summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadhri Jagan Sridharan <Badhri@google.com>2015-08-09 15:12:50 -0700
committerAmit Pundir <amit.pundir@linaro.org>2017-12-18 21:11:22 +0530
commit70d35ff9e833da9cea6bcb5879c265e3f441baf1 (patch)
tree4db88cf6e3a160d700376c7fa7b2e5fe2fbd6cb6
parentfec018eacb5bc73ed01e210950b5999ab5c670c6 (diff)
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. Change-Id: Id0391810d75b58c579610fbec6e37ab22f28886d 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>
-rw-r--r--drivers/usb/gadget/configfs.c91
1 files changed, 52 insertions, 39 deletions
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 111131af8adc..5ef6a4a13bd3 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -1592,6 +1592,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(
@@ -1599,9 +1647,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)
@@ -1645,37 +1690,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);
@@ -1683,17 +1705,8 @@ err:
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 = {