Moi, On Fri, Dec 20, 2024 at 03:09:05PM +0200, Tomi Valkeinen wrote: > Hi, > > On 17/12/2024 23:54, Sakari Ailus wrote: > > v4l2_get_link_freq() accepts a V4L2 control handler for now, but it needs > > to take struct media_pad argument in order to obtain the link frequency > > using get_mbus_config() pad op. Prepare for this by allowing struct > > media_pad as well. > > > > Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > > --- > > drivers/media/v4l2-core/v4l2-common.c | 21 ++++++++++++++++++--- > > include/media/v4l2-common.h | 19 ++++++++++++++++--- > > 2 files changed, 34 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c > > index 0a2f4f0d0a07..9fe74c7e064f 100644 > > --- a/drivers/media/v4l2-core/v4l2-common.c > > +++ b/drivers/media/v4l2-core/v4l2-common.c > > @@ -466,8 +466,8 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, > > } > > EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt); > > -s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul, > > - unsigned int div) > > +s64 __v4l2_get_link_freq_ctrl(struct v4l2_ctrl_handler *handler, > > + unsigned int mul, unsigned int div) > > { > > struct v4l2_ctrl *ctrl; > > s64 freq; > > @@ -502,7 +502,22 @@ s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul, > > return freq > 0 ? freq : -EINVAL; > > } > > -EXPORT_SYMBOL_GPL(v4l2_get_link_freq); > > +EXPORT_SYMBOL_GPL(__v4l2_get_link_freq_ctrl); > > + > > +#ifdef CONFIG_MEDIA_CONTROLLER > > +s64 __v4l2_get_link_freq_pad(struct media_pad *pad, unsigned int mul, > > + unsigned int div) > > +{ > > + struct v4l2_subdev *sd; > > + > > + sd = media_entity_to_v4l2_subdev(pad->entity); > > + if (!sd) > > + return -ENODEV; > > + > > + return __v4l2_get_link_freq_ctrl(sd->ctrl_handler, mul, div); > > +} > > +EXPORT_SYMBOL_GPL(__v4l2_get_link_freq_pad); > > +#endif /* CONFIG_MEDIA_CONTROLLER */ > > /* > > * Simplify a fraction using a simple continued fraction decomposition. The > > diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h > > index 63ad36f04f72..fda903bb3674 100644 > > --- a/include/media/v4l2-common.h > > +++ b/include/media/v4l2-common.h > > @@ -525,7 +525,8 @@ int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, > > /** > > * v4l2_get_link_freq - Get link rate from transmitter > > * > > - * @handler: The transmitter's control handler > > + * @pad: The transmitter's media pad (or control handler for non-MC users or > > + * compatibility reasons, don't use in new code) > > * @mul: The multiplier between pixel rate and link frequency. Bits per pixel on > > * D-PHY, samples per clock on parallel. 0 otherwise. > > * @div: The divisor between pixel rate and link frequency. Number of data lanes > > @@ -541,8 +542,20 @@ int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, > > * * %-ENOENT: Link frequency or pixel rate control not found > > * * %-EINVAL: Invalid link frequency value > > */ > > -s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul, > > - unsigned int div); > > +#ifdef CONFIG_MEDIA_CONTROLLER > > +#define v4l2_get_link_freq(pad, mul, div) \ > > + _Generic(pad, \ > > + struct media_pad *: __v4l2_get_link_freq_pad, \ > > + struct v4l2_ctrl_handler *: __v4l2_get_link_freq_ctrl) \ > > + (pad, mul, div) > > I can't decide if I love or hate _Generic =). I really like it. It enables certain things that didn't use to be possible in C, and really helps in transitions like this. We also have container_of_const() etc. for added constness checking. > > > +s64 __v4l2_get_link_freq_pad(struct media_pad *pad, unsigned int mul, > > + unsigned int div); > > +#else > > +#define v4l2_get_link_freq(handler, mul, div) \ > > + __v4l2_get_link_freq_ctrl(handler, mul, div) > > +#endif > > +s64 __v4l2_get_link_freq_ctrl(struct v4l2_ctrl_handler *handler, > > + unsigned int mul, unsigned int div); > > void v4l2_simplify_fraction(u32 *numerator, u32 *denominator, > > unsigned int n_terms, unsigned int threshold); > > This makes sense in the transition period. But I wonder, should we later > have: > > v4l2_get_link_freq(struct v4l2_subdev *sd, unsigned int pad, ...) like all > the subdev ops? Perhaps not... Subdev ops take subdev as the first argument > as, well, they're subdev ops. > > It did look to me that in many drivers we already have the source subdev and > pad stored somewhere, and getting the media_pad to call v4l2_get_link_freq() > is an extra step. I could add a couple of macros to cover that need. ;-) But to be fair, drivers should instead store the media pad of the sensor or even better, not store it at all but use media_entity_remote_pad_unique() to obtain it at runtime. -- Terveisin, Sakari Ailus