We introduce the connect API at usb_gadget_driver, the udc driver uses it to tell gadget driver that it is ready to CONNECT, and the dp can be pulled up from now on. Meanwhile, we introduce an API usb_udc_ready_to_connect to encapsulate above operation. Signed-off-by: Peter Chen <peter.chen@xxxxxxxxxxxxx> --- include/linux/usb/gadget.h | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index c3a6185..385af59 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -873,12 +873,39 @@ struct usb_gadget_driver { void (*disconnect)(struct usb_gadget *); void (*suspend)(struct usb_gadget *); void (*resume)(struct usb_gadget *); + int (*connect)(struct usb_gadget *, bool connect); /* FIXME support safe rmmod */ struct device_driver driver; }; - +/** + * usb_udc_ready_to_connect - The udc is ready to connect (physical pullup dp) + * @driver: the gadget driver for this gadget + * @gadget: the udc device + * @connect: whether the udc is ready to connect or not + * + * The USB 2.0 spec 7.2.1 and 7.1.5 requires the dp should not be pulled up if + * the vbus is not there, else it will fail Back-voltage Testing at below + * USB-IF certification test. + * www.usb.org/developers/docs/USB-IFTestProc1_3.pdf + * + * Some udcs have hardware logic that even the pullup bit is set by software, + * it can still meet above Back-voltage Testing requirement, these kinds of + * udcs only need to set connect as true at its .udc_start. But other udcs + * may have no this capability, so they need the software pullup bit is not + * set when the vbus is not there, otherwise it will break the spec, and can't + * pass Back-voltage Testing. So they need to set connect as false when the + * vbus is not there, and set connect as true when the vbus is there. + */ +static inline int usb_udc_ready_to_connect(struct usb_gadget_driver *driver, + struct usb_gadget *gadget, bool connect) +{ + if (driver->connect) + return driver->connect(gadget, connect); + else + return -EOPNOTSUPP; +} /*-------------------------------------------------------------------------*/ -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html