blob: c697b3595fcb9dde71fa8877466ee5549edb9448 [file] [log] [blame]
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Badhri Jagan Sridharan <Badhri@google.com>
Date: Sun, 9 Aug 2015 15:12:50 -0700
Subject: ANDROID: usb: gadget: configfs: Add device attribute to determine
gadget state
Android frameworks (UsbDeviceManager) relies on gadget state exported
through device attributes. This CL adds the device attribute to export
USB gadget state.
Bug: 68755607
Bug: 120441124
Change-Id: Id0391810d75b58c579610fbec6e37ab22f28886d
[badhri: Migrate to using udc uevents from upstream sysfs.]
Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
[AmitP: Folded following android-4.9 commit changes into this patch
Parts of e45c769fa7af ("ANDROID: usb: gadget: cleanup: fix unused variable and function warnings")
Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
---
drivers/usb/gadget/configfs.c | 91 ++++++++++++++++++++---------------
1 file changed, 52 insertions(+), 39 deletions(-)
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 195f67999f12..d17cf05fd62f 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -1709,6 +1709,54 @@ static struct device_attribute *android_usb_attributes[] = {
&dev_attr_state,
NULL
};
+
+static int android_device_create(struct gadget_info *gi)
+{
+ struct device_attribute **attrs;
+ struct device_attribute *attr;
+
+ INIT_WORK(&gi->work, android_work);
+ android_device = device_create(android_class, NULL,
+ MKDEV(0, 0), NULL, "android0");
+ if (IS_ERR(android_device))
+ return PTR_ERR(android_device);
+
+ dev_set_drvdata(android_device, gi);
+
+ attrs = android_usb_attributes;
+ while ((attr = *attrs++)) {
+ int err;
+
+ err = device_create_file(android_device, attr);
+ if (err) {
+ device_destroy(android_device->class,
+ android_device->devt);
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+static void android_device_destroy(void)
+{
+ struct device_attribute **attrs;
+ struct device_attribute *attr;
+
+ attrs = android_usb_attributes;
+ while ((attr = *attrs++))
+ device_remove_file(android_device, attr);
+ device_destroy(android_device->class, android_device->devt);
+}
+#else
+static inline int android_device_create(struct gadget_info *gi)
+{
+ return 0;
+}
+
+static inline void android_device_destroy(void)
+{
+}
#endif
static struct config_group *gadgets_make(
@@ -1716,9 +1764,6 @@ static struct config_group *gadgets_make(
const char *name)
{
struct gadget_info *gi;
- struct device_attribute **attrs;
- struct device_attribute *attr;
- int err;
gi = kzalloc(sizeof(*gi), GFP_KERNEL);
if (!gi)
@@ -1763,37 +1808,14 @@ static struct config_group *gadgets_make(
gi->composite.gadget_driver.function = kstrdup(name, GFP_KERNEL);
gi->composite.name = gi->composite.gadget_driver.function;
-#ifdef CONFIG_USB_CONFIGFS_UEVENT
- INIT_WORK(&gi->work, android_work);
- android_device = device_create(android_class, NULL,
- MKDEV(0, 0), NULL, "android0");
- if (IS_ERR(android_device))
+ if (!gi->composite.gadget_driver.function)
goto err;
- dev_set_drvdata(android_device, gi);
-
- attrs = android_usb_attributes;
- while ((attr = *attrs++)) {
- err = device_create_file(android_device, attr);
- if (err)
- goto err1;
- }
-#endif
-
- if (!gi->composite.gadget_driver.function)
- goto err1;
+ if (android_device_create(gi) < 0)
+ goto err;
return &gi->group;
-err1:
-#ifdef CONFIG_USB_CONFIGFS_UEVENT
- attrs = android_usb_attributes;
- while ((attr = *attrs++))
- device_remove_file(android_device, attr);
-
- device_destroy(android_device->class,
- android_device->devt);
-#endif
err:
kfree(gi);
return ERR_PTR(-ENOMEM);
@@ -1801,17 +1823,8 @@ static struct config_group *gadgets_make(
static void gadgets_drop(struct config_group *group, struct config_item *item)
{
- struct device_attribute **attrs;
- struct device_attribute *attr;
-
config_item_put(item);
-
-#ifdef CONFIG_USB_CONFIGFS_UEVENT
- attrs = android_usb_attributes;
- while ((attr = *attrs++))
- device_remove_file(android_device, attr);
- device_destroy(android_device->class, android_device->devt);
-#endif
+ android_device_destroy();
}
static struct configfs_group_operations gadgets_ops = {