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 /* -----------------------------------------------------------------------------
1603 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_format_allow_link()
1611 streaming = src->ci_parent->ci_parent; in uvcg_format_allow_link()
1613 if (!color_matching || color_matching != tgt->ci_parent) { in uvcg_format_allow_link()
1614 ret = -EINVAL; in uvcg_format_allow_link()
1626 if (fmt->color_matching != color_matching_desc) { in uvcg_format_allow_link()
1627 ret = -EBUSY; in uvcg_format_allow_link()
1631 color_matching_desc->refcnt--; in uvcg_format_allow_link()
1634 fmt->color_matching = color_matching_desc; in uvcg_format_allow_link()
1635 color_matching_desc->refcnt++; in uvcg_format_allow_link()
1646 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_format_drop_link()
1654 color_matching_desc->refcnt--; in uvcg_format_drop_link()
1656 streaming = src->ci_parent->ci_parent; in uvcg_format_drop_link()
1660 fmt->color_matching = color_matching_desc; in uvcg_format_drop_link()
1661 color_matching_desc->refcnt++; in uvcg_format_drop_link()
1676 struct mutex *su_mutex = &f->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_show()
1682 opts_item = f->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_show()
1685 mutex_lock(&opts->lock); in uvcg_format_bma_controls_show()
1689 result += sprintf(pg, "%x\n", f->bmaControls[i]); in uvcg_format_bma_controls_show()
1692 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_show()
1703 struct mutex *su_mutex = &ch->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_store()
1704 int ret = -EINVAL; in uvcg_format_bma_controls_store()
1708 opts_item = ch->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_store()
1711 mutex_lock(&opts->lock); in uvcg_format_bma_controls_store()
1712 if (ch->linked || opts->refcnt) { in uvcg_format_bma_controls_store()
1713 ret = -EBUSY; in uvcg_format_bma_controls_store()
1720 ret = hex2bin(ch->bmaControls, page + 2, 1); in uvcg_format_bma_controls_store()
1725 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_store()
1730 /* -----------------------------------------------------------------------------
1740 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_allow_link()
1746 int i, ret = -EINVAL; in uvcg_streaming_header_allow_link()
1751 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_allow_link()
1754 mutex_lock(&opts->lock); in uvcg_streaming_header_allow_link()
1756 if (src_hdr->linked) { in uvcg_streaming_header_allow_link()
1757 ret = -EBUSY; in uvcg_streaming_header_allow_link()
1764 * the grand-parent of the target matches the grand-parent of the source in uvcg_streaming_header_allow_link()
1768 if (src->ci_parent->ci_parent != target->ci_parent->ci_parent) in uvcg_streaming_header_allow_link()
1772 if (!strcmp(target->ci_parent->ci_name, uvcg_format_names[i])) in uvcg_streaming_header_allow_link()
1789 ret = -ENOMEM; in uvcg_streaming_header_allow_link()
1793 format_ptr->fmt = target_fmt; in uvcg_streaming_header_allow_link()
1794 list_add_tail(&format_ptr->entry, &src_hdr->formats); in uvcg_streaming_header_allow_link()
1795 ++src_hdr->num_fmt; in uvcg_streaming_header_allow_link()
1796 ++target_fmt->linked; in uvcg_streaming_header_allow_link()
1799 mutex_unlock(&opts->lock); in uvcg_streaming_header_allow_link()
1807 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_drop_link()
1817 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_drop_link()
1820 mutex_lock(&opts->lock); in uvcg_streaming_header_drop_link()
1827 list_for_each_entry_safe(format_ptr, tmp, &src_hdr->formats, entry) in uvcg_streaming_header_drop_link()
1828 if (format_ptr->fmt == target_fmt) { in uvcg_streaming_header_drop_link()
1829 list_del(&format_ptr->entry); in uvcg_streaming_header_drop_link()
1831 --src_hdr->num_fmt; in uvcg_streaming_header_drop_link()
1835 --target_fmt->linked; in uvcg_streaming_header_drop_link()
1838 mutex_unlock(&opts->lock); in uvcg_streaming_header_drop_link()
1848 #define UVCG_STREAMING_HEADER_ATTR(cname, aname, bits) \ argument
1855 struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
1860 opts_item = sh->item.ci_parent->ci_parent->ci_parent; \
1863 mutex_lock(&opts->lock); \
1864 result = sprintf(page, "%u\n", le##bits##_to_cpu(sh->desc.aname));\
1865 mutex_unlock(&opts->lock); \
1903 return ERR_PTR(-ENOMEM); in uvcg_streaming_header_make()
1905 INIT_LIST_HEAD(&h->formats); in uvcg_streaming_header_make()
1906 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_streaming_header_make()
1907 h->desc.bDescriptorSubType = UVC_VS_INPUT_HEADER; in uvcg_streaming_header_make()
1908 h->desc.bTerminalLink = 3; in uvcg_streaming_header_make()
1909 h->desc.bControlSize = UVCG_STREAMING_CONTROL_SIZE; in uvcg_streaming_header_make()
1911 config_item_init_type_name(&h->item, name, &uvcg_streaming_header_type); in uvcg_streaming_header_make()
1913 return &h->item; in uvcg_streaming_header_make()
1929 /* -----------------------------------------------------------------------------
1933 #define UVCG_FRAME_ATTR(cname, aname, bits) \ argument
1939 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1944 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1947 mutex_lock(&opts->lock); \
1948 result = sprintf(page, "%u\n", f->frame.cname); \
1949 mutex_unlock(&opts->lock); \
1962 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1963 typeof(f->frame.cname) num; \
1966 ret = kstrtou##bits(page, 0, &num); \
1972 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1974 fmt = to_uvcg_format(f->item.ci_parent); \
1976 mutex_lock(&opts->lock); \
1977 if (fmt->linked || opts->refcnt) { \
1978 ret = -EBUSY; \
1982 f->frame.cname = num; \
1985 mutex_unlock(&opts->lock); \
2000 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_b_frame_index_show()
2005 fmt_item = f->item.ci_parent; in uvcg_frame_b_frame_index_show()
2008 if (!fmt->linked) { in uvcg_frame_b_frame_index_show()
2009 result = -EBUSY; in uvcg_frame_b_frame_index_show()
2013 opts_item = fmt_item->ci_parent->ci_parent->ci_parent; in uvcg_frame_b_frame_index_show()
2016 mutex_lock(&opts->lock); in uvcg_frame_b_frame_index_show()
2017 result = sprintf(page, "%u\n", f->frame.b_frame_index); in uvcg_frame_b_frame_index_show()
2018 mutex_unlock(&opts->lock); in uvcg_frame_b_frame_index_show()
2044 struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_show()
2050 opts_item = frm->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_show()
2053 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
2054 for (result = 0, i = 0; i < frm->frame.b_frame_interval_type; ++i) { in uvcg_frame_dw_frame_interval_show()
2055 result += sprintf(pg, "%u\n", frm->dw_frame_interval[i]); in uvcg_frame_dw_frame_interval_show()
2058 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
2071 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_store()
2077 opts_item = ch->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_store()
2079 fmt = to_uvcg_format(ch->item.ci_parent); in uvcg_frame_dw_frame_interval_store()
2081 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
2082 if (fmt->linked || opts->refcnt) { in uvcg_frame_dw_frame_interval_store()
2083 ret = -EBUSY; in uvcg_frame_dw_frame_interval_store()
2093 ret = -ENOMEM; in uvcg_frame_dw_frame_interval_store()
2103 kfree(ch->dw_frame_interval); in uvcg_frame_dw_frame_interval_store()
2104 ch->dw_frame_interval = frm_intrv; in uvcg_frame_dw_frame_interval_store()
2105 ch->frame.b_frame_interval_type = n; in uvcg_frame_dw_frame_interval_store()
2106 sort(ch->dw_frame_interval, n, sizeof(*ch->dw_frame_interval), in uvcg_frame_dw_frame_interval_store()
2111 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
2167 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
2169 h->frame.b_descriptor_type = USB_DT_CS_INTERFACE; in uvcg_frame_make()
2170 h->frame.b_frame_index = 1; in uvcg_frame_make()
2171 h->frame.w_width = 640; in uvcg_frame_make()
2172 h->frame.w_height = 360; in uvcg_frame_make()
2173 h->frame.dw_min_bit_rate = 18432000; in uvcg_frame_make()
2174 h->frame.dw_max_bit_rate = 55296000; in uvcg_frame_make()
2175 h->frame.dw_max_video_frame_buffer_size = 460800; in uvcg_frame_make()
2176 h->frame.dw_default_frame_interval = 666666; in uvcg_frame_make()
2177 h->frame.dw_bytes_perline = 0; in uvcg_frame_make()
2179 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_make()
2182 mutex_lock(&opts->lock); in uvcg_frame_make()
2183 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_make()
2184 if (fmt->type == UVCG_UNCOMPRESSED) { in uvcg_frame_make()
2185 h->frame.b_descriptor_subtype = UVC_VS_FRAME_UNCOMPRESSED; in uvcg_frame_make()
2186 h->fmt_type = UVCG_UNCOMPRESSED; in uvcg_frame_make()
2187 } else if (fmt->type == UVCG_MJPEG) { in uvcg_frame_make()
2188 h->frame.b_descriptor_subtype = UVC_VS_FRAME_MJPEG; in uvcg_frame_make()
2189 h->fmt_type = UVCG_MJPEG; in uvcg_frame_make()
2190 } else if (fmt->type == UVCG_FRAMEBASED) { in uvcg_frame_make()
2191 h->frame.b_descriptor_subtype = UVC_VS_FRAME_FRAME_BASED; in uvcg_frame_make()
2192 h->fmt_type = UVCG_FRAMEBASED; in uvcg_frame_make()
2194 mutex_unlock(&opts->lock); in uvcg_frame_make()
2196 return ERR_PTR(-EINVAL); in uvcg_frame_make()
2201 mutex_unlock(&opts->lock); in uvcg_frame_make()
2203 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
2206 frame_ptr->frm = h; in uvcg_frame_make()
2207 list_add_tail(&frame_ptr->entry, &fmt->frames); in uvcg_frame_make()
2208 ++fmt->num_frames; in uvcg_frame_make()
2209 mutex_unlock(&opts->lock); in uvcg_frame_make()
2211 if (fmt->type == UVCG_FRAMEBASED) in uvcg_frame_make()
2212 config_item_init_type_name(&h->item, name, &uvcg_frame_type2); in uvcg_frame_make()
2214 config_item_init_type_name(&h->item, name, &uvcg_frame_type1); in uvcg_frame_make()
2216 return &h->item; in uvcg_frame_make()
2227 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_drop()
2230 mutex_lock(&opts->lock); in uvcg_frame_drop()
2232 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_drop()
2234 list_for_each_entry_safe(frame_ptr, tmp, &fmt->frames, entry) in uvcg_frame_drop()
2235 if (frame_ptr->frm == target_frm) { in uvcg_frame_drop()
2236 list_del(&frame_ptr->entry); in uvcg_frame_drop()
2238 --fmt->num_frames; in uvcg_frame_drop()
2241 mutex_unlock(&opts->lock); in uvcg_frame_drop()
2251 list_for_each_entry(ci, &fmt->cg_children, ci_entry) { in uvcg_format_set_indices()
2255 frm->frame.b_frame_index = i++; in uvcg_format_set_indices()
2259 /* -----------------------------------------------------------------------------
2274 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_show()
2278 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_show()
2281 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_show()
2282 memcpy(page, ch->desc.guidFormat, sizeof(ch->desc.guidFormat)); in uvcg_uncompressed_guid_format_show()
2283 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_show()
2287 return sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_show()
2296 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_store()
2298 u8 tmpguidFormat[sizeof(ch->desc.guidFormat)]; in uvcg_uncompressed_guid_format_store()
2303 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_store()
2306 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_store()
2307 if (ch->fmt.linked || opts->refcnt) { in uvcg_uncompressed_guid_format_store()
2308 ret = -EBUSY; in uvcg_uncompressed_guid_format_store()
2317 ret = -EINVAL; in uvcg_uncompressed_guid_format_store()
2321 memcpy(ch->desc.guidFormat, tmpguidFormat, in uvcg_uncompressed_guid_format_store()
2322 min(sizeof(ch->desc.guidFormat), len)); in uvcg_uncompressed_guid_format_store()
2323 ret = sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_store()
2326 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_store()
2333 #define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, bits) \ argument
2340 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2345 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2348 mutex_lock(&opts->lock); \
2349 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2350 mutex_unlock(&opts->lock); \
2358 #define UVCG_UNCOMPRESSED_ATTR(cname, aname, bits) \ argument
2365 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2370 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2373 mutex_lock(&opts->lock); \
2374 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2375 mutex_unlock(&opts->lock); \
2388 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2390 u8 num; \
2394 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2397 mutex_lock(&opts->lock); \
2398 if (u->fmt.linked || opts->refcnt) { \
2399 ret = -EBUSY; \
2403 ret = kstrtou8(page, 0, &num); \
2408 if (!num) { \
2409 ret = -EINVAL; \
2413 u->desc.aname = num; \
2416 mutex_unlock(&opts->lock); \
2437 return uvcg_format_bma_controls_show(&unc->fmt, page); in uvcg_uncompressed_bma_controls_show()
2445 return uvcg_format_bma_controls_store(&unc->fmt, page, len); in uvcg_uncompressed_bma_controls_store()
2480 streaming = group->cg_item.ci_parent; in uvcg_uncompressed_make()
2483 return ERR_PTR(-EINVAL); in uvcg_uncompressed_make()
2487 return ERR_PTR(-ENOMEM); in uvcg_uncompressed_make()
2489 h->desc.bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE; in uvcg_uncompressed_make()
2490 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_uncompressed_make()
2491 h->desc.bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED; in uvcg_uncompressed_make()
2492 memcpy(h->desc.guidFormat, guid, sizeof(guid)); in uvcg_uncompressed_make()
2493 h->desc.bBitsPerPixel = 16; in uvcg_uncompressed_make()
2494 h->desc.bDefaultFrameIndex = 1; in uvcg_uncompressed_make()
2495 h->desc.bAspectRatioX = 0; in uvcg_uncompressed_make()
2496 h->desc.bAspectRatioY = 0; in uvcg_uncompressed_make()
2497 h->desc.bmInterlaceFlags = 0; in uvcg_uncompressed_make()
2498 h->desc.bCopyProtect = 0; in uvcg_uncompressed_make()
2500 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_uncompressed_make()
2501 h->fmt.type = UVCG_UNCOMPRESSED; in uvcg_uncompressed_make()
2502 h->fmt.color_matching = color_match; in uvcg_uncompressed_make()
2503 color_match->refcnt++; in uvcg_uncompressed_make()
2504 config_group_init_type_name(&h->fmt.group, name, in uvcg_uncompressed_make()
2507 return &h->fmt.group; in uvcg_uncompressed_make()
2523 /* -----------------------------------------------------------------------------
2532 #define UVCG_MJPEG_ATTR_RO(cname, aname, bits) \ argument
2538 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2543 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2546 mutex_lock(&opts->lock); \
2547 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2548 mutex_unlock(&opts->lock); \
2556 #define UVCG_MJPEG_ATTR(cname, aname, bits) \ argument
2562 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2567 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2570 mutex_lock(&opts->lock); \
2571 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2572 mutex_unlock(&opts->lock); \
2585 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2587 u8 num; \
2591 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2594 mutex_lock(&opts->lock); \
2595 if (u->fmt.linked || opts->refcnt) { \
2596 ret = -EBUSY; \
2600 ret = kstrtou8(page, 0, &num); \
2605 if (!num) { \
2606 ret = -EINVAL; \
2610 u->desc.aname = num; \
2613 mutex_unlock(&opts->lock); \
2634 return uvcg_format_bma_controls_show(&u->fmt, page); in uvcg_mjpeg_bma_controls_show()
2642 return uvcg_format_bma_controls_store(&u->fmt, page, len); in uvcg_mjpeg_bma_controls_store()
2672 streaming = group->cg_item.ci_parent; in uvcg_mjpeg_make()
2675 return ERR_PTR(-EINVAL); in uvcg_mjpeg_make()
2679 return ERR_PTR(-ENOMEM); in uvcg_mjpeg_make()
2681 h->desc.bLength = UVC_DT_FORMAT_MJPEG_SIZE; in uvcg_mjpeg_make()
2682 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_mjpeg_make()
2683 h->desc.bDescriptorSubType = UVC_VS_FORMAT_MJPEG; in uvcg_mjpeg_make()
2684 h->desc.bDefaultFrameIndex = 1; in uvcg_mjpeg_make()
2685 h->desc.bAspectRatioX = 0; in uvcg_mjpeg_make()
2686 h->desc.bAspectRatioY = 0; in uvcg_mjpeg_make()
2687 h->desc.bmInterlaceFlags = 0; in uvcg_mjpeg_make()
2688 h->desc.bCopyProtect = 0; in uvcg_mjpeg_make()
2690 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_mjpeg_make()
2691 h->fmt.type = UVCG_MJPEG; in uvcg_mjpeg_make()
2692 h->fmt.color_matching = color_match; in uvcg_mjpeg_make()
2693 color_match->refcnt++; in uvcg_mjpeg_make()
2694 config_group_init_type_name(&h->fmt.group, name, in uvcg_mjpeg_make()
2697 return &h->fmt.group; in uvcg_mjpeg_make()
2713 /* -----------------------------------------------------------------------------
2722 #define UVCG_FRAMEBASED_ATTR_RO(cname, aname, bits) \ argument
2729 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2734 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2737 mutex_lock(&opts->lock); \
2738 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2739 mutex_unlock(&opts->lock); \
2747 #define UVCG_FRAMEBASED_ATTR(cname, aname, bits) \ argument
2754 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2759 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2762 mutex_lock(&opts->lock); \
2763 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
2764 mutex_unlock(&opts->lock); \
2777 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
2779 u8 num; \
2783 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
2786 mutex_lock(&opts->lock); \
2787 if (u->fmt.linked || opts->refcnt) { \
2788 ret = -EBUSY; \
2792 ret = kstrtou8(page, 0, &num); \
2796 if (num > 255) { \
2797 ret = -EINVAL; \
2800 u->desc.aname = num; \
2803 mutex_unlock(&opts->lock); \
2826 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_framebased_guid_format_show()
2830 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_framebased_guid_format_show()
2833 mutex_lock(&opts->lock); in uvcg_framebased_guid_format_show()
2834 memcpy(page, ch->desc.guidFormat, sizeof(ch->desc.guidFormat)); in uvcg_framebased_guid_format_show()
2835 mutex_unlock(&opts->lock); in uvcg_framebased_guid_format_show()
2839 return sizeof(ch->desc.guidFormat); in uvcg_framebased_guid_format_show()
2848 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_framebased_guid_format_store()
2853 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_framebased_guid_format_store()
2856 mutex_lock(&opts->lock); in uvcg_framebased_guid_format_store()
2857 if (ch->fmt.linked || opts->refcnt) { in uvcg_framebased_guid_format_store()
2858 ret = -EBUSY; in uvcg_framebased_guid_format_store()
2862 memcpy(ch->desc.guidFormat, page, in uvcg_framebased_guid_format_store()
2863 min(sizeof(ch->desc.guidFormat), len)); in uvcg_framebased_guid_format_store()
2864 ret = sizeof(ch->desc.guidFormat); in uvcg_framebased_guid_format_store()
2867 mutex_unlock(&opts->lock); in uvcg_framebased_guid_format_store()
2879 return uvcg_format_bma_controls_show(&u->fmt, page); in uvcg_framebased_bma_controls_show()
2888 return uvcg_format_bma_controls_store(&u->fmt, page, len); in uvcg_framebased_bma_controls_store()
2923 return ERR_PTR(-ENOMEM); in uvcg_framebased_make()
2925 h->desc.bLength = UVC_DT_FORMAT_FRAMEBASED_SIZE; in uvcg_framebased_make()
2926 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_framebased_make()
2927 h->desc.bDescriptorSubType = UVC_VS_FORMAT_FRAME_BASED; in uvcg_framebased_make()
2928 memcpy(h->desc.guidFormat, guid, sizeof(guid)); in uvcg_framebased_make()
2929 h->desc.bBitsPerPixel = 0; in uvcg_framebased_make()
2930 h->desc.bDefaultFrameIndex = 1; in uvcg_framebased_make()
2931 h->desc.bAspectRatioX = 0; in uvcg_framebased_make()
2932 h->desc.bAspectRatioY = 0; in uvcg_framebased_make()
2933 h->desc.bmInterfaceFlags = 0; in uvcg_framebased_make()
2934 h->desc.bCopyProtect = 0; in uvcg_framebased_make()
2935 h->desc.bVariableSize = 1; in uvcg_framebased_make()
2937 INIT_LIST_HEAD(&h->fmt.frames); in uvcg_framebased_make()
2938 h->fmt.type = UVCG_FRAMEBASED; in uvcg_framebased_make()
2939 config_group_init_type_name(&h->fmt.group, name, in uvcg_framebased_make()
2942 return &h->fmt.group; in uvcg_framebased_make()
2958 /* -----------------------------------------------------------------------------
2962 #define UVCG_COLOR_MATCHING_ATTR(cname, aname, bits) \ argument
2971 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
2976 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
2979 mutex_lock(&opts->lock); \
2981 le##bits##_to_cpu(color_match->desc.aname)); \
2982 mutex_unlock(&opts->lock); \
2992 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
2998 u##bits num; \
3000 ret = kstrtou##bits(page, 0, &num); \
3006 if (color_match->refcnt) { \
3007 ret = -EBUSY; \
3011 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
3014 mutex_lock(&opts->lock); \
3016 color_match->desc.aname = num; \
3019 mutex_unlock(&opts->lock); \
3058 /* -----------------------------------------------------------------------------
3069 return ERR_PTR(-ENOMEM); in uvcg_color_matching_make()
3071 color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE; in uvcg_color_matching_make()
3072 color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_color_matching_make()
3073 color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT; in uvcg_color_matching_make()
3075 config_group_init_type_name(&color_match->group, name, in uvcg_color_matching_make()
3078 return &color_match->group; in uvcg_color_matching_make()
3091 return -ENOMEM; in uvcg_color_matching_create_children()
3093 color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE; in uvcg_color_matching_create_children()
3094 color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_color_matching_create_children()
3095 color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT; in uvcg_color_matching_create_children()
3096 color_match->desc.bColorPrimaries = UVC_COLOR_PRIMARIES_BT_709_SRGB; in uvcg_color_matching_create_children()
3097 color_match->desc.bTransferCharacteristics = UVC_TRANSFER_CHARACTERISTICS_BT_709; in uvcg_color_matching_create_children()
3098 color_match->desc.bMatrixCoefficients = UVC_MATRIX_COEFFICIENTS_SMPTE_170M; in uvcg_color_matching_create_children()
3100 config_group_init_type_name(&color_match->group, "default", in uvcg_color_matching_create_children()
3102 configfs_add_default_group(&color_match->group, parent); in uvcg_color_matching_create_children()
3117 /* -----------------------------------------------------------------------------
3118 * streaming/class/{fs|hs|ss}
3133 if (!strcmp(group->name, "fs")) in __uvcg_get_stream_class_arr()
3134 return &o->uvc_fs_streaming_cls; in __uvcg_get_stream_class_arr()
3136 if (!strcmp(group->name, "hs")) in __uvcg_get_stream_class_arr()
3137 return &o->uvc_hs_streaming_cls; in __uvcg_get_stream_class_arr()
3139 if (!strcmp(group->name, "ss")) in __uvcg_get_stream_class_arr()
3140 return &o->uvc_ss_streaming_cls; in __uvcg_get_stream_class_arr()
3182 return -EINVAL; in __uvcg_iter_strm_cls()
3188 list_for_each_entry(f, &h->formats, entry) { in __uvcg_iter_strm_cls()
3189 ret = fun(f->fmt, priv2, priv3, i++, UVCG_FORMAT); in __uvcg_iter_strm_cls()
3192 grp = &f->fmt->group; in __uvcg_iter_strm_cls()
3194 list_for_each_entry(item, &grp->cg_children, ci_entry) { in __uvcg_iter_strm_cls()
3201 ret = fun(f->fmt->color_matching, priv2, priv3, 0, in __uvcg_iter_strm_cls()
3228 *size += sizeof(h->desc); in __uvcg_cnt_strm()
3230 *size += h->num_fmt * UVCG_STREAMING_CONTROL_SIZE; in __uvcg_cnt_strm()
3236 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_cnt_strm()
3241 *size += sizeof(u->desc); in __uvcg_cnt_strm()
3242 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_cnt_strm()
3246 *size += sizeof(m->desc); in __uvcg_cnt_strm()
3247 } else if (fmt->type == UVCG_FRAMEBASED) { in __uvcg_cnt_strm()
3251 *size += sizeof(f->desc); in __uvcg_cnt_strm()
3253 return -EINVAL; in __uvcg_cnt_strm()
3259 int sz = sizeof(frm->dw_frame_interval); in __uvcg_cnt_strm()
3261 *size += sizeof(frm->frame); in __uvcg_cnt_strm()
3266 *size -= sizeof(u32); in __uvcg_cnt_strm()
3267 *size += frm->frame.b_frame_interval_type * sz; in __uvcg_cnt_strm()
3273 *size += sizeof(color_match->desc); in __uvcg_cnt_strm()
3288 desc->bLength = frm->frame.b_length; in __uvcg_copy_framebased_desc()
3289 desc->bDescriptorType = frm->frame.b_descriptor_type; in __uvcg_copy_framebased_desc()
3290 desc->bDescriptorSubType = frm->frame.b_descriptor_subtype; in __uvcg_copy_framebased_desc()
3291 desc->bFrameIndex = frm->frame.b_frame_index; in __uvcg_copy_framebased_desc()
3292 desc->bmCapabilities = frm->frame.bm_capabilities; in __uvcg_copy_framebased_desc()
3293 desc->wWidth = frm->frame.w_width; in __uvcg_copy_framebased_desc()
3294 desc->wHeight = frm->frame.w_height; in __uvcg_copy_framebased_desc()
3295 desc->dwMinBitRate = frm->frame.dw_min_bit_rate; in __uvcg_copy_framebased_desc()
3296 desc->dwMaxBitRate = frm->frame.dw_max_bit_rate; in __uvcg_copy_framebased_desc()
3297 desc->dwDefaultFrameInterval = frm->frame.dw_default_frame_interval; in __uvcg_copy_framebased_desc()
3298 desc->bFrameIntervalType = frm->frame.b_frame_interval_type; in __uvcg_copy_framebased_desc()
3299 desc->dwBytesPerLine = frm->frame.dw_bytes_perline; in __uvcg_copy_framebased_desc()
3309 * @priv3: inout parameter, pointer to a 2-dimensional array
3327 memcpy(*dest, &h->desc, sizeof(h->desc)); in __uvcg_fill_strm()
3328 *dest += sizeof(h->desc); in __uvcg_fill_strm()
3330 list_for_each_entry(f, &h->formats, entry) { in __uvcg_fill_strm()
3331 memcpy(*dest, f->fmt->bmaControls, sz); in __uvcg_fill_strm()
3334 ihdr->bLength = sizeof(h->desc) + h->num_fmt * sz; in __uvcg_fill_strm()
3335 ihdr->bNumFormats = h->num_fmt; in __uvcg_fill_strm()
3341 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_fill_strm()
3346 u->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3347 u->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3348 memcpy(*dest, &u->desc, sizeof(u->desc)); in __uvcg_fill_strm()
3349 *dest += sizeof(u->desc); in __uvcg_fill_strm()
3350 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_fill_strm()
3354 m->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3355 m->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3356 memcpy(*dest, &m->desc, sizeof(m->desc)); in __uvcg_fill_strm()
3357 *dest += sizeof(m->desc); in __uvcg_fill_strm()
3358 } else if (fmt->type == UVCG_FRAMEBASED) { in __uvcg_fill_strm()
3363 f->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
3364 f->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
3365 memcpy(*dest, &f->desc, sizeof(f->desc)); in __uvcg_fill_strm()
3366 *dest += sizeof(f->desc); in __uvcg_fill_strm()
3368 return -EINVAL; in __uvcg_fill_strm()
3376 sz = sizeof(frm->frame) - 4; in __uvcg_fill_strm()
3377 if (frm->fmt_type != UVCG_FRAMEBASED) in __uvcg_fill_strm()
3378 memcpy(*dest, &frm->frame, sz); in __uvcg_fill_strm()
3382 sz = frm->frame.b_frame_interval_type * in __uvcg_fill_strm()
3383 sizeof(*frm->dw_frame_interval); in __uvcg_fill_strm()
3384 memcpy(*dest, frm->dw_frame_interval, sz); in __uvcg_fill_strm()
3386 if (frm->fmt_type == UVCG_UNCOMPRESSED) in __uvcg_fill_strm()
3387 h->bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE( in __uvcg_fill_strm()
3388 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3389 else if (frm->fmt_type == UVCG_MJPEG) in __uvcg_fill_strm()
3390 h->bLength = UVC_DT_FRAME_MJPEG_SIZE( in __uvcg_fill_strm()
3391 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3392 else if (frm->fmt_type == UVCG_FRAMEBASED) in __uvcg_fill_strm()
3393 h->bLength = UVC_DT_FRAME_FRAMEBASED_SIZE( in __uvcg_fill_strm()
3394 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
3400 memcpy(*dest, &color_match->desc, sizeof(color_match->desc)); in __uvcg_fill_strm()
3401 *dest += sizeof(color_match->desc); in __uvcg_fill_strm()
3414 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_allow_link()
3419 int ret = -EINVAL; in uvcg_streaming_class_allow_link()
3423 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_allow_link()
3425 if (!header || target->ci_parent != header) in uvcg_streaming_class_allow_link()
3428 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_allow_link()
3430 mutex_lock(&opts->lock); in uvcg_streaming_class_allow_link()
3433 if (!class_array || *class_array || opts->refcnt) { in uvcg_streaming_class_allow_link()
3434 ret = -EBUSY; in uvcg_streaming_class_allow_link()
3446 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
3454 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
3471 ++target_hdr->linked; in uvcg_streaming_class_allow_link()
3475 mutex_unlock(&opts->lock); in uvcg_streaming_class_allow_link()
3487 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_drop_link()
3493 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_drop_link()
3495 if (!header || target->ci_parent != header) in uvcg_streaming_class_drop_link()
3498 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_drop_link()
3500 mutex_lock(&opts->lock); in uvcg_streaming_class_drop_link()
3506 if (opts->refcnt) in uvcg_streaming_class_drop_link()
3510 --target_hdr->linked; in uvcg_streaming_class_drop_link()
3516 mutex_unlock(&opts->lock); in uvcg_streaming_class_drop_link()
3533 /* -----------------------------------------------------------------------------
3539 static const char * const names[] = { "fs", "hs", "ss" }; in uvcg_streaming_class_create_children()
3547 return -ENOMEM; in uvcg_streaming_class_create_children()
3549 group->name = names[i]; in uvcg_streaming_class_create_children()
3551 config_group_init_type_name(&group->group, group->name, in uvcg_streaming_class_create_children()
3553 configfs_add_default_group(&group->group, parent); in uvcg_streaming_class_create_children()
3568 /* -----------------------------------------------------------------------------
3576 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_streaming_b_interface_number_show()
3583 opts_item = item->ci_parent; in uvcg_default_streaming_b_interface_number_show()
3586 mutex_lock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
3587 result += sprintf(page, "%u\n", opts->streaming_interface); in uvcg_default_streaming_b_interface_number_show()
3588 mutex_unlock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
3620 /* -----------------------------------------------------------------------------
3629 usb_put_function_instance(&opts->func_inst); in uvc_func_item_release()
3634 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvc_func_allow_link()
3643 strings = config_group_find_item(to_config_group(src->ci_parent->ci_parent), in uvc_func_allow_link()
3645 if (!strings || tgt->ci_parent->ci_parent != strings) { in uvc_func_allow_link()
3646 ret = -EINVAL; in uvc_func_allow_link()
3653 mutex_lock(&opts->lock); in uvc_func_allow_link()
3655 if (!strcmp(tgt->ci_name, "iad_desc")) in uvc_func_allow_link()
3656 opts->iad_index = string->usb_string.id; in uvc_func_allow_link()
3657 else if (!strcmp(tgt->ci_name, "vs0_desc")) in uvc_func_allow_link()
3658 opts->vs0_index = string->usb_string.id; in uvc_func_allow_link()
3659 else if (!strcmp(tgt->ci_name, "vs1_desc")) in uvc_func_allow_link()
3660 opts->vs1_index = string->usb_string.id; in uvc_func_allow_link()
3662 ret = -EINVAL; in uvc_func_allow_link()
3664 mutex_unlock(&opts->lock); in uvc_func_allow_link()
3678 mutex_lock(&opts->lock); in uvc_func_drop_link()
3680 if (!strcmp(tgt->ci_name, "iad_desc")) in uvc_func_drop_link()
3681 opts->iad_index = 0; in uvc_func_drop_link()
3682 else if (!strcmp(tgt->ci_name, "vs0_desc")) in uvc_func_drop_link()
3683 opts->vs0_index = 0; in uvc_func_drop_link()
3684 else if (!strcmp(tgt->ci_name, "vs1_desc")) in uvc_func_drop_link()
3685 opts->vs1_index = 0; in uvc_func_drop_link()
3687 mutex_unlock(&opts->lock); in uvc_func_drop_link()
3703 mutex_lock(&opts->lock); \
3704 result = sprintf(page, "%u\n", opts->cname); \
3705 mutex_unlock(&opts->lock); \
3715 unsigned int num; \
3718 mutex_lock(&opts->lock); \
3719 if (opts->refcnt) { \
3720 ret = -EBUSY; \
3724 ret = kstrtouint(page, 0, &num); \
3728 if (num > limit) { \
3729 ret = -EINVAL; \
3732 opts->cname = num; \
3735 mutex_unlock(&opts->lock); \
3754 mutex_lock(&opts->lock); \
3755 result = scnprintf(page, sizeof(opts->aname), "%s", opts->aname);\
3756 mutex_unlock(&opts->lock); \
3765 int size = min(sizeof(opts->aname), len + 1); \
3768 mutex_lock(&opts->lock); \
3769 if (opts->refcnt) { \
3770 ret = -EBUSY; \
3774 ret = strscpy(opts->aname, page, size); \
3775 if (ret == -E2BIG) \
3776 ret = size - 1; \
3779 mutex_unlock(&opts->lock); \
3815 config_group_init_type_name(&opts->func_inst.group, uvc_func_type.name, in uvcg_attach_configfs()
3818 ret = uvcg_config_create_children(&opts->func_inst.group, in uvcg_attach_configfs()
3821 config_group_put(&opts->func_inst.group); in uvcg_attach_configfs()