From e6d791b365467674e3ebb9647919e58d12f985fa Mon Sep 17 00:00:00 2001 From: Kamil Debski Date: Mon, 9 Jun 2014 14:12:41 +0200 Subject: [PATCH] usb: gadget: udc: Fix initialization sequence with extcon present Prior to this patch during initialization the udc would switch off regardless of the current state of the cable. Then it would be enabled if the cable is present. After applying this patch the udc would be disabled only if the cable is not present during initialization. Change-Id: Icfd7e42f9890798afb92428f4041dcffefaa2a08 Signed-off-by: Kamil Debski --- drivers/usb/gadget/udc-core.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index 1db6f18..1011c21 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c @@ -376,6 +376,8 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri udc->gadget->dev.driver = &driver->driver; node = udc->gadget->dev.of_node; + + edev = 0; /* Check if we have an extcon associated with the UDC driver */ if (node && of_property_read_bool(node, "extcon")) { edev = extcon_get_edev_by_phandle(&udc->gadget->dev, 0); @@ -402,20 +404,25 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri ret = driver->bind(udc->gadget, driver); if (ret) goto err2; - ret = usb_gadget_udc_start(udc->gadget, driver); - if (ret) { - driver->unbind(udc->gadget); - goto err2; - } - - usb_gadget_connect(udc->gadget); if (udc->extcon_usb_dev.edev) { - udc->enabled = 1; + udc->enabled = 0; udc->cable_state = extcon_get_cable_state_( udc->extcon_usb_dev.edev, udc->extcon_usb_dev.cable_index); - queue_work(udc->pwr_workqueue, &udc->pwr_work); + } else { + udc->cable_state = 1; + } + + if (udc->cable_state) { + ret = usb_gadget_udc_start(udc->gadget, driver); + if (ret) { + driver->unbind(udc->gadget); + goto err2; + } + + usb_gadget_connect(udc->gadget); + udc->enabled = 1; } kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); -- 2.7.4