Lines Matching +full:num +full:- +full:strings
1 // SPDX-License-Identifier: GPL-2.0
18 /* -----------------------------------------------------------------------------
47 return li < ri ? -1 : li == ri ? 0 : 1; in uvcg_config_compare_u32()
58 unsigned int num; in __uvcg_fill_item_entries() local
62 ret = kstrtouint(buf, 0, &num); in __uvcg_fill_item_entries()
66 if (num != (num & GENMASK((size * 8) - 1, 0))) in __uvcg_fill_item_entries()
67 return -ERANGE; in __uvcg_fill_item_entries()
70 memcpy(*values, &num, size); in __uvcg_fill_item_entries()
87 return -EINVAL; in __uvcg_iter_item_entries()
91 return -ENOMEM; in __uvcg_iter_item_entries()
93 while (pg - page < len) { in __uvcg_iter_item_entries()
95 while (i < sizeof(buf) && (pg - page < len) && in __uvcg_iter_item_entries()
99 ret = -EINVAL; in __uvcg_iter_item_entries()
102 while ((pg - page < len) && (*pg == '\0' || *pg == '\n')) in __uvcg_iter_item_entries()
142 if (type->create_children) in uvcg_config_create_children()
143 return type->create_children(group); in uvcg_config_create_children()
145 for (child = type->children; child && *child; ++child) { in uvcg_config_create_children()
161 return -ENOMEM; in uvcg_config_create_group()
163 config_group_init_type_name(group, type->name, &type->type); in uvcg_config_create_group()
173 list_for_each_entry_safe(child, n, &group->default_groups, group_entry) { in uvcg_config_remove_children()
174 list_del(&child->group_entry); in uvcg_config_remove_children()
176 config_item_put(&child->cg_item); in uvcg_config_remove_children()
180 /* -----------------------------------------------------------------------------
192 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
197 opts_item = ch->item.ci_parent->ci_parent->ci_parent; \
200 mutex_lock(&opts->lock); \
201 result = sprintf(page, "%u\n", le##bits##_to_cpu(ch->desc.aname));\
202 mutex_unlock(&opts->lock); \
215 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
217 u##bits num; \
221 opts_item = ch->item.ci_parent->ci_parent->ci_parent; \
224 mutex_lock(&opts->lock); \
225 if (ch->linked || opts->refcnt) { \
226 ret = -EBUSY; \
230 ret = kstrtou##bits(page, 0, &num); \
234 if (num > limit) { \
235 ret = -EINVAL; \
238 ch->desc.aname = cpu_to_le##bits(num); \
241 mutex_unlock(&opts->lock); \
273 return ERR_PTR(-ENOMEM); in uvcg_control_header_make()
275 h->desc.bLength = UVC_DT_HEADER_SIZE(1); in uvcg_control_header_make()
276 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_control_header_make()
277 h->desc.bDescriptorSubType = UVC_VC_HEADER; in uvcg_control_header_make()
278 h->desc.bcdUVC = cpu_to_le16(0x0110); in uvcg_control_header_make()
279 h->desc.dwClockFrequency = cpu_to_le32(48000000); in uvcg_control_header_make()
281 config_item_init_type_name(&h->item, name, &uvcg_control_header_type); in uvcg_control_header_make()
283 return &h->item; in uvcg_control_header_make()
299 /* -----------------------------------------------------------------------------
310 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
316 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
318 pd = &opts->uvc_processing; \
320 mutex_lock(&opts->lock); \
321 result = sprintf(page, "%u\n", le##bits##_to_cpu(pd->aname)); \
322 mutex_unlock(&opts->lock); \
341 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_processing_bm_controls_store()
351 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_default_processing_bm_controls_store()
353 pd = &opts->uvc_processing; in uvcg_default_processing_bm_controls_store()
355 mutex_lock(&opts->lock); in uvcg_default_processing_bm_controls_store()
356 if (opts->refcnt) { in uvcg_default_processing_bm_controls_store()
357 ret = -EBUSY; in uvcg_default_processing_bm_controls_store()
366 if (n > pd->bControlSize) { in uvcg_default_processing_bm_controls_store()
367 ret = -EINVAL; in uvcg_default_processing_bm_controls_store()
373 ret = -ENOMEM; in uvcg_default_processing_bm_controls_store()
383 pd->bmControls[i] = bm_controls[i]; in uvcg_default_processing_bm_controls_store()
390 mutex_unlock(&opts->lock); in uvcg_default_processing_bm_controls_store()
401 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_processing_bm_controls_show()
408 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_default_processing_bm_controls_show()
410 pd = &opts->uvc_processing; in uvcg_default_processing_bm_controls_show()
412 mutex_lock(&opts->lock); in uvcg_default_processing_bm_controls_show()
413 for (result = 0, i = 0; i < pd->bControlSize; ++i) { in uvcg_default_processing_bm_controls_show()
414 result += sprintf(pg, "%u\n", pd->bmControls[i]); in uvcg_default_processing_bm_controls_show()
417 mutex_unlock(&opts->lock); in uvcg_default_processing_bm_controls_show()
444 /* -----------------------------------------------------------------------------
460 /* -----------------------------------------------------------------------------
471 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
477 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> \
480 cd = &opts->uvc_camera_terminal; \
482 mutex_lock(&opts->lock); \
483 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
484 mutex_unlock(&opts->lock); \
510 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_camera_bm_controls_store()
520 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> in uvcg_default_camera_bm_controls_store()
523 cd = &opts->uvc_camera_terminal; in uvcg_default_camera_bm_controls_store()
525 mutex_lock(&opts->lock); in uvcg_default_camera_bm_controls_store()
526 if (opts->refcnt) { in uvcg_default_camera_bm_controls_store()
527 ret = -EBUSY; in uvcg_default_camera_bm_controls_store()
536 if (n > cd->bControlSize) { in uvcg_default_camera_bm_controls_store()
537 ret = -EINVAL; in uvcg_default_camera_bm_controls_store()
543 ret = -ENOMEM; in uvcg_default_camera_bm_controls_store()
553 cd->bmControls[i] = bm_controls[i]; in uvcg_default_camera_bm_controls_store()
560 mutex_unlock(&opts->lock); in uvcg_default_camera_bm_controls_store()
571 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_camera_bm_controls_show()
578 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> in uvcg_default_camera_bm_controls_show()
581 cd = &opts->uvc_camera_terminal; in uvcg_default_camera_bm_controls_show()
583 mutex_lock(&opts->lock); in uvcg_default_camera_bm_controls_show()
584 for (result = 0, i = 0; i < cd->bControlSize; ++i) { in uvcg_default_camera_bm_controls_show()
585 result += sprintf(pg, "%u\n", cd->bmControls[i]); in uvcg_default_camera_bm_controls_show()
588 mutex_unlock(&opts->lock); in uvcg_default_camera_bm_controls_show()
617 /* -----------------------------------------------------------------------------
633 /* -----------------------------------------------------------------------------
644 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
650 opts_item = group->cg_item.ci_parent->ci_parent-> \
651 ci_parent->ci_parent; \
653 cd = &opts->uvc_output_terminal; \
655 mutex_lock(&opts->lock); \
656 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
657 mutex_unlock(&opts->lock); \
679 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_output_b_source_id_show()
685 opts_item = group->cg_item.ci_parent->ci_parent-> in uvcg_default_output_b_source_id_show()
686 ci_parent->ci_parent; in uvcg_default_output_b_source_id_show()
688 cd = &opts->uvc_output_terminal; in uvcg_default_output_b_source_id_show()
690 mutex_lock(&opts->lock); in uvcg_default_output_b_source_id_show()
691 result = sprintf(page, "%u\n", le8_to_cpu(cd->bSourceID)); in uvcg_default_output_b_source_id_show()
692 mutex_unlock(&opts->lock); in uvcg_default_output_b_source_id_show()
705 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_output_b_source_id_store()
708 u8 num; in uvcg_default_output_b_source_id_store() local
710 result = kstrtou8(page, 0, &num); in uvcg_default_output_b_source_id_store()
716 opts_item = group->cg_item.ci_parent->ci_parent-> in uvcg_default_output_b_source_id_store()
717 ci_parent->ci_parent; in uvcg_default_output_b_source_id_store()
719 cd = &opts->uvc_output_terminal; in uvcg_default_output_b_source_id_store()
721 mutex_lock(&opts->lock); in uvcg_default_output_b_source_id_store()
722 cd->bSourceID = num; in uvcg_default_output_b_source_id_store()
723 mutex_unlock(&opts->lock); in uvcg_default_output_b_source_id_store()
749 /* -----------------------------------------------------------------------------
765 /* -----------------------------------------------------------------------------
782 /* -----------------------------------------------------------------------------
790 struct config_group *group = to_config_group(item->ci_parent); \
791 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
799 opts_item = item->ci_parent->ci_parent->ci_parent; \
802 mutex_lock(&opts->lock); \
803 ret = sprintf(page, "%u\n", xu->desc.aname); \
804 mutex_unlock(&opts->lock); \
819 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_b_num_controls_store()
820 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_b_num_controls_store()
825 u8 num; in uvcg_extension_b_num_controls_store() local
827 ret = kstrtou8(page, 0, &num); in uvcg_extension_b_num_controls_store()
833 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_b_num_controls_store()
836 mutex_lock(&opts->lock); in uvcg_extension_b_num_controls_store()
837 xu->desc.bNumControls = num; in uvcg_extension_b_num_controls_store()
838 mutex_unlock(&opts->lock); in uvcg_extension_b_num_controls_store()
853 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_b_nr_in_pins_store()
854 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_b_nr_in_pins_store()
860 u8 num; in uvcg_extension_b_nr_in_pins_store() local
862 ret = kstrtou8(page, 0, &num); in uvcg_extension_b_nr_in_pins_store()
868 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_b_nr_in_pins_store()
871 mutex_lock(&opts->lock); in uvcg_extension_b_nr_in_pins_store()
873 if (num == xu->desc.bNrInPins) { in uvcg_extension_b_nr_in_pins_store()
878 tmp_buf = krealloc_array(xu->desc.baSourceID, num, sizeof(u8), in uvcg_extension_b_nr_in_pins_store()
881 ret = -ENOMEM; in uvcg_extension_b_nr_in_pins_store()
885 xu->desc.baSourceID = tmp_buf; in uvcg_extension_b_nr_in_pins_store()
886 xu->desc.bNrInPins = num; in uvcg_extension_b_nr_in_pins_store()
887 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_b_nr_in_pins_store()
888 xu->desc.bControlSize); in uvcg_extension_b_nr_in_pins_store()
893 mutex_unlock(&opts->lock); in uvcg_extension_b_nr_in_pins_store()
906 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_b_control_size_store()
907 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_b_control_size_store()
913 u8 num; in uvcg_extension_b_control_size_store() local
915 ret = kstrtou8(page, 0, &num); in uvcg_extension_b_control_size_store()
921 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_b_control_size_store()
924 mutex_lock(&opts->lock); in uvcg_extension_b_control_size_store()
926 if (num == xu->desc.bControlSize) { in uvcg_extension_b_control_size_store()
931 tmp_buf = krealloc_array(xu->desc.bmControls, num, sizeof(u8), in uvcg_extension_b_control_size_store()
934 ret = -ENOMEM; in uvcg_extension_b_control_size_store()
938 xu->desc.bmControls = tmp_buf; in uvcg_extension_b_control_size_store()
939 xu->desc.bControlSize = num; in uvcg_extension_b_control_size_store()
940 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_b_control_size_store()
941 xu->desc.bControlSize); in uvcg_extension_b_control_size_store()
946 mutex_unlock(&opts->lock); in uvcg_extension_b_control_size_store()
956 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_guid_extension_code_show()
957 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_guid_extension_code_show()
964 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_guid_extension_code_show()
967 mutex_lock(&opts->lock); in uvcg_extension_guid_extension_code_show()
968 memcpy(page, xu->desc.guidExtensionCode, sizeof(xu->desc.guidExtensionCode)); in uvcg_extension_guid_extension_code_show()
969 mutex_unlock(&opts->lock); in uvcg_extension_guid_extension_code_show()
973 return sizeof(xu->desc.guidExtensionCode); in uvcg_extension_guid_extension_code_show()
979 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_guid_extension_code_store()
980 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_guid_extension_code_store()
988 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_guid_extension_code_store()
991 mutex_lock(&opts->lock); in uvcg_extension_guid_extension_code_store()
992 memcpy(xu->desc.guidExtensionCode, page, in uvcg_extension_guid_extension_code_store()
993 min(sizeof(xu->desc.guidExtensionCode), len)); in uvcg_extension_guid_extension_code_store()
994 mutex_unlock(&opts->lock); in uvcg_extension_guid_extension_code_store()
998 ret = sizeof(xu->desc.guidExtensionCode); in uvcg_extension_guid_extension_code_store()
1008 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_ba_source_id_show()
1009 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_ba_source_id_show()
1018 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_ba_source_id_show()
1021 mutex_lock(&opts->lock); in uvcg_extension_ba_source_id_show()
1022 for (ret = 0, i = 0; i < xu->desc.bNrInPins; ++i) { in uvcg_extension_ba_source_id_show()
1023 ret += sprintf(pg, "%u\n", xu->desc.baSourceID[i]); in uvcg_extension_ba_source_id_show()
1026 mutex_unlock(&opts->lock); in uvcg_extension_ba_source_id_show()
1036 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_ba_source_id_store()
1037 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_ba_source_id_store()
1046 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_ba_source_id_store()
1049 mutex_lock(&opts->lock); in uvcg_extension_ba_source_id_store()
1058 ret = -ENOMEM; in uvcg_extension_ba_source_id_store()
1069 kfree(xu->desc.baSourceID); in uvcg_extension_ba_source_id_store()
1070 xu->desc.baSourceID = source_ids; in uvcg_extension_ba_source_id_store()
1071 xu->desc.bNrInPins = n; in uvcg_extension_ba_source_id_store()
1072 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_ba_source_id_store()
1073 xu->desc.bControlSize); in uvcg_extension_ba_source_id_store()
1078 mutex_unlock(&opts->lock); in uvcg_extension_ba_source_id_store()
1087 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_bm_controls_show()
1088 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_bm_controls_show()
1097 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_bm_controls_show()
1100 mutex_lock(&opts->lock); in uvcg_extension_bm_controls_show()
1101 for (ret = 0, i = 0; i < xu->desc.bControlSize; ++i) { in uvcg_extension_bm_controls_show()
1102 ret += sprintf(pg, "0x%02x\n", xu->desc.bmControls[i]); in uvcg_extension_bm_controls_show()
1105 mutex_unlock(&opts->lock); in uvcg_extension_bm_controls_show()
1115 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_bm_controls_store()
1116 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_bm_controls_store()
1125 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_bm_controls_store()
1128 mutex_lock(&opts->lock); in uvcg_extension_bm_controls_store()
1137 ret = -ENOMEM; in uvcg_extension_bm_controls_store()
1148 kfree(xu->desc.bmControls); in uvcg_extension_bm_controls_store()
1149 xu->desc.bmControls = bm_controls; in uvcg_extension_bm_controls_store()
1150 xu->desc.bControlSize = n; in uvcg_extension_bm_controls_store()
1151 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_bm_controls_store()
1152 xu->desc.bControlSize); in uvcg_extension_bm_controls_store()
1157 mutex_unlock(&opts->lock); in uvcg_extension_bm_controls_store()
1186 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_extension_allow_link()
1190 struct config_item *strings; in uvcg_extension_allow_link() local
1195 /* Validate that the target of the link is an entry in strings/<langid> */ in uvcg_extension_allow_link()
1196 gadget_item = src->ci_parent->ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_extension_allow_link()
1197 strings = config_group_find_item(to_config_group(gadget_item), "strings"); in uvcg_extension_allow_link()
1198 if (!strings || tgt->ci_parent->ci_parent != strings) { in uvcg_extension_allow_link()
1199 ret = -EINVAL; in uvcg_extension_allow_link()
1204 xu->string_descriptor_index = string->usb_string.id; in uvcg_extension_allow_link()
1207 config_item_put(strings); in uvcg_extension_allow_link()
1215 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_extension_drop_link()
1222 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_extension_drop_link()
1225 mutex_lock(&opts->lock); in uvcg_extension_drop_link()
1227 xu->string_descriptor_index = 0; in uvcg_extension_drop_link()
1229 mutex_unlock(&opts->lock); in uvcg_extension_drop_link()
1252 opts_item = group->cg_item.ci_parent->ci_parent; in uvcg_extension_drop()
1255 mutex_lock(&opts->lock); in uvcg_extension_drop()
1258 list_del(&xu->list); in uvcg_extension_drop()
1259 kfree(xu->desc.baSourceID); in uvcg_extension_drop()
1260 kfree(xu->desc.bmControls); in uvcg_extension_drop()
1262 mutex_unlock(&opts->lock); in uvcg_extension_drop()
1271 opts_item = group->cg_item.ci_parent->ci_parent; in uvcg_extension_make()
1276 return ERR_PTR(-ENOMEM); in uvcg_extension_make()
1278 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(0, 0); in uvcg_extension_make()
1279 xu->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_extension_make()
1280 xu->desc.bDescriptorSubType = UVC_VC_EXTENSION_UNIT; in uvcg_extension_make()
1281 xu->desc.bNumControls = 0; in uvcg_extension_make()
1282 xu->desc.bNrInPins = 0; in uvcg_extension_make()
1283 xu->desc.baSourceID = NULL; in uvcg_extension_make()
1284 xu->desc.bControlSize = 0; in uvcg_extension_make()
1285 xu->desc.bmControls = NULL; in uvcg_extension_make()
1287 mutex_lock(&opts->lock); in uvcg_extension_make()
1289 xu->desc.bUnitID = ++opts->last_unit_id; in uvcg_extension_make()
1291 config_item_init_type_name(&xu->item, name, &uvcg_extension_type); in uvcg_extension_make()
1292 list_add_tail(&xu->list, &opts->extension_units); in uvcg_extension_make()
1294 mutex_unlock(&opts->lock); in uvcg_extension_make()
1296 return &xu->item; in uvcg_extension_make()
1313 /* -----------------------------------------------------------------------------
1329 if (!strcmp(group->name, "fs")) in uvcg_get_ctl_class_arr()
1330 return o->uvc_fs_control_cls; in uvcg_get_ctl_class_arr()
1332 if (!strcmp(group->name, "ss")) in uvcg_get_ctl_class_arr()
1333 return o->uvc_ss_control_cls; in uvcg_get_ctl_class_arr()
1343 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_control_class_allow_link()
1346 int ret = -EINVAL; in uvcg_control_class_allow_link()
1350 control = src->ci_parent->ci_parent; in uvcg_control_class_allow_link()
1352 if (!header || target->ci_parent != header) in uvcg_control_class_allow_link()
1355 opts = to_f_uvc_opts(control->ci_parent); in uvcg_control_class_allow_link()
1357 mutex_lock(&opts->lock); in uvcg_control_class_allow_link()
1362 if (opts->refcnt || class_array[0]) { in uvcg_control_class_allow_link()
1363 ret = -EBUSY; in uvcg_control_class_allow_link()
1368 ++target_hdr->linked; in uvcg_control_class_allow_link()
1369 class_array[0] = (struct uvc_descriptor_header *)&target_hdr->desc; in uvcg_control_class_allow_link()
1373 mutex_unlock(&opts->lock); in uvcg_control_class_allow_link()
1385 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_control_class_drop_link()
1391 control = src->ci_parent->ci_parent; in uvcg_control_class_drop_link()
1393 if (!header || target->ci_parent != header) in uvcg_control_class_drop_link()
1396 opts = to_f_uvc_opts(control->ci_parent); in uvcg_control_class_drop_link()
1398 mutex_lock(&opts->lock); in uvcg_control_class_drop_link()
1401 if (!class_array || opts->refcnt) in uvcg_control_class_drop_link()
1405 --target_hdr->linked; in uvcg_control_class_drop_link()
1409 mutex_unlock(&opts->lock); in uvcg_control_class_drop_link()
1426 /* -----------------------------------------------------------------------------
1440 return -ENOMEM; in uvcg_control_class_create_children()
1442 group->name = names[i]; in uvcg_control_class_create_children()
1444 config_group_init_type_name(&group->group, group->name, in uvcg_control_class_create_children()
1446 configfs_add_default_group(&group->group, parent); in uvcg_control_class_create_children()
1461 /* -----------------------------------------------------------------------------
1469 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_b_interface_number_show()
1476 opts_item = item->ci_parent; in uvcg_default_control_b_interface_number_show()
1479 mutex_lock(&opts->lock); in uvcg_default_control_b_interface_number_show()
1480 result += sprintf(page, "%u\n", opts->control_interface); in uvcg_default_control_b_interface_number_show()
1481 mutex_unlock(&opts->lock); in uvcg_default_control_b_interface_number_show()
1494 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_enable_interrupt_ep_show()
1501 opts_item = item->ci_parent; in uvcg_default_control_enable_interrupt_ep_show()
1504 mutex_lock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_show()
1505 result += sprintf(page, "%u\n", opts->enable_interrupt_ep); in uvcg_default_control_enable_interrupt_ep_show()
1506 mutex_unlock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_show()
1517 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_enable_interrupt_ep_store()
1521 u8 num; in uvcg_default_control_enable_interrupt_ep_store() local
1523 ret = kstrtou8(page, 0, &num); in uvcg_default_control_enable_interrupt_ep_store()
1529 opts_item = item->ci_parent; in uvcg_default_control_enable_interrupt_ep_store()
1532 mutex_lock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_store()
1533 opts->enable_interrupt_ep = num; in uvcg_default_control_enable_interrupt_ep_store()
1534 mutex_unlock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_store()
1565 /* -----------------------------------------------------------------------------
1600 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_format_allow_link()
1608 streaming = src->ci_parent->ci_parent; in uvcg_format_allow_link()
1610 if (!color_matching || color_matching != tgt->ci_parent) { in uvcg_format_allow_link()
1611 ret = -EINVAL; in uvcg_format_allow_link()
1623 if (fmt->color_matching != color_matching_desc) { in uvcg_format_allow_link()
1624 ret = -EBUSY; in uvcg_format_allow_link()
1628 color_matching_desc->refcnt--; in uvcg_format_allow_link()
1631 fmt->color_matching = color_matching_desc; in uvcg_format_allow_link()
1632 color_matching_desc->refcnt++; in uvcg_format_allow_link()
1643 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_format_drop_link()
1651 color_matching_desc->refcnt--; in uvcg_format_drop_link()
1653 streaming = src->ci_parent->ci_parent; in uvcg_format_drop_link()
1657 fmt->color_matching = color_matching_desc; in uvcg_format_drop_link()
1658 color_matching_desc->refcnt++; in uvcg_format_drop_link()
1673 struct mutex *su_mutex = &f->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_show()
1679 opts_item = f->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_show()
1682 mutex_lock(&opts->lock); in uvcg_format_bma_controls_show()
1686 result += sprintf(pg, "%x\n", f->bmaControls[i]); in uvcg_format_bma_controls_show()
1689 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_show()
1700 struct mutex *su_mutex = &ch->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_store()
1701 int ret = -EINVAL; in uvcg_format_bma_controls_store()
1705 opts_item = ch->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_store()
1708 mutex_lock(&opts->lock); in uvcg_format_bma_controls_store()
1709 if (ch->linked || opts->refcnt) { in uvcg_format_bma_controls_store()
1710 ret = -EBUSY; in uvcg_format_bma_controls_store()
1717 ret = hex2bin(ch->bmaControls, page + 2, 1); in uvcg_format_bma_controls_store()
1722 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_store()
1727 /* -----------------------------------------------------------------------------
1737 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_allow_link()
1743 int i, ret = -EINVAL; in uvcg_streaming_header_allow_link()
1748 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_allow_link()
1751 mutex_lock(&opts->lock); in uvcg_streaming_header_allow_link()
1753 if (src_hdr->linked) { in uvcg_streaming_header_allow_link()
1754 ret = -EBUSY; in uvcg_streaming_header_allow_link()
1761 * the grand-parent of the target matches the grand-parent of the source in uvcg_streaming_header_allow_link()
1765 if (src->ci_parent->ci_parent != target->ci_parent->ci_parent) in uvcg_streaming_header_allow_link()
1769 if (!strcmp(target->ci_parent->ci_name, uvcg_format_names[i])) in uvcg_streaming_header_allow_link()
1783 ret = -ENOMEM; in uvcg_streaming_header_allow_link()
1787 format_ptr->fmt = target_fmt; in uvcg_streaming_header_allow_link()
1788 list_add_tail(&format_ptr->entry, &src_hdr->formats); in uvcg_streaming_header_allow_link()
1789 ++src_hdr->num_fmt; in uvcg_streaming_header_allow_link()
1790 ++target_fmt->linked; in uvcg_streaming_header_allow_link()
1793 mutex_unlock(&opts->lock); in uvcg_streaming_header_allow_link()
1801 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_drop_link()
1811 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_drop_link()
1814 mutex_lock(&opts->lock); in uvcg_streaming_header_drop_link()
1818 list_for_each_entry_safe(format_ptr, tmp, &src_hdr->formats, entry) in uvcg_streaming_header_drop_link()
1819 if (format_ptr->fmt == target_fmt) { in uvcg_streaming_header_drop_link()
1820 list_del(&format_ptr->entry); in uvcg_streaming_header_drop_link()
1822 --src_hdr->num_fmt; in uvcg_streaming_header_drop_link()
1826 --target_fmt->linked; in uvcg_streaming_header_drop_link()
1828 mutex_unlock(&opts->lock); in uvcg_streaming_header_drop_link()
1845 struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
1850 opts_item = sh->item.ci_parent->ci_parent->ci_parent; \
1853 mutex_lock(&opts->lock); \
1854 result = sprintf(page, "%u\n", le##bits##_to_cpu(sh->desc.aname));\
1855 mutex_unlock(&opts->lock); \
1893 return ERR_PTR(-ENOMEM); in uvcg_streaming_header_make()
1895 INIT_LIST_HEAD(&h->formats); in uvcg_streaming_header_make()
1896 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_streaming_header_make()
1897 h->desc.bDescriptorSubType = UVC_VS_INPUT_HEADER; in uvcg_streaming_header_make()
1898 h->desc.bTerminalLink = 3; in uvcg_streaming_header_make()
1899 h->desc.bControlSize = UVCG_STREAMING_CONTROL_SIZE; in uvcg_streaming_header_make()
1901 config_item_init_type_name(&h->item, name, &uvcg_streaming_header_type); in uvcg_streaming_header_make()
1903 return &h->item; in uvcg_streaming_header_make()
1919 /* -----------------------------------------------------------------------------
1929 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1934 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1937 mutex_lock(&opts->lock); \
1938 result = sprintf(page, "%u\n", f->frame.cname); \
1939 mutex_unlock(&opts->lock); \
1952 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1953 typeof(f->frame.cname) num; \
1956 ret = kstrtou##bits(page, 0, &num); \
1962 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1964 fmt = to_uvcg_format(f->item.ci_parent); \
1966 mutex_lock(&opts->lock); \
1967 if (fmt->linked || opts->refcnt) { \
1968 ret = -EBUSY; \
1972 f->frame.cname = num; \
1975 mutex_unlock(&opts->lock); \
1990 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_b_frame_index_show()
1995 fmt_item = f->item.ci_parent; in uvcg_frame_b_frame_index_show()
1998 if (!fmt->linked) { in uvcg_frame_b_frame_index_show()
1999 result = -EBUSY; in uvcg_frame_b_frame_index_show()
2003 opts_item = fmt_item->ci_parent->ci_parent->ci_parent; in uvcg_frame_b_frame_index_show()
2006 mutex_lock(&opts->lock); in uvcg_frame_b_frame_index_show()
2007 result = sprintf(page, "%u\n", f->frame.b_frame_index); in uvcg_frame_b_frame_index_show()
2008 mutex_unlock(&opts->lock); in uvcg_frame_b_frame_index_show()
2033 struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_show()
2039 opts_item = frm->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_show()
2042 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
2043 for (result = 0, i = 0; i < frm->frame.b_frame_interval_type; ++i) { in uvcg_frame_dw_frame_interval_show()
2044 result += sprintf(pg, "%u\n", frm->dw_frame_interval[i]); in uvcg_frame_dw_frame_interval_show()
2047 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
2060 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_store()
2066 opts_item = ch->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_store()
2068 fmt = to_uvcg_format(ch->item.ci_parent); in uvcg_frame_dw_frame_interval_store()
2070 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
2071 if (fmt->linked || opts->refcnt) { in uvcg_frame_dw_frame_interval_store()
2072 ret = -EBUSY; in uvcg_frame_dw_frame_interval_store()
2082 ret = -ENOMEM; in uvcg_frame_dw_frame_interval_store()
2092 kfree(ch->dw_frame_interval); in uvcg_frame_dw_frame_interval_store()
2093 ch->dw_frame_interval = frm_intrv; in uvcg_frame_dw_frame_interval_store()
2094 ch->frame.b_frame_interval_type = n; in uvcg_frame_dw_frame_interval_store()
2095 sort(ch->dw_frame_interval, n, sizeof(*ch->dw_frame_interval), in uvcg_frame_dw_frame_interval_store()
2100 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
2137 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
2139 h->frame.b_descriptor_type = USB_DT_CS_INTERFACE; in uvcg_frame_make()
2140 h->frame.b_frame_index = 1; in uvcg_frame_make()
2141 h->frame.w_width = 640; in uvcg_frame_make()
2142 h->frame.w_height = 360; in uvcg_frame_make()
2143 h->frame.dw_min_bit_rate = 18432000; in uvcg_frame_make()
2144 h->frame.dw_max_bit_rate = 55296000; in uvcg_frame_make()
2145 h->frame.dw_max_video_frame_buffer_size = 460800; in uvcg_frame_make()
2146 h->frame.dw_default_frame_interval = 666666; in uvcg_frame_make()
2148 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_make()
2151 mutex_lock(&opts->lock); in uvcg_frame_make()
2152 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_make()
2153 if (fmt->type == UVCG_UNCOMPRESSED) { in uvcg_frame_make()
2154 h->frame.b_descriptor_subtype = UVC_VS_FRAME_UNCOMPRESSED; in uvcg_frame_make()
2155 h->fmt_type = UVCG_UNCOMPRESSED; in uvcg_frame_make()
2156 } else if (fmt->type == UVCG_MJPEG) { in uvcg_frame_make()
2157 h->frame.b_descriptor_subtype = UVC_VS_FRAME_MJPEG; in uvcg_frame_make()
2158 h->fmt_type = UVCG_MJPEG; in uvcg_frame_make()
2160 mutex_unlock(&opts->lock); in uvcg_frame_make()
2162 return ERR_PTR(-EINVAL); in uvcg_frame_make()
2167 mutex_unlock(&opts->lock); in uvcg_frame_make()
2169 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
2172 frame_ptr->frm = h; in uvcg_frame_make()
2173 list_add_tail(&frame_ptr->entry, &fmt->frames); in uvcg_frame_make()
2174 ++fmt->num_frames; in uvcg_frame_make()
2175 mutex_unlock(&opts->lock); in uvcg_frame_make()
2177 config_item_init_type_name(&h->item, name, &uvcg_frame_type); in uvcg_frame_make()
2179 return &h->item; in uvcg_frame_make()
2190 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_drop()
2193 mutex_lock(&opts->lock); in uvcg_frame_drop()
2195 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_drop()
2197 list_for_each_entry_safe(frame_ptr, tmp, &fmt->frames, entry) in uvcg_frame_drop()
2198 if (frame_ptr->frm == target_frm) { in uvcg_frame_drop()
2199 list_del(&frame_ptr->entry); in uvcg_frame_drop()
2201 --fmt->num_frames; in uvcg_frame_drop()
2204 mutex_unlock(&opts->lock); in uvcg_frame_drop()
2214 list_for_each_entry(ci, &fmt->cg_children, ci_entry) { in uvcg_format_set_indices()
2217 if (ci->ci_type != &uvcg_frame_type) in uvcg_format_set_indices()
2221 frm->frame.b_frame_index = i++; in uvcg_format_set_indices()
2225 /* -----------------------------------------------------------------------------
2240 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_show()
2244 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_show()
2247 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_show()
2248 memcpy(page, ch->desc.guidFormat, sizeof(ch->desc.guidFormat)); in uvcg_uncompressed_guid_format_show()
2249 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_show()
2253 return sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_show()
2262 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_store()
2267 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_store()
2270 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_store()
2271 if (ch->fmt.linked || opts->refcnt) { in uvcg_uncompressed_guid_format_store()
2272 ret = -EBUSY; in uvcg_uncompressed_guid_format_store()
2276 memcpy(ch->desc.guidFormat, page, in uvcg_uncompressed_guid_format_store()
2277 min(sizeof(ch->desc.guidFormat), len)); in uvcg_uncompressed_guid_format_store()
2278 ret = sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_store()
2281 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_store()
2295 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2300 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2303 mutex_lock(&opts->lock); \
2304 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2305 mutex_unlock(&opts->lock); \
2320 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2325 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2328 mutex_lock(&opts->lock); \
2329 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2330 mutex_unlock(&opts->lock); \
2343 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2345 u8 num; \
2349 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2352 mutex_lock(&opts->lock); \
2353 if (u->fmt.linked || opts->refcnt) { \
2354 ret = -EBUSY; \
2358 ret = kstrtou8(page, 0, &num); \
2363 if (!num) { \
2364 ret = -EINVAL; \
2368 u->desc.aname = num; \
2371 mutex_unlock(&opts->lock); \
2392 return uvcg_format_bma_controls_show(&unc->fmt, page); in uvcg_uncompressed_bma_controls_show()
2400 return uvcg_format_bma_controls_store(&unc->fmt, page, len); in uvcg_uncompressed_bma_controls_store()
2435 streaming = group->cg_item.ci_parent; in uvcg_uncompressed_make()
2438 return ERR_PTR(-EINVAL); in uvcg_uncompressed_make()
2442 return ERR_PTR(-ENOMEM); in uvcg_uncompressed_make()
2444 h->desc.bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE; in uvcg_uncompressed_make()
2445 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_uncompressed_make()
2446 h->desc.bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED; in uvcg_uncompressed_make()
2447 memcpy(h->desc.guidFormat, guid, sizeof(guid)); in uvcg_uncompressed_make()
2448 h->desc.bBitsPerPixel = 16; in uvcg_uncompressed_make()
2449 h->desc.bDefaultFrameIndex = 1; in uvcg_uncompressed_make()
2450 h->desc.bAspectRatioX = 0; in uvcg_uncompressed_make()
2451 h->desc.bAspectRatioY = 0; in uvcg_uncompressed_make()
2452 h->desc.bmInterlaceFlags = 0; in uvcg_uncompressed_make()
2453 h->desc.bCopyProtect = 0; in uvcg_uncompressed_make()
2455 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_uncompressed_make()
2456 h->fmt.type = UVCG_UNCOMPRESSED; in uvcg_uncompressed_make()
2457 h->fmt.color_matching = color_match; in uvcg_uncompressed_make()
2458 color_match->refcnt++; in uvcg_uncompressed_make()
2459 config_group_init_type_name(&h->fmt.group, name, in uvcg_uncompressed_make()
2462 return &h->fmt.group; in uvcg_uncompressed_make()
2478 /* -----------------------------------------------------------------------------
2493 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2498 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2501 mutex_lock(&opts->lock); \
2502 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2503 mutex_unlock(&opts->lock); \
2517 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2522 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2525 mutex_lock(&opts->lock); \
2526 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2527 mutex_unlock(&opts->lock); \
2540 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2542 u8 num; \
2546 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2549 mutex_lock(&opts->lock); \
2550 if (u->fmt.linked || opts->refcnt) { \
2551 ret = -EBUSY; \
2555 ret = kstrtou8(page, 0, &num); \
2560 if (!num) { \
2561 ret = -EINVAL; \
2565 u->desc.aname = num; \
2568 mutex_unlock(&opts->lock); \
2589 return uvcg_format_bma_controls_show(&u->fmt, page); in uvcg_mjpeg_bma_controls_show()
2597 return uvcg_format_bma_controls_store(&u->fmt, page, len); in uvcg_mjpeg_bma_controls_store()
2627 streaming = group->cg_item.ci_parent; in uvcg_mjpeg_make()
2630 return ERR_PTR(-EINVAL); in uvcg_mjpeg_make()
2634 return ERR_PTR(-ENOMEM); in uvcg_mjpeg_make()
2636 h->desc.bLength = UVC_DT_FORMAT_MJPEG_SIZE; in uvcg_mjpeg_make()
2637 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_mjpeg_make()
2638 h->desc.bDescriptorSubType = UVC_VS_FORMAT_MJPEG; in uvcg_mjpeg_make()
2639 h->desc.bDefaultFrameIndex = 1; in uvcg_mjpeg_make()
2640 h->desc.bAspectRatioX = 0; in uvcg_mjpeg_make()
2641 h->desc.bAspectRatioY = 0; in uvcg_mjpeg_make()
2642 h->desc.bmInterlaceFlags = 0; in uvcg_mjpeg_make()
2643 h->desc.bCopyProtect = 0; in uvcg_mjpeg_make()
2645 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_mjpeg_make()
2646 h->fmt.type = UVCG_MJPEG; in uvcg_mjpeg_make()
2647 h->fmt.color_matching = color_match; in uvcg_mjpeg_make()
2648 color_match->refcnt++; in uvcg_mjpeg_make()
2649 config_group_init_type_name(&h->fmt.group, name, in uvcg_mjpeg_make()
2652 return &h->fmt.group; in uvcg_mjpeg_make()
2668 /* -----------------------------------------------------------------------------
2681 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
2686 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
2689 mutex_lock(&opts->lock); \
2691 le##bits##_to_cpu(color_match->desc.aname)); \
2692 mutex_unlock(&opts->lock); \
2702 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
2708 u##bits num; \
2710 ret = kstrtou##bits(page, 0, &num); \
2716 if (color_match->refcnt) { \
2717 ret = -EBUSY; \
2721 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
2724 mutex_lock(&opts->lock); \
2726 color_match->desc.aname = num; \
2729 mutex_unlock(&opts->lock); \
2768 /* -----------------------------------------------------------------------------
2779 return ERR_PTR(-ENOMEM); in uvcg_color_matching_make()
2781 color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE; in uvcg_color_matching_make()
2782 color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_color_matching_make()
2783 color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT; in uvcg_color_matching_make()
2785 config_group_init_type_name(&color_match->group, name, in uvcg_color_matching_make()
2788 return &color_match->group; in uvcg_color_matching_make()
2801 return -ENOMEM; in uvcg_color_matching_create_children()
2803 color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE; in uvcg_color_matching_create_children()
2804 color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_color_matching_create_children()
2805 color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT; in uvcg_color_matching_create_children()
2806 color_match->desc.bColorPrimaries = UVC_COLOR_PRIMARIES_BT_709_SRGB; in uvcg_color_matching_create_children()
2807 color_match->desc.bTransferCharacteristics = UVC_TRANSFER_CHARACTERISTICS_BT_709; in uvcg_color_matching_create_children()
2808 color_match->desc.bMatrixCoefficients = UVC_MATRIX_COEFFICIENTS_SMPTE_170M; in uvcg_color_matching_create_children()
2810 config_group_init_type_name(&color_match->group, "default", in uvcg_color_matching_create_children()
2812 configfs_add_default_group(&color_match->group, parent); in uvcg_color_matching_create_children()
2827 /* -----------------------------------------------------------------------------
2843 if (!strcmp(group->name, "fs")) in __uvcg_get_stream_class_arr()
2844 return &o->uvc_fs_streaming_cls; in __uvcg_get_stream_class_arr()
2846 if (!strcmp(group->name, "hs")) in __uvcg_get_stream_class_arr()
2847 return &o->uvc_hs_streaming_cls; in __uvcg_get_stream_class_arr()
2849 if (!strcmp(group->name, "ss")) in __uvcg_get_stream_class_arr()
2850 return &o->uvc_ss_streaming_cls; in __uvcg_get_stream_class_arr()
2892 return -EINVAL; in __uvcg_iter_strm_cls()
2898 list_for_each_entry(f, &h->formats, entry) { in __uvcg_iter_strm_cls()
2899 ret = fun(f->fmt, priv2, priv3, i++, UVCG_FORMAT); in __uvcg_iter_strm_cls()
2902 grp = &f->fmt->group; in __uvcg_iter_strm_cls()
2903 list_for_each_entry(item, &grp->cg_children, ci_entry) { in __uvcg_iter_strm_cls()
2910 ret = fun(f->fmt->color_matching, priv2, priv3, 0, in __uvcg_iter_strm_cls()
2937 *size += sizeof(h->desc); in __uvcg_cnt_strm()
2939 *size += h->num_fmt * UVCG_STREAMING_CONTROL_SIZE; in __uvcg_cnt_strm()
2945 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_cnt_strm()
2950 *size += sizeof(u->desc); in __uvcg_cnt_strm()
2951 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_cnt_strm()
2955 *size += sizeof(m->desc); in __uvcg_cnt_strm()
2957 return -EINVAL; in __uvcg_cnt_strm()
2963 int sz = sizeof(frm->dw_frame_interval); in __uvcg_cnt_strm()
2965 *size += sizeof(frm->frame); in __uvcg_cnt_strm()
2966 *size += frm->frame.b_frame_interval_type * sz; in __uvcg_cnt_strm()
2972 *size += sizeof(color_match->desc); in __uvcg_cnt_strm()
2987 * @priv3: inout parameter, pointer to a 2-dimensional array
3005 memcpy(*dest, &h->desc, sizeof(h->desc)); in __uvcg_fill_strm()
3006 *dest += sizeof(h->desc); in __uvcg_fill_strm()
3008 list_for_each_entry(f, &h->formats, entry) { in __uvcg_fill_strm()
3009 memcpy(*dest, f->fmt->bmaControls, sz); in __uvcg_fill_strm()
3012 ihdr->bLength = sizeof(h->desc) + h->num_fmt * sz; in __uvcg_fill_strm()
3013 ihdr->bNumFormats = h->num_fmt; in __uvcg_fill_strm()
3019 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_fill_strm()
3024 u->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3025 u->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3026 memcpy(*dest, &u->desc, sizeof(u->desc)); in __uvcg_fill_strm()
3027 *dest += sizeof(u->desc); in __uvcg_fill_strm()
3028 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_fill_strm()
3032 m->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3033 m->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3034 memcpy(*dest, &m->desc, sizeof(m->desc)); in __uvcg_fill_strm()
3035 *dest += sizeof(m->desc); in __uvcg_fill_strm()
3037 return -EINVAL; in __uvcg_fill_strm()
3045 sz = sizeof(frm->frame); in __uvcg_fill_strm()
3046 memcpy(*dest, &frm->frame, sz); in __uvcg_fill_strm()
3048 sz = frm->frame.b_frame_interval_type * in __uvcg_fill_strm()
3049 sizeof(*frm->dw_frame_interval); in __uvcg_fill_strm()
3050 memcpy(*dest, frm->dw_frame_interval, sz); in __uvcg_fill_strm()
3052 if (frm->fmt_type == UVCG_UNCOMPRESSED) in __uvcg_fill_strm()
3053 h->bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE( in __uvcg_fill_strm()
3054 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3055 else if (frm->fmt_type == UVCG_MJPEG) in __uvcg_fill_strm()
3056 h->bLength = UVC_DT_FRAME_MJPEG_SIZE( in __uvcg_fill_strm()
3057 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3063 memcpy(*dest, &color_match->desc, sizeof(color_match->desc)); in __uvcg_fill_strm()
3064 *dest += sizeof(color_match->desc); in __uvcg_fill_strm()
3077 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_allow_link()
3082 int ret = -EINVAL; in uvcg_streaming_class_allow_link()
3086 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_allow_link()
3088 if (!header || target->ci_parent != header) in uvcg_streaming_class_allow_link()
3091 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_allow_link()
3093 mutex_lock(&opts->lock); in uvcg_streaming_class_allow_link()
3096 if (!class_array || *class_array || opts->refcnt) { in uvcg_streaming_class_allow_link()
3097 ret = -EBUSY; in uvcg_streaming_class_allow_link()
3109 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
3117 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
3134 ++target_hdr->linked; in uvcg_streaming_class_allow_link()
3138 mutex_unlock(&opts->lock); in uvcg_streaming_class_allow_link()
3150 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_drop_link()
3156 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_drop_link()
3158 if (!header || target->ci_parent != header) in uvcg_streaming_class_drop_link()
3161 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_drop_link()
3163 mutex_lock(&opts->lock); in uvcg_streaming_class_drop_link()
3169 if (opts->refcnt) in uvcg_streaming_class_drop_link()
3173 --target_hdr->linked; in uvcg_streaming_class_drop_link()
3179 mutex_unlock(&opts->lock); in uvcg_streaming_class_drop_link()
3196 /* -----------------------------------------------------------------------------
3210 return -ENOMEM; in uvcg_streaming_class_create_children()
3212 group->name = names[i]; in uvcg_streaming_class_create_children()
3214 config_group_init_type_name(&group->group, group->name, in uvcg_streaming_class_create_children()
3216 configfs_add_default_group(&group->group, parent); in uvcg_streaming_class_create_children()
3231 /* -----------------------------------------------------------------------------
3239 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_streaming_b_interface_number_show()
3246 opts_item = item->ci_parent; in uvcg_default_streaming_b_interface_number_show()
3249 mutex_lock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
3250 result += sprintf(page, "%u\n", opts->streaming_interface); in uvcg_default_streaming_b_interface_number_show()
3251 mutex_unlock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
3282 /* -----------------------------------------------------------------------------
3291 usb_put_function_instance(&opts->func_inst); in uvc_func_item_release()
3296 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvc_func_allow_link()
3298 struct config_item *strings; in uvc_func_allow_link() local
3304 /* Validate that the target is an entry in strings/<langid> */ in uvc_func_allow_link()
3305 strings = config_group_find_item(to_config_group(src->ci_parent->ci_parent), in uvc_func_allow_link()
3306 "strings"); in uvc_func_allow_link()
3307 if (!strings || tgt->ci_parent->ci_parent != strings) { in uvc_func_allow_link()
3308 ret = -EINVAL; in uvc_func_allow_link()
3315 mutex_lock(&opts->lock); in uvc_func_allow_link()
3317 if (!strcmp(tgt->ci_name, "iad_desc")) in uvc_func_allow_link()
3318 opts->iad_index = string->usb_string.id; in uvc_func_allow_link()
3319 else if (!strcmp(tgt->ci_name, "vs0_desc")) in uvc_func_allow_link()
3320 opts->vs0_index = string->usb_string.id; in uvc_func_allow_link()
3321 else if (!strcmp(tgt->ci_name, "vs1_desc")) in uvc_func_allow_link()
3322 opts->vs1_index = string->usb_string.id; in uvc_func_allow_link()
3324 ret = -EINVAL; in uvc_func_allow_link()
3326 mutex_unlock(&opts->lock); in uvc_func_allow_link()
3329 config_item_put(strings); in uvc_func_allow_link()
3340 mutex_lock(&opts->lock); in uvc_func_drop_link()
3342 if (!strcmp(tgt->ci_name, "iad_desc")) in uvc_func_drop_link()
3343 opts->iad_index = 0; in uvc_func_drop_link()
3344 else if (!strcmp(tgt->ci_name, "vs0_desc")) in uvc_func_drop_link()
3345 opts->vs0_index = 0; in uvc_func_drop_link()
3346 else if (!strcmp(tgt->ci_name, "vs1_desc")) in uvc_func_drop_link()
3347 opts->vs1_index = 0; in uvc_func_drop_link()
3349 mutex_unlock(&opts->lock); in uvc_func_drop_link()
3365 mutex_lock(&opts->lock); \
3366 result = sprintf(page, "%u\n", opts->cname); \
3367 mutex_unlock(&opts->lock); \
3377 unsigned int num; \
3380 mutex_lock(&opts->lock); \
3381 if (opts->refcnt) { \
3382 ret = -EBUSY; \
3386 ret = kstrtouint(page, 0, &num); \
3390 if (num > limit) { \
3391 ret = -EINVAL; \
3394 opts->cname = num; \
3397 mutex_unlock(&opts->lock); \
3416 mutex_lock(&opts->lock); \
3417 result = scnprintf(page, sizeof(opts->aname), "%s", opts->aname);\
3418 mutex_unlock(&opts->lock); \
3427 int size = min(sizeof(opts->aname), len + 1); \
3430 mutex_lock(&opts->lock); \
3431 if (opts->refcnt) { \
3432 ret = -EBUSY; \
3436 ret = strscpy(opts->aname, page, size); \
3437 if (ret == -E2BIG) \
3438 ret = size - 1; \
3441 mutex_unlock(&opts->lock); \
3477 config_group_init_type_name(&opts->func_inst.group, uvc_func_type.name, in uvcg_attach_configfs()
3480 ret = uvcg_config_create_children(&opts->func_inst.group, in uvcg_attach_configfs()
3483 config_group_put(&opts->func_inst.group); in uvcg_attach_configfs()