[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-id: <5609260A.7010806@samsung.com>
Date: Mon, 28 Sep 2015 13:35:38 +0200
From: Andrzej Pietrasiewicz <andrzej.p@...sung.com>
To: Christoph Hellwig <hch@....de>, Joel Becker <jlbec@...lplan.org>,
Andrew Morton <akpm@...ux-foundation.org>
Cc: Felipe Balbi <balbi@...com>, Tejun Heo <tj@...nel.org>,
Pratyush Anand <pratyush.anand@...il.com>,
target-devel@...r.kernel.org, cluster-devel@...hat.com,
ocfs2-devel@....oracle.com, linux-usb@...r.kernel.org,
netdev@...r.kernel.org
Subject: Re: [PATCH 03/23] usb-gadget/uvc: use per-attribute show and store
methods
Hi Christoph,
please see my comments inline.
With the issues addressed you can add
Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@...sung.com>
W dniu 25.09.2015 o 15:49, Christoph Hellwig pisze:
> 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@....de>
> ---
> drivers/usb/gadget/function/uvc_configfs.c | 391 +++++++++++------------------
> 1 file changed, 146 insertions(+), 245 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
> index 3c0467b..8ae8ff8 100644
> --- a/drivers/usb/gadget/function/uvc_configfs.c
> +++ b/drivers/usb/gadget/function/uvc_configfs.c
> @@ -15,23 +15,27 @@
> #include "u_uvc.h"
> #include "uvc_configfs.h"
>
> -#define UVCG_STREAMING_CONTROL_SIZE 1
Moving this define seems an unrelated change to me.
> +#define UVC_ATTR(prefix, cname, aname) \
> +static struct configfs_attribute prefix##attr_##cname = { \
> + .ca_name = __stringify(aname), \
> + .ca_mode = S_IRUGO, \
> + .ca_owner = THIS_MODULE, \
> + .show = prefix##cname##_show, \
> + .store = prefix##cname##_store, \
> +}
>
> -#define CONFIGFS_ATTR_OPS_RO(_item) \
> -static ssize_t _item##_attr_show(struct config_item *item, \
> - struct configfs_attribute *attr, \
> - char *page) \
> -{ \
> - struct _item *_item = to_##_item(item); \
> - struct _item##_attribute *_item##_attr = \
> - container_of(attr, struct _item##_attribute, attr); \
> - ssize_t ret = 0; \
> - \
> - if (_item##_attr->show) \
> - ret = _item##_attr->show(_item, page); \
> - return ret; \
> +#define UVC_ATTR_RO(prefix, cname, aname) \
> +static struct configfs_attribute prefix##attr_##cname = { \
> + .ca_name = __stringify(aname), \
> + .ca_mode = S_IRUGO, \
> + .ca_owner = THIS_MODULE, \
> + .show = prefix##cname##_show, \
> }
>
> +#define identity_conv(x) (x)
What is this needed for here?
This #define is not used near the place it is defined.
Throughout the file the identity_conv is being defined multiple times,
each time near the place it is used and then undefined.
Without this line the code still compiles.
> +
> +#define UVCG_STREAMING_CONTROL_SIZE 1
> +
> static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item);
>
> /* control/header/<NAME> */
> @@ -48,18 +52,11 @@ static struct uvcg_control_header *to_uvcg_control_header(struct config_item *it
> return container_of(item, struct uvcg_control_header, item);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_control_header);
> -CONFIGFS_ATTR_OPS(uvcg_control_header);
> -
> -static struct configfs_item_operations uvcg_control_header_item_ops = {
> - .show_attribute = uvcg_control_header_attr_show,
> - .store_attribute = uvcg_control_header_attr_store,
> -};
> -
> #define UVCG_CTRL_HDR_ATTR(cname, aname, conv, str2u, uxx, vnoc, limit) \
> static ssize_t uvcg_control_header_##cname##_show( \
> - struct uvcg_control_header *ch, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_control_header *ch = to_uvcg_control_header(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
> @@ -79,9 +76,10 @@ static ssize_t uvcg_control_header_##cname##_show( \
> } \
> \
> static ssize_t \
> -uvcg_control_header_##cname##_store(struct uvcg_control_header *ch, \
> +uvcg_control_header_##cname##_store(struct config_item *item, \
> const char *page, size_t len) \
> { \
> + struct uvcg_control_header *ch = to_uvcg_control_header(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
> @@ -115,11 +113,7 @@ end: \
> return ret; \
> } \
> \
> -static struct uvcg_control_header_attribute \
> - uvcg_control_header_##cname = \
> - __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
> - uvcg_control_header_##cname##_show, \
> - uvcg_control_header_##cname##_store)
> +UVC_ATTR(uvcg_control_header_, cname, aname)
>
> UVCG_CTRL_HDR_ATTR(bcd_uvc, bcdUVC, le16_to_cpu, kstrtou16, u16, cpu_to_le16,
> 0xffff);
> @@ -130,13 +124,12 @@ UVCG_CTRL_HDR_ATTR(dw_clock_frequency, dwClockFrequency, le32_to_cpu, kstrtou32,
> #undef UVCG_CTRL_HDR_ATTR
>
> static struct configfs_attribute *uvcg_control_header_attrs[] = {
> - &uvcg_control_header_bcd_uvc.attr,
> - &uvcg_control_header_dw_clock_frequency.attr,
> + &uvcg_control_header_attr_bcd_uvc,
> + &uvcg_control_header_attr_dw_clock_frequency,
> NULL,
> };
>
> static struct config_item_type uvcg_control_header_type = {
> - .ct_item_ops = &uvcg_control_header_item_ops,
> .ct_attrs = uvcg_control_header_attrs,
> .ct_owner = THIS_MODULE,
> };
> @@ -196,17 +189,11 @@ static inline struct uvcg_default_processing
> struct uvcg_default_processing, group);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_default_processing);
> -CONFIGFS_ATTR_OPS_RO(uvcg_default_processing);
> -
> -static struct configfs_item_operations uvcg_default_processing_item_ops = {
> - .show_attribute = uvcg_default_processing_attr_show,
> -};
> -
> #define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, conv) \
> static ssize_t uvcg_default_processing_##cname##_show( \
> - struct uvcg_default_processing *dp, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_default_processing *dp = to_uvcg_default_processing(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex; \
> @@ -227,9 +214,7 @@ static ssize_t uvcg_default_processing_##cname##_show( \
> return result; \
> } \
> \
> -static struct uvcg_default_processing_attribute \
> - uvcg_default_processing_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_default_processing_##cname##_show)
> +UVC_ATTR_RO(uvcg_default_processing_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -243,8 +228,9 @@ UVCG_DEFAULT_PROCESSING_ATTR(i_processing, iProcessing, identity_conv);
> #undef UVCG_DEFAULT_PROCESSING_ATTR
>
> static ssize_t uvcg_default_processing_bm_controls_show(
> - struct uvcg_default_processing *dp, char *page)
> + struct config_item *item, char *page)
> {
> + struct uvcg_default_processing *dp = to_uvcg_default_processing(item);
> struct f_uvc_opts *opts;
> struct config_item *opts_item;
> struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex;
> @@ -270,22 +256,18 @@ static ssize_t uvcg_default_processing_bm_controls_show(
> return result;
> }
>
> -static struct uvcg_default_processing_attribute
> - uvcg_default_processing_bm_controls =
> - __CONFIGFS_ATTR_RO(bmControls,
> - uvcg_default_processing_bm_controls_show);
> +UVC_ATTR_RO(uvcg_default_processing_, bm_controls, bmControls);
>
> static struct configfs_attribute *uvcg_default_processing_attrs[] = {
> - &uvcg_default_processing_b_unit_id.attr,
> - &uvcg_default_processing_b_source_id.attr,
> - &uvcg_default_processing_w_max_multiplier.attr,
> - &uvcg_default_processing_bm_controls.attr,
> - &uvcg_default_processing_i_processing.attr,
> + &uvcg_default_processing_attr_b_unit_id,
> + &uvcg_default_processing_attr_b_source_id,
> + &uvcg_default_processing_attr_w_max_multiplier,
> + &uvcg_default_processing_attr_bm_controls,
> + &uvcg_default_processing_attr_i_processing,
> NULL,
> };
>
> static struct config_item_type uvcg_default_processing_type = {
> - .ct_item_ops = &uvcg_default_processing_item_ops,
> .ct_attrs = uvcg_default_processing_attrs,
> .ct_owner = THIS_MODULE,
> };
> @@ -318,17 +300,11 @@ static inline struct uvcg_default_camera
> struct uvcg_default_camera, group);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_default_camera);
> -CONFIGFS_ATTR_OPS_RO(uvcg_default_camera);
> -
> -static struct configfs_item_operations uvcg_default_camera_item_ops = {
> - .show_attribute = uvcg_default_camera_attr_show,
> -};
> -
> #define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, conv) \
> static ssize_t uvcg_default_camera_##cname##_show( \
> - struct uvcg_default_camera *dc, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_default_camera *dc = to_uvcg_default_camera(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; \
> @@ -351,9 +327,7 @@ static ssize_t uvcg_default_camera_##cname##_show( \
> return result; \
> } \
> \
> -static struct uvcg_default_camera_attribute \
> - uvcg_default_camera_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_default_camera_##cname##_show)
> +UVC_ATTR_RO(uvcg_default_camera_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -373,8 +347,9 @@ UVCG_DEFAULT_CAMERA_ATTR(w_ocular_focal_length, wOcularFocalLength,
> #undef UVCG_DEFAULT_CAMERA_ATTR
>
> static ssize_t uvcg_default_camera_bm_controls_show(
> - struct uvcg_default_camera *dc, char *page)
> + struct config_item *item, char *page)
> {
> + struct uvcg_default_camera *dc = to_uvcg_default_camera(item);
> struct f_uvc_opts *opts;
> struct config_item *opts_item;
> struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;
> @@ -400,24 +375,21 @@ static ssize_t uvcg_default_camera_bm_controls_show(
> return result;
> }
>
> -static struct uvcg_default_camera_attribute
> - uvcg_default_camera_bm_controls =
> - __CONFIGFS_ATTR_RO(bmControls, uvcg_default_camera_bm_controls_show);
> +UVC_ATTR_RO(uvcg_default_camera_, bm_controls, bmControls);
>
> static struct configfs_attribute *uvcg_default_camera_attrs[] = {
> - &uvcg_default_camera_b_terminal_id.attr,
> - &uvcg_default_camera_w_terminal_type.attr,
> - &uvcg_default_camera_b_assoc_terminal.attr,
> - &uvcg_default_camera_i_terminal.attr,
> - &uvcg_default_camera_w_objective_focal_length_min.attr,
> - &uvcg_default_camera_w_objective_focal_length_max.attr,
> - &uvcg_default_camera_w_ocular_focal_length.attr,
> - &uvcg_default_camera_bm_controls.attr,
> + &uvcg_default_camera_attr_b_terminal_id,
> + &uvcg_default_camera_attr_w_terminal_type,
> + &uvcg_default_camera_attr_b_assoc_terminal,
> + &uvcg_default_camera_attr_i_terminal,
> + &uvcg_default_camera_attr_w_objective_focal_length_min,
> + &uvcg_default_camera_attr_w_objective_focal_length_max,
> + &uvcg_default_camera_attr_w_ocular_focal_length,
> + &uvcg_default_camera_attr_bm_controls,
> NULL,
> };
>
> static struct config_item_type uvcg_default_camera_type = {
> - .ct_item_ops = &uvcg_default_camera_item_ops,
> .ct_attrs = uvcg_default_camera_attrs,
> .ct_owner = THIS_MODULE,
> };
> @@ -450,17 +422,11 @@ static inline struct uvcg_default_output
> struct uvcg_default_output, group);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_default_output);
> -CONFIGFS_ATTR_OPS_RO(uvcg_default_output);
> -
> -static struct configfs_item_operations uvcg_default_output_item_ops = {
> - .show_attribute = uvcg_default_output_attr_show,
> -};
> -
> #define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, conv) \
> static ssize_t uvcg_default_output_##cname##_show( \
> - struct uvcg_default_output *dout, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_default_output *dout = to_uvcg_default_output(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &dout->group.cg_subsys->su_mutex; \
> @@ -483,9 +449,7 @@ static ssize_t uvcg_default_output_##cname##_show( \
> return result; \
> } \
> \
> -static struct uvcg_default_output_attribute \
> - uvcg_default_output_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_default_output_##cname##_show)
> +UVC_ATTR_RO(uvcg_default_output_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -500,16 +464,15 @@ UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, identity_conv);
> #undef UVCG_DEFAULT_OUTPUT_ATTR
>
> static struct configfs_attribute *uvcg_default_output_attrs[] = {
> - &uvcg_default_output_b_terminal_id.attr,
> - &uvcg_default_output_w_terminal_type.attr,
> - &uvcg_default_output_b_assoc_terminal.attr,
> - &uvcg_default_output_b_source_id.attr,
> - &uvcg_default_output_i_terminal.attr,
> + &uvcg_default_output_attr_b_terminal_id,
> + &uvcg_default_output_attr_w_terminal_type,
> + &uvcg_default_output_attr_b_assoc_terminal,
> + &uvcg_default_output_attr_b_source_id,
> + &uvcg_default_output_attr_i_terminal,
> NULL,
> };
>
> static struct config_item_type uvcg_default_output_type = {
> - .ct_item_ops = &uvcg_default_output_item_ops,
> .ct_attrs = uvcg_default_output_attrs,
> .ct_owner = THIS_MODULE,
> };
> @@ -800,9 +763,6 @@ static struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item
> return container_of(item, struct uvcg_streaming_header, item);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_streaming_header);
> -CONFIGFS_ATTR_OPS(uvcg_streaming_header);
> -
> static int uvcg_streaming_header_allow_link(struct config_item *src,
> struct config_item *target)
> {
> @@ -893,16 +853,15 @@ out:
> }
>
> static struct configfs_item_operations uvcg_streaming_header_item_ops = {
> - .show_attribute = uvcg_streaming_header_attr_show,
> - .store_attribute = uvcg_streaming_header_attr_store,
> .allow_link = uvcg_streaming_header_allow_link,
> .drop_link = uvcg_streaming_header_drop_link,
> };
>
> #define UVCG_STREAMING_HEADER_ATTR(cname, aname, conv) \
> static ssize_t uvcg_streaming_header_##cname##_show( \
> - struct uvcg_streaming_header *sh, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_streaming_header *sh = to_uvcg_streaming_header(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
> @@ -921,9 +880,7 @@ static ssize_t uvcg_streaming_header_##cname##_show( \
> return result; \
> } \
> \
> -static struct uvcg_streaming_header_attribute \
> - uvcg_streaming_header_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_streaming_header_##cname##_show)
> +UVC_ATTR_RO(uvcg_streaming_header_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -939,11 +896,11 @@ UVCG_STREAMING_HEADER_ATTR(b_trigger_usage, bTriggerUsage, identity_conv);
> #undef UVCG_STREAMING_HEADER_ATTR
>
> static struct configfs_attribute *uvcg_streaming_header_attrs[] = {
> - &uvcg_streaming_header_bm_info.attr,
> - &uvcg_streaming_header_b_terminal_link.attr,
> - &uvcg_streaming_header_b_still_capture_method.attr,
> - &uvcg_streaming_header_b_trigger_support.attr,
> - &uvcg_streaming_header_b_trigger_usage.attr,
> + &uvcg_streaming_header_attr_bm_info,
> + &uvcg_streaming_header_attr_b_terminal_link,
> + &uvcg_streaming_header_attr_b_still_capture_method,
> + &uvcg_streaming_header_attr_b_trigger_support,
> + &uvcg_streaming_header_attr_b_trigger_usage,
> NULL,
> };
>
> @@ -1022,17 +979,10 @@ static struct uvcg_frame *to_uvcg_frame(struct config_item *item)
> return container_of(item, struct uvcg_frame, item);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_frame);
> -CONFIGFS_ATTR_OPS(uvcg_frame);
> -
> -static struct configfs_item_operations uvcg_frame_item_ops = {
> - .show_attribute = uvcg_frame_attr_show,
> - .store_attribute = uvcg_frame_attr_store,
> -};
> -
> #define UVCG_FRAME_ATTR(cname, aname, to_cpu_endian, to_little_endian, bits) \
> -static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\
> +static ssize_t uvcg_frame_##cname##_show(struct config_item *item, char *page)\
> { \
> + struct uvcg_frame *f = to_uvcg_frame(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
> @@ -1051,9 +1001,10 @@ static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\
> return result; \
> } \
> \
> -static ssize_t uvcg_frame_##cname##_store(struct uvcg_frame *f, \
> +static ssize_t uvcg_frame_##cname##_store(struct config_item *item, \
> const char *page, size_t len)\
> { \
> + struct uvcg_frame *f = to_uvcg_frame(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct uvcg_format *fmt; \
> @@ -1085,11 +1036,7 @@ end: \
> return ret; \
> } \
> \
> -static struct uvcg_frame_attribute \
> - uvcg_frame_##cname = \
> - __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
> - uvcg_frame_##cname##_show, \
> - uvcg_frame_##cname##_store)
> +UVC_ATTR(uvcg_frame_, cname, aname);
>
> #define noop_conversion(x) (x)
>
> @@ -1108,9 +1055,10 @@ UVCG_FRAME_ATTR(dw_default_frame_interval, dwDefaultFrameInterval,
>
> #undef UVCG_FRAME_ATTR
>
> -static ssize_t uvcg_frame_dw_frame_interval_show(struct uvcg_frame *frm,
> +static ssize_t uvcg_frame_dw_frame_interval_show(struct config_item *item,
> char *page)
> {
> + struct uvcg_frame *frm = to_uvcg_frame(item);
> struct f_uvc_opts *opts;
> struct config_item *opts_item;
> struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex;
> @@ -1185,9 +1133,10 @@ static int __uvcg_iter_frm_intrv(const char *page, size_t len,
> return 0;
> }
>
> -static ssize_t uvcg_frame_dw_frame_interval_store(struct uvcg_frame *ch,
> +static ssize_t uvcg_frame_dw_frame_interval_store(struct config_item *item,
> const char *page, size_t len)
> {
> + struct uvcg_frame *ch = to_uvcg_frame(item);
> struct f_uvc_opts *opts;
> struct config_item *opts_item;
> struct uvcg_format *fmt;
> @@ -1234,26 +1183,21 @@ end:
> return ret;
> }
>
> -static struct uvcg_frame_attribute
> - uvcg_frame_dw_frame_interval =
> - __CONFIGFS_ATTR(dwFrameInterval, S_IRUGO | S_IWUSR,
> - uvcg_frame_dw_frame_interval_show,
> - uvcg_frame_dw_frame_interval_store);
> +UVC_ATTR(uvcg_frame_, dw_frame_interval, dwFrameInterval);
>
> static struct configfs_attribute *uvcg_frame_attrs[] = {
> - &uvcg_frame_bm_capabilities.attr,
> - &uvcg_frame_w_width.attr,
> - &uvcg_frame_w_height.attr,
> - &uvcg_frame_dw_min_bit_rate.attr,
> - &uvcg_frame_dw_max_bit_rate.attr,
> - &uvcg_frame_dw_max_video_frame_buffer_size.attr,
> - &uvcg_frame_dw_default_frame_interval.attr,
> - &uvcg_frame_dw_frame_interval.attr,
> + &uvcg_frame_attr_bm_capabilities,
> + &uvcg_frame_attr_w_width,
> + &uvcg_frame_attr_w_height,
> + &uvcg_frame_attr_dw_min_bit_rate,
> + &uvcg_frame_attr_dw_max_bit_rate,
> + &uvcg_frame_attr_dw_max_video_frame_buffer_size,
> + &uvcg_frame_attr_dw_default_frame_interval,
> + &uvcg_frame_attr_dw_frame_interval,
> NULL,
> };
>
> static struct config_item_type uvcg_frame_type = {
> - .ct_item_ops = &uvcg_frame_item_ops,
> .ct_attrs = uvcg_frame_attrs,
> .ct_owner = THIS_MODULE,
> };
> @@ -1333,22 +1277,15 @@ static struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
> struct uvcg_uncompressed, fmt);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_uncompressed);
> -CONFIGFS_ATTR_OPS(uvcg_uncompressed);
> -
> -static struct configfs_item_operations uvcg_uncompressed_item_ops = {
> - .show_attribute = uvcg_uncompressed_attr_show,
> - .store_attribute = uvcg_uncompressed_attr_store,
> -};
> -
> static struct configfs_group_operations uvcg_uncompressed_group_ops = {
> .make_item = uvcg_frame_make,
> .drop_item = uvcg_frame_drop,
> };
>
> -static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch,
> +static ssize_t uvcg_uncompressed_guid_format_show(struct config_item *item,
> char *page)
> {
> + struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
> struct f_uvc_opts *opts;
> struct config_item *opts_item;
> struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
> @@ -1367,9 +1304,10 @@ static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch,
> return sizeof(ch->desc.guidFormat);
> }
>
> -static ssize_t uvcg_uncompressed_guid_format_store(struct uvcg_uncompressed *ch,
> +static ssize_t uvcg_uncompressed_guid_format_store(struct config_item *item,
> const char *page, size_t len)
> {
> + struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
> struct f_uvc_opts *opts;
> struct config_item *opts_item;
> struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
> @@ -1396,16 +1334,13 @@ end:
> return ret;
> }
>
> -static struct uvcg_uncompressed_attribute uvcg_uncompressed_guid_format =
> - __CONFIGFS_ATTR(guidFormat, S_IRUGO | S_IWUSR,
> - uvcg_uncompressed_guid_format_show,
> - uvcg_uncompressed_guid_format_store);
> -
> +UVC_ATTR(uvcg_uncompressed_, guid_format, guidFormat);
>
> #define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, conv) \
> static ssize_t uvcg_uncompressed_##cname##_show( \
> - struct uvcg_uncompressed *u, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_uncompressed *u = to_uvcg_uncompressed(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
> @@ -1424,14 +1359,13 @@ static ssize_t uvcg_uncompressed_##cname##_show( \
> return result; \
> } \
> \
> -static struct uvcg_uncompressed_attribute \
> - uvcg_uncompressed_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_uncompressed_##cname##_show)
> +UVC_ATTR_RO(uvcg_uncompressed_, cname, aname);
>
> #define UVCG_UNCOMPRESSED_ATTR(cname, aname, conv) \
> static ssize_t uvcg_uncompressed_##cname##_show( \
> - struct uvcg_uncompressed *u, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_uncompressed *u = to_uvcg_uncompressed(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
> @@ -1451,9 +1385,10 @@ static ssize_t uvcg_uncompressed_##cname##_show( \
> } \
> \
> static ssize_t \
> -uvcg_uncompressed_##cname##_store(struct uvcg_uncompressed *u, \
> +uvcg_uncompressed_##cname##_store(struct config_item *item, \
> const char *page, size_t len) \
> { \
> + struct uvcg_uncompressed *u = to_uvcg_uncompressed(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
> @@ -1487,11 +1422,7 @@ end: \
> return ret; \
> } \
> \
> -static struct uvcg_uncompressed_attribute \
> - uvcg_uncompressed_##cname = \
> - __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
> - uvcg_uncompressed_##cname##_show, \
> - uvcg_uncompressed_##cname##_store)
> +UVC_ATTR(uvcg_uncompressed_, cname, aname);
>
> #define identity_conv(x) (x)
>
> @@ -1508,36 +1439,34 @@ UVCG_UNCOMPRESSED_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
> #undef UVCG_UNCOMPRESSED_ATTR_RO
>
> static inline ssize_t
> -uvcg_uncompressed_bma_controls_show(struct uvcg_uncompressed *unc, char *page)
> +uvcg_uncompressed_bma_controls_show(struct config_item *item, char *page)
> {
> + struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
> return uvcg_format_bma_controls_show(&unc->fmt, page);
> }
>
> static inline ssize_t
> -uvcg_uncompressed_bma_controls_store(struct uvcg_uncompressed *ch,
> +uvcg_uncompressed_bma_controls_store(struct config_item *item,
> const char *page, size_t len)
> {
> - return uvcg_format_bma_controls_store(&ch->fmt, page, len);
> + struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
> + return uvcg_format_bma_controls_store(&unc->fmt, page, len);
> }
>
> -static struct uvcg_uncompressed_attribute uvcg_uncompressed_bma_controls =
> - __CONFIGFS_ATTR(bmaControls, S_IRUGO | S_IWUSR,
> - uvcg_uncompressed_bma_controls_show,
> - uvcg_uncompressed_bma_controls_store);
> +UVC_ATTR(uvcg_uncompressed_, bma_controls, bmaControls);
>
> static struct configfs_attribute *uvcg_uncompressed_attrs[] = {
> - &uvcg_uncompressed_guid_format.attr,
> - &uvcg_uncompressed_b_bits_per_pixel.attr,
> - &uvcg_uncompressed_b_default_frame_index.attr,
> - &uvcg_uncompressed_b_aspect_ratio_x.attr,
> - &uvcg_uncompressed_b_aspect_ratio_y.attr,
> - &uvcg_uncompressed_bm_interface_flags.attr,
> - &uvcg_uncompressed_bma_controls.attr,
> + &uvcg_uncompressed_attr_guid_format,
> + &uvcg_uncompressed_attr_b_bits_per_pixel,
> + &uvcg_uncompressed_attr_b_default_frame_index,
> + &uvcg_uncompressed_attr_b_aspect_ratio_x,
> + &uvcg_uncompressed_attr_b_aspect_ratio_y,
> + &uvcg_uncompressed_attr_bm_interface_flags,
> + &uvcg_uncompressed_attr_bma_controls,
> NULL,
> };
>
> static struct config_item_type uvcg_uncompressed_type = {
> - .ct_item_ops = &uvcg_uncompressed_item_ops,
> .ct_group_ops = &uvcg_uncompressed_group_ops,
> .ct_attrs = uvcg_uncompressed_attrs,
> .ct_owner = THIS_MODULE,
> @@ -1605,22 +1534,15 @@ static struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
> struct uvcg_mjpeg, fmt);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_mjpeg);
> -CONFIGFS_ATTR_OPS(uvcg_mjpeg);
> -
> -static struct configfs_item_operations uvcg_mjpeg_item_ops = {
> - .show_attribute = uvcg_mjpeg_attr_show,
> - .store_attribute = uvcg_mjpeg_attr_store,
> -};
> -
> static struct configfs_group_operations uvcg_mjpeg_group_ops = {
> .make_item = uvcg_frame_make,
> .drop_item = uvcg_frame_drop,
> };
>
> #define UVCG_MJPEG_ATTR_RO(cname, aname, conv) \
> -static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
> +static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
> { \
> + struct uvcg_mjpeg *u = to_uvcg_mjpeg(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
> @@ -1639,13 +1561,12 @@ static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
> return result; \
> } \
> \
> -static struct uvcg_mjpeg_attribute \
> - uvcg_mjpeg_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_mjpeg_##cname##_show)
> +UVC_ATTR_RO(uvcg_mjpeg_, cname, aname)
>
> #define UVCG_MJPEG_ATTR(cname, aname, conv) \
> -static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
> +static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
> { \
> + struct uvcg_mjpeg *u = to_uvcg_mjpeg(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
> @@ -1665,9 +1586,10 @@ static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
> } \
> \
> static ssize_t \
> -uvcg_mjpeg_##cname##_store(struct uvcg_mjpeg *u, \
> +uvcg_mjpeg_##cname##_store(struct config_item *item, \
> const char *page, size_t len) \
> { \
> + struct uvcg_mjpeg *u = to_uvcg_mjpeg(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex; \
> @@ -1701,11 +1623,7 @@ end: \
> return ret; \
> } \
> \
> -static struct uvcg_mjpeg_attribute \
> - uvcg_mjpeg_##cname = \
> - __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR, \
> - uvcg_mjpeg_##cname##_show, \
> - uvcg_mjpeg_##cname##_store)
> +UVC_ATTR(uvcg_mjpeg_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -1722,35 +1640,33 @@ UVCG_MJPEG_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
> #undef UVCG_MJPEG_ATTR_RO
>
> static inline ssize_t
> -uvcg_mjpeg_bma_controls_show(struct uvcg_mjpeg *unc, char *page)
> +uvcg_mjpeg_bma_controls_show(struct config_item *item, char *page)
> {
> - return uvcg_format_bma_controls_show(&unc->fmt, page);
> + struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
> + return uvcg_format_bma_controls_show(&u->fmt, page);
> }
>
> static inline ssize_t
> -uvcg_mjpeg_bma_controls_store(struct uvcg_mjpeg *ch,
> +uvcg_mjpeg_bma_controls_store(struct config_item *item,
> const char *page, size_t len)
> {
> - return uvcg_format_bma_controls_store(&ch->fmt, page, len);
> + struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
> + return uvcg_format_bma_controls_store(&u->fmt, page, len);
> }
>
> -static struct uvcg_mjpeg_attribute uvcg_mjpeg_bma_controls =
> - __CONFIGFS_ATTR(bmaControls, S_IRUGO | S_IWUSR,
> - uvcg_mjpeg_bma_controls_show,
> - uvcg_mjpeg_bma_controls_store);
> +UVC_ATTR(uvcg_mjpeg_, bma_controls, bmaControls);
>
> static struct configfs_attribute *uvcg_mjpeg_attrs[] = {
> - &uvcg_mjpeg_b_default_frame_index.attr,
> - &uvcg_mjpeg_bm_flags.attr,
> - &uvcg_mjpeg_b_aspect_ratio_x.attr,
> - &uvcg_mjpeg_b_aspect_ratio_y.attr,
> - &uvcg_mjpeg_bm_interface_flags.attr,
> - &uvcg_mjpeg_bma_controls.attr,
> + &uvcg_mjpeg_attr_b_default_frame_index,
> + &uvcg_mjpeg_attr_bm_flags,
> + &uvcg_mjpeg_attr_b_aspect_ratio_x,
> + &uvcg_mjpeg_attr_b_aspect_ratio_y,
> + &uvcg_mjpeg_attr_bm_interface_flags,
> + &uvcg_mjpeg_attr_bma_controls,
> NULL,
> };
>
> static struct config_item_type uvcg_mjpeg_type = {
> - .ct_item_ops = &uvcg_mjpeg_item_ops,
> .ct_group_ops = &uvcg_mjpeg_group_ops,
> .ct_attrs = uvcg_mjpeg_attrs,
> .ct_owner = THIS_MODULE,
> @@ -1811,17 +1727,12 @@ static inline struct uvcg_default_color_matching
> struct uvcg_default_color_matching, group);
> }
>
> -CONFIGFS_ATTR_STRUCT(uvcg_default_color_matching);
> -CONFIGFS_ATTR_OPS_RO(uvcg_default_color_matching);
> -
> -static struct configfs_item_operations uvcg_default_color_matching_item_ops = {
> - .show_attribute = uvcg_default_color_matching_attr_show,
> -};
> -
> #define UVCG_DEFAULT_COLOR_MATCHING_ATTR(cname, aname, conv) \
> static ssize_t uvcg_default_color_matching_##cname##_show( \
> - struct uvcg_default_color_matching *dc, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct uvcg_default_color_matching *dc = \
> + to_uvcg_default_color_matching(item); \
> struct f_uvc_opts *opts; \
> struct config_item *opts_item; \
> struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex; \
> @@ -1842,9 +1753,7 @@ static ssize_t uvcg_default_color_matching_##cname##_show( \
> return result; \
> } \
> \
> -static struct uvcg_default_color_matching_attribute \
> - uvcg_default_color_matching_##cname = \
> - __CONFIGFS_ATTR_RO(aname, uvcg_default_color_matching_##cname##_show)
> +UVC_ATTR_RO(uvcg_default_color_matching_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -1860,14 +1769,13 @@ UVCG_DEFAULT_COLOR_MATCHING_ATTR(b_matrix_coefficients, bMatrixCoefficients,
> #undef UVCG_DEFAULT_COLOR_MATCHING_ATTR
>
> static struct configfs_attribute *uvcg_default_color_matching_attrs[] = {
> - &uvcg_default_color_matching_b_color_primaries.attr,
> - &uvcg_default_color_matching_b_transfer_characteristics.attr,
> - &uvcg_default_color_matching_b_matrix_coefficients.attr,
> + &uvcg_default_color_matching_attr_b_color_primaries,
> + &uvcg_default_color_matching_attr_b_transfer_characteristics,
> + &uvcg_default_color_matching_attr_b_matrix_coefficients,
> NULL,
> };
>
> static struct config_item_type uvcg_default_color_matching_type = {
> - .ct_item_ops = &uvcg_default_color_matching_item_ops,
> .ct_attrs = uvcg_default_color_matching_attrs,
> .ct_owner = THIS_MODULE,
> };
> @@ -2285,9 +2193,6 @@ static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
> func_inst.group);
> }
>
> -CONFIGFS_ATTR_STRUCT(f_uvc_opts);
> -CONFIGFS_ATTR_OPS(f_uvc_opts);
> -
> static void uvc_attr_release(struct config_item *item)
> {
> struct f_uvc_opts *opts = to_f_uvc_opts(item);
> @@ -2297,14 +2202,13 @@ static void uvc_attr_release(struct config_item *item)
>
> static struct configfs_item_operations uvc_item_ops = {
> .release = uvc_attr_release,
> - .show_attribute = f_uvc_opts_attr_show,
> - .store_attribute = f_uvc_opts_attr_store,
> };
>
> #define UVCG_OPTS_ATTR(cname, conv, str2u, uxx, vnoc, limit) \
> static ssize_t f_uvc_opts_##cname##_show( \
> - struct f_uvc_opts *opts, char *page) \
> + struct config_item *item, char *page) \
> { \
> + struct f_uvc_opts *opts = to_f_uvc_opts(item); \
> int result; \
> \
> mutex_lock(&opts->lock); \
> @@ -2315,9 +2219,10 @@ static ssize_t f_uvc_opts_##cname##_show( \
> } \
> \
> static ssize_t \
> -f_uvc_opts_##cname##_store(struct f_uvc_opts *opts, \
> +f_uvc_opts_##cname##_store(struct config_item *item, \
> const char *page, size_t len) \
> { \
> + struct f_uvc_opts *opts = to_f_uvc_opts(item); \
> int ret; \
> uxx num; \
> \
> @@ -2342,11 +2247,7 @@ end: \
> return ret; \
> } \
> \
> -static struct f_uvc_opts_attribute \
> - f_uvc_opts_attribute_##cname = \
> - __CONFIGFS_ATTR(cname, S_IRUGO | S_IWUSR, \
> - f_uvc_opts_##cname##_show, \
> - f_uvc_opts_##cname##_store)
> +UVC_ATTR(f_uvc_opts_, cname, aname)
>
> #define identity_conv(x) (x)
>
> @@ -2362,9 +2263,9 @@ UVCG_OPTS_ATTR(streaming_maxburst, identity_conv, kstrtou8, u8, identity_conv,
> #undef UVCG_OPTS_ATTR
>
> static struct configfs_attribute *uvc_attrs[] = {
> - &f_uvc_opts_attribute_streaming_interval.attr,
> - &f_uvc_opts_attribute_streaming_maxpacket.attr,
> - &f_uvc_opts_attribute_streaming_maxburst.attr,
> + &f_uvc_opts_attr_streaming_interval,
> + &f_uvc_opts_attr_streaming_maxpacket,
> + &f_uvc_opts_attr_streaming_maxburst,
> NULL,
> };
>
>
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists