Adapt dwc2_udc_otg to the gadget API changes from the resync.

Co-developed-by: Jerome Forissier <[email protected]>
Signed-off-by: Jerome Forissier <[email protected]>
Co-developed-by: Jens Wiklander <[email protected]>
Signed-off-by: Jens Wiklander <[email protected]>
Signed-off-by: Anders Roxell <[email protected]>
---
 drivers/usb/gadget/dwc2_udc_otg.c | 174 +++++++++---------------------
 1 file changed, 50 insertions(+), 124 deletions(-)

diff --git a/drivers/usb/gadget/dwc2_udc_otg.c 
b/drivers/usb/gadget/dwc2_udc_otg.c
index 570fed347c9e..b067745cb2e3 100644
--- a/drivers/usb/gadget/dwc2_udc_otg.c
+++ b/drivers/usb/gadget/dwc2_udc_otg.c
@@ -113,9 +113,6 @@ static void dwc2_handle_ep0(struct dwc2_udc *dev);
 static int dwc2_ep0_write(struct dwc2_udc *dev);
 static int write_fifo_ep0(struct dwc2_ep *ep, struct dwc2_request *req);
 static void done(struct dwc2_ep *ep, struct dwc2_request *req, int status);
-static void stop_activity(struct dwc2_udc *dev,
-                         struct usb_gadget_driver *driver);
-static int udc_enable(struct dwc2_udc *dev);
 static void udc_set_address(struct dwc2_udc *dev, unsigned char address);
 static void reconfig_usbd(struct dwc2_udc *dev);
 static void set_max_pktsize(struct dwc2_udc *dev, enum usb_device_speed speed);
@@ -170,22 +167,6 @@ __weak void otg_phy_off(struct dwc2_udc *dev) {}
 
 #include "dwc2_udc_otg_xfer_dma.c"
 
-/*
- *     udc_disable - disable USB device controller
- */
-static void udc_disable(struct dwc2_udc *dev)
-{
-       debug_cond(DEBUG_SETUP != 0, "%s: %p\n", __func__, dev);
-
-       udc_set_address(dev, 0);
-
-       dev->ep0state = WAIT_FOR_SETUP;
-       dev->gadget.speed = USB_SPEED_UNKNOWN;
-       dev->usb_address = 0;
-
-       otg_phy_off(dev);
-}
-
 /*
  *     udc_reinit - initialize software state
  */
@@ -219,6 +200,18 @@ static void udc_reinit(struct dwc2_udc *dev)
 #define BYTES2MAXP(x)  (x / 8)
 #define MAXP2BYTES(x)  (x * 8)
 
+static int dwc2_gadget_pullup(struct usb_gadget *g, int is_on)
+{
+       clrsetbits_le32(&reg->device_regs.dctl, DCTL_SFTDISCON,
+                       is_on ? 0 : DCTL_SFTDISCON);
+
+       return 0;
+}
+
+#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
+
+#else /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
+
 /* until it's enabled, this UDC should be completely invisible
  * to any USB host.
  */
@@ -238,112 +231,73 @@ static int udc_enable(struct dwc2_udc *dev)
        return 0;
 }
 
-static int dwc2_gadget_pullup(struct usb_gadget *g, int is_on)
-{
-       clrsetbits_le32(&reg->device_regs.dctl, DCTL_SFTDISCON,
-                       is_on ? 0 : DCTL_SFTDISCON);
-
-       return 0;
-}
-
-#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
-/*
-  Register entry point for the peripheral controller driver.
-*/
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+static int dwc2_gadget_start(struct usb_gadget *g,
+                            struct usb_gadget_driver *driver)
 {
        struct dwc2_udc *dev = the_controller;
-       int retval = 0;
-       unsigned long flags = 0;
 
        debug_cond(DEBUG_SETUP != 0, "%s: %s\n", __func__, "no name");
 
-       if (!driver || driver->speed < USB_SPEED_FULL
-           || !driver->bind || !driver->disconnect || !driver->setup)
+       if (!driver || driver->speed < USB_SPEED_FULL ||
+           !driver->bind || !driver->disconnect || !driver->setup)
                return -EINVAL;
+
        if (!dev)
                return -ENODEV;
+
        if (dev->driver)
                return -EBUSY;
 
-       spin_lock_irqsave(&dev->lock, flags);
        /* first hook up the driver ... */
        dev->driver = driver;
-       spin_unlock_irqrestore(&dev->lock, flags);
-
-       if (retval) { /* TODO */
-               printf("target device_add failed, error %d\n", retval);
-               return retval;
-       }
-
-       retval = driver->bind(&dev->gadget);
-       if (retval) {
-               debug_cond(DEBUG_SETUP != 0,
-                          "%s: bind to driver --> error %d\n",
-                           dev->gadget.name, retval);
-               dev->driver = 0;
-               return retval;
-       }
-
-       enable_irq(IRQ_OTG);
 
        debug_cond(DEBUG_SETUP != 0,
                   "Registered gadget driver %s\n", dev->gadget.name);
-       udc_enable(dev);
-
-       return 0;
+       return udc_enable(dev);
 }
 
-/*
- * Unregister entry point for the peripheral controller driver.
- */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static void stop_activity(struct dwc2_udc *dev,
+                         struct usb_gadget_driver *driver)
 {
-       struct dwc2_udc *dev = the_controller;
-       unsigned long flags = 0;
-
-       if (!dev)
-               return -ENODEV;
-       if (!driver || driver != dev->driver)
-               return -EINVAL;
+       int i;
 
-       spin_lock_irqsave(&dev->lock, flags);
-       dev->driver = 0;
-       stop_activity(dev, driver);
-       spin_unlock_irqrestore(&dev->lock, flags);
+       /* don't disconnect drivers more than once */
+       if (dev->gadget.speed == USB_SPEED_UNKNOWN)
+               driver = 0;
+       dev->gadget.speed = USB_SPEED_UNKNOWN;
 
-       driver->unbind(&dev->gadget);
+       /* prevent new request submissions, kill any outstanding requests  */
+       for (i = 0; i < DWC2_MAX_ENDPOINTS; i++) {
+               struct dwc2_ep *ep = &dev->ep[i];
+               ep->stopped = 1;
+               nuke(ep, -ESHUTDOWN);
+       }
 
-       disable_irq(IRQ_OTG);
+       /* report disconnect; the driver is already quiesced */
+       if (driver) {
+               spin_unlock(&dev->lock);
+               driver->disconnect(&dev->gadget);
+               spin_lock(&dev->lock);
+       }
 
-       udc_disable(dev);
-       return 0;
+       /* re-init driver-visible data structures */
+       udc_reinit(dev);
 }
-#else /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
 
-static int dwc2_gadget_start(struct usb_gadget *g,
-                            struct usb_gadget_driver *driver)
+/*
+ *     udc_disable - disable USB device controller
+ */
+static void udc_disable(struct dwc2_udc *dev)
 {
-       struct dwc2_udc *dev = the_controller;
-
-       debug_cond(DEBUG_SETUP != 0, "%s: %s\n", __func__, "no name");
-
-       if (!driver || driver->speed < USB_SPEED_FULL ||
-           !driver->bind || !driver->disconnect || !driver->setup)
-               return -EINVAL;
-
-       if (!dev)
-               return -ENODEV;
+       debug_cond(DEBUG_SETUP != 0, "%s: %p\n", __func__, dev);
 
-       if (dev->driver)
-               return -EBUSY;
+       udc_set_address(dev, 0);
 
-       /* first hook up the driver ... */
-       dev->driver = driver;
+       dev->ep0state = WAIT_FOR_SETUP;
+       dev->gadget.speed = USB_SPEED_UNKNOWN;
+       dev->usb_address = 0;
 
-       debug_cond(DEBUG_SETUP != 0,
-                  "Registered gadget driver %s\n", dev->gadget.name);
-       return udc_enable(dev);
+       otg_phy_off(dev);
 }
 
 static int dwc2_gadget_stop(struct usb_gadget *g)
@@ -433,34 +387,6 @@ static void nuke(struct dwc2_ep *ep, int status)
        }
 }
 
-static void stop_activity(struct dwc2_udc *dev,
-                         struct usb_gadget_driver *driver)
-{
-       int i;
-
-       /* don't disconnect drivers more than once */
-       if (dev->gadget.speed == USB_SPEED_UNKNOWN)
-               driver = 0;
-       dev->gadget.speed = USB_SPEED_UNKNOWN;
-
-       /* prevent new request submissions, kill any outstanding requests  */
-       for (i = 0; i < DWC2_MAX_ENDPOINTS; i++) {
-               struct dwc2_ep *ep = &dev->ep[i];
-               ep->stopped = 1;
-               nuke(ep, -ESHUTDOWN);
-       }
-
-       /* report disconnect; the driver is already quiesced */
-       if (driver) {
-               spin_unlock(&dev->lock);
-               driver->disconnect(&dev->gadget);
-               spin_lock(&dev->lock);
-       }
-
-       /* re-init driver-visible data structures */
-       udc_reinit(dev);
-}
-
 static void reconfig_usbd(struct dwc2_udc *dev)
 {
        /* 2. Soft-reset OTG Core and then unreset again. */
-- 
2.53.0

Reply via email to