Lines Matching +full:num +full:- +full:ss +full:- +full:bits
1 // SPDX-License-Identifier: GPL-2.0
18 /* -----------------------------------------------------------------------------
49 return li < ri ? -1 : li == ri ? 0 : 1; in uvcg_config_compare_u32()
85 if (type->create_children) in uvcg_config_create_children()
86 return type->create_children(group); in uvcg_config_create_children()
88 for (child = type->children; child && *child; ++child) { in uvcg_config_create_children()
104 return -ENOMEM; in uvcg_config_create_group()
106 config_group_init_type_name(group, type->name, &type->type); in uvcg_config_create_group()
116 list_for_each_entry_safe(child, n, &group->default_groups, group_entry) { in uvcg_config_remove_children()
117 list_del(&child->group_entry); in uvcg_config_remove_children()
119 config_item_put(&child->cg_item); in uvcg_config_remove_children()
123 /* -----------------------------------------------------------------------------
141 #define UVCG_CTRL_HDR_ATTR(cname, aname, bits, limit) \ argument
148 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
153 opts_item = ch->item.ci_parent->ci_parent->ci_parent; \
156 mutex_lock(&opts->lock); \
157 result = sprintf(page, "%u\n", le##bits##_to_cpu(ch->desc.aname));\
158 mutex_unlock(&opts->lock); \
171 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
173 u##bits num; \
177 opts_item = ch->item.ci_parent->ci_parent->ci_parent; \
180 mutex_lock(&opts->lock); \
181 if (ch->linked || opts->refcnt) { \
182 ret = -EBUSY; \
186 ret = kstrtou##bits(page, 0, &num); \
190 if (num > limit) { \
191 ret = -EINVAL; \
194 ch->desc.aname = cpu_to_le##bits(num); \
197 mutex_unlock(&opts->lock); \
229 return ERR_PTR(-ENOMEM); in uvcg_control_header_make()
231 h->desc.bLength = UVC_DT_HEADER_SIZE(1); in uvcg_control_header_make()
232 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_control_header_make()
233 h->desc.bDescriptorSubType = UVC_VC_HEADER; in uvcg_control_header_make()
234 h->desc.bcdUVC = cpu_to_le16(0x0110); in uvcg_control_header_make()
235 h->desc.dwClockFrequency = cpu_to_le32(48000000); in uvcg_control_header_make()
237 config_item_init_type_name(&h->item, name, &uvcg_control_header_type); in uvcg_control_header_make()
239 return &h->item; in uvcg_control_header_make()
255 /* -----------------------------------------------------------------------------
259 #define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, bits) \ argument
266 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
272 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
274 pd = &opts->uvc_processing; \
276 mutex_lock(&opts->lock); \
277 result = sprintf(page, "%u\n", le##bits##_to_cpu(pd->aname)); \
278 mutex_unlock(&opts->lock); \
299 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_processing_bm_controls_show()
306 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_default_processing_bm_controls_show()
308 pd = &opts->uvc_processing; in uvcg_default_processing_bm_controls_show()
310 mutex_lock(&opts->lock); in uvcg_default_processing_bm_controls_show()
311 for (result = 0, i = 0; i < pd->bControlSize; ++i) { in uvcg_default_processing_bm_controls_show()
312 result += sprintf(pg, "%u\n", pd->bmControls[i]); in uvcg_default_processing_bm_controls_show()
315 mutex_unlock(&opts->lock); in uvcg_default_processing_bm_controls_show()
342 /* -----------------------------------------------------------------------------
358 /* -----------------------------------------------------------------------------
362 #define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, bits) \ argument
369 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
375 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> \
378 cd = &opts->uvc_camera_terminal; \
380 mutex_lock(&opts->lock); \
381 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
382 mutex_unlock(&opts->lock); \
410 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_camera_bm_controls_show()
417 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent-> in uvcg_default_camera_bm_controls_show()
420 cd = &opts->uvc_camera_terminal; in uvcg_default_camera_bm_controls_show()
422 mutex_lock(&opts->lock); in uvcg_default_camera_bm_controls_show()
423 for (result = 0, i = 0; i < cd->bControlSize; ++i) { in uvcg_default_camera_bm_controls_show()
424 result += sprintf(pg, "%u\n", cd->bmControls[i]); in uvcg_default_camera_bm_controls_show()
427 mutex_unlock(&opts->lock); in uvcg_default_camera_bm_controls_show()
456 /* -----------------------------------------------------------------------------
472 /* -----------------------------------------------------------------------------
476 #define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, bits) \ argument
483 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
489 opts_item = group->cg_item.ci_parent->ci_parent-> \
490 ci_parent->ci_parent; \
492 cd = &opts->uvc_output_terminal; \
494 mutex_lock(&opts->lock); \
495 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
496 mutex_unlock(&opts->lock); \
531 /* -----------------------------------------------------------------------------
547 /* -----------------------------------------------------------------------------
564 /* -----------------------------------------------------------------------------
565 * control/class/{fs|ss}
580 if (!strcmp(group->name, "fs")) in uvcg_get_ctl_class_arr()
581 return o->uvc_fs_control_cls; in uvcg_get_ctl_class_arr()
583 if (!strcmp(group->name, "ss")) in uvcg_get_ctl_class_arr()
584 return o->uvc_ss_control_cls; in uvcg_get_ctl_class_arr()
594 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_control_class_allow_link()
597 int ret = -EINVAL; in uvcg_control_class_allow_link()
601 control = src->ci_parent->ci_parent; in uvcg_control_class_allow_link()
603 if (!header || target->ci_parent != header) in uvcg_control_class_allow_link()
606 opts = to_f_uvc_opts(control->ci_parent); in uvcg_control_class_allow_link()
608 mutex_lock(&opts->lock); in uvcg_control_class_allow_link()
613 if (opts->refcnt || class_array[0]) { in uvcg_control_class_allow_link()
614 ret = -EBUSY; in uvcg_control_class_allow_link()
619 ++target_hdr->linked; in uvcg_control_class_allow_link()
620 class_array[0] = (struct uvc_descriptor_header *)&target_hdr->desc; in uvcg_control_class_allow_link()
624 mutex_unlock(&opts->lock); in uvcg_control_class_allow_link()
636 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_control_class_drop_link()
642 control = src->ci_parent->ci_parent; in uvcg_control_class_drop_link()
644 if (!header || target->ci_parent != header) in uvcg_control_class_drop_link()
647 opts = to_f_uvc_opts(control->ci_parent); in uvcg_control_class_drop_link()
649 mutex_lock(&opts->lock); in uvcg_control_class_drop_link()
652 if (!class_array || opts->refcnt) in uvcg_control_class_drop_link()
656 --target_hdr->linked; in uvcg_control_class_drop_link()
660 mutex_unlock(&opts->lock); in uvcg_control_class_drop_link()
677 /* -----------------------------------------------------------------------------
683 static const char * const names[] = { "fs", "ss" }; in uvcg_control_class_create_children()
691 return -ENOMEM; in uvcg_control_class_create_children()
693 group->name = names[i]; in uvcg_control_class_create_children()
695 config_group_init_type_name(&group->group, group->name, in uvcg_control_class_create_children()
697 configfs_add_default_group(&group->group, parent); in uvcg_control_class_create_children()
712 /* -----------------------------------------------------------------------------
720 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_control_b_interface_number_show()
727 opts_item = item->ci_parent; in uvcg_default_control_b_interface_number_show()
730 mutex_lock(&opts->lock); in uvcg_default_control_b_interface_number_show()
731 result += sprintf(page, "%u\n", opts->control_interface); in uvcg_default_control_b_interface_number_show()
732 mutex_unlock(&opts->lock); in uvcg_default_control_b_interface_number_show()
762 /* -----------------------------------------------------------------------------
794 struct mutex *su_mutex = &f->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_show()
800 opts_item = f->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_show()
803 mutex_lock(&opts->lock); in uvcg_format_bma_controls_show()
807 result += sprintf(pg, "%x\n", f->bmaControls[i]); in uvcg_format_bma_controls_show()
810 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_show()
821 struct mutex *su_mutex = &ch->group.cg_subsys->su_mutex; in uvcg_format_bma_controls_store()
822 int ret = -EINVAL; in uvcg_format_bma_controls_store()
826 opts_item = ch->group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_format_bma_controls_store()
829 mutex_lock(&opts->lock); in uvcg_format_bma_controls_store()
830 if (ch->linked || opts->refcnt) { in uvcg_format_bma_controls_store()
831 ret = -EBUSY; in uvcg_format_bma_controls_store()
838 ret = hex2bin(ch->bmaControls, page + 2, 1); in uvcg_format_bma_controls_store()
843 mutex_unlock(&opts->lock); in uvcg_format_bma_controls_store()
853 /* -----------------------------------------------------------------------------
876 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_allow_link()
882 int i, ret = -EINVAL; in uvcg_streaming_header_allow_link()
887 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_allow_link()
890 mutex_lock(&opts->lock); in uvcg_streaming_header_allow_link()
892 if (src_hdr->linked) { in uvcg_streaming_header_allow_link()
893 ret = -EBUSY; in uvcg_streaming_header_allow_link()
900 * the grand-parent of the target matches the grand-parent of the source in uvcg_streaming_header_allow_link()
904 if (src->ci_parent->ci_parent != target->ci_parent->ci_parent) in uvcg_streaming_header_allow_link()
908 if (!strcmp(target->ci_parent->ci_name, uvcg_format_names[i])) in uvcg_streaming_header_allow_link()
922 ret = -ENOMEM; in uvcg_streaming_header_allow_link()
926 format_ptr->fmt = target_fmt; in uvcg_streaming_header_allow_link()
927 list_add_tail(&format_ptr->entry, &src_hdr->formats); in uvcg_streaming_header_allow_link()
928 ++src_hdr->num_fmt; in uvcg_streaming_header_allow_link()
929 ++target_fmt->linked; in uvcg_streaming_header_allow_link()
932 mutex_unlock(&opts->lock); in uvcg_streaming_header_allow_link()
940 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_header_drop_link()
950 opts_item = src->ci_parent->ci_parent->ci_parent; in uvcg_streaming_header_drop_link()
953 mutex_lock(&opts->lock); in uvcg_streaming_header_drop_link()
957 list_for_each_entry_safe(format_ptr, tmp, &src_hdr->formats, entry) in uvcg_streaming_header_drop_link()
958 if (format_ptr->fmt == target_fmt) { in uvcg_streaming_header_drop_link()
959 list_del(&format_ptr->entry); in uvcg_streaming_header_drop_link()
961 --src_hdr->num_fmt; in uvcg_streaming_header_drop_link()
965 --target_fmt->linked; in uvcg_streaming_header_drop_link()
967 mutex_unlock(&opts->lock); in uvcg_streaming_header_drop_link()
977 #define UVCG_STREAMING_HEADER_ATTR(cname, aname, bits) \ argument
984 struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
989 opts_item = sh->item.ci_parent->ci_parent->ci_parent; \
992 mutex_lock(&opts->lock); \
993 result = sprintf(page, "%u\n", le##bits##_to_cpu(sh->desc.aname));\
994 mutex_unlock(&opts->lock); \
1032 return ERR_PTR(-ENOMEM); in uvcg_streaming_header_make()
1034 INIT_LIST_HEAD(&h->formats); in uvcg_streaming_header_make()
1035 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_streaming_header_make()
1036 h->desc.bDescriptorSubType = UVC_VS_INPUT_HEADER; in uvcg_streaming_header_make()
1037 h->desc.bTerminalLink = 3; in uvcg_streaming_header_make()
1038 h->desc.bControlSize = UVCG_STREAMING_CONTROL_SIZE; in uvcg_streaming_header_make()
1040 config_item_init_type_name(&h->item, name, &uvcg_streaming_header_type); in uvcg_streaming_header_make()
1042 return &h->item; in uvcg_streaming_header_make()
1058 /* -----------------------------------------------------------------------------
1087 #define UVCG_FRAME_ATTR(cname, aname, bits) \ argument
1093 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1098 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1101 mutex_lock(&opts->lock); \
1102 result = sprintf(page, "%u\n", f->frame.cname); \
1103 mutex_unlock(&opts->lock); \
1116 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
1117 typeof(f->frame.cname) num; \
1120 ret = kstrtou##bits(page, 0, &num); \
1126 opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
1128 fmt = to_uvcg_format(f->item.ci_parent); \
1130 mutex_lock(&opts->lock); \
1131 if (fmt->linked || opts->refcnt) { \
1132 ret = -EBUSY; \
1136 f->frame.cname = num; \
1139 mutex_unlock(&opts->lock); \
1154 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_b_frame_index_show()
1159 fmt_item = f->item.ci_parent; in uvcg_frame_b_frame_index_show()
1162 if (!fmt->linked) { in uvcg_frame_b_frame_index_show()
1163 result = -EBUSY; in uvcg_frame_b_frame_index_show()
1167 opts_item = fmt_item->ci_parent->ci_parent->ci_parent; in uvcg_frame_b_frame_index_show()
1170 mutex_lock(&opts->lock); in uvcg_frame_b_frame_index_show()
1171 result = sprintf(page, "%u\n", f->frame.b_frame_index); in uvcg_frame_b_frame_index_show()
1172 mutex_unlock(&opts->lock); in uvcg_frame_b_frame_index_show()
1197 struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_show()
1203 opts_item = frm->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_show()
1206 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
1207 for (result = 0, i = 0; i < frm->frame.b_frame_interval_type; ++i) { in uvcg_frame_dw_frame_interval_show()
1208 result += sprintf(pg, "%u\n", frm->dw_frame_interval[i]); in uvcg_frame_dw_frame_interval_show()
1211 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_show()
1225 u32 num, **interv; in __uvcg_fill_frm_intrv() local
1228 ret = kstrtou32(buf, 0, &num); in __uvcg_fill_frm_intrv()
1233 **interv = num; in __uvcg_fill_frm_intrv()
1248 return -EINVAL; in __uvcg_iter_frm_intrv()
1250 while (pg - page < len) { in __uvcg_iter_frm_intrv()
1252 while (i < sizeof(buf) && (pg - page < len) && in __uvcg_iter_frm_intrv()
1256 return -EINVAL; in __uvcg_iter_frm_intrv()
1257 while ((pg - page < len) && (*pg == '\0' || *pg == '\n')) in __uvcg_iter_frm_intrv()
1275 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex; in uvcg_frame_dw_frame_interval_store()
1281 opts_item = ch->item.ci_parent->ci_parent->ci_parent->ci_parent; in uvcg_frame_dw_frame_interval_store()
1283 fmt = to_uvcg_format(ch->item.ci_parent); in uvcg_frame_dw_frame_interval_store()
1285 mutex_lock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
1286 if (fmt->linked || opts->refcnt) { in uvcg_frame_dw_frame_interval_store()
1287 ret = -EBUSY; in uvcg_frame_dw_frame_interval_store()
1297 ret = -ENOMEM; in uvcg_frame_dw_frame_interval_store()
1307 kfree(ch->dw_frame_interval); in uvcg_frame_dw_frame_interval_store()
1308 ch->dw_frame_interval = frm_intrv; in uvcg_frame_dw_frame_interval_store()
1309 ch->frame.b_frame_interval_type = n; in uvcg_frame_dw_frame_interval_store()
1310 sort(ch->dw_frame_interval, n, sizeof(*ch->dw_frame_interval), in uvcg_frame_dw_frame_interval_store()
1315 mutex_unlock(&opts->lock); in uvcg_frame_dw_frame_interval_store()
1351 return ERR_PTR(-ENOMEM); in uvcg_frame_make()
1353 h->frame.b_descriptor_type = USB_DT_CS_INTERFACE; in uvcg_frame_make()
1354 h->frame.b_frame_index = 1; in uvcg_frame_make()
1355 h->frame.w_width = 640; in uvcg_frame_make()
1356 h->frame.w_height = 360; in uvcg_frame_make()
1357 h->frame.dw_min_bit_rate = 18432000; in uvcg_frame_make()
1358 h->frame.dw_max_bit_rate = 55296000; in uvcg_frame_make()
1359 h->frame.dw_max_video_frame_buffer_size = 460800; in uvcg_frame_make()
1360 h->frame.dw_default_frame_interval = 666666; in uvcg_frame_make()
1362 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_make()
1365 mutex_lock(&opts->lock); in uvcg_frame_make()
1366 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_make()
1367 if (fmt->type == UVCG_UNCOMPRESSED) { in uvcg_frame_make()
1368 h->frame.b_descriptor_subtype = UVC_VS_FRAME_UNCOMPRESSED; in uvcg_frame_make()
1369 h->fmt_type = UVCG_UNCOMPRESSED; in uvcg_frame_make()
1370 } else if (fmt->type == UVCG_MJPEG) { in uvcg_frame_make()
1371 h->frame.b_descriptor_subtype = UVC_VS_FRAME_MJPEG; in uvcg_frame_make()
1372 h->fmt_type = UVCG_MJPEG; in uvcg_frame_make()
1374 mutex_unlock(&opts->lock); in uvcg_frame_make()
1376 return ERR_PTR(-EINVAL); in uvcg_frame_make()
1378 ++fmt->num_frames; in uvcg_frame_make()
1379 mutex_unlock(&opts->lock); in uvcg_frame_make()
1381 config_item_init_type_name(&h->item, name, &uvcg_frame_type); in uvcg_frame_make()
1383 return &h->item; in uvcg_frame_make()
1392 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; in uvcg_frame_drop()
1395 mutex_lock(&opts->lock); in uvcg_frame_drop()
1396 fmt = to_uvcg_format(&group->cg_item); in uvcg_frame_drop()
1397 --fmt->num_frames; in uvcg_frame_drop()
1398 mutex_unlock(&opts->lock); in uvcg_frame_drop()
1408 list_for_each_entry(ci, &fmt->cg_children, ci_entry) { in uvcg_format_set_indices()
1411 if (ci->ci_type != &uvcg_frame_type) in uvcg_format_set_indices()
1415 frm->frame.b_frame_index = i++; in uvcg_format_set_indices()
1419 /* -----------------------------------------------------------------------------
1446 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_show()
1450 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_show()
1453 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_show()
1454 memcpy(page, ch->desc.guidFormat, sizeof(ch->desc.guidFormat)); in uvcg_uncompressed_guid_format_show()
1455 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_show()
1459 return sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_show()
1468 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; in uvcg_uncompressed_guid_format_store()
1473 opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent; in uvcg_uncompressed_guid_format_store()
1476 mutex_lock(&opts->lock); in uvcg_uncompressed_guid_format_store()
1477 if (ch->fmt.linked || opts->refcnt) { in uvcg_uncompressed_guid_format_store()
1478 ret = -EBUSY; in uvcg_uncompressed_guid_format_store()
1482 memcpy(ch->desc.guidFormat, page, in uvcg_uncompressed_guid_format_store()
1483 min(sizeof(ch->desc.guidFormat), len)); in uvcg_uncompressed_guid_format_store()
1484 ret = sizeof(ch->desc.guidFormat); in uvcg_uncompressed_guid_format_store()
1487 mutex_unlock(&opts->lock); in uvcg_uncompressed_guid_format_store()
1494 #define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, bits) \ argument
1501 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
1506 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1509 mutex_lock(&opts->lock); \
1510 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
1511 mutex_unlock(&opts->lock); \
1519 #define UVCG_UNCOMPRESSED_ATTR(cname, aname, bits) \ argument
1526 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
1531 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1534 mutex_lock(&opts->lock); \
1535 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
1536 mutex_unlock(&opts->lock); \
1549 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
1551 u8 num; \
1555 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1558 mutex_lock(&opts->lock); \
1559 if (u->fmt.linked || opts->refcnt) { \
1560 ret = -EBUSY; \
1564 ret = kstrtou8(page, 0, &num); \
1568 u->desc.aname = num; \
1571 mutex_unlock(&opts->lock); \
1592 return uvcg_format_bma_controls_show(&unc->fmt, page); in uvcg_uncompressed_bma_controls_show()
1600 return uvcg_format_bma_controls_store(&unc->fmt, page, len); in uvcg_uncompressed_bma_controls_store()
1635 return ERR_PTR(-ENOMEM); in uvcg_uncompressed_make()
1637 h->desc.bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE; in uvcg_uncompressed_make()
1638 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_uncompressed_make()
1639 h->desc.bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED; in uvcg_uncompressed_make()
1640 memcpy(h->desc.guidFormat, guid, sizeof(guid)); in uvcg_uncompressed_make()
1641 h->desc.bBitsPerPixel = 16; in uvcg_uncompressed_make()
1642 h->desc.bDefaultFrameIndex = 1; in uvcg_uncompressed_make()
1643 h->desc.bAspectRatioX = 0; in uvcg_uncompressed_make()
1644 h->desc.bAspectRatioY = 0; in uvcg_uncompressed_make()
1645 h->desc.bmInterfaceFlags = 0; in uvcg_uncompressed_make()
1646 h->desc.bCopyProtect = 0; in uvcg_uncompressed_make()
1648 h->fmt.type = UVCG_UNCOMPRESSED; in uvcg_uncompressed_make()
1649 config_group_init_type_name(&h->fmt.group, name, in uvcg_uncompressed_make()
1652 return &h->fmt.group; in uvcg_uncompressed_make()
1668 /* -----------------------------------------------------------------------------
1689 #define UVCG_MJPEG_ATTR_RO(cname, aname, bits) \ argument
1695 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
1700 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1703 mutex_lock(&opts->lock); \
1704 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
1705 mutex_unlock(&opts->lock); \
1713 #define UVCG_MJPEG_ATTR(cname, aname, bits) \ argument
1719 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
1724 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1727 mutex_lock(&opts->lock); \
1728 result = sprintf(page, "%u\n", le##bits##_to_cpu(u->desc.aname));\
1729 mutex_unlock(&opts->lock); \
1742 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
1744 u8 num; \
1748 opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1751 mutex_lock(&opts->lock); \
1752 if (u->fmt.linked || opts->refcnt) { \
1753 ret = -EBUSY; \
1757 ret = kstrtou8(page, 0, &num); \
1761 u->desc.aname = num; \
1764 mutex_unlock(&opts->lock); \
1785 return uvcg_format_bma_controls_show(&u->fmt, page); in uvcg_mjpeg_bma_controls_show()
1793 return uvcg_format_bma_controls_store(&u->fmt, page, len); in uvcg_mjpeg_bma_controls_store()
1823 return ERR_PTR(-ENOMEM); in uvcg_mjpeg_make()
1825 h->desc.bLength = UVC_DT_FORMAT_MJPEG_SIZE; in uvcg_mjpeg_make()
1826 h->desc.bDescriptorType = USB_DT_CS_INTERFACE; in uvcg_mjpeg_make()
1827 h->desc.bDescriptorSubType = UVC_VS_FORMAT_MJPEG; in uvcg_mjpeg_make()
1828 h->desc.bDefaultFrameIndex = 1; in uvcg_mjpeg_make()
1829 h->desc.bAspectRatioX = 0; in uvcg_mjpeg_make()
1830 h->desc.bAspectRatioY = 0; in uvcg_mjpeg_make()
1831 h->desc.bmInterfaceFlags = 0; in uvcg_mjpeg_make()
1832 h->desc.bCopyProtect = 0; in uvcg_mjpeg_make()
1834 h->fmt.type = UVCG_MJPEG; in uvcg_mjpeg_make()
1835 config_group_init_type_name(&h->fmt.group, name, in uvcg_mjpeg_make()
1838 return &h->fmt.group; in uvcg_mjpeg_make()
1854 /* -----------------------------------------------------------------------------
1858 #define UVCG_DEFAULT_COLOR_MATCHING_ATTR(cname, aname, bits) \ argument
1865 struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
1871 opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
1873 cd = &opts->uvc_color_matching; \
1875 mutex_lock(&opts->lock); \
1876 result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
1877 mutex_unlock(&opts->lock); \
1908 /* -----------------------------------------------------------------------------
1924 /* -----------------------------------------------------------------------------
1925 * streaming/class/{fs|hs|ss}
1940 if (!strcmp(group->name, "fs")) in __uvcg_get_stream_class_arr()
1941 return &o->uvc_fs_streaming_cls; in __uvcg_get_stream_class_arr()
1943 if (!strcmp(group->name, "hs")) in __uvcg_get_stream_class_arr()
1944 return &o->uvc_hs_streaming_cls; in __uvcg_get_stream_class_arr()
1946 if (!strcmp(group->name, "ss")) in __uvcg_get_stream_class_arr()
1947 return &o->uvc_ss_streaming_cls; in __uvcg_get_stream_class_arr()
1988 return -EINVAL; in __uvcg_iter_strm_cls()
1994 list_for_each_entry(f, &h->formats, entry) { in __uvcg_iter_strm_cls()
1995 ret = fun(f->fmt, priv2, priv3, i++, UVCG_FORMAT); in __uvcg_iter_strm_cls()
1998 grp = &f->fmt->group; in __uvcg_iter_strm_cls()
1999 list_for_each_entry(item, &grp->cg_children, ci_entry) { in __uvcg_iter_strm_cls()
2028 *size += sizeof(h->desc); in __uvcg_cnt_strm()
2030 *size += h->num_fmt * UVCG_STREAMING_CONTROL_SIZE; in __uvcg_cnt_strm()
2036 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_cnt_strm()
2041 *size += sizeof(u->desc); in __uvcg_cnt_strm()
2042 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_cnt_strm()
2046 *size += sizeof(m->desc); in __uvcg_cnt_strm()
2048 return -EINVAL; in __uvcg_cnt_strm()
2054 int sz = sizeof(frm->dw_frame_interval); in __uvcg_cnt_strm()
2056 *size += sizeof(frm->frame); in __uvcg_cnt_strm()
2057 *size += frm->frame.b_frame_interval_type * sz; in __uvcg_cnt_strm()
2072 * @priv3: inout parameter, pointer to a 2-dimensional array
2090 memcpy(*dest, &h->desc, sizeof(h->desc)); in __uvcg_fill_strm()
2091 *dest += sizeof(h->desc); in __uvcg_fill_strm()
2093 list_for_each_entry(f, &h->formats, entry) { in __uvcg_fill_strm()
2094 memcpy(*dest, f->fmt->bmaControls, sz); in __uvcg_fill_strm()
2097 ihdr->bLength = sizeof(h->desc) + h->num_fmt * sz; in __uvcg_fill_strm()
2098 ihdr->bNumFormats = h->num_fmt; in __uvcg_fill_strm()
2104 if (fmt->type == UVCG_UNCOMPRESSED) { in __uvcg_fill_strm()
2109 u->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
2110 u->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
2111 memcpy(*dest, &u->desc, sizeof(u->desc)); in __uvcg_fill_strm()
2112 *dest += sizeof(u->desc); in __uvcg_fill_strm()
2113 } else if (fmt->type == UVCG_MJPEG) { in __uvcg_fill_strm()
2117 m->desc.bFormatIndex = n + 1; in __uvcg_fill_strm()
2118 m->desc.bNumFrameDescriptors = fmt->num_frames; in __uvcg_fill_strm()
2119 memcpy(*dest, &m->desc, sizeof(m->desc)); in __uvcg_fill_strm()
2120 *dest += sizeof(m->desc); in __uvcg_fill_strm()
2122 return -EINVAL; in __uvcg_fill_strm()
2130 sz = sizeof(frm->frame); in __uvcg_fill_strm()
2131 memcpy(*dest, &frm->frame, sz); in __uvcg_fill_strm()
2133 sz = frm->frame.b_frame_interval_type * in __uvcg_fill_strm()
2134 sizeof(*frm->dw_frame_interval); in __uvcg_fill_strm()
2135 memcpy(*dest, frm->dw_frame_interval, sz); in __uvcg_fill_strm()
2137 if (frm->fmt_type == UVCG_UNCOMPRESSED) in __uvcg_fill_strm()
2138 h->bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE( in __uvcg_fill_strm()
2139 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
2140 else if (frm->fmt_type == UVCG_MJPEG) in __uvcg_fill_strm()
2141 h->bLength = UVC_DT_FRAME_MJPEG_SIZE( in __uvcg_fill_strm()
2142 frm->frame.b_frame_interval_type); in __uvcg_fill_strm()
2155 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_allow_link()
2160 int ret = -EINVAL; in uvcg_streaming_class_allow_link()
2164 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_allow_link()
2166 if (!header || target->ci_parent != header) in uvcg_streaming_class_allow_link()
2169 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_allow_link()
2171 mutex_lock(&opts->lock); in uvcg_streaming_class_allow_link()
2174 if (!class_array || *class_array || opts->refcnt) { in uvcg_streaming_class_allow_link()
2175 ret = -EBUSY; in uvcg_streaming_class_allow_link()
2187 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
2195 ret = -ENOMEM; in uvcg_streaming_class_allow_link()
2211 *cl_arr = (struct uvc_descriptor_header *)&opts->uvc_color_matching; in uvcg_streaming_class_allow_link()
2213 ++target_hdr->linked; in uvcg_streaming_class_allow_link()
2217 mutex_unlock(&opts->lock); in uvcg_streaming_class_allow_link()
2229 struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; in uvcg_streaming_class_drop_link()
2235 streaming = src->ci_parent->ci_parent; in uvcg_streaming_class_drop_link()
2237 if (!header || target->ci_parent != header) in uvcg_streaming_class_drop_link()
2240 opts = to_f_uvc_opts(streaming->ci_parent); in uvcg_streaming_class_drop_link()
2242 mutex_lock(&opts->lock); in uvcg_streaming_class_drop_link()
2248 if (opts->refcnt) in uvcg_streaming_class_drop_link()
2252 --target_hdr->linked; in uvcg_streaming_class_drop_link()
2258 mutex_unlock(&opts->lock); in uvcg_streaming_class_drop_link()
2275 /* -----------------------------------------------------------------------------
2281 static const char * const names[] = { "fs", "hs", "ss" }; in uvcg_streaming_class_create_children()
2289 return -ENOMEM; in uvcg_streaming_class_create_children()
2291 group->name = names[i]; in uvcg_streaming_class_create_children()
2293 config_group_init_type_name(&group->group, group->name, in uvcg_streaming_class_create_children()
2295 configfs_add_default_group(&group->group, parent); in uvcg_streaming_class_create_children()
2310 /* -----------------------------------------------------------------------------
2318 struct mutex *su_mutex = &group->cg_subsys->su_mutex; in uvcg_default_streaming_b_interface_number_show()
2325 opts_item = item->ci_parent; in uvcg_default_streaming_b_interface_number_show()
2328 mutex_lock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
2329 result += sprintf(page, "%u\n", opts->streaming_interface); in uvcg_default_streaming_b_interface_number_show()
2330 mutex_unlock(&opts->lock); in uvcg_default_streaming_b_interface_number_show()
2361 /* -----------------------------------------------------------------------------
2370 usb_put_function_instance(&opts->func_inst); in uvc_func_item_release()
2384 mutex_lock(&opts->lock); \
2385 result = sprintf(page, "%u\n", opts->cname); \
2386 mutex_unlock(&opts->lock); \
2396 unsigned int num; \
2399 mutex_lock(&opts->lock); \
2400 if (opts->refcnt) { \
2401 ret = -EBUSY; \
2405 ret = kstrtouint(page, 0, &num); \
2409 if (num > limit) { \
2410 ret = -EINVAL; \
2413 opts->cname = num; \
2416 mutex_unlock(&opts->lock); \
2453 config_group_init_type_name(&opts->func_inst.group, uvc_func_type.name, in uvcg_attach_configfs()
2456 ret = uvcg_config_create_children(&opts->func_inst.group, in uvcg_attach_configfs()
2459 config_group_put(&opts->func_inst.group); in uvcg_attach_configfs()