usb: gadget: net2272: use udc-core's reset notifier

This patch adds support for the new udc-core reset notifier to the
net2272 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>
This commit is contained in:
Alan Stern 2014-11-06 14:27:57 +08:00 committed by Felipe Balbi
parent b611e424f1
commit 5ca1ccdaa8
1 changed files with 35 additions and 10 deletions

View File

@ -1982,17 +1982,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;