aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2015-10-03 09:32:39 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-10-14 01:13:44 -0400
commit76e0da34c7cec5a7dc94667326a948de2e9c8c8d (patch)
treeb04b07864029a42e3e4844083de0c0e3ccbaa7d0
parent45b6a73f62ebcf3ff067895fb8030e67f4c7b67f (diff)
usb-gadget/uvc: use per-attribute show and store methods
UVC is a little different from other configfs consumers in that it wants different function and field names from the exposed attribute name, so it keeps it's local macros to define attributes instead of using the common ones. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com> Acked-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-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