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>
This commit is contained in:
parent
b9efd37bc8
commit
de9e90c21e
1 changed files with 52 additions and 33 deletions
|
@ -1597,6 +1597,54 @@ static struct device_attribute *android_usb_attributes[] = {
|
||||||
&dev_attr_state,
|
&dev_attr_state,
|
||||||
NULL
|
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
|
#endif
|
||||||
|
|
||||||
static struct config_group *gadgets_make(
|
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.gadget_driver.function = kstrdup(name, GFP_KERNEL);
|
||||||
gi->composite.name = gi->composite.gadget_driver.function;
|
gi->composite.name = gi->composite.gadget_driver.function;
|
||||||
|
|
||||||
#ifdef CONFIG_USB_CONFIGFS_UEVENT
|
if (!gi->composite.gadget_driver.function)
|
||||||
INIT_WORK(&gi->work, android_work);
|
|
||||||
android_device = device_create(android_class, NULL,
|
|
||||||
MKDEV(0, 0), NULL, "android0");
|
|
||||||
if (IS_ERR(android_device))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
dev_set_drvdata(android_device, gi);
|
if (android_device_create(gi) < 0)
|
||||||
|
goto err;
|
||||||
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;
|
|
||||||
|
|
||||||
config_group_init_type_name(&gi->group, name,
|
config_group_init_type_name(&gi->group, name,
|
||||||
&gadget_root_type);
|
&gadget_root_type);
|
||||||
return &gi->group;
|
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:
|
err:
|
||||||
kfree(gi);
|
kfree(gi);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
@ -1690,13 +1715,7 @@ static void gadgets_drop(struct config_group *group, struct config_item *item)
|
||||||
struct device_attribute *attr;
|
struct device_attribute *attr;
|
||||||
|
|
||||||
config_item_put(item);
|
config_item_put(item);
|
||||||
|
android_device_destroy();
|
||||||
#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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct configfs_group_operations gadgets_ops = {
|
static struct configfs_group_operations gadgets_ops = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue