On Wed Jun 25 10:20:29 2025 +0100, Daniel Scally wrote:
> The rzg2l_csi2_calc_mbps() function currently tries to calculate the
> link frequency for a CSI2 bus using the V4L2_CID_PIXEL_RATE control
> of the remote subdevice. Switch the function to v4l2_get_link_freq()
> which correctly targets V4L2_CID_LINK_FREQ before falling back on
> V4L2_CID_PIXEL_RATE if the former is unavailable.
> 
> Reviewed-by: Jacopo Mondi <jacopo.mo...@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad...@bp.renesas.com>
> Tested-by: Lad Prabhakar <prabhakar.mahadev-lad...@bp.renesas.com>
> Signed-off-by: Daniel Scally <dan.scally+rene...@ideasonboard.com>
> Link: 
> https://lore.kernel.org/r/20250625-rzg2l-cru-v6-3-a9099ed26...@ideasonboard.com
> Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 .../media/platform/renesas/rzg2l-cru/rzg2l-csi2.c  | 33 +++++++++++++---------
 1 file changed, 20 insertions(+), 13 deletions(-)

---

diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c 
b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
index 9243306e2aa9..cec165551183 100644
--- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
+++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c
@@ -282,15 +282,18 @@ static int rzg2l_csi2_calc_mbps(struct rzg2l_csi2 *csi2)
        const struct rzg2l_csi2_format *format;
        const struct v4l2_mbus_framefmt *fmt;
        struct v4l2_subdev_state *state;
-       struct v4l2_ctrl *ctrl;
+       struct media_pad *remote_pad;
        u64 mbps;
+       s64 ret;
 
-       /* Read the pixel rate control from remote. */
-       ctrl = v4l2_ctrl_find(source->ctrl_handler, V4L2_CID_PIXEL_RATE);
-       if (!ctrl) {
-               dev_err(csi2->dev, "no pixel rate control in subdev %s\n",
-                       source->name);
-               return -EINVAL;
+       if (!csi2->remote_source)
+               return -ENODEV;
+
+       remote_pad = media_pad_remote_pad_unique(&csi2->pads[RZG2L_CSI2_SINK]);
+       if (IS_ERR(remote_pad)) {
+               dev_err(csi2->dev, "can't get source pad of %s (%ld)\n",
+                       csi2->remote_source->name, PTR_ERR(remote_pad));
+               return PTR_ERR(remote_pad);
        }
 
        state = v4l2_subdev_lock_and_get_active_state(&csi2->subdev);
@@ -298,12 +301,16 @@ static int rzg2l_csi2_calc_mbps(struct rzg2l_csi2 *csi2)
        format = rzg2l_csi2_code_to_fmt(fmt->code);
        v4l2_subdev_unlock_state(state);
 
-       /*
-        * Calculate hsfreq in Mbps
-        * hsfreq = (pixel_rate * bits_per_sample) / number_of_lanes
-        */
-       mbps = v4l2_ctrl_g_ctrl_int64(ctrl) * format->bpp;
-       do_div(mbps, csi2->lanes * 1000000);
+       /* Read the link frequency from remote subdevice. */
+       ret = v4l2_get_link_freq(remote_pad, format->bpp, csi2->lanes * 2);
+       if (ret < 0) {
+               dev_err(csi2->dev, "can't retrieve link freq from subdev %s\n",
+                       source->name);
+               return -EINVAL;
+       }
+
+       mbps = ret * 2;
+       do_div(mbps, 1000000);
 
        return mbps;
 }

Reply via email to