aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2014-11-06 01:27:56 -0500
committerFelipe Balbi <balbi@ti.com>2014-11-10 18:19:35 -0500
commitb611e424f1ad189409dde50fe950eb8c05f75cab (patch)
treecb2a6cc0cdcb9b36f31ee1a25c935b2cd50d8a4c /drivers/usb/gadget
parent8480484d6f4a5b7d50262702db082b0fd13e7df5 (diff)
usb: gadget: net2280: use udc-core's reset notifier
This patch adds support for the new udc-core reset notifier to the net2280 driver. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r--drivers/usb/gadget/udc/net2280.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c
index bd03a1b4192d..c49179493796 100644
--- a/drivers/usb/gadget/udc/net2280.c
+++ b/drivers/usb/gadget/udc/net2280.c
@@ -3308,17 +3308,42 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
3308 * only indicates a change in the reset state). 3308 * only indicates a change in the reset state).
3309 */ 3309 */
3310 if (stat & tmp) { 3310 if (stat & tmp) {
3311 bool reset = false;
3312 bool disconnect = false;
3313
3314 /*
3315 * Ignore disconnects and resets if the speed hasn't been set.
3316 * VBUS can bounce and there's always an initial reset.
3317 */
3311 writel(tmp, &dev->regs->irqstat1); 3318 writel(tmp, &dev->regs->irqstat1);
3312 if ((((stat & BIT(ROOT_PORT_RESET_INTERRUPT)) && 3319 if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
3313 ((readl(&dev->usb->usbstat) & mask) == 0)) || 3320 if ((stat & BIT(VBUS_INTERRUPT)) &&
3314 ((readl(&dev->usb->usbctl) & 3321 (readl(&dev->usb->usbctl) &
3315 BIT(VBUS_PIN)) == 0)) && 3322 BIT(VBUS_PIN)) == 0) {
3316 (dev->gadget.speed != USB_SPEED_UNKNOWN)) { 3323 disconnect = true;
3317 ep_dbg(dev, "disconnect %s\n", 3324 ep_dbg(dev, "disconnect %s\n",
3318 dev->driver->driver.name); 3325 dev->driver->driver.name);
3319 stop_activity(dev, dev->driver); 3326 } else if ((stat & BIT(ROOT_PORT_RESET_INTERRUPT)) &&
3320 ep0_start(dev); 3327 (readl(&dev->usb->usbstat) & mask)
3321 return; 3328 == 0) {
3329 reset = true;
3330 ep_dbg(dev, "reset %s\n",
3331 dev->driver->driver.name);
3332 }
3333
3334 if (disconnect || reset) {
3335 stop_activity(dev, dev->driver);
3336 ep0_start(dev);
3337 spin_unlock(&dev->lock);
3338 if (reset)
3339 usb_gadget_udc_reset
3340 (&dev->gadget, dev->driver);
3341 else
3342 (dev->driver->disconnect)
3343 (&dev->gadget);
3344 spin_lock(&dev->lock);
3345 return;
3346 }
3322 } 3347 }
3323 stat &= ~tmp; 3348 stat &= ~tmp;
3324 3349