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