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

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
...@@ -617,25 +617,16 @@ static int ov772x_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment