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@xxxxxxxxxxx> Cheers, Paul > Signed-off-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> > --- > 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 > -- Paul Kocialkowski, Bootlin Embedded Linux and kernel engineering https://bootlin.com
Attachment:
signature.asc
Description: PGP signature