[2/2] v4l2-ctrls: add __v4l2_ctrl_s_ctrl_compound()
Commit Message
Rather than creating new compound control helpers for each new
type, create one generic function and just create defines on
top.
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
---
drivers/media/v4l2-core/v4l2-ctrls.c | 10 +++---
include/media/v4l2-ctrls.h | 49 ++++++++++++++++------------
2 files changed, 34 insertions(+), 25 deletions(-)
Comments
HI Hans
I have just come back from holidays. If you give me a week I can test
it in real hardware.
Thanks!
On Tue, Mar 3, 2020 at 12:03 PM Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
>
> Rather than creating new compound control helpers for each new
> type, create one generic function and just create defines on
> top.
>
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> ---
> drivers/media/v4l2-core/v4l2-ctrls.c | 10 +++---
> include/media/v4l2-ctrls.h | 49 ++++++++++++++++------------
> 2 files changed, 34 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index d3bacf6b59d6..68684fcbdc61 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -4248,18 +4248,18 @@ int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
> }
> EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
>
> -int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
> - const struct v4l2_area *area)
> +int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
> + enum v4l2_ctrl_type type, const void *p)
> {
> lockdep_assert_held(ctrl->handler->lock);
>
> /* It's a driver bug if this happens. */
> - if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA))
> + if (WARN_ON(ctrl->type != type))
> return -EINVAL;
> - *ctrl->p_new.p_area = *area;
> + memcpy(ctrl->p_new.p, p, ctrl->elems * ctrl->elem_size);
> return set_ctrl(NULL, ctrl, 0);
> }
> -EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_area);
> +EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_compound);
>
> void v4l2_ctrl_request_complete(struct media_request *req,
> struct v4l2_ctrl_handler *main_hdl)
> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
> index 7db9e719a583..75a8daacb4c4 100644
> --- a/include/media/v4l2-ctrls.h
> +++ b/include/media/v4l2-ctrls.h
> @@ -1113,45 +1113,54 @@ static inline int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
> }
>
> /**
> - * __v4l2_ctrl_s_ctrl_area() - Unlocked variant of v4l2_ctrl_s_ctrl_area().
> + * __v4l2_ctrl_s_ctrl_compound() - Unlocked variant to set a compound control
> *
> - * @ctrl: The control.
> - * @area: The new area.
> + * @ctrl: The control.
> + * @type: The type of the data.
> + * @p: The new compound payload.
> *
> - * This sets the control's new area safely by going through the control
> - * framework. This function assumes the control's handler is already locked,
> - * allowing it to be used from within the &v4l2_ctrl_ops functions.
> + * This sets the control's new compound payload safely by going through the
> + * control framework. This function assumes the control's handler is already
> + * locked, allowing it to be used from within the &v4l2_ctrl_ops functions.
> *
> - * This function is for area type controls only.
> + * This function is for compound type controls only.
> */
> -int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
> - const struct v4l2_area *area);
> +int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
> + enum v4l2_ctrl_type type, const void *p);
>
> /**
> - * v4l2_ctrl_s_ctrl_area() - Helper function to set a control's area value
> - * from within a driver.
> + * v4l2_ctrl_s_ctrl_compound() - Helper function to set a compound control
> + * from within a driver.
> *
> - * @ctrl: The control.
> - * @area: The new area.
> + * @ctrl: The control.
> + * @type: The type of the data.
> + * @p: The new compound payload.
> *
> - * This sets the control's new area safely by going through the control
> - * framework. This function will lock the control's handler, so it cannot be
> - * used from within the &v4l2_ctrl_ops functions.
> + * This sets the control's new compound payload safely by going through the
> + * control framework. This function will lock the control's handler, so it
> + * cannot be used from within the &v4l2_ctrl_ops functions.
> *
> - * This function is for area type controls only.
> + * This function is for compound type controls only.
> */
> -static inline int v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
> - const struct v4l2_area *area)
> +static inline int v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
> + enum v4l2_ctrl_type type,
> + const void *p)
> {
> int rval;
>
> v4l2_ctrl_lock(ctrl);
> - rval = __v4l2_ctrl_s_ctrl_area(ctrl, area);
> + rval = __v4l2_ctrl_s_ctrl_compound(ctrl, type, p);
> v4l2_ctrl_unlock(ctrl);
>
> return rval;
> }
>
> +/* Helper defines for area type controls */
> +#define __v4l2_ctrl_s_ctrl_area(ctrl, area) \
> + __v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
> +#define v4l2_ctrl_s_ctrl_area(ctrl, area) \
> + v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
> +
> /* Internal helper functions that deal with control events. */
> extern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;
>
> --
> 2.25.1
>
Hi Hans,
On Tue 03 Mar 20, 12:02, Hans Verkuil wrote:
> Rather than creating new compound control helpers for each new
> type, create one generic function and just create defines on
> top.
Thanks for the patch, works fine here!
Tested-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Cheers,
Paul
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> ---
> drivers/media/v4l2-core/v4l2-ctrls.c | 10 +++---
> include/media/v4l2-ctrls.h | 49 ++++++++++++++++------------
> 2 files changed, 34 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index d3bacf6b59d6..68684fcbdc61 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -4248,18 +4248,18 @@ int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
> }
> EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
>
> -int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
> - const struct v4l2_area *area)
> +int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
> + enum v4l2_ctrl_type type, const void *p)
> {
> lockdep_assert_held(ctrl->handler->lock);
>
> /* It's a driver bug if this happens. */
> - if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA))
> + if (WARN_ON(ctrl->type != type))
> return -EINVAL;
> - *ctrl->p_new.p_area = *area;
> + memcpy(ctrl->p_new.p, p, ctrl->elems * ctrl->elem_size);
> return set_ctrl(NULL, ctrl, 0);
> }
> -EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_area);
> +EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_compound);
>
> void v4l2_ctrl_request_complete(struct media_request *req,
> struct v4l2_ctrl_handler *main_hdl)
> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
> index 7db9e719a583..75a8daacb4c4 100644
> --- a/include/media/v4l2-ctrls.h
> +++ b/include/media/v4l2-ctrls.h
> @@ -1113,45 +1113,54 @@ static inline int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
> }
>
> /**
> - * __v4l2_ctrl_s_ctrl_area() - Unlocked variant of v4l2_ctrl_s_ctrl_area().
> + * __v4l2_ctrl_s_ctrl_compound() - Unlocked variant to set a compound control
> *
> - * @ctrl: The control.
> - * @area: The new area.
> + * @ctrl: The control.
> + * @type: The type of the data.
> + * @p: The new compound payload.
> *
> - * This sets the control's new area safely by going through the control
> - * framework. This function assumes the control's handler is already locked,
> - * allowing it to be used from within the &v4l2_ctrl_ops functions.
> + * This sets the control's new compound payload safely by going through the
> + * control framework. This function assumes the control's handler is already
> + * locked, allowing it to be used from within the &v4l2_ctrl_ops functions.
> *
> - * This function is for area type controls only.
> + * This function is for compound type controls only.
> */
> -int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
> - const struct v4l2_area *area);
> +int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
> + enum v4l2_ctrl_type type, const void *p);
>
> /**
> - * v4l2_ctrl_s_ctrl_area() - Helper function to set a control's area value
> - * from within a driver.
> + * v4l2_ctrl_s_ctrl_compound() - Helper function to set a compound control
> + * from within a driver.
> *
> - * @ctrl: The control.
> - * @area: The new area.
> + * @ctrl: The control.
> + * @type: The type of the data.
> + * @p: The new compound payload.
> *
> - * This sets the control's new area safely by going through the control
> - * framework. This function will lock the control's handler, so it cannot be
> - * used from within the &v4l2_ctrl_ops functions.
> + * This sets the control's new compound payload safely by going through the
> + * control framework. This function will lock the control's handler, so it
> + * cannot be used from within the &v4l2_ctrl_ops functions.
> *
> - * This function is for area type controls only.
> + * This function is for compound type controls only.
> */
> -static inline int v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
> - const struct v4l2_area *area)
> +static inline int v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
> + enum v4l2_ctrl_type type,
> + const void *p)
> {
> int rval;
>
> v4l2_ctrl_lock(ctrl);
> - rval = __v4l2_ctrl_s_ctrl_area(ctrl, area);
> + rval = __v4l2_ctrl_s_ctrl_compound(ctrl, type, p);
> v4l2_ctrl_unlock(ctrl);
>
> return rval;
> }
>
> +/* Helper defines for area type controls */
> +#define __v4l2_ctrl_s_ctrl_area(ctrl, area) \
> + __v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
> +#define v4l2_ctrl_s_ctrl_area(ctrl, area) \
> + v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
> +
> /* Internal helper functions that deal with control events. */
> extern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;
>
> --
> 2.25.1
>
@@ -4248,18 +4248,18 @@ int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
}
EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
-int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
- const struct v4l2_area *area)
+int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
+ enum v4l2_ctrl_type type, const void *p)
{
lockdep_assert_held(ctrl->handler->lock);
/* It's a driver bug if this happens. */
- if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA))
+ if (WARN_ON(ctrl->type != type))
return -EINVAL;
- *ctrl->p_new.p_area = *area;
+ memcpy(ctrl->p_new.p, p, ctrl->elems * ctrl->elem_size);
return set_ctrl(NULL, ctrl, 0);
}
-EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_area);
+EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_compound);
void v4l2_ctrl_request_complete(struct media_request *req,
struct v4l2_ctrl_handler *main_hdl)
@@ -1113,45 +1113,54 @@ static inline int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
}
/**
- * __v4l2_ctrl_s_ctrl_area() - Unlocked variant of v4l2_ctrl_s_ctrl_area().
+ * __v4l2_ctrl_s_ctrl_compound() - Unlocked variant to set a compound control
*
- * @ctrl: The control.
- * @area: The new area.
+ * @ctrl: The control.
+ * @type: The type of the data.
+ * @p: The new compound payload.
*
- * This sets the control's new area safely by going through the control
- * framework. This function assumes the control's handler is already locked,
- * allowing it to be used from within the &v4l2_ctrl_ops functions.
+ * This sets the control's new compound payload safely by going through the
+ * control framework. This function assumes the control's handler is already
+ * locked, allowing it to be used from within the &v4l2_ctrl_ops functions.
*
- * This function is for area type controls only.
+ * This function is for compound type controls only.
*/
-int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
- const struct v4l2_area *area);
+int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
+ enum v4l2_ctrl_type type, const void *p);
/**
- * v4l2_ctrl_s_ctrl_area() - Helper function to set a control's area value
- * from within a driver.
+ * v4l2_ctrl_s_ctrl_compound() - Helper function to set a compound control
+ * from within a driver.
*
- * @ctrl: The control.
- * @area: The new area.
+ * @ctrl: The control.
+ * @type: The type of the data.
+ * @p: The new compound payload.
*
- * This sets the control's new area safely by going through the control
- * framework. This function will lock the control's handler, so it cannot be
- * used from within the &v4l2_ctrl_ops functions.
+ * This sets the control's new compound payload safely by going through the
+ * control framework. This function will lock the control's handler, so it
+ * cannot be used from within the &v4l2_ctrl_ops functions.
*
- * This function is for area type controls only.
+ * This function is for compound type controls only.
*/
-static inline int v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
- const struct v4l2_area *area)
+static inline int v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
+ enum v4l2_ctrl_type type,
+ const void *p)
{
int rval;
v4l2_ctrl_lock(ctrl);
- rval = __v4l2_ctrl_s_ctrl_area(ctrl, area);
+ rval = __v4l2_ctrl_s_ctrl_compound(ctrl, type, p);
v4l2_ctrl_unlock(ctrl);
return rval;
}
+/* Helper defines for area type controls */
+#define __v4l2_ctrl_s_ctrl_area(ctrl, area) \
+ __v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
+#define v4l2_ctrl_s_ctrl_area(ctrl, area) \
+ v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
+
/* Internal helper functions that deal with control events. */
extern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;