diff options
Diffstat (limited to 'drivers/usb/gadget/function/uvc_configfs.c')
-rw-r--r-- | drivers/usb/gadget/function/uvc_configfs.c | 387 |
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) \ |
21 | static ssize_t _item##_attr_show(struct config_item *item, \ | 21 | static 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) \ | 30 | static 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 | ||
35 | static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item); | 37 | static 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 | ||
51 | CONFIGFS_ATTR_STRUCT(uvcg_control_header); | ||
52 | CONFIGFS_ATTR_OPS(uvcg_control_header); | ||
53 | |||
54 | static 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) \ |
60 | static ssize_t uvcg_control_header_##cname##_show( \ | 54 | static 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 | \ |
81 | static ssize_t \ | 76 | static ssize_t \ |
82 | uvcg_control_header_##cname##_store(struct uvcg_control_header *ch, \ | 77 | uvcg_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 | \ |
118 | static struct uvcg_control_header_attribute \ | 114 | UVC_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 | ||
124 | UVCG_CTRL_HDR_ATTR(bcd_uvc, bcdUVC, le16_to_cpu, kstrtou16, u16, cpu_to_le16, | 116 | UVCG_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 | ||
132 | static struct configfs_attribute *uvcg_control_header_attrs[] = { | 124 | static 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 | ||
138 | static struct config_item_type uvcg_control_header_type = { | 130 | static 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 | ||
199 | CONFIGFS_ATTR_STRUCT(uvcg_default_processing); | ||
200 | CONFIGFS_ATTR_OPS_RO(uvcg_default_processing); | ||
201 | |||
202 | static 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) \ |
207 | static ssize_t uvcg_default_processing_##cname##_show( \ | 191 | static 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 | \ |
230 | static struct uvcg_default_processing_attribute \ | 215 | UVC_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 | ||
245 | static ssize_t uvcg_default_processing_bm_controls_show( | 228 | static 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 | ||
273 | static struct uvcg_default_processing_attribute | 257 | UVC_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 | ||
278 | static struct configfs_attribute *uvcg_default_processing_attrs[] = { | 259 | static 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 | ||
287 | static struct config_item_type uvcg_default_processing_type = { | 268 | static 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 | ||
321 | CONFIGFS_ATTR_STRUCT(uvcg_default_camera); | ||
322 | CONFIGFS_ATTR_OPS_RO(uvcg_default_camera); | ||
323 | |||
324 | static 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) \ |
329 | static ssize_t uvcg_default_camera_##cname##_show( \ | 302 | static 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 | \ |
354 | static struct uvcg_default_camera_attribute \ | 328 | UVC_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 | ||
375 | static ssize_t uvcg_default_camera_bm_controls_show( | 347 | static 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 | ||
403 | static struct uvcg_default_camera_attribute | 376 | UVC_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 | ||
407 | static struct configfs_attribute *uvcg_default_camera_attrs[] = { | 378 | static 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 | ||
419 | static struct config_item_type uvcg_default_camera_type = { | 390 | static 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 | ||
453 | CONFIGFS_ATTR_STRUCT(uvcg_default_output); | ||
454 | CONFIGFS_ATTR_OPS_RO(uvcg_default_output); | ||
455 | |||
456 | static 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) \ |
461 | static ssize_t uvcg_default_output_##cname##_show( \ | 424 | static 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 | \ |
486 | static struct uvcg_default_output_attribute \ | 450 | UVC_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 | ||
502 | static struct configfs_attribute *uvcg_default_output_attrs[] = { | 464 | static 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 | ||
511 | static struct config_item_type uvcg_default_output_type = { | 473 | static 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 | ||
803 | CONFIGFS_ATTR_STRUCT(uvcg_streaming_header); | ||
804 | CONFIGFS_ATTR_OPS(uvcg_streaming_header); | ||
805 | |||
806 | static int uvcg_streaming_header_allow_link(struct config_item *src, | 764 | static 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 | ||
895 | static struct configfs_item_operations uvcg_streaming_header_item_ops = { | 853 | static 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) \ |
903 | static ssize_t uvcg_streaming_header_##cname##_show( \ | 859 | static 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 | \ |
924 | static struct uvcg_streaming_header_attribute \ | 881 | UVC_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 | ||
941 | static struct configfs_attribute *uvcg_streaming_header_attrs[] = { | 896 | static 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 | ||
1025 | CONFIGFS_ATTR_STRUCT(uvcg_frame); | ||
1026 | CONFIGFS_ATTR_OPS(uvcg_frame); | ||
1027 | |||
1028 | static 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) \ |
1034 | static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\ | 981 | static 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 | \ |
1054 | static ssize_t uvcg_frame_##cname##_store(struct uvcg_frame *f, \ | 1002 | static 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 | \ |
1088 | static struct uvcg_frame_attribute \ | 1037 | UVC_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 | ||
1111 | static ssize_t uvcg_frame_dw_frame_interval_show(struct uvcg_frame *frm, | 1056 | static 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 | ||
1188 | static ssize_t uvcg_frame_dw_frame_interval_store(struct uvcg_frame *ch, | 1134 | static 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 | ||
1237 | static struct uvcg_frame_attribute | 1184 | UVC_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 | ||
1243 | static struct configfs_attribute *uvcg_frame_attrs[] = { | 1186 | static 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 | ||
1255 | static struct config_item_type uvcg_frame_type = { | 1198 | static 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 | ||
1336 | CONFIGFS_ATTR_STRUCT(uvcg_uncompressed); | ||
1337 | CONFIGFS_ATTR_OPS(uvcg_uncompressed); | ||
1338 | |||
1339 | static struct configfs_item_operations uvcg_uncompressed_item_ops = { | ||
1340 | .show_attribute = uvcg_uncompressed_attr_show, | ||
1341 | .store_attribute = uvcg_uncompressed_attr_store, | ||
1342 | }; | ||
1343 | |||
1344 | static struct configfs_group_operations uvcg_uncompressed_group_ops = { | 1278 | static 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 | ||
1349 | static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch, | 1283 | static 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 | ||
1370 | static ssize_t uvcg_uncompressed_guid_format_store(struct uvcg_uncompressed *ch, | 1305 | static 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 | ||
1399 | static struct uvcg_uncompressed_attribute uvcg_uncompressed_guid_format = | 1335 | UVC_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) \ |
1406 | static ssize_t uvcg_uncompressed_##cname##_show( \ | 1338 | static 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 | \ |
1427 | static struct uvcg_uncompressed_attribute \ | 1360 | UVC_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) \ |
1432 | static ssize_t uvcg_uncompressed_##cname##_show( \ | 1363 | static 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 | \ |
1453 | static ssize_t \ | 1385 | static ssize_t \ |
1454 | uvcg_uncompressed_##cname##_store(struct uvcg_uncompressed *u, \ | 1386 | uvcg_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 | \ |
1490 | static struct uvcg_uncompressed_attribute \ | 1423 | UVC_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 | ||
1510 | static inline ssize_t | 1439 | static inline ssize_t |
1511 | uvcg_uncompressed_bma_controls_show(struct uvcg_uncompressed *unc, char *page) | 1440 | uvcg_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 | ||
1516 | static inline ssize_t | 1446 | static inline ssize_t |
1517 | uvcg_uncompressed_bma_controls_store(struct uvcg_uncompressed *ch, | 1447 | uvcg_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 | ||
1523 | static struct uvcg_uncompressed_attribute uvcg_uncompressed_bma_controls = | 1454 | UVC_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 | ||
1528 | static struct configfs_attribute *uvcg_uncompressed_attrs[] = { | 1456 | static 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 | ||
1539 | static struct config_item_type uvcg_uncompressed_type = { | 1467 | static 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 | ||
1608 | CONFIGFS_ATTR_STRUCT(uvcg_mjpeg); | ||
1609 | CONFIGFS_ATTR_OPS(uvcg_mjpeg); | ||
1610 | |||
1611 | static struct configfs_item_operations uvcg_mjpeg_item_ops = { | ||
1612 | .show_attribute = uvcg_mjpeg_attr_show, | ||
1613 | .store_attribute = uvcg_mjpeg_attr_store, | ||
1614 | }; | ||
1615 | |||
1616 | static struct configfs_group_operations uvcg_mjpeg_group_ops = { | 1535 | static 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) \ |
1622 | static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\ | 1541 | static 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 | \ |
1642 | static struct uvcg_mjpeg_attribute \ | 1562 | UVC_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) \ |
1647 | static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\ | 1565 | static 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 | \ |
1667 | static ssize_t \ | 1586 | static ssize_t \ |
1668 | uvcg_mjpeg_##cname##_store(struct uvcg_mjpeg *u, \ | 1587 | uvcg_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 | \ |
1704 | static struct uvcg_mjpeg_attribute \ | 1624 | UVC_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 | ||
1724 | static inline ssize_t | 1640 | static inline ssize_t |
1725 | uvcg_mjpeg_bma_controls_show(struct uvcg_mjpeg *unc, char *page) | 1641 | uvcg_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 | ||
1730 | static inline ssize_t | 1647 | static inline ssize_t |
1731 | uvcg_mjpeg_bma_controls_store(struct uvcg_mjpeg *ch, | 1648 | uvcg_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 | ||
1737 | static struct uvcg_mjpeg_attribute uvcg_mjpeg_bma_controls = | 1655 | UVC_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 | ||
1742 | static struct configfs_attribute *uvcg_mjpeg_attrs[] = { | 1657 | static 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 | ||
1752 | static struct config_item_type uvcg_mjpeg_type = { | 1667 | static 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 | ||
1814 | CONFIGFS_ATTR_STRUCT(uvcg_default_color_matching); | ||
1815 | CONFIGFS_ATTR_OPS_RO(uvcg_default_color_matching); | ||
1816 | |||
1817 | static 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) \ |
1822 | static ssize_t uvcg_default_color_matching_##cname##_show( \ | 1729 | static 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 | \ |
1845 | static struct uvcg_default_color_matching_attribute \ | 1754 | UVC_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 | ||
1862 | static struct configfs_attribute *uvcg_default_color_matching_attrs[] = { | 1769 | static 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 | ||
1869 | static struct config_item_type uvcg_default_color_matching_type = { | 1776 | static 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 | ||
2288 | CONFIGFS_ATTR_STRUCT(f_uvc_opts); | ||
2289 | CONFIGFS_ATTR_OPS(f_uvc_opts); | ||
2290 | |||
2291 | static void uvc_attr_release(struct config_item *item) | 2194 | static 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 | ||
2298 | static struct configfs_item_operations uvc_item_ops = { | 2201 | static 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) \ |
2305 | static ssize_t f_uvc_opts_##cname##_show( \ | 2206 | static 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 | \ |
2317 | static ssize_t \ | 2219 | static ssize_t \ |
2318 | f_uvc_opts_##cname##_store(struct f_uvc_opts *opts, \ | 2220 | f_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 | \ |
2345 | static struct f_uvc_opts_attribute \ | 2248 | UVC_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 | ||
2364 | static struct configfs_attribute *uvc_attrs[] = { | 2263 | static 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 | ||