diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2014-11-06 01:27:56 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-11-10 18:19:35 -0500 |
commit | b611e424f1ad189409dde50fe950eb8c05f75cab (patch) | |
tree | cb2a6cc0cdcb9b36f31ee1a25c935b2cd50d8a4c /drivers/usb/gadget | |
parent | 8480484d6f4a5b7d50262702db082b0fd13e7df5 (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.c | 45 |
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 | ||