aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadhri Jagan Sridharan <Badhri@google.com>2015-08-09 15:12:50 -0700
committerAmit Pundir <amit.pundir@linaro.org>2015-11-20 19:02:02 +0530
commitca64e4700e4193b211a902c485233bb52bec8784 (patch)
tree9a7e48fbb0ac95176610ea4f5d789165631b249f
parentd62bd9e21f65b973120df5dcbe2b81c907cb2786 (diff)
usb: gadget: 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>
-rw-r--r--drivers/usb/gadget/configfs.c85
1 files changed, 52 insertions, 33 deletions
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 8c48ab4e78ba..542d60792e2c 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -1597,6 +1597,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(
@@ -1646,39 +1694,16 @@ 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;
config_group_init_type_name(&gi->group, name,
&gadget_root_type);
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);
@@ -1690,13 +1715,7 @@ static void gadgets_drop(struct config_group *group, struct config_item *item)
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 = {