media: rcar-csi2: Simplify rcsi2_calc_mbps()

Instead of taking the bpp and the number of lanes as parameters to
rcsi2_calc_mbps(), change the function to get those parameters inside
the function. This centralizes the code a bit and makes it easier to add
streams support.

Also, in the future when the legacy (non-link-freq) code is removed,
there will be no need to change rcsi2_calc_mbps() parameters.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Tomi Valkeinen 2026-01-15 12:07:00 +02:00 committed by Mauro Carvalho Chehab
parent 0ffd7f4c4c
commit 21bcc9355c

View File

@ -1003,13 +1003,18 @@ static int rcsi2_get_active_lanes(struct rcar_csi2 *priv,
return 0;
}
static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp,
unsigned int lanes)
static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
const struct rcar_csi2_format *format;
struct v4l2_mbus_framefmt *fmt;
struct media_pad *remote_pad;
struct v4l2_subdev *source;
unsigned int lanes;
unsigned int bpp;
s64 freq;
u64 mbps;
int ret;
if (!priv->remote)
return -ENODEV;
@ -1017,6 +1022,20 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp,
source = priv->remote;
remote_pad = &source->entity.pads[priv->remote_pad];
ret = rcsi2_get_active_lanes(priv, &lanes);
if (ret)
return ret;
fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
if (!fmt)
return -EINVAL;
format = rcsi2_code_to_fmt(fmt->code);
if (!format)
return -EINVAL;
bpp = format->bpp;
freq = v4l2_get_link_freq(remote_pad, bpp, 2 * lanes);
if (freq < 0) {
int ret = (int)freq;
@ -1093,7 +1112,7 @@ static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv,
phycnt = PHYCNT_ENABLECLK;
phycnt |= (1 << lanes) - 1;
mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
mbps = rcsi2_calc_mbps(priv, state);
if (mbps < 0)
return mbps;
@ -1475,23 +1494,15 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
const struct rcsi2_cphy_setting *cphy = NULL;
const struct rcar_csi2_format *format;
const struct v4l2_mbus_framefmt *fmt;
unsigned int lanes;
int mbps;
int ret;
/* Use the format on the sink pad to compute the receiver config. */
fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
format = rcsi2_code_to_fmt(fmt->code);
if (!format)
return -EINVAL;
ret = rcsi2_get_active_lanes(priv, &lanes);
if (ret)
return ret;
mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
mbps = rcsi2_calc_mbps(priv, state);
if (mbps < 0)
return mbps;
@ -1732,23 +1743,15 @@ static int rcsi2_init_common_v4m(struct rcar_csi2 *priv, unsigned int mbps)
static int rcsi2_start_receiver_v4m(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
const struct rcar_csi2_format *format;
const struct v4l2_mbus_framefmt *fmt;
unsigned int lanes;
int mbps;
int ret;
/* Calculate parameters */
fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
format = rcsi2_code_to_fmt(fmt->code);
if (!format)
return -EINVAL;
ret = rcsi2_get_active_lanes(priv, &lanes);
if (ret)
return ret;
mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
mbps = rcsi2_calc_mbps(priv, state);
if (mbps < 0)
return mbps;