usb: gadget: ci13xxx: initialize ep0{out,in} dynamically
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Fri, 4 May 2012 13:47:15 +0000 (16:47 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 May 2012 16:27:56 +0000 (09:27 -0700)
Change ep0{out,in} macros into dynamically assigned pointers in
gadget initialization time.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/ci13xxx_udc.c
drivers/usb/gadget/ci13xxx_udc.h

index b6f359ce157ddce9b7a72b9c55d3407307adfee2..b44c83d90c0e60ca75801ee3208b07e61fdc46b3 100644 (file)
@@ -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);
                }
@@ -1950,8 +1950,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 {
@@ -2279,7 +2279,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;
@@ -2496,7 +2496,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)
@@ -2637,28 +2637,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;
@@ -2684,7 +2694,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);
 
index 6490cf872adb12c77482f0ebc1c82300f7006ff3..d6dbaad9c90676f1ba9dbe1e53f90b7826f2681b 100644 (file)
@@ -125,8 +125,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 */