@@ -998,18 +998,37 @@ 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 v4l2_subdev *source;
+ unsigned int lanes;
+ unsigned int bpp;
s64 freq;
u64 mbps;
+ int ret;
if (!priv->remote)
return -ENODEV;
source = priv->remote;
+ 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(source->ctrl_handler, bpp, 2 * lanes);
if (freq < 0) {
int ret = (int)freq;
@@ -1090,7 +1109,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;
@@ -1298,23 +1317,15 @@ static int rcsi2_c_phy_setting_v4h(struct rcar_csi2 *priv, int msps)
static int rcsi2_start_receiver_v4h(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;
- /* 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;
@@ -1492,23 +1503,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;
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. Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com> --- drivers/media/platform/renesas/rcar-csi2.c | 45 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 21 deletions(-)