Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80dc2a49 authored by Akinobu Mita's avatar Akinobu Mita Committed by Mauro Carvalho Chehab
Browse files

media: ov772x: reconstruct s_frame_interval()



This splits the s_frame_interval() in subdev video ops into selecting the
frame interval and setting up the registers.

This is a preparatory change to avoid accessing registers under power
saving mode.

Cc: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Reviewed-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 34af7d92
Loading
Loading
Loading
Loading
+35 −21
Original line number Original line Diff line number Diff line
@@ -617,25 +617,16 @@ static int ov772x_s_stream(struct v4l2_subdev *sd, int enable)
	return 0;
	return 0;
}
}


static int ov772x_set_frame_rate(struct ov772x_priv *priv,
static unsigned int ov772x_select_fps(struct ov772x_priv *priv,
				 struct v4l2_fract *tpf,
				      struct v4l2_fract *tpf)
				 const struct ov772x_color_format *cfmt,
				 const struct ov772x_win_size *win)
{
{
	struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
	unsigned long fin = clk_get_rate(priv->clk);
	unsigned int fps = tpf->numerator ?
	unsigned int fps = tpf->numerator ?
			   tpf->denominator / tpf->numerator :
			   tpf->denominator / tpf->numerator :
			   tpf->denominator;
			   tpf->denominator;
	unsigned int best_diff;
	unsigned int best_diff;
	unsigned int fsize;
	unsigned int pclk;
	unsigned int diff;
	unsigned int diff;
	unsigned int idx;
	unsigned int idx;
	unsigned int i;
	unsigned int i;
	u8 clkrc = 0;
	u8 com4 = 0;
	int ret;


	/* Approximate to the closest supported frame interval. */
	/* Approximate to the closest supported frame interval. */
	best_diff = ~0L;
	best_diff = ~0L;
@@ -646,7 +637,25 @@ static int ov772x_set_frame_rate(struct ov772x_priv *priv,
			best_diff = diff;
			best_diff = diff;
		}
		}
	}
	}
	fps = ov772x_frame_intervals[idx];

	return ov772x_frame_intervals[idx];
}

static int ov772x_set_frame_rate(struct ov772x_priv *priv,
				 unsigned int fps,
				 const struct ov772x_color_format *cfmt,
				 const struct ov772x_win_size *win)
{
	struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
	unsigned long fin = clk_get_rate(priv->clk);
	unsigned int best_diff;
	unsigned int fsize;
	unsigned int pclk;
	unsigned int diff;
	unsigned int i;
	u8 clkrc = 0;
	u8 com4 = 0;
	int ret;


	/* Use image size (with blankings) to calculate desired pixel clock. */
	/* Use image size (with blankings) to calculate desired pixel clock. */
	switch (cfmt->com7 & OFMT_MASK) {
	switch (cfmt->com7 & OFMT_MASK) {
@@ -711,10 +720,6 @@ static int ov772x_set_frame_rate(struct ov772x_priv *priv,
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;


	tpf->numerator = 1;
	tpf->denominator = fps;
	priv->fps = tpf->denominator;

	return 0;
	return 0;
}
}


@@ -735,8 +740,20 @@ static int ov772x_s_frame_interval(struct v4l2_subdev *sd,
{
{
	struct ov772x_priv *priv = to_ov772x(sd);
	struct ov772x_priv *priv = to_ov772x(sd);
	struct v4l2_fract *tpf = &ival->interval;
	struct v4l2_fract *tpf = &ival->interval;
	unsigned int fps;
	int ret;

	fps = ov772x_select_fps(priv, tpf);

	ret = ov772x_set_frame_rate(priv, fps, priv->cfmt, priv->win);
	if (ret)
		return ret;


	return ov772x_set_frame_rate(priv, tpf, priv->cfmt, priv->win);
	tpf->numerator = 1;
	tpf->denominator = fps;
	priv->fps = fps;

	return 0;
}
}


static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl)
static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl)
@@ -993,7 +1010,6 @@ static int ov772x_set_params(struct ov772x_priv *priv,
			     const struct ov772x_win_size *win)
			     const struct ov772x_win_size *win)
{
{
	struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
	struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
	struct v4l2_fract tpf;
	int ret;
	int ret;
	u8  val;
	u8  val;


@@ -1075,9 +1091,7 @@ static int ov772x_set_params(struct ov772x_priv *priv,
		goto ov772x_set_fmt_error;
		goto ov772x_set_fmt_error;


	/* COM4, CLKRC: Set pixel clock and framerate. */
	/* COM4, CLKRC: Set pixel clock and framerate. */
	tpf.numerator = 1;
	ret = ov772x_set_frame_rate(priv, priv->fps, cfmt, win);
	tpf.denominator = priv->fps;
	ret = ov772x_set_frame_rate(priv, &tpf, cfmt, win);
	if (ret < 0)
	if (ret < 0)
		goto ov772x_set_fmt_error;
		goto ov772x_set_fmt_error;