Commit ac261abe authored by Daniel Scally's avatar Daniel Scally Committed by Hans Verkuil
Browse files

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: default avatarJacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: default avatarLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Tested-by: default avatarLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: default avatarDaniel Scally <dan.scally+renesas@ideasonboard.com>
Link: https://lore.kernel.org/r/20250625-rzg2l-cru-v6-3-a9099ed26c14@ideasonboard.com


Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
parent d225bdb6
Loading
Loading
Loading
Loading
+20 −13
Original line number Diff line number Diff line
@@ -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;
}