usb: gadget: Add device attribute to determine gadget state
authorBadhri Jagan Sridharan <Badhri@google.com>
Sun, 9 Aug 2015 22:12:50 +0000 (15:12 -0700)
committerJohn Stultz <john.stultz@linaro.org>
Tue, 16 Feb 2016 21:52:14 +0000 (13:52 -0800)
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>
drivers/usb/gadget/configfs.c

index 8c48ab4e78ba66aa6d01463361c2d4e6b9d64a1c..542d60792e2ccc369c6bb5dc9626159193a60834 100644 (file)
@@ -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 = {