1
0
Fork 0

usb: phy: generic: Handle late registration of gadget

It is possible for the VBUS detect GPIO interrupt to occur before
nop_set_peripheral() is called, in which case otg->gadget is NULL.

Signed-off-by: Maarten ter Huurne <maarten@treewalker.org>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
hifive-unleashed-5.1
Maarten ter Huurne 2016-02-28 16:34:16 +01:00 committed by Felipe Balbi
parent cff5638ef7
commit 2eafe93b92
1 changed files with 8 additions and 3 deletions

View File

@ -118,7 +118,8 @@ static irqreturn_t nop_gpio_vbus_thread(int irq, void *data)
status = USB_EVENT_VBUS;
otg->state = OTG_STATE_B_PERIPHERAL;
nop->phy.last_event = status;
usb_gadget_vbus_connect(otg->gadget);
if (otg->gadget)
usb_gadget_vbus_connect(otg->gadget);
/* drawing a "unit load" is *always* OK, except for OTG */
nop_set_vbus_draw(nop, 100);
@ -128,7 +129,8 @@ static irqreturn_t nop_gpio_vbus_thread(int irq, void *data)
} else {
nop_set_vbus_draw(nop, 0);
usb_gadget_vbus_disconnect(otg->gadget);
if (otg->gadget)
usb_gadget_vbus_disconnect(otg->gadget);
status = USB_EVENT_NONE;
otg->state = OTG_STATE_B_IDLE;
nop->phy.last_event = status;
@ -184,7 +186,10 @@ static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
}
otg->gadget = gadget;
otg->state = OTG_STATE_B_IDLE;
if (otg->state == OTG_STATE_B_PERIPHERAL)
usb_gadget_vbus_connect(gadget);
else
otg->state = OTG_STATE_B_IDLE;
return 0;
}