From: Alan Stern <st...@rowland.harvard.edu>

This patch adds support for the new udc-core reset notifier to the
net2272 driver.

Signed-off-by: Alan Stern <st...@rowland.harvard.edu>
Signed-off-by: Felipe Balbi <ba...@ti.com>
Signed-off-by: Peter Chen <peter.c...@freescale.com>
---
 drivers/usb/gadget/udc/net2272.c |   45 +++++++++++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/udc/net2272.c b/drivers/usb/gadget/udc/net2272.c
index 059cfe5..d828680 100644
--- a/drivers/usb/gadget/udc/net2272.c
+++ b/drivers/usb/gadget/udc/net2272.c
@@ -1987,17 +1987,42 @@ net2272_handle_stat1_irqs(struct net2272 *dev, u8 stat)
        mask = (1 << USB_HIGH_SPEED) | (1 << USB_FULL_SPEED);
 
        if (stat & tmp) {
+               bool    reset = false;
+               bool    disconnect = false;
+
+               /*
+                * Ignore disconnects and resets if the speed hasn't been set.
+                * VBUS can bounce and there's always an initial reset.
+                */
                net2272_write(dev, IRQSTAT1, tmp);
-               if ((((stat & (1 << ROOT_PORT_RESET_INTERRUPT)) &&
-                               ((net2272_read(dev, USBCTL1) & mask) == 0))
-                       || ((net2272_read(dev, USBCTL1) & (1 << VBUS_PIN))
-                               == 0))
-                               && (dev->gadget.speed != USB_SPEED_UNKNOWN)) {
-                       dev_dbg(dev->dev, "disconnect %s\n",
-                               dev->driver->driver.name);
-                       stop_activity(dev, dev->driver);
-                       net2272_ep0_start(dev);
-                       return;
+               if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
+                       if ((stat & (1 << VBUS_INTERRUPT)) &&
+                                       (net2272_read(dev, USBCTL1) &
+                                               (1 << VBUS_PIN)) == 0) {
+                               disconnect = true;
+                               dev_dbg(dev->dev, "disconnect %s\n",
+                                       dev->driver->driver.name);
+                       } else if ((stat & (1 << ROOT_PORT_RESET_INTERRUPT)) &&
+                                       (net2272_read(dev, USBCTL1) & mask)
+                                               == 0) {
+                               reset = true;
+                               dev_dbg(dev->dev, "reset %s\n",
+                                       dev->driver->driver.name);
+                       }
+
+                       if (disconnect || reset) {
+                               stop_activity(dev, dev->driver);
+                               net2272_ep0_start(dev);
+                               spin_unlock(&dev->lock);
+                               if (reset)
+                                       usb_gadget_udc_reset
+                                               (&dev->gadget, dev->driver);
+                               else
+                                       (dev->driver->disconnect)
+                                               (&dev->gadget);
+                               spin_lock(&dev->lock);
+                               return;
+                       }
                }
                stat &= ~tmp;
 
-- 
1.7.9.5

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

Reply via email to