Hi Alan,

Alan Stern <st...@rowland.harvard.edu> 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

Attachment: signature.asc
Description: PGP signature

Reply via email to