On 05/10/2021 10:57, Tomi Valkeinen wrote: > Add v4l2_subdev_get_fmt() helper function which implements > v4l2_subdev_pad_ops.get_fmt using streams. Subdev drivers that do not > need to do anything special in their get_fmt op can use this helper > directly for v4l2_subdev_pad_ops.get_fmt. > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@xxxxxxxxxxxxxxxx> Reviewed-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> > --- > drivers/media/v4l2-core/v4l2-subdev.c | 21 +++++++++++++++++++++ > include/media/v4l2-subdev.h | 16 ++++++++++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c > index 9eeadad997c8..d402ffeef560 100644 > --- a/drivers/media/v4l2-core/v4l2-subdev.c > +++ b/drivers/media/v4l2-core/v4l2-subdev.c > @@ -1526,3 +1526,24 @@ v4l2_state_get_opposite_stream_format(struct v4l2_subdev_state *state, u32 pad, > return v4l2_state_get_stream_format(state, other_pad, other_stream); > } > EXPORT_SYMBOL_GPL(v4l2_state_get_opposite_stream_format); > + > +int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, > + struct v4l2_subdev_format *format) > +{ > + struct v4l2_mbus_framefmt *fmt; > + > + v4l2_subdev_lock_state(state); > + > + fmt = v4l2_state_get_stream_format(state, format->pad, format->stream); > + if (!fmt) { > + v4l2_subdev_unlock_state(state); > + return -EINVAL; > + } > + > + format->format = *fmt; > + > + v4l2_subdev_unlock_state(state); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(v4l2_subdev_get_fmt); > diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h > index 4b9520410783..04fca595aa91 100644 > --- a/include/media/v4l2-subdev.h > +++ b/include/media/v4l2-subdev.h > @@ -1532,5 +1532,21 @@ int v4l2_state_find_opposite_end(struct v4l2_subdev_krouting *routing, u32 pad, > struct v4l2_mbus_framefmt * > v4l2_state_get_opposite_stream_format(struct v4l2_subdev_state *state, u32 pad, > u32 stream); > +/** > + * v4l2_subdev_get_fmt() - Fill format based on state > + * @sd: subdevice > + * @state: subdevice state > + * @format: pointer to &struct v4l2_subdev_format > + * > + * Fill @format based on the pad and stream given in the @format struct. > + * > + * This function can be used by the subdev drivers to implement > + * v4l2_subdev_pad_ops.get_fmt if the subdev driver does not need to do > + * anything special in their get_fmt op. > + * > + * Returns 0 on success, error value otherwise. > + */ > +int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, > + struct v4l2_subdev_format *format); > > #endif >