]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: platform: rzg2l-cru: Use v4l2_get_link_freq()
authorDaniel Scally <dan.scally+renesas@ideasonboard.com>
Wed, 25 Jun 2025 09:20:29 +0000 (10:20 +0100)
committerHans Verkuil <hverkuil@xs4all.nl>
Thu, 3 Jul 2025 07:04:14 +0000 (09:04 +0200)
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.mondi@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: Daniel Scally <dan.scally+renesas@ideasonboard.com>
Link: https://lore.kernel.org/r/20250625-rzg2l-cru-v6-3-a9099ed26c14@ideasonboard.com
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c

index 9243306e2aa98587ed8aa70bc91f9ca4758362c8..cec165551183afb71ae019b277c46a17a0f8096d 100644 (file)
@@ -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;
 }