[RFC PATCH 1/1] usb: udc-core: redo usb_gadget_probe_driver when the udc is ready

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We have historic problem that the gadget will not work if the gadget
is build-in and the udc driver is defered probe due to some
resources are not ready. Below links are related to this problem.

http://marc.info/?l=linux-usb&m=139380872501745&w=2
http://marc.info/?l=linux-usb&m=137991612311893&w=2
http://marc.info/?l=linux-usb&m=137706435611447&w=2

This patch saves pointer of usb_gadget_driver when the udc is
not ready, and redo usb_gadget_probe_driver when the udc is ready
This method may not be good enough, but we need to find a way
to fix this problem, so I post this RFC to see if to see comments,
someone may have a better solution:)

Signed-off-by: Peter Chen <peter.chen@xxxxxxxxxxxxx>
---
 drivers/usb/gadget/udc-core.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index 27768a7..1b991ef 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -48,6 +48,11 @@ struct usb_udc {
 static struct class *udc_class;
 static LIST_HEAD(udc_list);
 static DEFINE_MUTEX(udc_lock);
+/* 
+ * Only used for saving usb_gadget_driver pointer
+ * when the udc is not ready
+ */
+struct usb_gadget_driver	*saved_gadget_driver;
 
 /* ------------------------------------------------------------------------- */
 
@@ -272,7 +277,12 @@ EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release);
  */
 int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
 {
-	return usb_add_gadget_udc_release(parent, gadget, NULL);
+	int ret = usb_add_gadget_udc_release(parent, gadget, NULL);
+	if (!ret && saved_gadget_driver) {
+		usb_gadget_probe_driver(saved_gadget_driver);
+		saved_gadget_driver = NULL;
+	}
+	return ret;
 }
 EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
 
@@ -406,7 +416,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
 			goto found;
 	}
 
-	pr_debug("couldn't find an available UDC\n");
+	pr_debug("couldn't find an UDC, retry probe when udc is ready\n");
+	saved_gadget_driver = driver;
 	mutex_unlock(&udc_lock);
 	return -ENODEV;
 found:
-- 
1.7.8


--
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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux