Message ID | 20241210075906.609490-2-sakari.ailus@linux.intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Use V4L2 mbus config for conveying MEI CSI link frequency | expand |
Hi Sakari On Tue, Dec 10, 2024 at 09:59:02AM +0200, 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@linux.intel.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Thanks j > --- > 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) > +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); > -- > 2.39.5 > >
Hi Sakari, Thank you for the patch. On Tue, Dec 10, 2024 at 09:59:02AM +0200, 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@linux.intel.com> > --- > 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) > +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); Let's avoid this complexity by patching callers. I'm OK with this patch as a temporary measure, but the series should end with a patch that removes the ability to pass a control handler. > > void v4l2_simplify_fraction(u32 *numerator, u32 *denominator, > unsigned int n_terms, unsigned int threshold);
Hi Laurent, On Sun, Dec 15, 2024 at 06:45:23PM +0200, Laurent Pinchart wrote: > Hi Sakari, > > Thank you for the patch. > > On Tue, Dec 10, 2024 at 09:59:02AM +0200, 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@linux.intel.com> > > --- > > 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) > > +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); > > Let's avoid this complexity by patching callers. I'm OK with this patch > as a temporary measure, but the series should end with a patch that > removes the ability to pass a control handler. I intend to do that. However new drivers are being merged and the set has been around since the spring and it fixes an issue in the IVSC driver (not being able to convey the link frequency). Therefore I prefer to get this merged now and then convert the rest of the users. > > > > > void v4l2_simplify_fraction(u32 *numerator, u32 *denominator, > > unsigned int n_terms, unsigned int threshold); >
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) +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);
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@linux.intel.com> --- drivers/media/v4l2-core/v4l2-common.c | 21 ++++++++++++++++++--- include/media/v4l2-common.h | 19 ++++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-)