Lines Matching +full:composite +full:- +full:in
1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/usb/composite.h>
34 return ERR_PTR(-EINVAL); in create_function_device()
50 return -EINVAL; in check_user_usb_string()
52 stringtab_dev->language = num; in check_user_usb_string()
73 struct usb_composite_driver composite; member
141 return -EOVERFLOW; in usb_string_copy()
148 return -ENOMEM; in usb_string_copy()
151 if (str[ret - 1] == '\n') in usb_string_copy()
152 str[ret - 1] = '\0'; in usb_string_copy()
162 to_gadget_info(item)->cdev.desc.__name); \
170 le16_to_cpup(&to_gadget_info(item)->cdev.desc.__name)); \
183 to_gadget_info(item)->cdev.desc._name = val; \
196 to_gadget_info(item)->cdev.desc._name = cpu_to_le16p(&val); \
216 return -EINVAL; in is_valid_bcd()
218 return -EINVAL; in is_valid_bcd()
220 return -EINVAL; in is_valid_bcd()
222 return -EINVAL; in is_valid_bcd()
239 to_gadget_info(item)->cdev.desc.bcdDevice = cpu_to_le16(bcdDevice); in gadget_dev_desc_bcdDevice_store()
256 to_gadget_info(item)->cdev.desc.bcdUSB = cpu_to_le16(bcdUSB); in gadget_dev_desc_bcdUSB_store()
266 mutex_lock(&gi->lock); in gadget_dev_desc_UDC_show()
267 udc_name = gi->composite.gadget_driver.udc_name; in gadget_dev_desc_UDC_show()
269 mutex_unlock(&gi->lock); in gadget_dev_desc_UDC_show()
278 if (!gi->composite.gadget_driver.udc_name) in unregister_gadget()
279 return -ENODEV; in unregister_gadget()
281 ret = usb_gadget_unregister_driver(&gi->composite.gadget_driver); in unregister_gadget()
284 kfree(gi->composite.gadget_driver.udc_name); in unregister_gadget()
285 gi->composite.gadget_driver.udc_name = NULL; in unregister_gadget()
297 return -EOVERFLOW; in gadget_dev_desc_UDC_store()
301 return -ENOMEM; in gadget_dev_desc_UDC_store()
302 if (name[len - 1] == '\n') in gadget_dev_desc_UDC_store()
303 name[len - 1] = '\0'; in gadget_dev_desc_UDC_store()
305 mutex_lock(&gi->lock); in gadget_dev_desc_UDC_store()
313 if (gi->composite.gadget_driver.udc_name) { in gadget_dev_desc_UDC_store()
314 ret = -EBUSY; in gadget_dev_desc_UDC_store()
317 gi->composite.gadget_driver.udc_name = name; in gadget_dev_desc_UDC_store()
318 ret = usb_gadget_probe_driver(&gi->composite.gadget_driver); in gadget_dev_desc_UDC_store()
320 gi->composite.gadget_driver.udc_name = NULL; in gadget_dev_desc_UDC_store()
324 mutex_unlock(&gi->lock); in gadget_dev_desc_UDC_store()
328 mutex_unlock(&gi->lock); in gadget_dev_desc_UDC_store()
335 enum usb_device_speed speed = to_gadget_info(item)->composite.max_speed; in gadget_dev_desc_max_speed_show()
345 mutex_lock(&gi->lock); in gadget_dev_desc_max_speed_store()
348 if (gi->composite.gadget_driver.udc_name) in gadget_dev_desc_max_speed_store()
351 if (strncmp(page, "super-speed-plus", 16) == 0) in gadget_dev_desc_max_speed_store()
352 gi->composite.max_speed = USB_SPEED_SUPER_PLUS; in gadget_dev_desc_max_speed_store()
353 else if (strncmp(page, "super-speed", 11) == 0) in gadget_dev_desc_max_speed_store()
354 gi->composite.max_speed = USB_SPEED_SUPER; in gadget_dev_desc_max_speed_store()
355 else if (strncmp(page, "high-speed", 10) == 0) in gadget_dev_desc_max_speed_store()
356 gi->composite.max_speed = USB_SPEED_HIGH; in gadget_dev_desc_max_speed_store()
357 else if (strncmp(page, "full-speed", 10) == 0) in gadget_dev_desc_max_speed_store()
358 gi->composite.max_speed = USB_SPEED_FULL; in gadget_dev_desc_max_speed_store()
359 else if (strncmp(page, "low-speed", 9) == 0) in gadget_dev_desc_max_speed_store()
360 gi->composite.max_speed = USB_SPEED_LOW; in gadget_dev_desc_max_speed_store()
364 gi->composite.gadget_driver.max_speed = gi->composite.max_speed; in gadget_dev_desc_max_speed_store()
366 mutex_unlock(&gi->lock); in gadget_dev_desc_max_speed_store()
369 mutex_unlock(&gi->lock); in gadget_dev_desc_max_speed_store()
370 return -EINVAL; in gadget_dev_desc_max_speed_store()
422 WARN_ON(!list_empty(&gi->cdev.configs)); in gadget_info_attr_release()
423 WARN_ON(!list_empty(&gi->string_list)); in gadget_info_attr_release()
424 WARN_ON(!list_empty(&gi->available_func)); in gadget_info_attr_release()
425 kfree(gi->composite.gadget_driver.function); in gadget_info_attr_release()
437 WARN_ON(!list_empty(&cfg->c.functions)); in gadget_config_attr_release()
438 list_del(&cfg->c.list); in gadget_config_attr_release()
439 kfree(cfg->c.label); in gadget_config_attr_release()
448 struct usb_composite_dev *cdev = cfg->c.cdev; in config_usb_cfg_link()
458 mutex_lock(&gi->lock); in config_usb_cfg_link()
464 list_for_each_entry(a_fi, &gi->available_func, cfs_list) { in config_usb_cfg_link()
469 ret = -EINVAL; in config_usb_cfg_link()
473 list_for_each_entry(f, &cfg->func_list, list) { in config_usb_cfg_link()
474 if (f->fi == fi) { in config_usb_cfg_link()
475 ret = -EEXIST; in config_usb_cfg_link()
487 list_add_tail(&f->list, &cfg->func_list); in config_usb_cfg_link()
490 mutex_unlock(&gi->lock); in config_usb_cfg_link()
499 struct usb_composite_dev *cdev = cfg->c.cdev; in config_usb_cfg_unlink()
513 mutex_lock(&gi->lock); in config_usb_cfg_unlink()
514 if (gi->composite.gadget_driver.udc_name) in config_usb_cfg_unlink()
516 WARN_ON(gi->composite.gadget_driver.udc_name); in config_usb_cfg_unlink()
518 list_for_each_entry(f, &cfg->func_list, list) { in config_usb_cfg_unlink()
519 if (f->fi == fi) { in config_usb_cfg_unlink()
520 list_del(&f->list); in config_usb_cfg_unlink()
522 mutex_unlock(&gi->lock); in config_usb_cfg_unlink()
526 mutex_unlock(&gi->lock); in config_usb_cfg_unlink()
540 return sprintf(page, "%u\n", to_config_usb_cfg(item)->c.MaxPower); in gadget_config_desc_MaxPower_show()
552 return -ERANGE; in gadget_config_desc_MaxPower_store()
553 to_config_usb_cfg(item)->c.MaxPower = val; in gadget_config_desc_MaxPower_store()
561 to_config_usb_cfg(item)->c.bmAttributes); in gadget_config_desc_bmAttributes_show()
573 return -EINVAL; in gadget_config_desc_bmAttributes_store()
576 return -EINVAL; in gadget_config_desc_bmAttributes_store()
577 to_config_usb_cfg(item)->c.bmAttributes = val; in gadget_config_desc_bmAttributes_store()
604 spin_lock_init(&cdev->lock); in composite_init_dev()
605 INIT_LIST_HEAD(&cdev->configs); in composite_init_dev()
606 INIT_LIST_HEAD(&cdev->gstrings); in composite_init_dev()
622 return ERR_PTR(-ENAMETOOLONG); in function_make()
627 pr_err("Unable to locate . in FUNC.INSTANCE\n"); in function_make()
628 return ERR_PTR(-EINVAL); in function_make()
637 ret = config_item_set_name(&fi->group.cg_item, "%s", name); in function_make()
642 if (fi->set_inst_name) { in function_make()
643 ret = fi->set_inst_name(fi, instance_name); in function_make()
652 mutex_lock(&gi->lock); in function_make()
653 list_add_tail(&fi->cfs_list, &gi->available_func); in function_make()
654 mutex_unlock(&gi->lock); in function_make()
655 return &fi->group; in function_make()
667 mutex_lock(&gi->lock); in function_drop()
668 list_del(&fi->cfs_list); in function_drop()
669 mutex_unlock(&gi->lock); in function_drop()
694 kfree(cn->configuration); in gadget_config_name_attr_release()
696 list_del(&cn->list); in gadget_config_name_attr_release()
717 return ERR_PTR(-ENAMETOOLONG); in config_desc_make()
721 pr_err("Unable to locate . in name.bConfigurationValue\n"); in config_desc_make()
722 return ERR_PTR(-EINVAL); in config_desc_make()
729 return ERR_PTR(-EINVAL); in config_desc_make()
737 return ERR_PTR(-ENOMEM); in config_desc_make()
738 cfg->c.label = kstrdup(buf, GFP_KERNEL); in config_desc_make()
739 if (!cfg->c.label) { in config_desc_make()
740 ret = -ENOMEM; in config_desc_make()
743 cfg->c.bConfigurationValue = num; in config_desc_make()
744 cfg->c.MaxPower = CONFIG_USB_GADGET_VBUS_DRAW; in config_desc_make()
745 cfg->c.bmAttributes = USB_CONFIG_ATT_ONE; in config_desc_make()
746 INIT_LIST_HEAD(&cfg->string_list); in config_desc_make()
747 INIT_LIST_HEAD(&cfg->func_list); in config_desc_make()
749 config_group_init_type_name(&cfg->group, name, in config_desc_make()
752 config_group_init_type_name(&cfg->strings_group, "strings", in config_desc_make()
754 configfs_add_default_group(&cfg->strings_group, &cfg->group); in config_desc_make()
756 ret = usb_add_config_only(&gi->cdev, &cfg->c); in config_desc_make()
760 return &cfg->group; in config_desc_make()
762 kfree(cfg->c.label); in config_desc_make()
799 kfree(gs->manufacturer); in gadget_strings_attr_release()
800 kfree(gs->product); in gadget_strings_attr_release()
801 kfree(gs->serialnumber); in gadget_strings_attr_release()
803 list_del(&gs->list); in gadget_strings_attr_release()
818 return to_gadget_info(to_os_desc(item)->group.cg_item.ci_parent); in os_desc_item_to_gadget_info()
824 os_desc_item_to_gadget_info(item)->use_os_desc); in os_desc_use_show()
834 mutex_lock(&gi->lock); in os_desc_use_store()
837 gi->use_os_desc = use; in os_desc_use_store()
840 mutex_unlock(&gi->lock); in os_desc_use_store()
848 os_desc_item_to_gadget_info(item)->b_vendor_code); in os_desc_b_vendor_code_show()
858 mutex_lock(&gi->lock); in os_desc_b_vendor_code_store()
861 gi->b_vendor_code = b_vendor_code; in os_desc_b_vendor_code_store()
864 mutex_unlock(&gi->lock); in os_desc_b_vendor_code_store()
874 res = utf16s_to_utf8s((wchar_t *) gi->qw_sign, OS_STRING_QW_SIGN_LEN, in os_desc_qw_sign_show()
875 UTF16_LITTLE_ENDIAN, page, PAGE_SIZE - 1); in os_desc_qw_sign_show()
888 if (page[l - 1] == '\n') in os_desc_qw_sign_store()
889 --l; in os_desc_qw_sign_store()
891 mutex_lock(&gi->lock); in os_desc_qw_sign_store()
893 UTF16_LITTLE_ENDIAN, (wchar_t *) gi->qw_sign, in os_desc_qw_sign_store()
897 mutex_unlock(&gi->lock); in os_desc_qw_sign_store()
924 struct usb_composite_dev *cdev = &gi->cdev; in os_desc_link()
931 mutex_lock(&gi->lock); in os_desc_link()
932 list_for_each_entry(c, &cdev->configs, list) { in os_desc_link()
933 if (c == &c_target->c) in os_desc_link()
936 if (c != &c_target->c) { in os_desc_link()
937 ret = -EINVAL; in os_desc_link()
941 if (cdev->os_desc_config) { in os_desc_link()
942 ret = -EBUSY; in os_desc_link()
946 cdev->os_desc_config = &c_target->c; in os_desc_link()
950 mutex_unlock(&gi->lock); in os_desc_link()
959 struct usb_composite_dev *cdev = &gi->cdev; in os_desc_unlink()
961 mutex_lock(&gi->lock); in os_desc_unlink()
962 if (gi->composite.gadget_driver.udc_name) in os_desc_unlink()
964 cdev->os_desc_config = NULL; in os_desc_unlink()
965 WARN_ON(gi->composite.gadget_driver.udc_name); in os_desc_unlink()
966 mutex_unlock(&gi->lock); in os_desc_unlink()
989 return sprintf(page, "%d\n", to_usb_os_desc_ext_prop(item)->type); in ext_prop_type_show()
996 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); in ext_prop_type_store()
1000 if (desc->opts_mutex) in ext_prop_type_store()
1001 mutex_lock(desc->opts_mutex); in ext_prop_type_store()
1006 ret = -EINVAL; in ext_prop_type_store()
1010 if ((ext_prop->type == USB_EXT_PROP_BINARY || in ext_prop_type_store()
1011 ext_prop->type == USB_EXT_PROP_LE32 || in ext_prop_type_store()
1012 ext_prop->type == USB_EXT_PROP_BE32) && in ext_prop_type_store()
1016 ext_prop->data_len <<= 1; in ext_prop_type_store()
1017 else if ((ext_prop->type == USB_EXT_PROP_UNICODE || in ext_prop_type_store()
1018 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || in ext_prop_type_store()
1019 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) && in ext_prop_type_store()
1023 ext_prop->data_len >>= 1; in ext_prop_type_store()
1024 ext_prop->type = type; in ext_prop_type_store()
1028 if (desc->opts_mutex) in ext_prop_type_store()
1029 mutex_unlock(desc->opts_mutex); in ext_prop_type_store()
1036 int len = ext_prop->data_len; in ext_prop_data_show()
1038 if (ext_prop->type == USB_EXT_PROP_UNICODE || in ext_prop_data_show()
1039 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || in ext_prop_data_show()
1040 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) in ext_prop_data_show()
1042 memcpy(page, ext_prop->data, len); in ext_prop_data_show()
1051 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); in ext_prop_data_store()
1055 if (page[len - 1] == '\n' || page[len - 1] == '\0') in ext_prop_data_store()
1056 --len; in ext_prop_data_store()
1059 return -ENOMEM; in ext_prop_data_store()
1061 if (desc->opts_mutex) in ext_prop_data_store()
1062 mutex_lock(desc->opts_mutex); in ext_prop_data_store()
1063 kfree(ext_prop->data); in ext_prop_data_store()
1064 ext_prop->data = new_data; in ext_prop_data_store()
1065 desc->ext_prop_len -= ext_prop->data_len; in ext_prop_data_store()
1066 ext_prop->data_len = len; in ext_prop_data_store()
1067 desc->ext_prop_len += ext_prop->data_len; in ext_prop_data_store()
1068 if (ext_prop->type == USB_EXT_PROP_UNICODE || in ext_prop_data_store()
1069 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || in ext_prop_data_store()
1070 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) { in ext_prop_data_store()
1071 desc->ext_prop_len -= ext_prop->data_len; in ext_prop_data_store()
1072 ext_prop->data_len <<= 1; in ext_prop_data_store()
1073 ext_prop->data_len += 2; in ext_prop_data_store()
1074 desc->ext_prop_len += ext_prop->data_len; in ext_prop_data_store()
1076 if (desc->opts_mutex) in ext_prop_data_store()
1077 mutex_unlock(desc->opts_mutex); in ext_prop_data_store()
1116 return ERR_PTR(-ENOMEM); in ext_prop_make()
1122 ext_prop_type->ct_item_ops = &ext_prop_ops; in ext_prop_make()
1123 ext_prop_type->ct_attrs = ext_prop_attrs; in ext_prop_make()
1124 ext_prop_type->ct_owner = desc->owner; in ext_prop_make()
1126 config_item_init_type_name(&ext_prop->item, name, ext_prop_type); in ext_prop_make()
1128 ext_prop->name = kstrdup(name, GFP_KERNEL); in ext_prop_make()
1129 if (!ext_prop->name) { in ext_prop_make()
1131 return ERR_PTR(-ENOMEM); in ext_prop_make()
1133 desc->ext_prop_len += 14; in ext_prop_make()
1134 ext_prop->name_len = 2 * strlen(ext_prop->name) + 2; in ext_prop_make()
1135 if (desc->opts_mutex) in ext_prop_make()
1136 mutex_lock(desc->opts_mutex); in ext_prop_make()
1137 desc->ext_prop_len += ext_prop->name_len; in ext_prop_make()
1138 list_add_tail(&ext_prop->entry, &desc->ext_prop); in ext_prop_make()
1139 ++desc->ext_prop_count; in ext_prop_make()
1140 if (desc->opts_mutex) in ext_prop_make()
1141 mutex_unlock(desc->opts_mutex); in ext_prop_make()
1143 return &ext_prop->item; in ext_prop_make()
1149 struct usb_os_desc *desc = to_usb_os_desc(&group->cg_item); in ext_prop_drop()
1151 if (desc->opts_mutex) in ext_prop_drop()
1152 mutex_lock(desc->opts_mutex); in ext_prop_drop()
1153 list_del(&ext_prop->entry); in ext_prop_drop()
1154 --desc->ext_prop_count; in ext_prop_drop()
1155 kfree(ext_prop->name); in ext_prop_drop()
1156 desc->ext_prop_len -= (ext_prop->name_len + ext_prop->data_len + 14); in ext_prop_drop()
1157 if (desc->opts_mutex) in ext_prop_drop()
1158 mutex_unlock(desc->opts_mutex); in ext_prop_drop()
1170 memcpy(page, to_usb_os_desc(item)->ext_compat_id, 8); in interf_grp_compatible_id_show()
1181 if (page[l - 1] == '\n') in interf_grp_compatible_id_store()
1182 --l; in interf_grp_compatible_id_store()
1183 if (desc->opts_mutex) in interf_grp_compatible_id_store()
1184 mutex_lock(desc->opts_mutex); in interf_grp_compatible_id_store()
1185 memcpy(desc->ext_compat_id, page, l); in interf_grp_compatible_id_store()
1187 if (desc->opts_mutex) in interf_grp_compatible_id_store()
1188 mutex_unlock(desc->opts_mutex); in interf_grp_compatible_id_store()
1196 memcpy(page, to_usb_os_desc(item)->ext_compat_id + 8, 8); in interf_grp_sub_compatible_id_show()
1207 if (page[l - 1] == '\n') in interf_grp_sub_compatible_id_store()
1208 --l; in interf_grp_sub_compatible_id_store()
1209 if (desc->opts_mutex) in interf_grp_sub_compatible_id_store()
1210 mutex_lock(desc->opts_mutex); in interf_grp_sub_compatible_id_store()
1211 memcpy(desc->ext_compat_id + 8, page, l); in interf_grp_sub_compatible_id_store()
1213 if (desc->opts_mutex) in interf_grp_sub_compatible_id_store()
1214 mutex_unlock(desc->opts_mutex); in interf_grp_sub_compatible_id_store()
1245 return ERR_PTR(-ENOMEM); in usb_os_desc_prepare_interf_dir()
1251 os_desc_type->ct_owner = owner; in usb_os_desc_prepare_interf_dir()
1255 interface_type->ct_group_ops = &interf_grp_ops; in usb_os_desc_prepare_interf_dir()
1256 interface_type->ct_attrs = interf_grp_attrs; in usb_os_desc_prepare_interf_dir()
1257 interface_type->ct_owner = owner; in usb_os_desc_prepare_interf_dir()
1259 while (n_interf--) { in usb_os_desc_prepare_interf_dir()
1263 d->owner = owner; in usb_os_desc_prepare_interf_dir()
1264 config_group_init_type_name(&d->group, "", interface_type); in usb_os_desc_prepare_interf_dir()
1265 config_item_set_name(&d->group.cg_item, "interface.%s", in usb_os_desc_prepare_interf_dir()
1267 configfs_add_default_group(&d->group, os_desc_group); in usb_os_desc_prepare_interf_dir()
1277 return -EINVAL; in configfs_do_nothing()
1280 int composite_dev_prepare(struct usb_composite_driver *composite,
1290 list_for_each_entry(c, &gi->cdev.configs, list) { in purge_configs_funcs()
1296 list_for_each_entry_safe_reverse(f, tmp, &c->functions, list) { in purge_configs_funcs()
1298 list_move(&f->list, &cfg->func_list); in purge_configs_funcs()
1299 if (f->unbind) { in purge_configs_funcs()
1300 dev_dbg(&gi->cdev.gadget->dev, in purge_configs_funcs()
1302 f->name, f); in purge_configs_funcs()
1303 f->unbind(c, f); in purge_configs_funcs()
1306 if (f->bind_deactivated) in purge_configs_funcs()
1309 c->next_interface_id = 0; in purge_configs_funcs()
1310 memset(c->interface, 0, sizeof(c->interface)); in purge_configs_funcs()
1311 c->superspeed_plus = 0; in purge_configs_funcs()
1312 c->superspeed = 0; in purge_configs_funcs()
1313 c->highspeed = 0; in purge_configs_funcs()
1314 c->fullspeed = 0; in purge_configs_funcs()
1321 struct usb_composite_driver *composite = to_cdriver(gdriver); in configfs_composite_bind() local
1322 struct gadget_info *gi = container_of(composite, in configfs_composite_bind()
1323 struct gadget_info, composite); in configfs_composite_bind()
1324 struct usb_composite_dev *cdev = &gi->cdev; in configfs_composite_bind()
1330 /* the gi->lock is hold by the caller */ in configfs_composite_bind()
1331 gi->unbind = 0; in configfs_composite_bind()
1332 cdev->gadget = gadget; in configfs_composite_bind()
1334 ret = composite_dev_prepare(composite, cdev); in configfs_composite_bind()
1338 ret = -EINVAL; in configfs_composite_bind()
1340 if (list_empty(&gi->cdev.configs)) { in configfs_composite_bind()
1341 pr_err("Need at least one configuration in %s.\n", in configfs_composite_bind()
1342 gi->composite.name); in configfs_composite_bind()
1347 list_for_each_entry(c, &gi->cdev.configs, list) { in configfs_composite_bind()
1351 if (list_empty(&cfg->func_list)) { in configfs_composite_bind()
1353 c->label, c->bConfigurationValue, in configfs_composite_bind()
1354 gi->composite.name); in configfs_composite_bind()
1360 if (!list_empty(&gi->string_list)) { in configfs_composite_bind()
1364 list_for_each_entry(gs, &gi->string_list, list) { in configfs_composite_bind()
1366 gi->gstrings[i] = &gs->stringtab_dev; in configfs_composite_bind()
1367 gs->stringtab_dev.strings = gs->strings; in configfs_composite_bind()
1368 gs->strings[USB_GADGET_MANUFACTURER_IDX].s = in configfs_composite_bind()
1369 gs->manufacturer; in configfs_composite_bind()
1370 gs->strings[USB_GADGET_PRODUCT_IDX].s = gs->product; in configfs_composite_bind()
1371 gs->strings[USB_GADGET_SERIAL_IDX].s = gs->serialnumber; in configfs_composite_bind()
1374 gi->gstrings[i] = NULL; in configfs_composite_bind()
1375 s = usb_gstrings_attach(&gi->cdev, gi->gstrings, in configfs_composite_bind()
1382 gi->cdev.desc.iManufacturer = s[USB_GADGET_MANUFACTURER_IDX].id; in configfs_composite_bind()
1383 gi->cdev.desc.iProduct = s[USB_GADGET_PRODUCT_IDX].id; in configfs_composite_bind()
1384 gi->cdev.desc.iSerialNumber = s[USB_GADGET_SERIAL_IDX].id; in configfs_composite_bind()
1387 if (gi->use_os_desc) { in configfs_composite_bind()
1388 cdev->use_os_string = true; in configfs_composite_bind()
1389 cdev->b_vendor_code = gi->b_vendor_code; in configfs_composite_bind()
1390 memcpy(cdev->qw_sign, gi->qw_sign, OS_STRING_QW_SIGN_LEN); in configfs_composite_bind()
1398 ret = -ENOMEM; in configfs_composite_bind()
1407 list_for_each_entry(c, &gi->cdev.configs, list) { in configfs_composite_bind()
1414 c->descriptors = otg_desc; in configfs_composite_bind()
1417 if (!list_empty(&cfg->string_list)) { in configfs_composite_bind()
1419 list_for_each_entry(cn, &cfg->string_list, list) { in configfs_composite_bind()
1420 cfg->gstrings[i] = &cn->stringtab_dev; in configfs_composite_bind()
1421 cn->stringtab_dev.strings = &cn->strings; in configfs_composite_bind()
1422 cn->strings.s = cn->configuration; in configfs_composite_bind()
1425 cfg->gstrings[i] = NULL; in configfs_composite_bind()
1426 s = usb_gstrings_attach(&gi->cdev, cfg->gstrings, 1); in configfs_composite_bind()
1431 c->iConfiguration = s[0].id; in configfs_composite_bind()
1434 list_for_each_entry_safe(f, tmp, &cfg->func_list, list) { in configfs_composite_bind()
1435 list_del(&f->list); in configfs_composite_bind()
1438 list_add(&f->list, &cfg->func_list); in configfs_composite_bind()
1442 ret = usb_gadget_check_config(cdev->gadget); in configfs_composite_bind()
1446 usb_ep_autoconfig_reset(cdev->gadget); in configfs_composite_bind()
1448 if (cdev->use_os_string) { in configfs_composite_bind()
1449 ret = composite_os_desc_req_prepare(cdev, gadget->ep0); in configfs_composite_bind()
1454 usb_ep_autoconfig_reset(cdev->gadget); in configfs_composite_bind()
1468 struct usb_composite_dev *cdev = &gi->cdev; in android_work()
1472 /* 0-connected 1-configured 2-disconnected*/ in android_work()
1477 spin_lock_irqsave(&cdev->lock, flags); in android_work()
1478 if (cdev->config) in android_work()
1481 if (gi->connected != gi->sw_connected) { in android_work()
1482 if (gi->connected) in android_work()
1486 gi->sw_connected = gi->connected; in android_work()
1488 spin_unlock_irqrestore(&cdev->lock, flags); in android_work()
1491 kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, connected); in android_work()
1497 kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, configured); in android_work()
1503 kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, disconnected); in android_work()
1510 gi->connected, gi->sw_connected, cdev->config); in android_work()
1521 /* the gi->lock is hold by the caller */ in configfs_composite_unbind()
1525 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_unbind()
1526 gi->unbind = 1; in configfs_composite_unbind()
1527 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_unbind()
1533 usb_ep_autoconfig_reset(cdev->gadget); in configfs_composite_unbind()
1534 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_unbind()
1535 cdev->gadget = NULL; in configfs_composite_unbind()
1536 cdev->deactivations = 0; in configfs_composite_unbind()
1537 gadget->deactivated = false; in configfs_composite_unbind()
1539 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_unbind()
1549 int value = -EOPNOTSUPP; in android_setup()
1556 spin_lock_irqsave(&gi->spinlock, flags); in android_setup()
1558 if (!cdev || gi->unbind) { in android_setup()
1559 spin_unlock_irqrestore(&gi->spinlock, flags); in android_setup()
1563 if (c->bRequest == USB_REQ_GET_DESCRIPTOR && in android_setup()
1564 (c->wValue >> 8) == USB_DT_CONFIG && !gi->connected) { in android_setup()
1565 gi->connected = 1; in android_setup()
1566 schedule_work(&gi->work); in android_setup()
1569 list_for_each_entry(fi, &gi->available_func, cfs_list) { in android_setup()
1570 if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) { in android_setup()
1571 value = fi->f->setup(fi->f, c); in android_setup()
1585 if (c->bRequest == USB_REQ_SET_CONFIGURATION && in android_setup()
1586 cdev->config) { in android_setup()
1587 schedule_work(&gi->work); in android_setup()
1589 spin_unlock_irqrestore(&gi->spinlock, flags); in android_setup()
1609 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_setup()
1611 if (!cdev || gi->unbind) { in configfs_composite_setup()
1612 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_setup()
1617 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_setup()
1642 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_disconnect()
1644 if (!cdev || gi->unbind) { in configfs_composite_disconnect()
1645 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_disconnect()
1650 gi->connected = 0; in configfs_composite_disconnect()
1651 schedule_work(&gi->work); in configfs_composite_disconnect()
1654 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_disconnect()
1668 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_reset()
1670 if (!cdev || gi->unbind) { in configfs_composite_reset()
1671 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_reset()
1676 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_reset()
1690 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_suspend()
1692 if (!cdev || gi->unbind) { in configfs_composite_suspend()
1693 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_suspend()
1698 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_suspend()
1712 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_resume()
1714 if (!cdev || gi->unbind) { in configfs_composite_resume()
1715 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_resume()
1720 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_resume()
1740 .name = "configfs-gadget",
1757 cdev = &dev->cdev; in state_show()
1762 spin_lock_irqsave(&cdev->lock, flags); in state_show()
1763 if (cdev->config) in state_show()
1765 else if (dev->connected) in state_show()
1767 spin_unlock_irqrestore(&cdev->lock, flags); in state_show()
1784 INIT_WORK(&gi->work, android_work); in android_device_create()
1785 gi->dev = device_create(android_class, NULL, in android_device_create()
1787 if (IS_ERR(gi->dev)) in android_device_create()
1788 return PTR_ERR(gi->dev); in android_device_create()
1790 dev_set_drvdata(gi->dev, gi); in android_device_create()
1792 android_device = gi->dev; in android_device_create()
1798 err = device_create_file(gi->dev, attr); in android_device_create()
1800 device_destroy(gi->dev->class, in android_device_create()
1801 gi->dev->devt); in android_device_create()
1816 device_remove_file(gi->dev, attr); in android_device_destroy()
1817 device_destroy(gi->dev->class, gi->dev->devt); in android_device_destroy()
1838 return ERR_PTR(-ENOMEM); in gadgets_make()
1840 config_group_init_type_name(&gi->group, name, &gadget_root_type); in gadgets_make()
1842 config_group_init_type_name(&gi->functions_group, "functions", in gadgets_make()
1844 configfs_add_default_group(&gi->functions_group, &gi->group); in gadgets_make()
1846 config_group_init_type_name(&gi->configs_group, "configs", in gadgets_make()
1848 configfs_add_default_group(&gi->configs_group, &gi->group); in gadgets_make()
1850 config_group_init_type_name(&gi->strings_group, "strings", in gadgets_make()
1852 configfs_add_default_group(&gi->strings_group, &gi->group); in gadgets_make()
1854 config_group_init_type_name(&gi->os_desc_group, "os_desc", in gadgets_make()
1856 configfs_add_default_group(&gi->os_desc_group, &gi->group); in gadgets_make()
1858 gi->composite.bind = configfs_do_nothing; in gadgets_make()
1859 gi->composite.unbind = configfs_do_nothing; in gadgets_make()
1860 gi->composite.suspend = NULL; in gadgets_make()
1861 gi->composite.resume = NULL; in gadgets_make()
1862 gi->composite.max_speed = USB_SPEED_SUPER_PLUS; in gadgets_make()
1864 spin_lock_init(&gi->spinlock); in gadgets_make()
1865 mutex_init(&gi->lock); in gadgets_make()
1866 INIT_LIST_HEAD(&gi->string_list); in gadgets_make()
1867 INIT_LIST_HEAD(&gi->available_func); in gadgets_make()
1869 composite_init_dev(&gi->cdev); in gadgets_make()
1870 gi->cdev.desc.bLength = USB_DT_DEVICE_SIZE; in gadgets_make()
1871 gi->cdev.desc.bDescriptorType = USB_DT_DEVICE; in gadgets_make()
1872 gi->cdev.desc.bcdDevice = cpu_to_le16(get_default_bcdDevice()); in gadgets_make()
1874 gi->composite.gadget_driver = configfs_driver_template; in gadgets_make()
1876 gi->composite.gadget_driver.function = kstrdup(name, GFP_KERNEL); in gadgets_make()
1877 gi->composite.name = gi->composite.gadget_driver.function; in gadgets_make()
1879 if (!gi->composite.gadget_driver.function) in gadgets_make()
1885 return &gi->group; in gadgets_make()
1889 return ERR_PTR(-ENOMEM); in gadgets_make()
1925 mutex_lock(&gi->lock); in unregister_gadget_item()
1927 mutex_unlock(&gi->lock); in unregister_gadget_item()