Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2eafe93b authored by Maarten ter Huurne's avatar Maarten ter Huurne Committed by Felipe Balbi
Browse files

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: default avatarMaarten ter Huurne <maarten@treewalker.org>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent cff5638e
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ 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;
		if (otg->gadget)
			usb_gadget_vbus_connect(otg->gadget);

		/* drawing a "unit load" is *always* OK, except for OTG */
@@ -128,6 +129,7 @@ static irqreturn_t nop_gpio_vbus_thread(int irq, void *data)
	} else {
		nop_set_vbus_draw(nop, 0);

		if (otg->gadget)
			usb_gadget_vbus_disconnect(otg->gadget);
		status = USB_EVENT_NONE;
		otg->state = OTG_STATE_B_IDLE;
@@ -184,6 +186,9 @@ static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget)
	}

	otg->gadget = gadget;
	if (otg->state == OTG_STATE_B_PERIPHERAL)
		usb_gadget_vbus_connect(gadget);
	else
		otg->state = OTG_STATE_B_IDLE;
	return 0;
}