blob: 62b64b3935a0a895c46707ed7a811d2d3f540973 [file]
From 23213b4f272dac40510b7e740181f6665fef68bf Mon Sep 17 00:00:00 2001
From: Yue Wang <yue.wang@amlogic.com>
Date: Wed, 8 Jun 2022 14:13:16 +0800
Subject: [PATCH 32/95] C3: usb: c3 usb driver [1/1]
PD#SWPL-83845
Problem:
c3 usb driver.
Solution:
c3 usb driver.
Verify:
aw419
Change-Id: I1b423e1d2b9558b8e5b3da60a87a845cac18f980
Signed-off-by: Yue Wang <yue.wang@amlogic.com>
---
drivers/usb/gadget/configfs.c | 55 +++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 66885e28a195..155fda95e690 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -25,6 +25,10 @@ static struct device *android_device;
static int index;
static int gadget_index;
+#ifdef CONFIG_AMLOGIC_USB
+static struct gadget_info *gi_backup;
+#endif
+
struct device *create_function_device(char *name)
{
if (android_device && !IS_ERR(android_device))
@@ -1869,6 +1873,10 @@ static struct config_group *gadgets_make(
if (android_device_create(gi) < 0)
goto err;
+#ifdef CONFIG_AMLOGIC_USB
+ gi_backup = gi;
+#endif
+
return &gi->group;
err:
@@ -1915,6 +1923,53 @@ void unregister_gadget_item(struct config_item *item)
}
EXPORT_SYMBOL_GPL(unregister_gadget_item);
+#ifdef CONFIG_AMLOGIC_USB
+int crg_otg_write_UDC(const char *udc_name)
+{
+ struct gadget_info *gi = gi_backup;
+ char *name;
+ int ret;
+ size_t len;
+
+ if (!gi)
+ return -ENOMEM;
+ len = strlen(udc_name);
+
+ name = kstrdup(udc_name, GFP_KERNEL);
+ if (!name)
+ return -ENOMEM;
+ if (name[len - 1] == '\n')
+ name[len - 1] = '\0';
+
+ mutex_lock(&gi->lock);
+
+ if (!strlen(name) || strcmp(name, "none") == 0) {
+ ret = unregister_gadget(gi);
+ if (ret)
+ goto err;
+ kfree(name);
+ } else {
+ if (gi->composite.gadget_driver.udc_name) {
+ ret = -EBUSY;
+ goto err;
+ }
+ gi->composite.gadget_driver.udc_name = name;
+ ret = usb_gadget_probe_driver(&gi->composite.gadget_driver);
+ if (ret) {
+ gi->composite.gadget_driver.udc_name = NULL;
+ goto err;
+ }
+ }
+ mutex_unlock(&gi->lock);
+ return 0;
+err:
+ kfree(name);
+ mutex_unlock(&gi->lock);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(crg_otg_write_UDC);
+#endif
+
static int __init gadget_cfs_init(void)
{
int ret;
--
2.25.1