Lines Matching +full:num +full:- +full:strings
1 // SPDX-License-Identifier: GPL-2.0
16 u16 num; in check_user_usb_string() local
19 ret = kstrtou16(name, 0, &num); in check_user_usb_string()
23 if (!usb_validate_langid(num)) in check_user_usb_string()
24 return -EINVAL; in check_user_usb_string()
26 stringtab_dev->language = num; in check_user_usb_string()
78 struct usb_string strings[USB_GADGET_FIRST_AVAIL_IDX]; member
93 struct usb_string strings; member
110 return -EOVERFLOW; in usb_string_copy()
112 return -EINVAL; in usb_string_copy()
119 return -ENOMEM; in usb_string_copy()
122 if (str[ret - 1] == '\n') in usb_string_copy()
123 str[ret - 1] = '\0'; in usb_string_copy()
133 to_gadget_info(item)->cdev.desc.__name); \
141 le16_to_cpup(&to_gadget_info(item)->cdev.desc.__name)); \
154 to_gadget_info(item)->cdev.desc._name = val; \
167 to_gadget_info(item)->cdev.desc._name = cpu_to_le16p(&val); \
187 return -EINVAL; in is_valid_bcd()
189 return -EINVAL; in is_valid_bcd()
191 return -EINVAL; in is_valid_bcd()
193 return -EINVAL; in is_valid_bcd()
210 to_gadget_info(item)->cdev.desc.bcdDevice = cpu_to_le16(bcdDevice); in gadget_dev_desc_bcdDevice_store()
227 to_gadget_info(item)->cdev.desc.bcdUSB = cpu_to_le16(bcdUSB); in gadget_dev_desc_bcdUSB_store()
237 mutex_lock(&gi->lock); in gadget_dev_desc_UDC_show()
238 udc_name = gi->composite.gadget_driver.udc_name; in gadget_dev_desc_UDC_show()
240 mutex_unlock(&gi->lock); in gadget_dev_desc_UDC_show()
249 if (!gi->composite.gadget_driver.udc_name) in unregister_gadget()
250 return -ENODEV; in unregister_gadget()
252 ret = usb_gadget_unregister_driver(&gi->composite.gadget_driver); in unregister_gadget()
255 kfree(gi->composite.gadget_driver.udc_name); in unregister_gadget()
256 gi->composite.gadget_driver.udc_name = NULL; in unregister_gadget()
268 return -EOVERFLOW; in gadget_dev_desc_UDC_store()
272 return -ENOMEM; in gadget_dev_desc_UDC_store()
273 if (name[len - 1] == '\n') in gadget_dev_desc_UDC_store()
274 name[len - 1] = '\0'; in gadget_dev_desc_UDC_store()
276 mutex_lock(&gi->lock); in gadget_dev_desc_UDC_store()
284 if (gi->composite.gadget_driver.udc_name) { in gadget_dev_desc_UDC_store()
285 ret = -EBUSY; in gadget_dev_desc_UDC_store()
288 gi->composite.gadget_driver.udc_name = name; in gadget_dev_desc_UDC_store()
289 ret = usb_gadget_probe_driver(&gi->composite.gadget_driver); in gadget_dev_desc_UDC_store()
291 gi->composite.gadget_driver.udc_name = NULL; in gadget_dev_desc_UDC_store()
295 mutex_unlock(&gi->lock); in gadget_dev_desc_UDC_store()
299 mutex_unlock(&gi->lock); in gadget_dev_desc_UDC_store()
306 enum usb_device_speed speed = to_gadget_info(item)->composite.max_speed; in gadget_dev_desc_max_speed_show()
316 mutex_lock(&gi->lock); in gadget_dev_desc_max_speed_store()
319 if (gi->composite.gadget_driver.udc_name) in gadget_dev_desc_max_speed_store()
322 if (strncmp(page, "super-speed-plus", 16) == 0) in gadget_dev_desc_max_speed_store()
323 gi->composite.max_speed = USB_SPEED_SUPER_PLUS; in gadget_dev_desc_max_speed_store()
324 else if (strncmp(page, "super-speed", 11) == 0) in gadget_dev_desc_max_speed_store()
325 gi->composite.max_speed = USB_SPEED_SUPER; in gadget_dev_desc_max_speed_store()
326 else if (strncmp(page, "high-speed", 10) == 0) in gadget_dev_desc_max_speed_store()
327 gi->composite.max_speed = USB_SPEED_HIGH; in gadget_dev_desc_max_speed_store()
328 else if (strncmp(page, "full-speed", 10) == 0) in gadget_dev_desc_max_speed_store()
329 gi->composite.max_speed = USB_SPEED_FULL; in gadget_dev_desc_max_speed_store()
330 else if (strncmp(page, "low-speed", 9) == 0) in gadget_dev_desc_max_speed_store()
331 gi->composite.max_speed = USB_SPEED_LOW; in gadget_dev_desc_max_speed_store()
335 gi->composite.gadget_driver.max_speed = gi->composite.max_speed; in gadget_dev_desc_max_speed_store()
337 mutex_unlock(&gi->lock); in gadget_dev_desc_max_speed_store()
340 mutex_unlock(&gi->lock); in gadget_dev_desc_max_speed_store()
341 return -EINVAL; in gadget_dev_desc_max_speed_store()
393 WARN_ON(!list_empty(&gi->cdev.configs)); in gadget_info_attr_release()
394 WARN_ON(!list_empty(&gi->string_list)); in gadget_info_attr_release()
395 WARN_ON(!list_empty(&gi->available_func)); in gadget_info_attr_release()
396 kfree(gi->composite.gadget_driver.function); in gadget_info_attr_release()
408 WARN_ON(!list_empty(&cfg->c.functions)); in gadget_config_attr_release()
409 list_del(&cfg->c.list); in gadget_config_attr_release()
410 kfree(cfg->c.label); in gadget_config_attr_release()
419 struct usb_composite_dev *cdev = cfg->c.cdev; in config_usb_cfg_link()
429 mutex_lock(&gi->lock); in config_usb_cfg_link()
435 list_for_each_entry(a_fi, &gi->available_func, cfs_list) { in config_usb_cfg_link()
440 ret = -EINVAL; in config_usb_cfg_link()
444 list_for_each_entry(f, &cfg->func_list, list) { in config_usb_cfg_link()
445 if (f->fi == fi) { in config_usb_cfg_link()
446 ret = -EEXIST; in config_usb_cfg_link()
458 list_add_tail(&f->list, &cfg->func_list); in config_usb_cfg_link()
461 mutex_unlock(&gi->lock); in config_usb_cfg_link()
470 struct usb_composite_dev *cdev = cfg->c.cdev; in config_usb_cfg_unlink()
484 mutex_lock(&gi->lock); in config_usb_cfg_unlink()
485 if (gi->composite.gadget_driver.udc_name) in config_usb_cfg_unlink()
487 WARN_ON(gi->composite.gadget_driver.udc_name); in config_usb_cfg_unlink()
489 list_for_each_entry(f, &cfg->func_list, list) { in config_usb_cfg_unlink()
490 if (f->fi == fi) { in config_usb_cfg_unlink()
491 list_del(&f->list); in config_usb_cfg_unlink()
493 mutex_unlock(&gi->lock); in config_usb_cfg_unlink()
497 mutex_unlock(&gi->lock); in config_usb_cfg_unlink()
511 return sprintf(page, "%u\n", to_config_usb_cfg(item)->c.MaxPower); in gadget_config_desc_MaxPower_show()
523 return -ERANGE; in gadget_config_desc_MaxPower_store()
524 to_config_usb_cfg(item)->c.MaxPower = val; in gadget_config_desc_MaxPower_store()
532 to_config_usb_cfg(item)->c.bmAttributes); in gadget_config_desc_bmAttributes_show()
544 return -EINVAL; in gadget_config_desc_bmAttributes_store()
547 return -EINVAL; in gadget_config_desc_bmAttributes_store()
548 to_config_usb_cfg(item)->c.bmAttributes = val; in gadget_config_desc_bmAttributes_store()
575 spin_lock_init(&cdev->lock); in composite_init_dev()
576 INIT_LIST_HEAD(&cdev->configs); in composite_init_dev()
577 INIT_LIST_HEAD(&cdev->gstrings); in composite_init_dev()
593 return ERR_PTR(-ENAMETOOLONG); in function_make()
599 return ERR_PTR(-EINVAL); in function_make()
608 ret = config_item_set_name(&fi->group.cg_item, "%s", name); in function_make()
613 if (fi->set_inst_name) { in function_make()
614 ret = fi->set_inst_name(fi, instance_name); in function_make()
623 mutex_lock(&gi->lock); in function_make()
624 list_add_tail(&fi->cfs_list, &gi->available_func); in function_make()
625 mutex_unlock(&gi->lock); in function_make()
626 return &fi->group; in function_make()
638 mutex_lock(&gi->lock); in function_drop()
639 list_del(&fi->cfs_list); in function_drop()
640 mutex_unlock(&gi->lock); in function_drop()
665 kfree(cn->configuration); in gadget_config_name_attr_release()
667 list_del(&cn->list); in gadget_config_name_attr_release()
682 u8 num; in config_desc_make() local
688 return ERR_PTR(-ENAMETOOLONG); in config_desc_make()
693 return ERR_PTR(-EINVAL); in config_desc_make()
700 return ERR_PTR(-EINVAL); in config_desc_make()
702 ret = kstrtou8(num_str, 0, &num); in config_desc_make()
708 return ERR_PTR(-ENOMEM); in config_desc_make()
709 cfg->c.label = kstrdup(buf, GFP_KERNEL); in config_desc_make()
710 if (!cfg->c.label) { in config_desc_make()
711 ret = -ENOMEM; in config_desc_make()
714 cfg->c.bConfigurationValue = num; in config_desc_make()
715 cfg->c.MaxPower = CONFIG_USB_GADGET_VBUS_DRAW; in config_desc_make()
716 cfg->c.bmAttributes = USB_CONFIG_ATT_ONE; in config_desc_make()
717 INIT_LIST_HEAD(&cfg->string_list); in config_desc_make()
718 INIT_LIST_HEAD(&cfg->func_list); in config_desc_make()
720 config_group_init_type_name(&cfg->group, name, in config_desc_make()
723 config_group_init_type_name(&cfg->strings_group, "strings", in config_desc_make()
725 configfs_add_default_group(&cfg->strings_group, &cfg->group); in config_desc_make()
727 ret = usb_add_config_only(&gi->cdev, &cfg->c); in config_desc_make()
731 return &cfg->group; in config_desc_make()
733 kfree(cfg->c.label); in config_desc_make()
770 kfree(gs->manufacturer); in gadget_strings_attr_release()
771 kfree(gs->product); in gadget_strings_attr_release()
772 kfree(gs->serialnumber); in gadget_strings_attr_release()
774 list_del(&gs->list); in gadget_strings_attr_release()
789 return to_gadget_info(to_os_desc(item)->group.cg_item.ci_parent); in os_desc_item_to_gadget_info()
795 os_desc_item_to_gadget_info(item)->use_os_desc); in os_desc_use_show()
805 mutex_lock(&gi->lock); in os_desc_use_store()
808 gi->use_os_desc = use; in os_desc_use_store()
811 mutex_unlock(&gi->lock); in os_desc_use_store()
819 os_desc_item_to_gadget_info(item)->b_vendor_code); in os_desc_b_vendor_code_show()
829 mutex_lock(&gi->lock); in os_desc_b_vendor_code_store()
832 gi->b_vendor_code = b_vendor_code; in os_desc_b_vendor_code_store()
835 mutex_unlock(&gi->lock); in os_desc_b_vendor_code_store()
845 res = utf16s_to_utf8s((wchar_t *) gi->qw_sign, OS_STRING_QW_SIGN_LEN, in os_desc_qw_sign_show()
846 UTF16_LITTLE_ENDIAN, page, PAGE_SIZE - 1); in os_desc_qw_sign_show()
861 if (page[l - 1] == '\n') in os_desc_qw_sign_store()
862 --l; in os_desc_qw_sign_store()
864 mutex_lock(&gi->lock); in os_desc_qw_sign_store()
866 UTF16_LITTLE_ENDIAN, (wchar_t *) gi->qw_sign, in os_desc_qw_sign_store()
870 mutex_unlock(&gi->lock); in os_desc_qw_sign_store()
897 struct usb_composite_dev *cdev = &gi->cdev; in os_desc_link()
904 mutex_lock(&gi->lock); in os_desc_link()
905 list_for_each_entry(c, &cdev->configs, list) { in os_desc_link()
906 if (c == &c_target->c) in os_desc_link()
909 if (c != &c_target->c) { in os_desc_link()
910 ret = -EINVAL; in os_desc_link()
914 if (cdev->os_desc_config) { in os_desc_link()
915 ret = -EBUSY; in os_desc_link()
919 cdev->os_desc_config = &c_target->c; in os_desc_link()
923 mutex_unlock(&gi->lock); in os_desc_link()
932 struct usb_composite_dev *cdev = &gi->cdev; in os_desc_unlink()
934 mutex_lock(&gi->lock); in os_desc_unlink()
935 if (gi->composite.gadget_driver.udc_name) in os_desc_unlink()
937 cdev->os_desc_config = NULL; in os_desc_unlink()
938 WARN_ON(gi->composite.gadget_driver.udc_name); in os_desc_unlink()
939 mutex_unlock(&gi->lock); in os_desc_unlink()
962 return sprintf(page, "%d\n", to_usb_os_desc_ext_prop(item)->type); in ext_prop_type_show()
969 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); in ext_prop_type_store()
973 if (desc->opts_mutex) in ext_prop_type_store()
974 mutex_lock(desc->opts_mutex); in ext_prop_type_store()
979 ret = -EINVAL; in ext_prop_type_store()
983 if ((ext_prop->type == USB_EXT_PROP_BINARY || in ext_prop_type_store()
984 ext_prop->type == USB_EXT_PROP_LE32 || in ext_prop_type_store()
985 ext_prop->type == USB_EXT_PROP_BE32) && in ext_prop_type_store()
989 ext_prop->data_len <<= 1; in ext_prop_type_store()
990 else if ((ext_prop->type == USB_EXT_PROP_UNICODE || in ext_prop_type_store()
991 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || in ext_prop_type_store()
992 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) && in ext_prop_type_store()
996 ext_prop->data_len >>= 1; in ext_prop_type_store()
997 ext_prop->type = type; in ext_prop_type_store()
1001 if (desc->opts_mutex) in ext_prop_type_store()
1002 mutex_unlock(desc->opts_mutex); in ext_prop_type_store()
1009 int len = ext_prop->data_len; in ext_prop_data_show()
1011 if (ext_prop->type == USB_EXT_PROP_UNICODE || in ext_prop_data_show()
1012 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || in ext_prop_data_show()
1013 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) in ext_prop_data_show()
1015 memcpy(page, ext_prop->data, len); in ext_prop_data_show()
1024 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); in ext_prop_data_store()
1028 if (page[len - 1] == '\n' || page[len - 1] == '\0') in ext_prop_data_store()
1029 --len; in ext_prop_data_store()
1032 return -ENOMEM; in ext_prop_data_store()
1034 if (desc->opts_mutex) in ext_prop_data_store()
1035 mutex_lock(desc->opts_mutex); in ext_prop_data_store()
1036 kfree(ext_prop->data); in ext_prop_data_store()
1037 ext_prop->data = new_data; in ext_prop_data_store()
1038 desc->ext_prop_len -= ext_prop->data_len; in ext_prop_data_store()
1039 ext_prop->data_len = len; in ext_prop_data_store()
1040 desc->ext_prop_len += ext_prop->data_len; in ext_prop_data_store()
1041 if (ext_prop->type == USB_EXT_PROP_UNICODE || in ext_prop_data_store()
1042 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || in ext_prop_data_store()
1043 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) { in ext_prop_data_store()
1044 desc->ext_prop_len -= ext_prop->data_len; in ext_prop_data_store()
1045 ext_prop->data_len <<= 1; in ext_prop_data_store()
1046 ext_prop->data_len += 2; in ext_prop_data_store()
1047 desc->ext_prop_len += ext_prop->data_len; in ext_prop_data_store()
1049 if (desc->opts_mutex) in ext_prop_data_store()
1050 mutex_unlock(desc->opts_mutex); in ext_prop_data_store()
1089 return ERR_PTR(-ENOMEM); in ext_prop_make()
1095 ext_prop_type->ct_item_ops = &ext_prop_ops; in ext_prop_make()
1096 ext_prop_type->ct_attrs = ext_prop_attrs; in ext_prop_make()
1097 ext_prop_type->ct_owner = desc->owner; in ext_prop_make()
1099 config_item_init_type_name(&ext_prop->item, name, ext_prop_type); in ext_prop_make()
1101 ext_prop->name = kstrdup(name, GFP_KERNEL); in ext_prop_make()
1102 if (!ext_prop->name) { in ext_prop_make()
1104 return ERR_PTR(-ENOMEM); in ext_prop_make()
1106 desc->ext_prop_len += 14; in ext_prop_make()
1107 ext_prop->name_len = 2 * strlen(ext_prop->name) + 2; in ext_prop_make()
1108 if (desc->opts_mutex) in ext_prop_make()
1109 mutex_lock(desc->opts_mutex); in ext_prop_make()
1110 desc->ext_prop_len += ext_prop->name_len; in ext_prop_make()
1111 list_add_tail(&ext_prop->entry, &desc->ext_prop); in ext_prop_make()
1112 ++desc->ext_prop_count; in ext_prop_make()
1113 if (desc->opts_mutex) in ext_prop_make()
1114 mutex_unlock(desc->opts_mutex); in ext_prop_make()
1116 return &ext_prop->item; in ext_prop_make()
1122 struct usb_os_desc *desc = to_usb_os_desc(&group->cg_item); in ext_prop_drop()
1124 if (desc->opts_mutex) in ext_prop_drop()
1125 mutex_lock(desc->opts_mutex); in ext_prop_drop()
1126 list_del(&ext_prop->entry); in ext_prop_drop()
1127 --desc->ext_prop_count; in ext_prop_drop()
1128 kfree(ext_prop->name); in ext_prop_drop()
1129 desc->ext_prop_len -= (ext_prop->name_len + ext_prop->data_len + 14); in ext_prop_drop()
1130 if (desc->opts_mutex) in ext_prop_drop()
1131 mutex_unlock(desc->opts_mutex); in ext_prop_drop()
1143 memcpy(page, to_usb_os_desc(item)->ext_compat_id, 8); in interf_grp_compatible_id_show()
1154 if (page[l - 1] == '\n') in interf_grp_compatible_id_store()
1155 --l; in interf_grp_compatible_id_store()
1156 if (desc->opts_mutex) in interf_grp_compatible_id_store()
1157 mutex_lock(desc->opts_mutex); in interf_grp_compatible_id_store()
1158 memcpy(desc->ext_compat_id, page, l); in interf_grp_compatible_id_store()
1160 if (desc->opts_mutex) in interf_grp_compatible_id_store()
1161 mutex_unlock(desc->opts_mutex); in interf_grp_compatible_id_store()
1169 memcpy(page, to_usb_os_desc(item)->ext_compat_id + 8, 8); in interf_grp_sub_compatible_id_show()
1180 if (page[l - 1] == '\n') in interf_grp_sub_compatible_id_store()
1181 --l; in interf_grp_sub_compatible_id_store()
1182 if (desc->opts_mutex) in interf_grp_sub_compatible_id_store()
1183 mutex_lock(desc->opts_mutex); in interf_grp_sub_compatible_id_store()
1184 memcpy(desc->ext_compat_id + 8, page, l); in interf_grp_sub_compatible_id_store()
1186 if (desc->opts_mutex) in interf_grp_sub_compatible_id_store()
1187 mutex_unlock(desc->opts_mutex); in interf_grp_sub_compatible_id_store()
1218 return ERR_PTR(-ENOMEM); in usb_os_desc_prepare_interf_dir()
1224 os_desc_type->ct_owner = owner; in usb_os_desc_prepare_interf_dir()
1228 interface_type->ct_group_ops = &interf_grp_ops; in usb_os_desc_prepare_interf_dir()
1229 interface_type->ct_attrs = interf_grp_attrs; in usb_os_desc_prepare_interf_dir()
1230 interface_type->ct_owner = owner; in usb_os_desc_prepare_interf_dir()
1232 while (n_interf--) { in usb_os_desc_prepare_interf_dir()
1236 d->owner = owner; in usb_os_desc_prepare_interf_dir()
1237 config_group_init_type_name(&d->group, "", interface_type); in usb_os_desc_prepare_interf_dir()
1238 config_item_set_name(&d->group.cg_item, "interface.%s", in usb_os_desc_prepare_interf_dir()
1240 configfs_add_default_group(&d->group, os_desc_group); in usb_os_desc_prepare_interf_dir()
1250 return -EINVAL; in configfs_do_nothing()
1263 list_for_each_entry(c, &gi->cdev.configs, list) { in purge_configs_funcs()
1269 list_for_each_entry_safe_reverse(f, tmp, &c->functions, list) { in purge_configs_funcs()
1271 list_move(&f->list, &cfg->func_list); in purge_configs_funcs()
1272 if (f->unbind) { in purge_configs_funcs()
1273 dev_dbg(&gi->cdev.gadget->dev, in purge_configs_funcs()
1275 f->name, f); in purge_configs_funcs()
1276 f->unbind(c, f); in purge_configs_funcs()
1279 c->next_interface_id = 0; in purge_configs_funcs()
1280 memset(c->interface, 0, sizeof(c->interface)); in purge_configs_funcs()
1281 c->superspeed_plus = 0; in purge_configs_funcs()
1282 c->superspeed = 0; in purge_configs_funcs()
1283 c->highspeed = 0; in purge_configs_funcs()
1284 c->fullspeed = 0; in purge_configs_funcs()
1294 struct usb_composite_dev *cdev = &gi->cdev; in configfs_composite_bind()
1300 /* the gi->lock is hold by the caller */ in configfs_composite_bind()
1301 gi->unbind = 0; in configfs_composite_bind()
1302 cdev->gadget = gadget; in configfs_composite_bind()
1308 ret = -EINVAL; in configfs_composite_bind()
1310 if (list_empty(&gi->cdev.configs)) { in configfs_composite_bind()
1312 gi->composite.name); in configfs_composite_bind()
1317 list_for_each_entry(c, &gi->cdev.configs, list) { in configfs_composite_bind()
1321 if (list_empty(&cfg->func_list)) { in configfs_composite_bind()
1323 c->label, c->bConfigurationValue, in configfs_composite_bind()
1324 gi->composite.name); in configfs_composite_bind()
1329 /* init all strings */ in configfs_composite_bind()
1330 if (!list_empty(&gi->string_list)) { in configfs_composite_bind()
1334 list_for_each_entry(gs, &gi->string_list, list) { in configfs_composite_bind()
1336 gi->gstrings[i] = &gs->stringtab_dev; in configfs_composite_bind()
1337 gs->stringtab_dev.strings = gs->strings; in configfs_composite_bind()
1338 gs->strings[USB_GADGET_MANUFACTURER_IDX].s = in configfs_composite_bind()
1339 gs->manufacturer; in configfs_composite_bind()
1340 gs->strings[USB_GADGET_PRODUCT_IDX].s = gs->product; in configfs_composite_bind()
1341 gs->strings[USB_GADGET_SERIAL_IDX].s = gs->serialnumber; in configfs_composite_bind()
1344 gi->gstrings[i] = NULL; in configfs_composite_bind()
1345 s = usb_gstrings_attach(&gi->cdev, gi->gstrings, in configfs_composite_bind()
1352 gi->cdev.desc.iManufacturer = s[USB_GADGET_MANUFACTURER_IDX].id; in configfs_composite_bind()
1353 gi->cdev.desc.iProduct = s[USB_GADGET_PRODUCT_IDX].id; in configfs_composite_bind()
1354 gi->cdev.desc.iSerialNumber = s[USB_GADGET_SERIAL_IDX].id; in configfs_composite_bind()
1357 if (gi->use_os_desc) { in configfs_composite_bind()
1358 cdev->use_os_string = true; in configfs_composite_bind()
1359 cdev->b_vendor_code = gi->b_vendor_code; in configfs_composite_bind()
1360 memcpy(cdev->qw_sign, gi->qw_sign, OS_STRING_QW_SIGN_LEN); in configfs_composite_bind()
1368 ret = -ENOMEM; in configfs_composite_bind()
1377 list_for_each_entry(c, &gi->cdev.configs, list) { in configfs_composite_bind()
1384 c->descriptors = otg_desc; in configfs_composite_bind()
1387 if (!list_empty(&cfg->string_list)) { in configfs_composite_bind()
1389 list_for_each_entry(cn, &cfg->string_list, list) { in configfs_composite_bind()
1390 cfg->gstrings[i] = &cn->stringtab_dev; in configfs_composite_bind()
1391 cn->stringtab_dev.strings = &cn->strings; in configfs_composite_bind()
1392 cn->strings.s = cn->configuration; in configfs_composite_bind()
1395 cfg->gstrings[i] = NULL; in configfs_composite_bind()
1396 s = usb_gstrings_attach(&gi->cdev, cfg->gstrings, 1); in configfs_composite_bind()
1401 c->iConfiguration = s[0].id; in configfs_composite_bind()
1404 list_for_each_entry_safe(f, tmp, &cfg->func_list, list) { in configfs_composite_bind()
1405 list_del(&f->list); in configfs_composite_bind()
1408 list_add(&f->list, &cfg->func_list); in configfs_composite_bind()
1412 usb_ep_autoconfig_reset(cdev->gadget); in configfs_composite_bind()
1414 if (cdev->use_os_string) { in configfs_composite_bind()
1415 ret = composite_os_desc_req_prepare(cdev, gadget->ep0); in configfs_composite_bind()
1420 usb_ep_autoconfig_reset(cdev->gadget); in configfs_composite_bind()
1436 /* the gi->lock is hold by the caller */ in configfs_composite_unbind()
1440 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_unbind()
1441 gi->unbind = 1; in configfs_composite_unbind()
1442 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_unbind()
1448 usb_ep_autoconfig_reset(cdev->gadget); in configfs_composite_unbind()
1449 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_unbind()
1450 cdev->gadget = NULL; in configfs_composite_unbind()
1451 cdev->deactivations = 0; in configfs_composite_unbind()
1452 gadget->deactivated = false; in configfs_composite_unbind()
1454 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_unbind()
1470 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_setup()
1472 if (!cdev || gi->unbind) { in configfs_composite_setup()
1473 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_setup()
1478 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_setup()
1493 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_disconnect()
1495 if (!cdev || gi->unbind) { in configfs_composite_disconnect()
1496 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_disconnect()
1501 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_disconnect()
1515 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_suspend()
1517 if (!cdev || gi->unbind) { in configfs_composite_suspend()
1518 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_suspend()
1523 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_suspend()
1537 spin_lock_irqsave(&gi->spinlock, flags); in configfs_composite_resume()
1539 if (!cdev || gi->unbind) { in configfs_composite_resume()
1540 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_resume()
1545 spin_unlock_irqrestore(&gi->spinlock, flags); in configfs_composite_resume()
1562 .name = "configfs-gadget",
1575 return ERR_PTR(-ENOMEM); in gadgets_make()
1577 config_group_init_type_name(&gi->group, name, &gadget_root_type); in gadgets_make()
1579 config_group_init_type_name(&gi->functions_group, "functions", in gadgets_make()
1581 configfs_add_default_group(&gi->functions_group, &gi->group); in gadgets_make()
1583 config_group_init_type_name(&gi->configs_group, "configs", in gadgets_make()
1585 configfs_add_default_group(&gi->configs_group, &gi->group); in gadgets_make()
1587 config_group_init_type_name(&gi->strings_group, "strings", in gadgets_make()
1589 configfs_add_default_group(&gi->strings_group, &gi->group); in gadgets_make()
1591 config_group_init_type_name(&gi->os_desc_group, "os_desc", in gadgets_make()
1593 configfs_add_default_group(&gi->os_desc_group, &gi->group); in gadgets_make()
1595 gi->composite.bind = configfs_do_nothing; in gadgets_make()
1596 gi->composite.unbind = configfs_do_nothing; in gadgets_make()
1597 gi->composite.suspend = NULL; in gadgets_make()
1598 gi->composite.resume = NULL; in gadgets_make()
1599 gi->composite.max_speed = USB_SPEED_SUPER_PLUS; in gadgets_make()
1601 spin_lock_init(&gi->spinlock); in gadgets_make()
1602 mutex_init(&gi->lock); in gadgets_make()
1603 INIT_LIST_HEAD(&gi->string_list); in gadgets_make()
1604 INIT_LIST_HEAD(&gi->available_func); in gadgets_make()
1606 composite_init_dev(&gi->cdev); in gadgets_make()
1607 gi->cdev.desc.bLength = USB_DT_DEVICE_SIZE; in gadgets_make()
1608 gi->cdev.desc.bDescriptorType = USB_DT_DEVICE; in gadgets_make()
1609 gi->cdev.desc.bcdDevice = cpu_to_le16(get_default_bcdDevice()); in gadgets_make()
1611 gi->composite.gadget_driver = configfs_driver_template; in gadgets_make()
1613 gi->composite.gadget_driver.function = kstrdup(name, GFP_KERNEL); in gadgets_make()
1614 gi->composite.name = gi->composite.gadget_driver.function; in gadgets_make()
1616 if (!gi->composite.gadget_driver.function) in gadgets_make()
1619 return &gi->group; in gadgets_make()
1622 return ERR_PTR(-ENOMEM); in gadgets_make()
1654 mutex_lock(&gi->lock); in unregister_gadget_item()
1656 mutex_unlock(&gi->lock); in unregister_gadget_item()