media: platform: rzg2l-cru: Use v4l2_get_link_freq()

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>
This commit is contained in:
Daniel Scally
2025-06-25 10:20:29 +01:00
committed by Hans Verkuil
parent d225bdb6ed
commit ac261abe73

View 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;
}