Lines Matching +full:num +full:- +full:ss +full:- +full:bits
1 // SPDX-License-Identifier: GPL-2.0
19 /* -----------------------------------------------------------------------------
48 return li < ri ? -1 : li == ri ? 0 : 1; in uvcg_config_compare_u32()
59 unsigned int num; in __uvcg_fill_item_entries() local
63 ret = kstrtouint(buf, 0, &num); in __uvcg_fill_item_entries()
67 if (num != (num & GENMASK((size * 8) - 1, 0))) in __uvcg_fill_item_entries()
68 return -ERANGE; in __uvcg_fill_item_entries()
71 memcpy(*values, &num, size); in __uvcg_fill_item_entries()
88 return -EINVAL; in __uvcg_iter_item_entries()
92 return -ENOMEM; in __uvcg_iter_item_entries()
94 while (pg - page < len) { in __uvcg_iter_item_entries()
96 while (i < bufsize && (pg - page < len) && in __uvcg_iter_item_entries()
100 ret = -EINVAL; in __uvcg_iter_item_entries()
103 while ((pg - page < len) && (*pg == '\0' || *pg == '\n')) in __uvcg_iter_item_entries()
143 if (type->create_children) in uvcg_config_create_children()
144 return type->create_children(group); in uvcg_config_create_children()
146 for (child = type->children; child && *child; ++child) { in uvcg_config_create_children()
162 return -ENOMEM; in uvcg_config_create_group()
164 config_group_init_type_name(group, type->name, &type->type); in uvcg_config_create_group()
174 list_for_each_entry_safe(child, n, &group->default_groups, group_entry) { in uvcg_config_remove_children()
175 list_del(&child->group_entry); in uvcg_config_remove_children()
177 config_item_put(&child->cg_item); in uvcg_config_remove_children()
181 /* -----------------------------------------------------------------------------
186 #define UVCG_CTRL_HDR_ATTR(cname, aname, bits, limit) \ argument
193 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
198 opts_item = ch->item.ci_parent->ci_parent->ci_parent; \
201 mutex_lock(&opts->lock); \
202 result = sprintf(page, "%u\n", le##bits##_to_cpu(ch->desc.aname));\
203 mutex_unlock(&opts->lock); \
216 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
218 u##bits num; \
222 opts_item = ch->item.ci_parent->ci_parent->ci_parent; \
225 mutex_lock(&opts->lock); \
226 if (ch->linked || opts->refcnt) { \
227 ret = -EBUSY; \
231 ret = kstrtou##bits(page, 0, &num); \
235 if (num > limit) { \
236 ret = -EINVAL; \
239 ch->desc.aname = cpu_to_le##bits(num); \
242 mutex_unlock(&opts->lock); \
274 return ERR_PTR(-ENOMEM); in uvcg_control_header_make()
276 h->desc.bLength = UVC_DT_HEADER_SIZE(1); in uvcg_control_header_make()
277 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_control_header_make()
278 h->desc.bDescriptorSubType = UVC_VC_HEADER; in uvcg_control_header_make()
279 h->desc.bcdUVC = cpu_to_le16(0x0110); in uvcg_control_header_make()
280 h->desc.dwClockFrequency = cpu_to_le32(48000000); in uvcg_control_header_make()
282 config_item_init_type_name(&h->item, name, &uvcg_control_header_type); in uvcg_control_header_make()
284 return &h->item; in uvcg_control_header_make()
300 /* -----------------------------------------------------------------------------
304 #define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, bits) \ argument
311 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
317 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
319 pd = &opts->uvc_processing; \
321 mutex_lock(&opts->lock); \
322 result = sprintf(page, "%u\n", le##bits##_to_cpu(pd->aname)); \
323 mutex_unlock(&opts->lock); \
342 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_processing_bm_controls_store()
352 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_default_processing_bm_controls_store()
354 pd = &opts->uvc_processing; in uvcg_default_processing_bm_controls_store()
356 mutex_lock(&opts->lock); in uvcg_default_processing_bm_controls_store()
357 if (opts->refcnt) { in uvcg_default_processing_bm_controls_store()
358 ret = -EBUSY; in uvcg_default_processing_bm_controls_store()
367 if (n > pd->bControlSize) { in uvcg_default_processing_bm_controls_store()
368 ret = -EINVAL; in uvcg_default_processing_bm_controls_store()
374 ret = -ENOMEM; in uvcg_default_processing_bm_controls_store()
384 pd->bmControls[i] = bm_controls[i]; in uvcg_default_processing_bm_controls_store()
391 mutex_unlock(&opts->lock); in uvcg_default_processing_bm_controls_store()
402 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_processing_bm_controls_show()
409 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_default_processing_bm_controls_show()
411 pd = &opts->uvc_processing; in uvcg_default_processing_bm_controls_show()
413 mutex_lock(&opts->lock); in uvcg_default_processing_bm_controls_show()
414 for (result = 0, i = 0; i < pd->bControlSize; ++i) { in uvcg_default_processing_bm_controls_show()
415 result += sprintf(pg, "%u\n", pd->bmControls[i]); in uvcg_default_processing_bm_controls_show()
418 mutex_unlock(&opts->lock); in uvcg_default_processing_bm_controls_show()
445 /* -----------------------------------------------------------------------------
461 /* -----------------------------------------------------------------------------
465 #define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, bits) \ argument
472 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
478 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> \
481 cd = &opts->uvc_camera_terminal; \
483 mutex_lock(&opts->lock); \
484 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
485 mutex_unlock(&opts->lock); \
511 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_camera_bm_controls_store()
521 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> in uvcg_default_camera_bm_controls_store()
524 cd = &opts->uvc_camera_terminal; in uvcg_default_camera_bm_controls_store()
526 mutex_lock(&opts->lock); in uvcg_default_camera_bm_controls_store()
527 if (opts->refcnt) { in uvcg_default_camera_bm_controls_store()
528 ret = -EBUSY; in uvcg_default_camera_bm_controls_store()
537 if (n > cd->bControlSize) { in uvcg_default_camera_bm_controls_store()
538 ret = -EINVAL; in uvcg_default_camera_bm_controls_store()
544 ret = -ENOMEM; in uvcg_default_camera_bm_controls_store()
554 cd->bmControls[i] = bm_controls[i]; in uvcg_default_camera_bm_controls_store()
561 mutex_unlock(&opts->lock); in uvcg_default_camera_bm_controls_store()
572 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_camera_bm_controls_show()
579 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> in uvcg_default_camera_bm_controls_show()
582 cd = &opts->uvc_camera_terminal; in uvcg_default_camera_bm_controls_show()
584 mutex_lock(&opts->lock); in uvcg_default_camera_bm_controls_show()
585 for (result = 0, i = 0; i < cd->bControlSize; ++i) { in uvcg_default_camera_bm_controls_show()
586 result += sprintf(pg, "%u\n", cd->bmControls[i]); in uvcg_default_camera_bm_controls_show()
589 mutex_unlock(&opts->lock); in uvcg_default_camera_bm_controls_show()
618 /* -----------------------------------------------------------------------------
634 /* -----------------------------------------------------------------------------
638 #define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, bits) \ argument
645 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
651 opts_item = group->cg_item.ci_parent->ci_parent-> \
652 ci_parent->ci_parent; \
654 cd = &opts->uvc_output_terminal; \
656 mutex_lock(&opts->lock); \
657 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
658 mutex_unlock(&opts->lock); \
680 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_output_b_source_id_show()
686 opts_item = group->cg_item.ci_parent->ci_parent-> in uvcg_default_output_b_source_id_show()
687 ci_parent->ci_parent; in uvcg_default_output_b_source_id_show()
689 cd = &opts->uvc_output_terminal; in uvcg_default_output_b_source_id_show()
691 mutex_lock(&opts->lock); in uvcg_default_output_b_source_id_show()
692 result = sprintf(page, "%u\n", le8_to_cpu(cd->bSourceID)); in uvcg_default_output_b_source_id_show()
693 mutex_unlock(&opts->lock); in uvcg_default_output_b_source_id_show()
706 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_output_b_source_id_store()
709 u8 num; in uvcg_default_output_b_source_id_store() local
711 result = kstrtou8(page, 0, &num); in uvcg_default_output_b_source_id_store()
717 opts_item = group->cg_item.ci_parent->ci_parent-> in uvcg_default_output_b_source_id_store()
718 ci_parent->ci_parent; in uvcg_default_output_b_source_id_store()
720 cd = &opts->uvc_output_terminal; in uvcg_default_output_b_source_id_store()
722 mutex_lock(&opts->lock); in uvcg_default_output_b_source_id_store()
723 cd->bSourceID = num; in uvcg_default_output_b_source_id_store()
724 mutex_unlock(&opts->lock); in uvcg_default_output_b_source_id_store()
750 /* -----------------------------------------------------------------------------
766 /* -----------------------------------------------------------------------------
783 /* -----------------------------------------------------------------------------
791 struct config_group *group = to_config_group(item->ci_parent); \
792 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
800 opts_item = item->ci_parent->ci_parent->ci_parent; \
803 mutex_lock(&opts->lock); \
804 ret = sprintf(page, "%u\n", xu->desc.aname); \
805 mutex_unlock(&opts->lock); \
820 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_b_num_controls_store()
821 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_b_num_controls_store()
826 u8 num; in uvcg_extension_b_num_controls_store() local
828 ret = kstrtou8(page, 0, &num); in uvcg_extension_b_num_controls_store()
834 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_b_num_controls_store()
837 mutex_lock(&opts->lock); in uvcg_extension_b_num_controls_store()
838 xu->desc.bNumControls = num; in uvcg_extension_b_num_controls_store()
839 mutex_unlock(&opts->lock); in uvcg_extension_b_num_controls_store()
854 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_b_nr_in_pins_store()
855 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_b_nr_in_pins_store()
861 u8 num; in uvcg_extension_b_nr_in_pins_store() local
863 ret = kstrtou8(page, 0, &num); in uvcg_extension_b_nr_in_pins_store()
869 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_b_nr_in_pins_store()
872 mutex_lock(&opts->lock); in uvcg_extension_b_nr_in_pins_store()
874 if (num == xu->desc.bNrInPins) { in uvcg_extension_b_nr_in_pins_store()
879 tmp_buf = krealloc_array(xu->desc.baSourceID, num, sizeof(u8), in uvcg_extension_b_nr_in_pins_store()
882 ret = -ENOMEM; in uvcg_extension_b_nr_in_pins_store()
886 xu->desc.baSourceID = tmp_buf; in uvcg_extension_b_nr_in_pins_store()
887 xu->desc.bNrInPins = num; in uvcg_extension_b_nr_in_pins_store()
888 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_b_nr_in_pins_store()
889 xu->desc.bControlSize); in uvcg_extension_b_nr_in_pins_store()
894 mutex_unlock(&opts->lock); in uvcg_extension_b_nr_in_pins_store()
907 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_b_control_size_store()
908 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_b_control_size_store()
914 u8 num; in uvcg_extension_b_control_size_store() local
916 ret = kstrtou8(page, 0, &num); in uvcg_extension_b_control_size_store()
922 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_b_control_size_store()
925 mutex_lock(&opts->lock); in uvcg_extension_b_control_size_store()
927 if (num == xu->desc.bControlSize) { in uvcg_extension_b_control_size_store()
932 tmp_buf = krealloc_array(xu->desc.bmControls, num, sizeof(u8), in uvcg_extension_b_control_size_store()
935 ret = -ENOMEM; in uvcg_extension_b_control_size_store()
939 xu->desc.bmControls = tmp_buf; in uvcg_extension_b_control_size_store()
940 xu->desc.bControlSize = num; in uvcg_extension_b_control_size_store()
941 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_b_control_size_store()
942 xu->desc.bControlSize); in uvcg_extension_b_control_size_store()
947 mutex_unlock(&opts->lock); in uvcg_extension_b_control_size_store()
957 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_guid_extension_code_show()
958 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_guid_extension_code_show()
965 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_guid_extension_code_show()
968 mutex_lock(&opts->lock); in uvcg_extension_guid_extension_code_show()
969 memcpy(page, xu->desc.guidExtensionCode, sizeof(xu->desc.guidExtensionCode)); in uvcg_extension_guid_extension_code_show()
970 mutex_unlock(&opts->lock); in uvcg_extension_guid_extension_code_show()
974 return sizeof(xu->desc.guidExtensionCode); in uvcg_extension_guid_extension_code_show()
980 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_guid_extension_code_store()
981 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_guid_extension_code_store()
989 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_guid_extension_code_store()
992 mutex_lock(&opts->lock); in uvcg_extension_guid_extension_code_store()
993 memcpy(xu->desc.guidExtensionCode, page, in uvcg_extension_guid_extension_code_store()
994 min(sizeof(xu->desc.guidExtensionCode), len)); in uvcg_extension_guid_extension_code_store()
995 mutex_unlock(&opts->lock); in uvcg_extension_guid_extension_code_store()
999 ret = sizeof(xu->desc.guidExtensionCode); in uvcg_extension_guid_extension_code_store()
1009 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_ba_source_id_show()
1010 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_ba_source_id_show()
1019 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_ba_source_id_show()
1022 mutex_lock(&opts->lock); in uvcg_extension_ba_source_id_show()
1023 for (ret = 0, i = 0; i < xu->desc.bNrInPins; ++i) { in uvcg_extension_ba_source_id_show()
1024 ret += sprintf(pg, "%u\n", xu->desc.baSourceID[i]); in uvcg_extension_ba_source_id_show()
1027 mutex_unlock(&opts->lock); in uvcg_extension_ba_source_id_show()
1037 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_ba_source_id_store()
1038 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_ba_source_id_store()
1047 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_ba_source_id_store()
1050 mutex_lock(&opts->lock); in uvcg_extension_ba_source_id_store()
1059 ret = -ENOMEM; in uvcg_extension_ba_source_id_store()
1070 kfree(xu->desc.baSourceID); in uvcg_extension_ba_source_id_store()
1071 xu->desc.baSourceID = source_ids; in uvcg_extension_ba_source_id_store()
1072 xu->desc.bNrInPins = n; in uvcg_extension_ba_source_id_store()
1073 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_ba_source_id_store()
1074 xu->desc.bControlSize); in uvcg_extension_ba_source_id_store()
1079 mutex_unlock(&opts->lock); in uvcg_extension_ba_source_id_store()
1088 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_bm_controls_show()
1089 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_bm_controls_show()
1098 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_bm_controls_show()
1101 mutex_lock(&opts->lock); in uvcg_extension_bm_controls_show()
1102 for (ret = 0, i = 0; i < xu->desc.bControlSize; ++i) { in uvcg_extension_bm_controls_show()
1103 ret += sprintf(pg, "0x%02x\n", xu->desc.bmControls[i]); in uvcg_extension_bm_controls_show()
1106 mutex_unlock(&opts->lock); in uvcg_extension_bm_controls_show()
1116 struct config_group *group = to_config_group(item->ci_parent); in uvcg_extension_bm_controls_store()
1117 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_extension_bm_controls_store()
1126 opts_item = item->ci_parent->ci_parent->ci_parent; in uvcg_extension_bm_controls_store()
1129 mutex_lock(&opts->lock); in uvcg_extension_bm_controls_store()
1138 ret = -ENOMEM; in uvcg_extension_bm_controls_store()
1149 kfree(xu->desc.bmControls); in uvcg_extension_bm_controls_store()
1150 xu->desc.bmControls = bm_controls; in uvcg_extension_bm_controls_store()
1151 xu->desc.bControlSize = n; in uvcg_extension_bm_controls_store()
1152 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(xu->desc.bNrInPins, in uvcg_extension_bm_controls_store()
1153 xu->desc.bControlSize); in uvcg_extension_bm_controls_store()
1158 mutex_unlock(&opts->lock); in uvcg_extension_bm_controls_store()
1187 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_extension_allow_link()
1197 gadget_item = src->ci_parent->ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_extension_allow_link()
1199 if (!strings || tgt->ci_parent->ci_parent != strings) { in uvcg_extension_allow_link()
1200 ret = -EINVAL; in uvcg_extension_allow_link()
1205 xu->string_descriptor_index = string->usb_string.id; in uvcg_extension_allow_link()
1216 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_extension_drop_link()
1223 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_extension_drop_link()
1226 mutex_lock(&opts->lock); in uvcg_extension_drop_link()
1228 xu->string_descriptor_index = 0; in uvcg_extension_drop_link()
1230 mutex_unlock(&opts->lock); in uvcg_extension_drop_link()
1253 opts_item = group->cg_item.ci_parent->ci_parent; in uvcg_extension_drop()
1256 mutex_lock(&opts->lock); in uvcg_extension_drop()
1259 list_del(&xu->list); in uvcg_extension_drop()
1260 kfree(xu->desc.baSourceID); in uvcg_extension_drop()
1261 kfree(xu->desc.bmControls); in uvcg_extension_drop()
1263 mutex_unlock(&opts->lock); in uvcg_extension_drop()
1272 opts_item = group->cg_item.ci_parent->ci_parent; in uvcg_extension_make()
1277 return ERR_PTR(-ENOMEM); in uvcg_extension_make()
1279 xu->desc.bLength = UVC_DT_EXTENSION_UNIT_SIZE(0, 0); in uvcg_extension_make()
1280 xu->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_extension_make()
1281 xu->desc.bDescriptorSubType = UVC_VC_EXTENSION_UNIT; in uvcg_extension_make()
1282 xu->desc.bNumControls = 0; in uvcg_extension_make()
1283 xu->desc.bNrInPins = 0; in uvcg_extension_make()
1284 xu->desc.baSourceID = NULL; in uvcg_extension_make()
1285 xu->desc.bControlSize = 0; in uvcg_extension_make()
1286 xu->desc.bmControls = NULL; in uvcg_extension_make()
1288 mutex_lock(&opts->lock); in uvcg_extension_make()
1290 xu->desc.bUnitID = ++opts->last_unit_id; in uvcg_extension_make()
1292 config_item_init_type_name(&xu->item, name, &uvcg_extension_type); in uvcg_extension_make()
1293 list_add_tail(&xu->list, &opts->extension_units); in uvcg_extension_make()
1295 mutex_unlock(&opts->lock); in uvcg_extension_make()
1297 return &xu->item; in uvcg_extension_make()
1314 /* -----------------------------------------------------------------------------
1315 * control/class/{fs|ss}
1330 if (!strcmp(group->name, "fs")) in uvcg_get_ctl_class_arr()
1331 return o->uvc_fs_control_cls; in uvcg_get_ctl_class_arr()
1333 if (!strcmp(group->name, "ss")) in uvcg_get_ctl_class_arr()
1334 return o->uvc_ss_control_cls; in uvcg_get_ctl_class_arr()
1344 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_control_class_allow_link()
1347 int ret = -EINVAL; in uvcg_control_class_allow_link()
1351 control = src->ci_parent->ci_parent; in uvcg_control_class_allow_link()
1353 if (!header || target->ci_parent != header) in uvcg_control_class_allow_link()
1356 opts = to_f_uvc_opts(control->ci_parent); in uvcg_control_class_allow_link()
1358 mutex_lock(&opts->lock); in uvcg_control_class_allow_link()
1363 if (opts->refcnt || class_array[0]) { in uvcg_control_class_allow_link()
1364 ret = -EBUSY; in uvcg_control_class_allow_link()
1369 ++target_hdr->linked; in uvcg_control_class_allow_link()
1370 class_array[0] = (struct uvc_descriptor_header *)&target_hdr->desc; in uvcg_control_class_allow_link()
1374 mutex_unlock(&opts->lock); in uvcg_control_class_allow_link()
1386 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_control_class_drop_link()
1392 control = src->ci_parent->ci_parent; in uvcg_control_class_drop_link()
1394 if (!header || target->ci_parent != header) in uvcg_control_class_drop_link()
1397 opts = to_f_uvc_opts(control->ci_parent); in uvcg_control_class_drop_link()
1399 mutex_lock(&opts->lock); in uvcg_control_class_drop_link()
1402 if (!class_array || opts->refcnt) in uvcg_control_class_drop_link()
1406 --target_hdr->linked; in uvcg_control_class_drop_link()
1410 mutex_unlock(&opts->lock); in uvcg_control_class_drop_link()
1427 /* -----------------------------------------------------------------------------
1433 static const char * const names[] = { "fs", "ss" }; in uvcg_control_class_create_children()
1441 return -ENOMEM; in uvcg_control_class_create_children()
1443 group->name = names[i]; in uvcg_control_class_create_children()
1445 config_group_init_type_name(&group->group, group->name, in uvcg_control_class_create_children()
1447 configfs_add_default_group(&group->group, parent); in uvcg_control_class_create_children()
1462 /* -----------------------------------------------------------------------------
1470 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_b_interface_number_show()
1477 opts_item = item->ci_parent; in uvcg_default_control_b_interface_number_show()
1480 mutex_lock(&opts->lock); in uvcg_default_control_b_interface_number_show()
1481 result += sprintf(page, "%u\n", opts->control_interface); in uvcg_default_control_b_interface_number_show()
1482 mutex_unlock(&opts->lock); in uvcg_default_control_b_interface_number_show()
1495 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_enable_interrupt_ep_show()
1502 opts_item = item->ci_parent; in uvcg_default_control_enable_interrupt_ep_show()
1505 mutex_lock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_show()
1506 result += sprintf(page, "%u\n", opts->enable_interrupt_ep); in uvcg_default_control_enable_interrupt_ep_show()
1507 mutex_unlock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_show()
1518 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_enable_interrupt_ep_store()
1522 u8 num; in uvcg_default_control_enable_interrupt_ep_store() local
1524 ret = kstrtou8(page, 0, &num); in uvcg_default_control_enable_interrupt_ep_store()
1530 opts_item = item->ci_parent; in uvcg_default_control_enable_interrupt_ep_store()
1533 mutex_lock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_store()
1534 opts->enable_interrupt_ep = num; in uvcg_default_control_enable_interrupt_ep_store()
1535 mutex_unlock(&opts->lock); in uvcg_default_control_enable_interrupt_ep_store()
1566 /* -----------------------------------------------------------------------------
1601 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_format_allow_link()
1609 streaming = src->ci_parent->ci_parent; in uvcg_format_allow_link()
1611 if (!color_matching || color_matching != tgt->ci_parent) { in uvcg_format_allow_link()
1612 ret = -EINVAL; in uvcg_format_allow_link()
1624 if (fmt->color_matching != color_matching_desc) { in uvcg_format_allow_link()
1625 ret = -EBUSY; in uvcg_format_allow_link()
1629 color_matching_desc->refcnt--; in uvcg_format_allow_link()
1632 fmt->color_matching = color_matching_desc; in uvcg_format_allow_link()
1633 color_matching_desc->refcnt++; in uvcg_format_allow_link()
1644 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_format_drop_link()
1652 color_matching_desc->refcnt--; in uvcg_format_drop_link()
1654 streaming = src->ci_parent->ci_parent; in uvcg_format_drop_link()
1658 fmt->color_matching = color_matching_desc; in uvcg_format_drop_link()
1659 color_matching_desc->refcnt++; in uvcg_format_drop_link()
1674 struct mutex *su_mutex = &f->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_show()
1680 opts_item = f->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_show()
1683 mutex_lock(&opts->lock); in uvcg_format_bma_controls_show()
1687 result += sprintf(pg, "%x\n", f->bmaControls[i]); in uvcg_format_bma_controls_show()
1690 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_show()
1701 struct mutex *su_mutex = &ch->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_store()
1702 int ret = -EINVAL; in uvcg_format_bma_controls_store()
1706 opts_item = ch->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_store()
1709 mutex_lock(&opts->lock); in uvcg_format_bma_controls_store()
1710 if (ch->linked || opts->refcnt) { in uvcg_format_bma_controls_store()
1711 ret = -EBUSY; in uvcg_format_bma_controls_store()
1718 ret = hex2bin(ch->bmaControls, page + 2, 1); in uvcg_format_bma_controls_store()
1723 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_store()
1728 /* -----------------------------------------------------------------------------
1738 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_allow_link()
1744 int i, ret = -EINVAL; in uvcg_streaming_header_allow_link()
1749 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_allow_link()
1752 mutex_lock(&opts->lock); in uvcg_streaming_header_allow_link()
1754 if (src_hdr->linked) { in uvcg_streaming_header_allow_link()
1755 ret = -EBUSY; in uvcg_streaming_header_allow_link()
1762 * the grand-parent of the target matches the grand-parent of the source in uvcg_streaming_header_allow_link()
1766 if (src->ci_parent->ci_parent != target->ci_parent->ci_parent) in uvcg_streaming_header_allow_link()
1770 if (!strcmp(target->ci_parent->ci_name, uvcg_format_names[i])) in uvcg_streaming_header_allow_link()
1784 ret = -ENOMEM; in uvcg_streaming_header_allow_link()
1788 format_ptr->fmt = target_fmt; in uvcg_streaming_header_allow_link()
1789 list_add_tail(&format_ptr->entry, &src_hdr->formats); in uvcg_streaming_header_allow_link()
1790 ++src_hdr->num_fmt; in uvcg_streaming_header_allow_link()
1791 ++target_fmt->linked; in uvcg_streaming_header_allow_link()
1794 mutex_unlock(&opts->lock); in uvcg_streaming_header_allow_link()
1802 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_drop_link()
1812 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_drop_link()
1815 mutex_lock(&opts->lock); in uvcg_streaming_header_drop_link()
1819 list_for_each_entry_safe(format_ptr, tmp, &src_hdr->formats, entry) in uvcg_streaming_header_drop_link()
1820 if (format_ptr->fmt == target_fmt) { in uvcg_streaming_header_drop_link()
1821 list_del(&format_ptr->entry); in uvcg_streaming_header_drop_link()
1823 --src_hdr->num_fmt; in uvcg_streaming_header_drop_link()
1827 --target_fmt->linked; in uvcg_streaming_header_drop_link()
1829 mutex_unlock(&opts->lock); in uvcg_streaming_header_drop_link()
1839 #define UVCG_STREAMING_HEADER_ATTR(cname, aname, bits) \ argument
1846 struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
1851 opts_item = sh->item.ci_parent->ci_parent->ci_parent; \
1854 mutex_lock(&opts->lock); \
1855 result = sprintf(page, "%u\n", le##bits##_to_cpu(sh->desc.aname));\
1856 mutex_unlock(&opts->lock); \
1894 return ERR_PTR(-ENOMEM); in uvcg_streaming_header_make()
1896 INIT_LIST_HEAD(&h->formats); in uvcg_streaming_header_make()
1897 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_streaming_header_make()
1898 h->desc.bDescriptorSubType = UVC_VS_INPUT_HEADER; in uvcg_streaming_header_make()
1899 h->desc.bTerminalLink = 3; in uvcg_streaming_header_make()
1900 h->desc.bControlSize = UVCG_STREAMING_CONTROL_SIZE; in uvcg_streaming_header_make()
1902 config_item_init_type_name(&h->item, name, &uvcg_streaming_header_type); in uvcg_streaming_header_make()
1904 return &h->item; in uvcg_streaming_header_make()
1920 /* -----------------------------------------------------------------------------
1924 #define UVCG_FRAME_ATTR(cname, aname, bits) \ argument
1930 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1935 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1938 mutex_lock(&opts->lock); \
1939 result = sprintf(page, "%u\n", f->frame.cname); \
1940 mutex_unlock(&opts->lock); \
1953 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1954 typeof(f->frame.cname) num; \
1957 ret = kstrtou##bits(page, 0, &num); \
1963 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1965 fmt = to_uvcg_format(f->item.ci_parent); \
1967 mutex_lock(&opts->lock); \
1968 if (fmt->linked || opts->refcnt) { \
1969 ret = -EBUSY; \
1973 f->frame.cname = num; \
1976 mutex_unlock(&opts->lock); \
1991 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_b_frame_index_show()
1996 fmt_item = f->item.ci_parent; in uvcg_frame_b_frame_index_show()
1999 if (!fmt->linked) { in uvcg_frame_b_frame_index_show()
2000 result = -EBUSY; in uvcg_frame_b_frame_index_show()
2004 opts_item = fmt_item->ci_parent->ci_parent->ci_parent; in uvcg_frame_b_frame_index_show()
2007 mutex_lock(&opts->lock); in uvcg_frame_b_frame_index_show()
2008 result = sprintf(page, "%u\n", f->frame.b_frame_index); in uvcg_frame_b_frame_index_show()
2009 mutex_unlock(&opts->lock); in uvcg_frame_b_frame_index_show()
2034 struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_show()
2040 opts_item = frm->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_show()
2043 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
2044 for (result = 0, i = 0; i < frm->frame.b_frame_interval_type; ++i) { in uvcg_frame_dw_frame_interval_show()
2045 result += sprintf(pg, "%u\n", frm->dw_frame_interval[i]); in uvcg_frame_dw_frame_interval_show()
2048 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
2061 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_store()
2067 opts_item = ch->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_store()
2069 fmt = to_uvcg_format(ch->item.ci_parent); in uvcg_frame_dw_frame_interval_store()
2071 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
2072 if (fmt->linked || opts->refcnt) { in uvcg_frame_dw_frame_interval_store()
2073 ret = -EBUSY; in uvcg_frame_dw_frame_interval_store()
2083 ret = -ENOMEM; in uvcg_frame_dw_frame_interval_store()
2093 kfree(ch->dw_frame_interval); in uvcg_frame_dw_frame_interval_store()
2094 ch->dw_frame_interval = frm_intrv; in uvcg_frame_dw_frame_interval_store()
2095 ch->frame.b_frame_interval_type = n; in uvcg_frame_dw_frame_interval_store()
2096 sort(ch->dw_frame_interval, n, sizeof(*ch->dw_frame_interval), in uvcg_frame_dw_frame_interval_store()
2101 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
2138 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
2140 h->frame.b_descriptor_type = USB_DT_CS_INTERFACE; in uvcg_frame_make()
2141 h->frame.b_frame_index = 1; in uvcg_frame_make()
2142 h->frame.w_width = 640; in uvcg_frame_make()
2143 h->frame.w_height = 360; in uvcg_frame_make()
2144 h->frame.dw_min_bit_rate = 18432000; in uvcg_frame_make()
2145 h->frame.dw_max_bit_rate = 55296000; in uvcg_frame_make()
2146 h->frame.dw_max_video_frame_buffer_size = 460800; in uvcg_frame_make()
2147 h->frame.dw_default_frame_interval = 666666; in uvcg_frame_make()
2149 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_make()
2152 mutex_lock(&opts->lock); in uvcg_frame_make()
2153 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_make()
2154 if (fmt->type == UVCG_UNCOMPRESSED) { in uvcg_frame_make()
2155 h->frame.b_descriptor_subtype = UVC_VS_FRAME_UNCOMPRESSED; in uvcg_frame_make()
2156 h->fmt_type = UVCG_UNCOMPRESSED; in uvcg_frame_make()
2157 } else if (fmt->type == UVCG_MJPEG) { in uvcg_frame_make()
2158 h->frame.b_descriptor_subtype = UVC_VS_FRAME_MJPEG; in uvcg_frame_make()
2159 h->fmt_type = UVCG_MJPEG; in uvcg_frame_make()
2161 mutex_unlock(&opts->lock); in uvcg_frame_make()
2163 return ERR_PTR(-EINVAL); in uvcg_frame_make()
2168 mutex_unlock(&opts->lock); in uvcg_frame_make()
2170 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
2173 frame_ptr->frm = h; in uvcg_frame_make()
2174 list_add_tail(&frame_ptr->entry, &fmt->frames); in uvcg_frame_make()
2175 ++fmt->num_frames; in uvcg_frame_make()
2176 mutex_unlock(&opts->lock); in uvcg_frame_make()
2178 config_item_init_type_name(&h->item, name, &uvcg_frame_type); in uvcg_frame_make()
2180 return &h->item; in uvcg_frame_make()
2191 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_drop()
2194 mutex_lock(&opts->lock); in uvcg_frame_drop()
2196 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_drop()
2198 list_for_each_entry_safe(frame_ptr, tmp, &fmt->frames, entry) in uvcg_frame_drop()
2199 if (frame_ptr->frm == target_frm) { in uvcg_frame_drop()
2200 list_del(&frame_ptr->entry); in uvcg_frame_drop()
2202 --fmt->num_frames; in uvcg_frame_drop()
2205 mutex_unlock(&opts->lock); in uvcg_frame_drop()
2215 list_for_each_entry(ci, &fmt->cg_children, ci_entry) { in uvcg_format_set_indices()
2218 if (ci->ci_type != &uvcg_frame_type) in uvcg_format_set_indices()
2222 frm->frame.b_frame_index = i++; in uvcg_format_set_indices()
2226 /* -----------------------------------------------------------------------------
2241 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_show()
2245 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_show()
2248 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_show()
2249 memcpy(page, ch->desc.guidFormat, sizeof(ch->desc.guidFormat)); in uvcg_uncompressed_guid_format_show()
2250 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_show()
2254 return sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_show()
2263 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_store()
2265 u8 tmpguidFormat[sizeof(ch->desc.guidFormat)]; in uvcg_uncompressed_guid_format_store()
2270 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_store()
2273 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_store()
2274 if (ch->fmt.linked || opts->refcnt) { in uvcg_uncompressed_guid_format_store()
2275 ret = -EBUSY; in uvcg_uncompressed_guid_format_store()
2284 ret = -EINVAL; in uvcg_uncompressed_guid_format_store()
2288 memcpy(ch->desc.guidFormat, tmpguidFormat, in uvcg_uncompressed_guid_format_store()
2289 min(sizeof(ch->desc.guidFormat), len)); in uvcg_uncompressed_guid_format_store()
2290 ret = sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_store()
2293 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_store()
2300 #define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, bits) \ argument
2307 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2312 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2315 mutex_lock(&opts->lock); \
2316 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2317 mutex_unlock(&opts->lock); \
2325 #define UVCG_UNCOMPRESSED_ATTR(cname, aname, bits) \ argument
2332 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2337 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2340 mutex_lock(&opts->lock); \
2341 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2342 mutex_unlock(&opts->lock); \
2355 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2357 u8 num; \
2361 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2364 mutex_lock(&opts->lock); \
2365 if (u->fmt.linked || opts->refcnt) { \
2366 ret = -EBUSY; \
2370 ret = kstrtou8(page, 0, &num); \
2375 if (!num) { \
2376 ret = -EINVAL; \
2380 u->desc.aname = num; \
2383 mutex_unlock(&opts->lock); \
2404 return uvcg_format_bma_controls_show(&unc->fmt, page); in uvcg_uncompressed_bma_controls_show()
2412 return uvcg_format_bma_controls_store(&unc->fmt, page, len); in uvcg_uncompressed_bma_controls_store()
2447 streaming = group->cg_item.ci_parent; in uvcg_uncompressed_make()
2450 return ERR_PTR(-EINVAL); in uvcg_uncompressed_make()
2454 return ERR_PTR(-ENOMEM); in uvcg_uncompressed_make()
2456 h->desc.bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE; in uvcg_uncompressed_make()
2457 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_uncompressed_make()
2458 h->desc.bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED; in uvcg_uncompressed_make()
2459 memcpy(h->desc.guidFormat, guid, sizeof(guid)); in uvcg_uncompressed_make()
2460 h->desc.bBitsPerPixel = 16; in uvcg_uncompressed_make()
2461 h->desc.bDefaultFrameIndex = 1; in uvcg_uncompressed_make()
2462 h->desc.bAspectRatioX = 0; in uvcg_uncompressed_make()
2463 h->desc.bAspectRatioY = 0; in uvcg_uncompressed_make()
2464 h->desc.bmInterlaceFlags = 0; in uvcg_uncompressed_make()
2465 h->desc.bCopyProtect = 0; in uvcg_uncompressed_make()
2467 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_uncompressed_make()
2468 h->fmt.type = UVCG_UNCOMPRESSED; in uvcg_uncompressed_make()
2469 h->fmt.color_matching = color_match; in uvcg_uncompressed_make()
2470 color_match->refcnt++; in uvcg_uncompressed_make()
2471 config_group_init_type_name(&h->fmt.group, name, in uvcg_uncompressed_make()
2474 return &h->fmt.group; in uvcg_uncompressed_make()
2490 /* -----------------------------------------------------------------------------
2499 #define UVCG_MJPEG_ATTR_RO(cname, aname, bits) \ argument
2505 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2510 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2513 mutex_lock(&opts->lock); \
2514 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2515 mutex_unlock(&opts->lock); \
2523 #define UVCG_MJPEG_ATTR(cname, aname, bits) \ argument
2529 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2534 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2537 mutex_lock(&opts->lock); \
2538 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2539 mutex_unlock(&opts->lock); \
2552 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2554 u8 num; \
2558 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2561 mutex_lock(&opts->lock); \
2562 if (u->fmt.linked || opts->refcnt) { \
2563 ret = -EBUSY; \
2567 ret = kstrtou8(page, 0, &num); \
2572 if (!num) { \
2573 ret = -EINVAL; \
2577 u->desc.aname = num; \
2580 mutex_unlock(&opts->lock); \
2601 return uvcg_format_bma_controls_show(&u->fmt, page); in uvcg_mjpeg_bma_controls_show()
2609 return uvcg_format_bma_controls_store(&u->fmt, page, len); in uvcg_mjpeg_bma_controls_store()
2639 streaming = group->cg_item.ci_parent; in uvcg_mjpeg_make()
2642 return ERR_PTR(-EINVAL); in uvcg_mjpeg_make()
2646 return ERR_PTR(-ENOMEM); in uvcg_mjpeg_make()
2648 h->desc.bLength = UVC_DT_FORMAT_MJPEG_SIZE; in uvcg_mjpeg_make()
2649 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_mjpeg_make()
2650 h->desc.bDescriptorSubType = UVC_VS_FORMAT_MJPEG; in uvcg_mjpeg_make()
2651 h->desc.bDefaultFrameIndex = 1; in uvcg_mjpeg_make()
2652 h->desc.bAspectRatioX = 0; in uvcg_mjpeg_make()
2653 h->desc.bAspectRatioY = 0; in uvcg_mjpeg_make()
2654 h->desc.bmInterlaceFlags = 0; in uvcg_mjpeg_make()
2655 h->desc.bCopyProtect = 0; in uvcg_mjpeg_make()
2657 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_mjpeg_make()
2658 h->fmt.type = UVCG_MJPEG; in uvcg_mjpeg_make()
2659 h->fmt.color_matching = color_match; in uvcg_mjpeg_make()
2660 color_match->refcnt++; in uvcg_mjpeg_make()
2661 config_group_init_type_name(&h->fmt.group, name, in uvcg_mjpeg_make()
2664 return &h->fmt.group; in uvcg_mjpeg_make()
2680 /* -----------------------------------------------------------------------------
2684 #define UVCG_COLOR_MATCHING_ATTR(cname, aname, bits) \ argument
2693 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
2698 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
2701 mutex_lock(&opts->lock); \
2703 le##bits##_to_cpu(color_match->desc.aname)); \
2704 mutex_unlock(&opts->lock); \
2714 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
2720 u##bits num; \
2722 ret = kstrtou##bits(page, 0, &num); \
2728 if (color_match->refcnt) { \
2729 ret = -EBUSY; \
2733 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
2736 mutex_lock(&opts->lock); \
2738 color_match->desc.aname = num; \
2741 mutex_unlock(&opts->lock); \
2780 /* -----------------------------------------------------------------------------
2791 return ERR_PTR(-ENOMEM); in uvcg_color_matching_make()
2793 color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE; in uvcg_color_matching_make()
2794 color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_color_matching_make()
2795 color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT; in uvcg_color_matching_make()
2797 config_group_init_type_name(&color_match->group, name, in uvcg_color_matching_make()
2800 return &color_match->group; in uvcg_color_matching_make()
2813 return -ENOMEM; in uvcg_color_matching_create_children()
2815 color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE; in uvcg_color_matching_create_children()
2816 color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_color_matching_create_children()
2817 color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT; in uvcg_color_matching_create_children()
2818 color_match->desc.bColorPrimaries = UVC_COLOR_PRIMARIES_BT_709_SRGB; in uvcg_color_matching_create_children()
2819 color_match->desc.bTransferCharacteristics = UVC_TRANSFER_CHARACTERISTICS_BT_709; in uvcg_color_matching_create_children()
2820 color_match->desc.bMatrixCoefficients = UVC_MATRIX_COEFFICIENTS_SMPTE_170M; in uvcg_color_matching_create_children()
2822 config_group_init_type_name(&color_match->group, "default", in uvcg_color_matching_create_children()
2824 configfs_add_default_group(&color_match->group, parent); in uvcg_color_matching_create_children()
2839 /* -----------------------------------------------------------------------------
2840 * streaming/class/{fs|hs|ss}
2855 if (!strcmp(group->name, "fs")) in __uvcg_get_stream_class_arr()
2856 return &o->uvc_fs_streaming_cls; in __uvcg_get_stream_class_arr()
2858 if (!strcmp(group->name, "hs")) in __uvcg_get_stream_class_arr()
2859 return &o->uvc_hs_streaming_cls; in __uvcg_get_stream_class_arr()
2861 if (!strcmp(group->name, "ss")) in __uvcg_get_stream_class_arr()
2862 return &o->uvc_ss_streaming_cls; in __uvcg_get_stream_class_arr()
2904 return -EINVAL; in __uvcg_iter_strm_cls()
2910 list_for_each_entry(f, &h->formats, entry) { in __uvcg_iter_strm_cls()
2911 ret = fun(f->fmt, priv2, priv3, i++, UVCG_FORMAT); in __uvcg_iter_strm_cls()
2914 grp = &f->fmt->group; in __uvcg_iter_strm_cls()
2915 list_for_each_entry(item, &grp->cg_children, ci_entry) { in __uvcg_iter_strm_cls()
2922 ret = fun(f->fmt->color_matching, priv2, priv3, 0, in __uvcg_iter_strm_cls()
2949 *size += sizeof(h->desc); in __uvcg_cnt_strm()
2951 *size += h->num_fmt * UVCG_STREAMING_CONTROL_SIZE; in __uvcg_cnt_strm()
2957 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_cnt_strm()
2962 *size += sizeof(u->desc); in __uvcg_cnt_strm()
2963 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_cnt_strm()
2967 *size += sizeof(m->desc); in __uvcg_cnt_strm()
2969 return -EINVAL; in __uvcg_cnt_strm()
2975 int sz = sizeof(frm->dw_frame_interval); in __uvcg_cnt_strm()
2977 *size += sizeof(frm->frame); in __uvcg_cnt_strm()
2978 *size += frm->frame.b_frame_interval_type * sz; in __uvcg_cnt_strm()
2984 *size += sizeof(color_match->desc); in __uvcg_cnt_strm()
2999 * @priv3: inout parameter, pointer to a 2-dimensional array
3017 memcpy(*dest, &h->desc, sizeof(h->desc)); in __uvcg_fill_strm()
3018 *dest += sizeof(h->desc); in __uvcg_fill_strm()
3020 list_for_each_entry(f, &h->formats, entry) { in __uvcg_fill_strm()
3021 memcpy(*dest, f->fmt->bmaControls, sz); in __uvcg_fill_strm()
3024 ihdr->bLength = sizeof(h->desc) + h->num_fmt * sz; in __uvcg_fill_strm()
3025 ihdr->bNumFormats = h->num_fmt; in __uvcg_fill_strm()
3031 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_fill_strm()
3036 u->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3037 u->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3038 memcpy(*dest, &u->desc, sizeof(u->desc)); in __uvcg_fill_strm()
3039 *dest += sizeof(u->desc); in __uvcg_fill_strm()
3040 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_fill_strm()
3044 m->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3045 m->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3046 memcpy(*dest, &m->desc, sizeof(m->desc)); in __uvcg_fill_strm()
3047 *dest += sizeof(m->desc); in __uvcg_fill_strm()
3049 return -EINVAL; in __uvcg_fill_strm()
3057 sz = sizeof(frm->frame); in __uvcg_fill_strm()
3058 memcpy(*dest, &frm->frame, sz); in __uvcg_fill_strm()
3060 sz = frm->frame.b_frame_interval_type * in __uvcg_fill_strm()
3061 sizeof(*frm->dw_frame_interval); in __uvcg_fill_strm()
3062 memcpy(*dest, frm->dw_frame_interval, sz); in __uvcg_fill_strm()
3064 if (frm->fmt_type == UVCG_UNCOMPRESSED) in __uvcg_fill_strm()
3065 h->bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE( in __uvcg_fill_strm()
3066 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3067 else if (frm->fmt_type == UVCG_MJPEG) in __uvcg_fill_strm()
3068 h->bLength = UVC_DT_FRAME_MJPEG_SIZE( in __uvcg_fill_strm()
3069 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3075 memcpy(*dest, &color_match->desc, sizeof(color_match->desc)); in __uvcg_fill_strm()
3076 *dest += sizeof(color_match->desc); in __uvcg_fill_strm()
3089 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_allow_link()
3094 int ret = -EINVAL; in uvcg_streaming_class_allow_link()
3098 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_allow_link()
3100 if (!header || target->ci_parent != header) in uvcg_streaming_class_allow_link()
3103 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_allow_link()
3105 mutex_lock(&opts->lock); in uvcg_streaming_class_allow_link()
3108 if (!class_array || *class_array || opts->refcnt) { in uvcg_streaming_class_allow_link()
3109 ret = -EBUSY; in uvcg_streaming_class_allow_link()
3121 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
3129 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
3146 ++target_hdr->linked; in uvcg_streaming_class_allow_link()
3150 mutex_unlock(&opts->lock); in uvcg_streaming_class_allow_link()
3162 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_drop_link()
3168 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_drop_link()
3170 if (!header || target->ci_parent != header) in uvcg_streaming_class_drop_link()
3173 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_drop_link()
3175 mutex_lock(&opts->lock); in uvcg_streaming_class_drop_link()
3181 if (opts->refcnt) in uvcg_streaming_class_drop_link()
3185 --target_hdr->linked; in uvcg_streaming_class_drop_link()
3191 mutex_unlock(&opts->lock); in uvcg_streaming_class_drop_link()
3208 /* -----------------------------------------------------------------------------
3214 static const char * const names[] = { "fs", "hs", "ss" }; in uvcg_streaming_class_create_children()
3222 return -ENOMEM; in uvcg_streaming_class_create_children()
3224 group->name = names[i]; in uvcg_streaming_class_create_children()
3226 config_group_init_type_name(&group->group, group->name, in uvcg_streaming_class_create_children()
3228 configfs_add_default_group(&group->group, parent); in uvcg_streaming_class_create_children()
3243 /* -----------------------------------------------------------------------------
3251 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_streaming_b_interface_number_show()
3258 opts_item = item->ci_parent; in uvcg_default_streaming_b_interface_number_show()
3261 mutex_lock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
3262 result += sprintf(page, "%u\n", opts->streaming_interface); in uvcg_default_streaming_b_interface_number_show()
3263 mutex_unlock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
3294 /* -----------------------------------------------------------------------------
3303 usb_put_function_instance(&opts->func_inst); in uvc_func_item_release()
3308 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvc_func_allow_link()
3317 strings = config_group_find_item(to_config_group(src->ci_parent->ci_parent), in uvc_func_allow_link()
3319 if (!strings || tgt->ci_parent->ci_parent != strings) { in uvc_func_allow_link()
3320 ret = -EINVAL; in uvc_func_allow_link()
3327 mutex_lock(&opts->lock); in uvc_func_allow_link()
3329 if (!strcmp(tgt->ci_name, "iad_desc")) in uvc_func_allow_link()
3330 opts->iad_index = string->usb_string.id; in uvc_func_allow_link()
3331 else if (!strcmp(tgt->ci_name, "vs0_desc")) in uvc_func_allow_link()
3332 opts->vs0_index = string->usb_string.id; in uvc_func_allow_link()
3333 else if (!strcmp(tgt->ci_name, "vs1_desc")) in uvc_func_allow_link()
3334 opts->vs1_index = string->usb_string.id; in uvc_func_allow_link()
3336 ret = -EINVAL; in uvc_func_allow_link()
3338 mutex_unlock(&opts->lock); in uvc_func_allow_link()
3352 mutex_lock(&opts->lock); in uvc_func_drop_link()
3354 if (!strcmp(tgt->ci_name, "iad_desc")) in uvc_func_drop_link()
3355 opts->iad_index = 0; in uvc_func_drop_link()
3356 else if (!strcmp(tgt->ci_name, "vs0_desc")) in uvc_func_drop_link()
3357 opts->vs0_index = 0; in uvc_func_drop_link()
3358 else if (!strcmp(tgt->ci_name, "vs1_desc")) in uvc_func_drop_link()
3359 opts->vs1_index = 0; in uvc_func_drop_link()
3361 mutex_unlock(&opts->lock); in uvc_func_drop_link()
3377 mutex_lock(&opts->lock); \
3378 result = sprintf(page, "%u\n", opts->cname); \
3379 mutex_unlock(&opts->lock); \
3389 unsigned int num; \
3392 mutex_lock(&opts->lock); \
3393 if (opts->refcnt) { \
3394 ret = -EBUSY; \
3398 ret = kstrtouint(page, 0, &num); \
3402 if (num > limit) { \
3403 ret = -EINVAL; \
3406 opts->cname = num; \
3409 mutex_unlock(&opts->lock); \
3428 mutex_lock(&opts->lock); \
3429 result = snprintf(page, sizeof(opts->aname), "%s", opts->aname);\
3430 mutex_unlock(&opts->lock); \
3439 int size = min(sizeof(opts->aname), len + 1); \
3442 mutex_lock(&opts->lock); \
3443 if (opts->refcnt) { \
3444 ret = -EBUSY; \
3448 ret = strscpy(opts->aname, page, size); \
3449 if (ret == -E2BIG) \
3450 ret = size - 1; \
3453 mutex_unlock(&opts->lock); \
3489 config_group_init_type_name(&opts->func_inst.group, uvc_func_type.name, in uvcg_attach_configfs()
3492 ret = uvcg_config_create_children(&opts->func_inst.group, in uvcg_attach_configfs()
3495 config_group_put(&opts->func_inst.group); in uvcg_attach_configfs()