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

Replace usb_gadget_driver's disconnect with udc-core's reset notifier at
bus reset handler.

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/dummy_hcd.c |   21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/gadget/udc/dummy_hcd.c 
b/drivers/usb/gadget/udc/dummy_hcd.c
index 2b54955..91f6881 100644
--- a/drivers/usb/gadget/udc/dummy_hcd.c
+++ b/drivers/usb/gadget/udc/dummy_hcd.c
@@ -367,19 +367,22 @@ static void set_link_state(struct dummy_hcd *dum_hcd)
             dum_hcd->active)
                dum_hcd->resuming = 0;
 
-       /* if !connected or reset */
+       /* Currently !connected or in reset */
        if ((dum_hcd->port_status & USB_PORT_STAT_CONNECTION) == 0 ||
                        (dum_hcd->port_status & USB_PORT_STAT_RESET) != 0) {
-               /*
-                * We're connected and not reset (reset occurred now),
-                * and driver attached - disconnect!
-                */
-               if ((dum_hcd->old_status & USB_PORT_STAT_CONNECTION) != 0 &&
-                   (dum_hcd->old_status & USB_PORT_STAT_RESET) == 0 &&
-                   dum->driver) {
+               unsigned disconnect = USB_PORT_STAT_CONNECTION &
+                               dum_hcd->old_status & (~dum_hcd->port_status);
+               unsigned reset = USB_PORT_STAT_RESET &
+                               (~dum_hcd->old_status) & dum_hcd->port_status;
+
+               /* Report reset and disconnect events to the driver */
+               if (dum->driver && (disconnect || reset)) {
                        stop_activity(dum);
                        spin_unlock(&dum->lock);
-                       dum->driver->disconnect(&dum->gadget);
+                       if (reset)
+                               usb_gadget_udc_reset(&dum->gadget, dum->driver);
+                       else
+                               dum->driver->disconnect(&dum->gadget);
                        spin_lock(&dum->lock);
                }
        } else if (dum_hcd->active != dum_hcd->old_active) {
-- 
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