Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christoph Hellwig and committed by
Nicholas Bellinger
76e0da34 45b6a73f

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