Hi Alan, Alan Stern <[email protected]> writes: > Felipe: > > A UDC driver will invoke the gadget driver's ->disconnect callback > whenever the D+ pullup is turned off. During gadget driver unbinding, > this happens automatically when usb_gadget_remove_driver() calls > usb_gadget_disconnect().
usb_gadget_disconnect() only calls UDC's ->pullup(), not gadget driver's
->disconnect()
int usb_gadget_disconnect(struct usb_gadget *gadget)
{
int ret = 0;
if (!gadget->ops->pullup) {
ret = -EOPNOTSUPP;
goto out;
}
if (gadget->deactivated) {
/*
* If gadget is deactivated we only save new state.
* Gadget will stay disconnected after activation.
*/
gadget->connected = false;
goto out;
}
ret = gadget->ops->pullup(gadget, 0);
if (!ret)
gadget->connected = 0;
out:
trace_usb_gadget_disconnect(gadget, ret);
return ret;
}
EXPORT_SYMBOL_GPL(usb_gadget_disconnect);
> But immediately thereafter, usb_gadget_remove_driver() calls the gadget
> driver's ->disconnect callback directly! Do we have any reason for
> doing this? I don't see point to it. Should that call be removed?
Unless I'm missing something, that call is necessary :-) Have you faced
any issues with it? Are there any UDCs calling gadget driver's
->disconnect() from ->pullup() ?
--
balbi
signature.asc
Description: PGP signature
