[RFC v3 03/11] usb: gadget: ci13xxx: initialize ep0{out,in} dynamically

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


Change ep0{out,in} macros into dynamically assigned pointers in
gadget initialization time.

Signed-off-by: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx>
---
 drivers/usb/gadget/ci13xxx_udc.c |   48 +++++++++++++++++++++++---------------
 drivers/usb/gadget/ci13xxx_udc.h |    3 +--
 2 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c
index 2d3e265..17d66fe 100644
--- a/drivers/usb/gadget/ci13xxx_udc.c
+++ b/drivers/usb/gadget/ci13xxx_udc.c
@@ -1650,8 +1650,8 @@ static int _gadget_stop_activity(struct usb_gadget *gadget)
 	gadget_for_each_ep(ep, gadget) {
 		usb_ep_fifo_flush(ep);
 	}
-	usb_ep_fifo_flush(&udc->ep0out.ep);
-	usb_ep_fifo_flush(&udc->ep0in.ep);
+	usb_ep_fifo_flush(&udc->ep0out->ep);
+	usb_ep_fifo_flush(&udc->ep0in->ep);
 
 	udc->driver->disconnect(gadget);
 
@@ -1661,7 +1661,7 @@ static int _gadget_stop_activity(struct usb_gadget *gadget)
 	}
 
 	if (udc->status != NULL) {
-		usb_ep_free_request(&udc->ep0in.ep, udc->status);
+		usb_ep_free_request(&udc->ep0in->ep, udc->status);
 		udc->status = NULL;
 	}
 
@@ -1701,7 +1701,7 @@ __acquires(udc->lock)
 	if (retval)
 		goto done;
 
-	udc->status = usb_ep_alloc_request(&udc->ep0in.ep, GFP_ATOMIC);
+	udc->status = usb_ep_alloc_request(&udc->ep0in->ep, GFP_ATOMIC);
 	if (udc->status == NULL)
 		retval = -ENOMEM;
 
@@ -1744,7 +1744,7 @@ static int isr_get_status_response(struct ci13xxx *udc,
 __releases(mEp->lock)
 __acquires(mEp->lock)
 {
-	struct ci13xxx_ep *mEp = &udc->ep0in;
+	struct ci13xxx_ep *mEp = udc->ep0in;
 	struct usb_request *req = NULL;
 	gfp_t gfp_flags = GFP_ATOMIC;
 	int dir, num, retval;
@@ -1835,7 +1835,7 @@ __acquires(mEp->lock)
 
 	trace("%p", udc);
 
-	mEp = (udc->ep0_dir == TX) ? &udc->ep0out : &udc->ep0in;
+	mEp = (udc->ep0_dir == TX) ? udc->ep0out : udc->ep0in;
 	udc->status->context = udc;
 	udc->status->complete = isr_setup_status_complete;
 
@@ -1877,7 +1877,7 @@ __acquires(mEp->lock)
 			spin_unlock(mEp->lock);
 			if ((mEp->type == USB_ENDPOINT_XFER_CONTROL) &&
 					mReq->req.length)
-				mEpTemp = &_udc->ep0in;
+				mEpTemp = _udc->ep0in;
 			mReq->req.complete(&mEpTemp->ep, &mReq->req);
 			spin_lock(mEp->lock);
 		}
@@ -1948,8 +1948,8 @@ __acquires(udc->lock)
 		 * Flush data and handshake transactions of previous
 		 * setup packet.
 		 */
-		_ep_nuke(&udc->ep0out);
-		_ep_nuke(&udc->ep0in);
+		_ep_nuke(udc->ep0out);
+		_ep_nuke(udc->ep0in);
 
 		/* read_setup_packet */
 		do {
@@ -2277,7 +2277,7 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req,
 	if (mEp->type == USB_ENDPOINT_XFER_CONTROL) {
 		if (req->length)
 			mEp = (_udc->ep0_dir == RX) ?
-				&_udc->ep0out : &_udc->ep0in;
+				_udc->ep0out : _udc->ep0in;
 		if (!list_empty(&mEp->qh.queue)) {
 			_ep_nuke(mEp);
 			retval = -EOVERFLOW;
@@ -2494,7 +2494,7 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
 		if (is_active) {
 			pm_runtime_get_sync(&_gadget->dev);
 			hw_device_reset(udc);
-			hw_device_state(udc->ep0out.qh.dma);
+			hw_device_state(udc->ep0out->qh.dma);
 		} else {
 			hw_device_state(0);
 			if (udc->udc_driver->notify_event)
@@ -2635,28 +2635,38 @@ static int ci13xxx_start(struct usb_gadget_driver *driver,
 			else
 				memset(mEp->qh.ptr, 0, sizeof(*mEp->qh.ptr));
 
-			/* skip ep0 out and in endpoints */
-			if (i == 0)
+			/*
+			 * set up shorthands for ep0 out and in endpoints,
+			 * don't add to gadget's ep_list
+			 */
+			if (i == 0) {
+				if (j == RX)
+					udc->ep0out = mEp;
+				else
+					udc->ep0in = mEp;
+
 				continue;
+			}
 
 			list_add_tail(&mEp->ep.ep_list, &udc->gadget.ep_list);
 		}
 	}
 	if (retval)
 		goto done;
+
 	spin_unlock_irqrestore(udc->lock, flags);
-	udc->ep0out.ep.desc = &ctrl_endpt_out_desc;
-	retval = usb_ep_enable(&udc->ep0out.ep);
+	udc->ep0out->ep.desc = &ctrl_endpt_out_desc;
+	retval = usb_ep_enable(&udc->ep0out->ep);
 	if (retval)
 		return retval;
 
-	udc->ep0in.ep.desc = &ctrl_endpt_in_desc;
-	retval = usb_ep_enable(&udc->ep0in.ep);
+	udc->ep0in->ep.desc = &ctrl_endpt_in_desc;
+	retval = usb_ep_enable(&udc->ep0in->ep);
 	if (retval)
 		return retval;
 	spin_lock_irqsave(udc->lock, flags);
 
-	udc->gadget.ep0 = &udc->ep0in.ep;
+	udc->gadget.ep0 = &udc->ep0in->ep;
 	/* bind gadget */
 	driver->driver.bus     = NULL;
 	udc->gadget.dev.driver = &driver->driver;
@@ -2682,7 +2692,7 @@ static int ci13xxx_start(struct usb_gadget_driver *driver,
 		}
 	}
 
-	retval = hw_device_state(udc->ep0out.qh.dma);
+	retval = hw_device_state(udc->ep0out->qh.dma);
 	if (retval)
 		pm_runtime_put_sync(&udc->gadget.dev);
 
diff --git a/drivers/usb/gadget/ci13xxx_udc.h b/drivers/usb/gadget/ci13xxx_udc.h
index 0d31af5..000dd14 100644
--- a/drivers/usb/gadget/ci13xxx_udc.h
+++ b/drivers/usb/gadget/ci13xxx_udc.h
@@ -126,8 +126,7 @@ struct ci13xxx {
 	struct usb_gadget          gadget;     /* USB slave device */
 	struct ci13xxx_ep          ci13xxx_ep[ENDPT_MAX]; /* extended endpts */
 	u32                        ep0_dir;    /* ep0 direction */
-#define ep0out ci13xxx_ep[0]
-#define ep0in  ci13xxx_ep[hw_ep_max / 2]
+	struct ci13xxx_ep          *ep0out, *ep0in;
 	u8                         remote_wakeup; /* Is remote wakeup feature
 							enabled by the host? */
 	u8                         suspended;  /* suspended by the host */
-- 
1.7.10

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


B and H Foto and Electronics Corp.

[Linux Media]     [Video for Linux]     [Linux Input]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Free Online Dating]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]     [More Archives]

Add to Google Powered by Linux