aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/function/uvc_configfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/function/uvc_configfs.c')
-rw-r--r--drivers/usb/gadget/function/uvc_configfs.c387
1 files changed, 143 insertions, 244 deletions
diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
index 3c0467bcb14f..289ebca316d3 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -17,19 +17,21 @@
17 17
18#define UVCG_STREAMING_CONTROL_SIZE 1 18#define UVCG_STREAMING_CONTROL_SIZE 1
19 19
20#define CONFIGFS_ATTR_OPS_RO(_item) \ 20#define UVC_ATTR(prefix, cname, aname) \
21static ssize_t _item##_attr_show(struct config_item *item, \ 21static struct configfs_attribute prefix##attr_##cname = { \
22 struct configfs_attribute *attr, \ 22 .ca_name = __stringify(aname), \
23 char *page) \ 23 .ca_mode = S_IRUGO, \
24{ \ 24 .ca_owner = THIS_MODULE, \
25 struct _item *_item = to_##_item(item); \ 25 .show = prefix##cname##_show, \
26 struct _item##_attribute *_item##_attr = \ 26 .store = prefix##cname##_store, \
27 container_of(attr, struct _item##_attribute, attr); \ 27}
28 ssize_t ret = 0; \ 28
29 \ 29#define UVC_ATTR_RO(prefix, cname, aname) \
30 if (_item##_attr->show) \ 30static struct configfs_attribute prefix##attr_##cname = { \
31 ret = _item##_attr->show(_item, page); \ 31 .ca_name = __stringify(aname), \
32 return ret; \ 32 .ca_mode = S_IRUGO, \
33 .ca_owner = THIS_MODULE, \
34 .show = prefix##cname##_show, \
33} 35}
34 36
35static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item); 37static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item);
@@ -48,18 +50,11 @@ static struct uvcg_control_header *to_uvcg_control_header(struct config_item *it
48 return container_of(item, struct uvcg_control_header, item); 50 return container_of(item, struct uvcg_control_header, item);
49} 51}
50 52
51CONFIGFS_ATTR_STRUCT(uvcg_control_header);
52CONFIGFS_ATTR_OPS(uvcg_control_header);
53
54static struct configfs_item_operations uvcg_control_header_item_ops = {
55 .show_attribute = uvcg_control_header_attr_show,
56 .store_attribute = uvcg_control_header_attr_store,
57};
58
59#define UVCG_CTRL_HDR_ATTR(cname, aname, conv, str2u, uxx, vnoc, limit) \ 53#define UVCG_CTRL_HDR_ATTR(cname, aname, conv, str2u, uxx, vnoc, limit) \
60static ssize_t uvcg_control_header_##cname##_show( \ 54static ssize_t uvcg_control_header_##cname##_show( \
61 struct uvcg_control_header *ch, char *page) \ 55 struct config_item *item, char *page) \
62{ \ 56{ \
57 struct uvcg_control_header *ch = to_uvcg_control_header(item); \
63 struct f_uvc_opts *opts; \ 58 struct f_uvc_opts *opts; \
64 struct config_item *opts_item; \ 59 struct config_item *opts_item; \
65 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\ 60 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
@@ -79,9 +74,10 @@ static ssize_t uvcg_control_header_##cname##_show( \
79} \ 74} \
80 \ 75 \
81static ssize_t \ 76static ssize_t \
82uvcg_control_header_##cname##_store(struct uvcg_control_header *ch, \ 77uvcg_control_header_##cname##_store(struct config_item *item, \
83 const char *page, size_t len) \ 78 const char *page, size_t len) \
84{ \ 79{ \
80 struct uvcg_control_header *ch = to_uvcg_control_header(item); \
85 struct f_uvc_opts *opts; \ 81 struct f_uvc_opts *opts; \
86 struct config_item *opts_item; \ 82 struct config_item *opts_item; \
87 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\ 83 struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
@@ -115,11 +111,7 @@ end: \
115 return ret; \ 111 return ret; \
116} \ 112} \
117 \ 113 \
118static struct uvcg_control_header_attribute \ 114UVC_ATTR(uvcg_control_header_, cname, aname)
119 uvcg_control_header_##cname = \
120 __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
121 uvcg_control_header_##cname##_show, \
122 uvcg_control_header_##cname##_store)
123 115
124UVCG_CTRL_HDR_ATTR(bcd_uvc, bcdUVC, le16_to_cpu, kstrtou16, u16, cpu_to_le16, 116UVCG_CTRL_HDR_ATTR(bcd_uvc, bcdUVC, le16_to_cpu, kstrtou16, u16, cpu_to_le16,
125 0xffff); 117 0xffff);
@@ -130,13 +122,12 @@ UVCG_CTRL_HDR_ATTR(dw_clock_frequency, dwClockFrequency, le32_to_cpu, kstrtou32,
130#undef UVCG_CTRL_HDR_ATTR 122#undef UVCG_CTRL_HDR_ATTR
131 123
132static struct configfs_attribute *uvcg_control_header_attrs[] = { 124static struct configfs_attribute *uvcg_control_header_attrs[] = {
133 &uvcg_control_header_bcd_uvc.attr, 125 &uvcg_control_header_attr_bcd_uvc,
134 &uvcg_control_header_dw_clock_frequency.attr, 126 &uvcg_control_header_attr_dw_clock_frequency,
135 NULL, 127 NULL,
136}; 128};
137 129
138static struct config_item_type uvcg_control_header_type = { 130static struct config_item_type uvcg_control_header_type = {
139 .ct_item_ops = &uvcg_control_header_item_ops,
140 .ct_attrs = uvcg_control_header_attrs, 131 .ct_attrs = uvcg_control_header_attrs,
141 .ct_owner = THIS_MODULE, 132 .ct_owner = THIS_MODULE,
142}; 133};
@@ -196,17 +187,11 @@ static inline struct uvcg_default_processing
196 struct uvcg_default_processing, group); 187 struct uvcg_default_processing, group);
197} 188}
198 189
199CONFIGFS_ATTR_STRUCT(uvcg_default_processing);
200CONFIGFS_ATTR_OPS_RO(uvcg_default_processing);
201
202static struct configfs_item_operations uvcg_default_processing_item_ops = {
203 .show_attribute = uvcg_default_processing_attr_show,
204};
205
206#define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, conv) \ 190#define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, conv) \
207static ssize_t uvcg_default_processing_##cname##_show( \ 191static ssize_t uvcg_default_processing_##cname##_show( \
208 struct uvcg_default_processing *dp, char *page) \ 192 struct config_item *item, char *page) \
209{ \ 193{ \
194 struct uvcg_default_processing *dp = to_uvcg_default_processing(item); \
210 struct f_uvc_opts *opts; \ 195 struct f_uvc_opts *opts; \
211 struct config_item *opts_item; \ 196 struct config_item *opts_item; \
212 struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex; \ 197 struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex; \
@@ -227,9 +212,7 @@ static ssize_t uvcg_default_processing_##cname##_show( \
227 return result; \ 212 return result; \
228} \ 213} \
229 \ 214 \
230static struct uvcg_default_processing_attribute \ 215UVC_ATTR_RO(uvcg_default_processing_, cname, aname)
231 uvcg_default_processing_##cname = \
232 __CONFIGFS_ATTR_RO(aname, uvcg_default_processing_##cname##_show)
233 216
234#define identity_conv(x) (x) 217#define identity_conv(x) (x)
235 218
@@ -243,8 +226,9 @@ UVCG_DEFAULT_PROCESSING_ATTR(i_processing, iProcessing, identity_conv);
243#undef UVCG_DEFAULT_PROCESSING_ATTR 226#undef UVCG_DEFAULT_PROCESSING_ATTR
244 227
245static ssize_t uvcg_default_processing_bm_controls_show( 228static ssize_t uvcg_default_processing_bm_controls_show(
246 struct uvcg_default_processing *dp, char *page) 229 struct config_item *item, char *page)
247{ 230{
231 struct uvcg_default_processing *dp = to_uvcg_default_processing(item);
248 struct f_uvc_opts *opts; 232 struct f_uvc_opts *opts;
249 struct config_item *opts_item; 233 struct config_item *opts_item;
250 struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex; 234 struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex;
@@ -270,22 +254,18 @@ static ssize_t uvcg_default_processing_bm_controls_show(
270 return result; 254 return result;
271} 255}
272 256
273static struct uvcg_default_processing_attribute 257UVC_ATTR_RO(uvcg_default_processing_, bm_controls, bmControls);
274 uvcg_default_processing_bm_controls =
275 __CONFIGFS_ATTR_RO(bmControls,
276 uvcg_default_processing_bm_controls_show);
277 258
278static struct configfs_attribute *uvcg_default_processing_attrs[] = { 259static struct configfs_attribute *uvcg_default_processing_attrs[] = {
279 &uvcg_default_processing_b_unit_id.attr, 260 &uvcg_default_processing_attr_b_unit_id,
280 &uvcg_default_processing_b_source_id.attr, 261 &uvcg_default_processing_attr_b_source_id,
281 &uvcg_default_processing_w_max_multiplier.attr, 262 &uvcg_default_processing_attr_w_max_multiplier,
282 &uvcg_default_processing_bm_controls.attr, 263 &uvcg_default_processing_attr_bm_controls,
283 &uvcg_default_processing_i_processing.attr, 264 &uvcg_default_processing_attr_i_processing,
284 NULL, 265 NULL,
285}; 266};
286 267
287static struct config_item_type uvcg_default_processing_type = { 268static struct config_item_type uvcg_default_processing_type = {
288 .ct_item_ops = &uvcg_default_processing_item_ops,
289 .ct_attrs = uvcg_default_processing_attrs, 269 .ct_attrs = uvcg_default_processing_attrs,
290 .ct_owner = THIS_MODULE, 270 .ct_owner = THIS_MODULE,
291}; 271};
@@ -318,17 +298,11 @@ static inline struct uvcg_default_camera
318 struct uvcg_default_camera, group); 298 struct uvcg_default_camera, group);
319} 299}
320 300
321CONFIGFS_ATTR_STRUCT(uvcg_default_camera);
322CONFIGFS_ATTR_OPS_RO(uvcg_default_camera);
323
324static struct configfs_item_operations uvcg_default_camera_item_ops = {
325 .show_attribute = uvcg_default_camera_attr_show,
326};
327
328#define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, conv) \ 301#define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, conv) \
329static ssize_t uvcg_default_camera_##cname##_show( \ 302static ssize_t uvcg_default_camera_##cname##_show( \
330 struct uvcg_default_camera *dc, char *page) \ 303 struct config_item *item, char *page) \
331{ \ 304{ \
305 struct uvcg_default_camera *dc = to_uvcg_default_camera(item); \
332 struct f_uvc_opts *opts; \ 306 struct f_uvc_opts *opts; \
333 struct config_item *opts_item; \ 307 struct config_item *opts_item; \
334 struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; \ 308 struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; \
@@ -351,9 +325,7 @@ static ssize_t uvcg_default_camera_##cname##_show( \
351 return result; \ 325 return result; \
352} \ 326} \
353 \ 327 \
354static struct uvcg_default_camera_attribute \ 328UVC_ATTR_RO(uvcg_default_camera_, cname, aname)
355 uvcg_default_camera_##cname = \
356 __CONFIGFS_ATTR_RO(aname, uvcg_default_camera_##cname##_show)
357 329
358#define identity_conv(x) (x) 330#define identity_conv(x) (x)
359 331
@@ -373,8 +345,9 @@ UVCG_DEFAULT_CAMERA_ATTR(w_ocular_focal_length, wOcularFocalLength,
373#undef UVCG_DEFAULT_CAMERA_ATTR 345#undef UVCG_DEFAULT_CAMERA_ATTR
374 346
375static ssize_t uvcg_default_camera_bm_controls_show( 347static ssize_t uvcg_default_camera_bm_controls_show(
376 struct uvcg_default_camera *dc, char *page) 348 struct config_item *item, char *page)
377{ 349{
350 struct uvcg_default_camera *dc = to_uvcg_default_camera(item);
378 struct f_uvc_opts *opts; 351 struct f_uvc_opts *opts;
379 struct config_item *opts_item; 352 struct config_item *opts_item;
380 struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; 353 struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;
@@ -400,24 +373,21 @@ static ssize_t uvcg_default_camera_bm_controls_show(
400 return result; 373 return result;
401} 374}
402 375
403static struct uvcg_default_camera_attribute 376UVC_ATTR_RO(uvcg_default_camera_, bm_controls, bmControls);
404 uvcg_default_camera_bm_controls =
405 __CONFIGFS_ATTR_RO(bmControls, uvcg_default_camera_bm_controls_show);
406 377
407static struct configfs_attribute *uvcg_default_camera_attrs[] = { 378static struct configfs_attribute *uvcg_default_camera_attrs[] = {
408 &uvcg_default_camera_b_terminal_id.attr, 379 &uvcg_default_camera_attr_b_terminal_id,
409 &uvcg_default_camera_w_terminal_type.attr, 380 &uvcg_default_camera_attr_w_terminal_type,
410 &uvcg_default_camera_b_assoc_terminal.attr, 381 &uvcg_default_camera_attr_b_assoc_terminal,
411 &uvcg_default_camera_i_terminal.attr, 382 &uvcg_default_camera_attr_i_terminal,
412 &uvcg_default_camera_w_objective_focal_length_min.attr, 383 &uvcg_default_camera_attr_w_objective_focal_length_min,
413 &uvcg_default_camera_w_objective_focal_length_max.attr, 384 &uvcg_default_camera_attr_w_objective_focal_length_max,
414 &uvcg_default_camera_w_ocular_focal_length.attr, 385 &uvcg_default_camera_attr_w_ocular_focal_length,
415 &uvcg_default_camera_bm_controls.attr, 386 &uvcg_default_camera_attr_bm_controls,
416 NULL, 387 NULL,
417}; 388};
418 389
419static struct config_item_type uvcg_default_camera_type = { 390static struct config_item_type uvcg_default_camera_type = {
420 .ct_item_ops = &uvcg_default_camera_item_ops,
421 .ct_attrs = uvcg_default_camera_attrs, 391 .ct_attrs = uvcg_default_camera_attrs,
422 .ct_owner = THIS_MODULE, 392 .ct_owner = THIS_MODULE,
423}; 393};
@@ -450,17 +420,11 @@ static inline struct uvcg_default_output
450 struct uvcg_default_output, group); 420 struct uvcg_default_output, group);
451} 421}
452 422
453CONFIGFS_ATTR_STRUCT(uvcg_default_output);
454CONFIGFS_ATTR_OPS_RO(uvcg_default_output);
455
456static struct configfs_item_operations uvcg_default_output_item_ops = {
457 .show_attribute = uvcg_default_output_attr_show,
458};
459
460#define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, conv) \ 423#define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, conv) \
461static ssize_t uvcg_default_output_##cname##_show( \ 424static ssize_t uvcg_default_output_##cname##_show( \
462 struct uvcg_default_output *dout, char *page) \ 425 struct config_item *item, char *page) \
463{ \ 426{ \
427 struct uvcg_default_output *dout = to_uvcg_default_output(item); \
464 struct f_uvc_opts *opts; \ 428 struct f_uvc_opts *opts; \
465 struct config_item *opts_item; \ 429 struct config_item *opts_item; \
466 struct mutex *su_mutex = &dout->group.cg_subsys->su_mutex; \ 430 struct mutex *su_mutex = &dout->group.cg_subsys->su_mutex; \
@@ -483,9 +447,7 @@ static ssize_t uvcg_default_output_##cname##_show( \
483 return result; \ 447 return result; \
484} \ 448} \
485 \ 449 \
486static struct uvcg_default_output_attribute \ 450UVC_ATTR_RO(uvcg_default_output_, cname, aname)
487 uvcg_default_output_##cname = \
488 __CONFIGFS_ATTR_RO(aname, uvcg_default_output_##cname##_show)
489 451
490#define identity_conv(x) (x) 452#define identity_conv(x) (x)
491 453
@@ -500,16 +462,15 @@ UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, identity_conv);
500#undef UVCG_DEFAULT_OUTPUT_ATTR 462#undef UVCG_DEFAULT_OUTPUT_ATTR
501 463
502static struct configfs_attribute *uvcg_default_output_attrs[] = { 464static struct configfs_attribute *uvcg_default_output_attrs[] = {
503 &uvcg_default_output_b_terminal_id.attr, 465 &uvcg_default_output_attr_b_terminal_id,
504 &uvcg_default_output_w_terminal_type.attr, 466 &uvcg_default_output_attr_w_terminal_type,
505 &uvcg_default_output_b_assoc_terminal.attr, 467 &uvcg_default_output_attr_b_assoc_terminal,
506 &uvcg_default_output_b_source_id.attr, 468 &uvcg_default_output_attr_b_source_id,
507 &uvcg_default_output_i_terminal.attr, 469 &uvcg_default_output_attr_i_terminal,
508 NULL, 470 NULL,
509}; 471};
510 472
511static struct config_item_type uvcg_default_output_type = { 473static struct config_item_type uvcg_default_output_type = {
512 .ct_item_ops = &uvcg_default_output_item_ops,
513 .ct_attrs = uvcg_default_output_attrs, 474 .ct_attrs = uvcg_default_output_attrs,
514 .ct_owner = THIS_MODULE, 475 .ct_owner = THIS_MODULE,
515}; 476};
@@ -800,9 +761,6 @@ static struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item
800 return container_of(item, struct uvcg_streaming_header, item); 761 return container_of(item, struct uvcg_streaming_header, item);
801} 762}
802 763
803CONFIGFS_ATTR_STRUCT(uvcg_streaming_header);
804CONFIGFS_ATTR_OPS(uvcg_streaming_header);
805
806static int uvcg_streaming_header_allow_link(struct config_item *src, 764static int uvcg_streaming_header_allow_link(struct config_item *src,
807 struct config_item *target) 765 struct config_item *target)
808{ 766{
@@ -893,16 +851,15 @@ out:
893} 851}
894 852
895static struct configfs_item_operations uvcg_streaming_header_item_ops = { 853static struct configfs_item_operations uvcg_streaming_header_item_ops = {
896 .show_attribute = uvcg_streaming_header_attr_show,
897 .store_attribute = uvcg_streaming_header_attr_store,
898 .allow_link = uvcg_streaming_header_allow_link, 854 .allow_link = uvcg_streaming_header_allow_link,
899 .drop_link = uvcg_streaming_header_drop_link, 855 .drop_link = uvcg_streaming_header_drop_link,
900}; 856};
901 857
902#define UVCG_STREAMING_HEADER_ATTR(cname, aname, conv) \ 858#define UVCG_STREAMING_HEADER_ATTR(cname, aname, conv) \
903static ssize_t uvcg_streaming_header_##cname##_show( \ 859static ssize_t uvcg_streaming_header_##cname##_show( \
904 struct uvcg_streaming_header *sh, char *page) \ 860 struct config_item *item, char *page) \
905{ \ 861{ \
862 struct uvcg_streaming_header *sh = to_uvcg_streaming_header(item); \
906 struct f_uvc_opts *opts; \ 863 struct f_uvc_opts *opts; \
907 struct config_item *opts_item; \ 864 struct config_item *opts_item; \
908 struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\ 865 struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
@@ -921,9 +878,7 @@ static ssize_t uvcg_streaming_header_##cname##_show( \
921 return result; \ 878 return result; \
922} \ 879} \
923 \ 880 \
924static struct uvcg_streaming_header_attribute \ 881UVC_ATTR_RO(uvcg_streaming_header_, cname, aname)
925 uvcg_streaming_header_##cname = \
926 __CONFIGFS_ATTR_RO(aname, uvcg_streaming_header_##cname##_show)
927 882
928#define identity_conv(x) (x) 883#define identity_conv(x) (x)
929 884
@@ -939,11 +894,11 @@ UVCG_STREAMING_HEADER_ATTR(b_trigger_usage, bTriggerUsage, identity_conv);
939#undef UVCG_STREAMING_HEADER_ATTR 894#undef UVCG_STREAMING_HEADER_ATTR
940 895
941static struct configfs_attribute *uvcg_streaming_header_attrs[] = { 896static struct configfs_attribute *uvcg_streaming_header_attrs[] = {
942 &uvcg_streaming_header_bm_info.attr, 897 &uvcg_streaming_header_attr_bm_info,
943 &uvcg_streaming_header_b_terminal_link.attr, 898 &uvcg_streaming_header_attr_b_terminal_link,
944 &uvcg_streaming_header_b_still_capture_method.attr, 899 &uvcg_streaming_header_attr_b_still_capture_method,
945 &uvcg_streaming_header_b_trigger_support.attr, 900 &uvcg_streaming_header_attr_b_trigger_support,
946 &uvcg_streaming_header_b_trigger_usage.attr, 901 &uvcg_streaming_header_attr_b_trigger_usage,
947 NULL, 902 NULL,
948}; 903};
949 904
@@ -1022,17 +977,10 @@ static struct uvcg_frame *to_uvcg_frame(struct config_item *item)
1022 return container_of(item, struct uvcg_frame, item); 977 return container_of(item, struct uvcg_frame, item);
1023} 978}
1024 979
1025CONFIGFS_ATTR_STRUCT(uvcg_frame);
1026CONFIGFS_ATTR_OPS(uvcg_frame);
1027
1028static struct configfs_item_operations uvcg_frame_item_ops = {
1029 .show_attribute = uvcg_frame_attr_show,
1030 .store_attribute = uvcg_frame_attr_store,
1031};
1032
1033#define UVCG_FRAME_ATTR(cname, aname, to_cpu_endian, to_little_endian, bits) \ 980#define UVCG_FRAME_ATTR(cname, aname, to_cpu_endian, to_little_endian, bits) \
1034static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\ 981static ssize_t uvcg_frame_##cname##_show(struct config_item *item, char *page)\
1035{ \ 982{ \
983 struct uvcg_frame *f = to_uvcg_frame(item); \
1036 struct f_uvc_opts *opts; \ 984 struct f_uvc_opts *opts; \
1037 struct config_item *opts_item; \ 985 struct config_item *opts_item; \
1038 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\ 986 struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
@@ -1051,9 +999,10 @@ static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\
1051 return result; \ 999 return result; \
1052} \ 1000} \
1053 \ 1001 \
1054static ssize_t uvcg_frame_##cname##_store(struct uvcg_frame *f, \ 1002static ssize_t uvcg_frame_##cname##_store(struct config_item *item, \
1055 const char *page, size_t len)\ 1003 const char *page, size_t len)\
1056{ \ 1004{ \
1005 struct uvcg_frame *f = to_uvcg_frame(item); \
1057 struct f_uvc_opts *opts; \ 1006 struct f_uvc_opts *opts; \
1058 struct config_item *opts_item; \ 1007 struct config_item *opts_item; \
1059 struct uvcg_format *fmt; \ 1008 struct uvcg_format *fmt; \
@@ -1085,11 +1034,7 @@ end: \
1085 return ret; \ 1034 return ret; \
1086} \ 1035} \
1087 \ 1036 \
1088static struct uvcg_frame_attribute \ 1037UVC_ATTR(uvcg_frame_, cname, aname);
1089 uvcg_frame_##cname = \
1090 __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
1091 uvcg_frame_##cname##_show, \
1092 uvcg_frame_##cname##_store)
1093 1038
1094#define noop_conversion(x) (x) 1039#define noop_conversion(x) (x)
1095 1040
@@ -1108,9 +1053,10 @@ UVCG_FRAME_ATTR(dw_default_frame_interval, dwDefaultFrameInterval,
1108 1053
1109#undef UVCG_FRAME_ATTR 1054#undef UVCG_FRAME_ATTR
1110 1055
1111static ssize_t uvcg_frame_dw_frame_interval_show(struct uvcg_frame *frm, 1056static ssize_t uvcg_frame_dw_frame_interval_show(struct config_item *item,
1112 char *page) 1057 char *page)
1113{ 1058{
1059 struct uvcg_frame *frm = to_uvcg_frame(item);
1114 struct f_uvc_opts *opts; 1060 struct f_uvc_opts *opts;
1115 struct config_item *opts_item; 1061 struct config_item *opts_item;
1116 struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex; 1062 struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex;
@@ -1185,9 +1131,10 @@ static int __uvcg_iter_frm_intrv(const char *page, size_t len,
1185 return 0; 1131 return 0;
1186} 1132}
1187 1133
1188static ssize_t uvcg_frame_dw_frame_interval_store(struct uvcg_frame *ch, 1134static ssize_t uvcg_frame_dw_frame_interval_store(struct config_item *item,
1189 const char *page, size_t len) 1135 const char *page, size_t len)
1190{ 1136{
1137 struct uvcg_frame *ch = to_uvcg_frame(item);
1191 struct f_uvc_opts *opts; 1138 struct f_uvc_opts *opts;
1192 struct config_item *opts_item; 1139 struct config_item *opts_item;
1193 struct uvcg_format *fmt; 1140 struct uvcg_format *fmt;
@@ -1234,26 +1181,21 @@ end:
1234 return ret; 1181 return ret;
1235} 1182}
1236 1183
1237static struct uvcg_frame_attribute 1184UVC_ATTR(uvcg_frame_, dw_frame_interval, dwFrameInterval);
1238 uvcg_frame_dw_frame_interval =
1239 __CONFIGFS_ATTR(dwFrameInterval, S_IRUGO | S_IWUSR,
1240 uvcg_frame_dw_frame_interval_show,
1241 uvcg_frame_dw_frame_interval_store);
1242 1185
1243static struct configfs_attribute *uvcg_frame_attrs[] = { 1186static struct configfs_attribute *uvcg_frame_attrs[] = {
1244 &uvcg_frame_bm_capabilities.attr, 1187 &uvcg_frame_attr_bm_capabilities,
1245 &uvcg_frame_w_width.attr, 1188 &uvcg_frame_attr_w_width,
1246 &uvcg_frame_w_height.attr, 1189 &uvcg_frame_attr_w_height,
1247 &uvcg_frame_dw_min_bit_rate.attr, 1190 &uvcg_frame_attr_dw_min_bit_rate,
1248 &uvcg_frame_dw_max_bit_rate.attr, 1191 &uvcg_frame_attr_dw_max_bit_rate,
1249 &uvcg_frame_dw_max_video_frame_buffer_size.attr, 1192 &uvcg_frame_attr_dw_max_video_frame_buffer_size,
1250 &uvcg_frame_dw_default_frame_interval.attr, 1193 &uvcg_frame_attr_dw_default_frame_interval,
1251 &uvcg_frame_dw_frame_interval.attr, 1194 &uvcg_frame_attr_dw_frame_interval,
1252 NULL, 1195 NULL,
1253}; 1196};
1254 1197
1255static struct config_item_type uvcg_frame_type = { 1198static struct config_item_type uvcg_frame_type = {
1256 .ct_item_ops = &uvcg_frame_item_ops,
1257 .ct_attrs = uvcg_frame_attrs, 1199 .ct_attrs = uvcg_frame_attrs,
1258 .ct_owner = THIS_MODULE, 1200 .ct_owner = THIS_MODULE,
1259}; 1201};
@@ -1333,22 +1275,15 @@ static struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
1333 struct uvcg_uncompressed, fmt); 1275 struct uvcg_uncompressed, fmt);
1334} 1276}
1335 1277
1336CONFIGFS_ATTR_STRUCT(uvcg_uncompressed);
1337CONFIGFS_ATTR_OPS(uvcg_uncompressed);
1338
1339static struct configfs_item_operations uvcg_uncompressed_item_ops = {
1340 .show_attribute = uvcg_uncompressed_attr_show,
1341 .store_attribute = uvcg_uncompressed_attr_store,
1342};
1343
1344static struct configfs_group_operations uvcg_uncompressed_group_ops = { 1278static struct configfs_group_operations uvcg_uncompressed_group_ops = {
1345 .make_item = uvcg_frame_make, 1279 .make_item = uvcg_frame_make,
1346 .drop_item = uvcg_frame_drop, 1280 .drop_item = uvcg_frame_drop,
1347}; 1281};
1348 1282
1349static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch, 1283static ssize_t uvcg_uncompressed_guid_format_show(struct config_item *item,
1350 char *page) 1284 char *page)
1351{ 1285{
1286 struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
1352 struct f_uvc_opts *opts; 1287 struct f_uvc_opts *opts;
1353 struct config_item *opts_item; 1288 struct config_item *opts_item;
1354 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; 1289 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
@@ -1367,9 +1302,10 @@ static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch,
1367 return sizeof(ch->desc.guidFormat); 1302 return sizeof(ch->desc.guidFormat);
1368} 1303}
1369 1304
1370static ssize_t uvcg_uncompressed_guid_format_store(struct uvcg_uncompressed *ch, 1305static ssize_t uvcg_uncompressed_guid_format_store(struct config_item *item,
1371 const char *page, size_t len) 1306 const char *page, size_t len)
1372{ 1307{
1308 struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
1373 struct f_uvc_opts *opts; 1309 struct f_uvc_opts *opts;
1374 struct config_item *opts_item; 1310 struct config_item *opts_item;
1375 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex; 1311 struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
@@ -1396,16 +1332,13 @@ end:
1396 return ret; 1332 return ret;
1397} 1333}
1398 1334
1399static struct uvcg_uncompressed_attribute uvcg_uncompressed_guid_format = 1335UVC_ATTR(uvcg_uncompressed_, guid_format, guidFormat);
1400 __CONFIGFS_ATTR(guidFormat, S_IRUGO | S_IWUSR,
1401 uvcg_uncompressed_guid_format_show,
1402 uvcg_uncompressed_guid_format_store);
1403
1404 1336
1405#define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, conv) \ 1337#define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, conv) \
1406static ssize_t uvcg_uncompressed_##cname##_show( \ 1338static ssize_t uvcg_uncompressed_##cname##_show( \
1407 struct uvcg_uncompressed *u, char *page) \ 1339 struct config_item *item, char *page) \
1408{ \ 1340{ \
1341 struct uvcg_uncompressed *u = to_uvcg_uncompressed(item); \
1409 struct f_uvc_opts *opts; \ 1342 struct f_uvc_opts *opts; \
1410 struct config_item *opts_item; \ 1343 struct config_item *opts_item; \
1411 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \ 1344 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
@@ -1424,14 +1357,13 @@ static ssize_t uvcg_uncompressed_##cname##_show( \
1424 return result; \ 1357 return result; \
1425} \ 1358} \
1426 \ 1359 \
1427static struct uvcg_uncompressed_attribute \ 1360UVC_ATTR_RO(uvcg_uncompressed_, cname, aname);
1428 uvcg_uncompressed_##cname = \
1429 __CONFIGFS_ATTR_RO(aname, uvcg_uncompressed_##cname##_show)
1430 1361
1431#define UVCG_UNCOMPRESSED_ATTR(cname, aname, conv) \ 1362#define UVCG_UNCOMPRESSED_ATTR(cname, aname, conv) \
1432static ssize_t uvcg_uncompressed_##cname##_show( \ 1363static ssize_t uvcg_uncompressed_##cname##_show( \
1433 struct uvcg_uncompressed *u, char *page) \ 1364 struct config_item *item, char *page) \
1434{ \ 1365{ \
1366 struct uvcg_uncompressed *u = to_uvcg_uncompressed(item); \
1435 struct f_uvc_opts *opts; \ 1367 struct f_uvc_opts *opts; \
1436 struct config_item *opts_item; \ 1368 struct config_item *opts_item; \
1437 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \ 1369 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
@@ -1451,9 +1383,10 @@ static ssize_t uvcg_uncompressed_##cname##_show( \
1451} \ 1383} \
1452 \ 1384 \
1453static ssize_t \ 1385static ssize_t \
1454uvcg_uncompressed_##cname##_store(struct uvcg_uncompressed *u, \ 1386uvcg_uncompressed_##cname##_store(struct config_item *item, \
1455 const char *page, size_t len) \ 1387 const char *page, size_t len) \
1456{ \ 1388{ \
1389 struct uvcg_uncompressed *u = to_uvcg_uncompressed(item); \
1457 struct f_uvc_opts *opts; \ 1390 struct f_uvc_opts *opts; \
1458 struct config_item *opts_item; \ 1391 struct config_item *opts_item; \
1459 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \ 1392 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
@@ -1487,11 +1420,7 @@ end: \
1487 return ret; \ 1420 return ret; \
1488} \ 1421} \
1489 \ 1422 \
1490static struct uvcg_uncompressed_attribute \ 1423UVC_ATTR(uvcg_uncompressed_, cname, aname);
1491 uvcg_uncompressed_##cname = \
1492 __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
1493 uvcg_uncompressed_##cname##_show, \
1494 uvcg_uncompressed_##cname##_store)
1495 1424
1496#define identity_conv(x) (x) 1425#define identity_conv(x) (x)
1497 1426
@@ -1508,36 +1437,34 @@ UVCG_UNCOMPRESSED_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
1508#undef UVCG_UNCOMPRESSED_ATTR_RO 1437#undef UVCG_UNCOMPRESSED_ATTR_RO
1509 1438
1510static inline ssize_t 1439static inline ssize_t
1511uvcg_uncompressed_bma_controls_show(struct uvcg_uncompressed *unc, char *page) 1440uvcg_uncompressed_bma_controls_show(struct config_item *item, char *page)
1512{ 1441{
1442 struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
1513 return uvcg_format_bma_controls_show(&unc->fmt, page); 1443 return uvcg_format_bma_controls_show(&unc->fmt, page);
1514} 1444}
1515 1445
1516static inline ssize_t 1446static inline ssize_t
1517uvcg_uncompressed_bma_controls_store(struct uvcg_uncompressed *ch, 1447uvcg_uncompressed_bma_controls_store(struct config_item *item,
1518 const char *page, size_t len) 1448 const char *page, size_t len)
1519{ 1449{
1520 return uvcg_format_bma_controls_store(&ch->fmt, page, len); 1450 struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
1451 return uvcg_format_bma_controls_store(&unc->fmt, page, len);
1521} 1452}
1522 1453
1523static struct uvcg_uncompressed_attribute uvcg_uncompressed_bma_controls = 1454UVC_ATTR(uvcg_uncompressed_, bma_controls, bmaControls);
1524 __CONFIGFS_ATTR(bmaControls, S_IRUGO | S_IWUSR,
1525 uvcg_uncompressed_bma_controls_show,
1526 uvcg_uncompressed_bma_controls_store);
1527 1455
1528static struct configfs_attribute *uvcg_uncompressed_attrs[] = { 1456static struct configfs_attribute *uvcg_uncompressed_attrs[] = {
1529 &uvcg_uncompressed_guid_format.attr, 1457 &uvcg_uncompressed_attr_guid_format,
1530 &uvcg_uncompressed_b_bits_per_pixel.attr, 1458 &uvcg_uncompressed_attr_b_bits_per_pixel,
1531 &uvcg_uncompressed_b_default_frame_index.attr, 1459 &uvcg_uncompressed_attr_b_default_frame_index,
1532 &uvcg_uncompressed_b_aspect_ratio_x.attr, 1460 &uvcg_uncompressed_attr_b_aspect_ratio_x,
1533 &uvcg_uncompressed_b_aspect_ratio_y.attr, 1461 &uvcg_uncompressed_attr_b_aspect_ratio_y,
1534 &uvcg_uncompressed_bm_interface_flags.attr, 1462 &uvcg_uncompressed_attr_bm_interface_flags,
1535 &uvcg_uncompressed_bma_controls.attr, 1463 &uvcg_uncompressed_attr_bma_controls,
1536 NULL, 1464 NULL,
1537}; 1465};
1538 1466
1539static struct config_item_type uvcg_uncompressed_type = { 1467static struct config_item_type uvcg_uncompressed_type = {
1540 .ct_item_ops = &uvcg_uncompressed_item_ops,
1541 .ct_group_ops = &uvcg_uncompressed_group_ops, 1468 .ct_group_ops = &uvcg_uncompressed_group_ops,
1542 .ct_attrs = uvcg_uncompressed_attrs, 1469 .ct_attrs = uvcg_uncompressed_attrs,
1543 .ct_owner = THIS_MODULE, 1470 .ct_owner = THIS_MODULE,
@@ -1605,22 +1532,15 @@ static struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
1605 struct uvcg_mjpeg, fmt); 1532 struct uvcg_mjpeg, fmt);
1606} 1533}
1607 1534
1608CONFIGFS_ATTR_STRUCT(uvcg_mjpeg);
1609CONFIGFS_ATTR_OPS(uvcg_mjpeg);
1610
1611static struct configfs_item_operations uvcg_mjpeg_item_ops = {
1612 .show_attribute = uvcg_mjpeg_attr_show,
1613 .store_attribute = uvcg_mjpeg_attr_store,
1614};
1615
1616static struct configfs_group_operations uvcg_mjpeg_group_ops = { 1535static struct configfs_group_operations uvcg_mjpeg_group_ops = {
1617 .make_item = uvcg_frame_make, 1536 .make_item = uvcg_frame_make,
1618 .drop_item = uvcg_frame_drop, 1537 .drop_item = uvcg_frame_drop,
1619}; 1538};
1620 1539
1621#define UVCG_MJPEG_ATTR_RO(cname, aname, conv) \ 1540#define UVCG_MJPEG_ATTR_RO(cname, aname, conv) \
1622static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\ 1541static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
1623{ \ 1542{ \
1543 struct uvcg_mjpeg *u = to_uvcg_mjpeg(item); \
1624 struct f_uvc_opts *opts; \ 1544 struct f_uvc_opts *opts; \
1625 struct config_item *opts_item; \ 1545 struct config_item *opts_item; \
1626 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \ 1546 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
@@ -1639,13 +1559,12 @@ static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
1639 return result; \ 1559 return result; \
1640} \ 1560} \
1641 \ 1561 \
1642static struct uvcg_mjpeg_attribute \ 1562UVC_ATTR_RO(uvcg_mjpeg_, cname, aname)
1643 uvcg_mjpeg_##cname = \
1644 __CONFIGFS_ATTR_RO(aname, uvcg_mjpeg_##cname##_show)
1645 1563
1646#define UVCG_MJPEG_ATTR(cname, aname, conv) \ 1564#define UVCG_MJPEG_ATTR(cname, aname, conv) \
1647static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\ 1565static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
1648{ \ 1566{ \
1567 struct uvcg_mjpeg *u = to_uvcg_mjpeg(item); \
1649 struct f_uvc_opts *opts; \ 1568 struct f_uvc_opts *opts; \
1650 struct config_item *opts_item; \ 1569 struct config_item *opts_item; \
1651 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \ 1570 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
@@ -1665,9 +1584,10 @@ static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
1665} \ 1584} \
1666 \ 1585 \
1667static ssize_t \ 1586static ssize_t \
1668uvcg_mjpeg_##cname##_store(struct uvcg_mjpeg *u, \ 1587uvcg_mjpeg_##cname##_store(struct config_item *item, \
1669 const char *page, size_t len) \ 1588 const char *page, size_t len) \
1670{ \ 1589{ \
1590 struct uvcg_mjpeg *u = to_uvcg_mjpeg(item); \
1671 struct f_uvc_opts *opts; \ 1591 struct f_uvc_opts *opts; \
1672 struct config_item *opts_item; \ 1592 struct config_item *opts_item; \
1673 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \ 1593 struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
@@ -1701,11 +1621,7 @@ end: \
1701 return ret; \ 1621 return ret; \
1702} \ 1622} \
1703 \ 1623 \
1704static struct uvcg_mjpeg_attribute \ 1624UVC_ATTR(uvcg_mjpeg_, cname, aname)
1705 uvcg_mjpeg_##cname = \
1706 __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
1707 uvcg_mjpeg_##cname##_show, \
1708 uvcg_mjpeg_##cname##_store)
1709 1625
1710#define identity_conv(x) (x) 1626#define identity_conv(x) (x)
1711 1627
@@ -1722,35 +1638,33 @@ UVCG_MJPEG_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
1722#undef UVCG_MJPEG_ATTR_RO 1638#undef UVCG_MJPEG_ATTR_RO
1723 1639
1724static inline ssize_t 1640static inline ssize_t
1725uvcg_mjpeg_bma_controls_show(struct uvcg_mjpeg *unc, char *page) 1641uvcg_mjpeg_bma_controls_show(struct config_item *item, char *page)
1726{ 1642{
1727 return uvcg_format_bma_controls_show(&unc->fmt, page); 1643 struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
1644 return uvcg_format_bma_controls_show(&u->fmt, page);
1728} 1645}
1729 1646
1730static inline ssize_t 1647static inline ssize_t
1731uvcg_mjpeg_bma_controls_store(struct uvcg_mjpeg *ch, 1648uvcg_mjpeg_bma_controls_store(struct config_item *item,
1732 const char *page, size_t len) 1649 const char *page, size_t len)
1733{ 1650{
1734 return uvcg_format_bma_controls_store(&ch->fmt, page, len); 1651 struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
1652 return uvcg_format_bma_controls_store(&u->fmt, page, len);
1735} 1653}
1736 1654
1737static struct uvcg_mjpeg_attribute uvcg_mjpeg_bma_controls = 1655UVC_ATTR(uvcg_mjpeg_, bma_controls, bmaControls);
1738 __CONFIGFS_ATTR(bmaControls, S_IRUGO | S_IWUSR,
1739 uvcg_mjpeg_bma_controls_show,
1740 uvcg_mjpeg_bma_controls_store);
1741 1656
1742static struct configfs_attribute *uvcg_mjpeg_attrs[] = { 1657static struct configfs_attribute *uvcg_mjpeg_attrs[] = {
1743 &uvcg_mjpeg_b_default_frame_index.attr, 1658 &uvcg_mjpeg_attr_b_default_frame_index,
1744 &uvcg_mjpeg_bm_flags.attr, 1659 &uvcg_mjpeg_attr_bm_flags,
1745 &uvcg_mjpeg_b_aspect_ratio_x.attr, 1660 &uvcg_mjpeg_attr_b_aspect_ratio_x,
1746 &uvcg_mjpeg_b_aspect_ratio_y.attr, 1661 &uvcg_mjpeg_attr_b_aspect_ratio_y,
1747 &uvcg_mjpeg_bm_interface_flags.attr, 1662 &uvcg_mjpeg_attr_bm_interface_flags,
1748 &uvcg_mjpeg_bma_controls.attr, 1663 &uvcg_mjpeg_attr_bma_controls,
1749 NULL, 1664 NULL,
1750}; 1665};
1751 1666
1752static struct config_item_type uvcg_mjpeg_type = { 1667static struct config_item_type uvcg_mjpeg_type = {
1753 .ct_item_ops = &uvcg_mjpeg_item_ops,
1754 .ct_group_ops = &uvcg_mjpeg_group_ops, 1668 .ct_group_ops = &uvcg_mjpeg_group_ops,
1755 .ct_attrs = uvcg_mjpeg_attrs, 1669 .ct_attrs = uvcg_mjpeg_attrs,
1756 .ct_owner = THIS_MODULE, 1670 .ct_owner = THIS_MODULE,
@@ -1811,17 +1725,12 @@ static inline struct uvcg_default_color_matching
1811 struct uvcg_default_color_matching, group); 1725 struct uvcg_default_color_matching, group);
1812} 1726}
1813 1727
1814CONFIGFS_ATTR_STRUCT(uvcg_default_color_matching);
1815CONFIGFS_ATTR_OPS_RO(uvcg_default_color_matching);
1816
1817static struct configfs_item_operations uvcg_default_color_matching_item_ops = {
1818 .show_attribute = uvcg_default_color_matching_attr_show,
1819};
1820
1821#define UVCG_DEFAULT_COLOR_MATCHING_ATTR(cname, aname, conv) \ 1728#define UVCG_DEFAULT_COLOR_MATCHING_ATTR(cname, aname, conv) \
1822static ssize_t uvcg_default_color_matching_##cname##_show( \ 1729static ssize_t uvcg_default_color_matching_##cname##_show( \
1823 struct uvcg_default_color_matching *dc, char *page) \ 1730 struct config_item *item, char *page) \
1824{ \ 1731{ \
1732 struct uvcg_default_color_matching *dc = \
1733 to_uvcg_default_color_matching(item); \
1825 struct f_uvc_opts *opts; \ 1734 struct f_uvc_opts *opts; \
1826 struct config_item *opts_item; \ 1735 struct config_item *opts_item; \
1827 struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; \ 1736 struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; \
@@ -1842,9 +1751,7 @@ static ssize_t uvcg_default_color_matching_##cname##_show( \
1842 return result; \ 1751 return result; \
1843} \ 1752} \
1844 \ 1753 \
1845static struct uvcg_default_color_matching_attribute \ 1754UVC_ATTR_RO(uvcg_default_color_matching_, cname, aname)
1846 uvcg_default_color_matching_##cname = \
1847 __CONFIGFS_ATTR_RO(aname, uvcg_default_color_matching_##cname##_show)
1848 1755
1849#define identity_conv(x) (x) 1756#define identity_conv(x) (x)
1850 1757
@@ -1860,14 +1767,13 @@ UVCG_DEFAULT_COLOR_MATCHING_ATTR(b_matrix_coefficients, bMatrixCoefficients,
1860#undef UVCG_DEFAULT_COLOR_MATCHING_ATTR 1767#undef UVCG_DEFAULT_COLOR_MATCHING_ATTR
1861 1768
1862static struct configfs_attribute *uvcg_default_color_matching_attrs[] = { 1769static struct configfs_attribute *uvcg_default_color_matching_attrs[] = {
1863 &uvcg_default_color_matching_b_color_primaries.attr, 1770 &uvcg_default_color_matching_attr_b_color_primaries,
1864 &uvcg_default_color_matching_b_transfer_characteristics.attr, 1771 &uvcg_default_color_matching_attr_b_transfer_characteristics,
1865 &uvcg_default_color_matching_b_matrix_coefficients.attr, 1772 &uvcg_default_color_matching_attr_b_matrix_coefficients,
1866 NULL, 1773 NULL,
1867}; 1774};
1868 1775
1869static struct config_item_type uvcg_default_color_matching_type = { 1776static struct config_item_type uvcg_default_color_matching_type = {
1870 .ct_item_ops = &uvcg_default_color_matching_item_ops,
1871 .ct_attrs = uvcg_default_color_matching_attrs, 1777 .ct_attrs = uvcg_default_color_matching_attrs,
1872 .ct_owner = THIS_MODULE, 1778 .ct_owner = THIS_MODULE,
1873}; 1779};
@@ -2285,9 +2191,6 @@ static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
2285 func_inst.group); 2191 func_inst.group);
2286} 2192}
2287 2193
2288CONFIGFS_ATTR_STRUCT(f_uvc_opts);
2289CONFIGFS_ATTR_OPS(f_uvc_opts);
2290
2291static void uvc_attr_release(struct config_item *item) 2194static void uvc_attr_release(struct config_item *item)
2292{ 2195{
2293 struct f_uvc_opts *opts = to_f_uvc_opts(item); 2196 struct f_uvc_opts *opts = to_f_uvc_opts(item);
@@ -2297,14 +2200,13 @@ static void uvc_attr_release(struct config_item *item)
2297 2200
2298static struct configfs_item_operations uvc_item_ops = { 2201static struct configfs_item_operations uvc_item_ops = {
2299 .release = uvc_attr_release, 2202 .release = uvc_attr_release,
2300 .show_attribute = f_uvc_opts_attr_show,
2301 .store_attribute = f_uvc_opts_attr_store,
2302}; 2203};
2303 2204
2304#define UVCG_OPTS_ATTR(cname, conv, str2u, uxx, vnoc, limit) \ 2205#define UVCG_OPTS_ATTR(cname, conv, str2u, uxx, vnoc, limit) \
2305static ssize_t f_uvc_opts_##cname##_show( \ 2206static ssize_t f_uvc_opts_##cname##_show( \
2306 struct f_uvc_opts *opts, char *page) \ 2207 struct config_item *item, char *page) \
2307{ \ 2208{ \
2209 struct f_uvc_opts *opts = to_f_uvc_opts(item); \
2308 int result; \ 2210 int result; \
2309 \ 2211 \
2310 mutex_lock(&opts->lock); \ 2212 mutex_lock(&opts->lock); \
@@ -2315,9 +2217,10 @@ static ssize_t f_uvc_opts_##cname##_show( \
2315} \ 2217} \
2316 \ 2218 \
2317static ssize_t \ 2219static ssize_t \
2318f_uvc_opts_##cname##_store(struct f_uvc_opts *opts, \ 2220f_uvc_opts_##cname##_store(struct config_item *item, \
2319 const char *page, size_t len) \ 2221 const char *page, size_t len) \
2320{ \ 2222{ \
2223 struct f_uvc_opts *opts = to_f_uvc_opts(item); \
2321 int ret; \ 2224 int ret; \
2322 uxx num; \ 2225 uxx num; \
2323 \ 2226 \
@@ -2342,11 +2245,7 @@ end: \
2342 return ret; \ 2245 return ret; \
2343} \ 2246} \
2344 \ 2247 \
2345static struct f_uvc_opts_attribute \ 2248UVC_ATTR(f_uvc_opts_, cname, aname)
2346 f_uvc_opts_attribute_##cname = \
2347 __CONFIGFS_ATTR(cname, S_IRUGO | S_IWUSR, \
2348 f_uvc_opts_##cname##_show, \
2349 f_uvc_opts_##cname##_store)
2350 2249
2351#define identity_conv(x) (x) 2250#define identity_conv(x) (x)
2352 2251
@@ -2362,9 +2261,9 @@ UVCG_OPTS_ATTR(streaming_maxburst, identity_conv, kstrtou8, u8, identity_conv,
2362#undef UVCG_OPTS_ATTR 2261#undef UVCG_OPTS_ATTR
2363 2262
2364static struct configfs_attribute *uvc_attrs[] = { 2263static struct configfs_attribute *uvc_attrs[] = {
2365 &f_uvc_opts_attribute_streaming_interval.attr, 2264 &f_uvc_opts_attr_streaming_interval,
2366 &f_uvc_opts_attribute_streaming_maxpacket.attr, 2265 &f_uvc_opts_attr_streaming_maxpacket,
2367 &f_uvc_opts_attribute_streaming_maxburst.attr, 2266 &f_uvc_opts_attr_streaming_maxburst,
2368 NULL, 2267 NULL,
2369}; 2268};
2370 2269