Commit 12f6153d authored by Akinobu Mita's avatar Akinobu Mita Committed by Mauro Carvalho Chehab

media: ov7670: don't access registers when the device is powered off

Since commit 3d6a8fe2 ("media: ov7670: hook s_power onto v4l2 core"),
the device is actually powered off while the video stream is stopped.

So now set_format and s_frame_interval could be called while the device
is powered off, but these callbacks try to change the register settings
at this time.

The frame format and framerate will be restored right after power-up, so
we can just postpone applying these changes at these callbacks if the
device is not powered up.

Fixes: 3d6a8fe2 ("media: ov7670: hook s_power onto v4l2 core")

Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Reviewed-by: default avatarLubomir Rintel <lkundrak@v3.sk>
Tested-by: default avatarLubomir Rintel <lkundrak@v3.sk>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 32ab688b
...@@ -864,7 +864,15 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd, ...@@ -864,7 +864,15 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd,
/* Recalculate frame rate */ /* Recalculate frame rate */
ov7675_get_framerate(sd, tpf); ov7675_get_framerate(sd, tpf);
/*
* If the device is not powered up by the host driver do
* not apply any changes to H/W at this time. Instead
* the framerate will be restored right after power-up.
*/
if (info->on)
return ov7675_apply_framerate(sd); return ov7675_apply_framerate(sd);
return 0;
} }
static void ov7670_get_framerate_legacy(struct v4l2_subdev *sd, static void ov7670_get_framerate_legacy(struct v4l2_subdev *sd,
...@@ -895,7 +903,16 @@ static int ov7670_set_framerate_legacy(struct v4l2_subdev *sd, ...@@ -895,7 +903,16 @@ static int ov7670_set_framerate_legacy(struct v4l2_subdev *sd,
info->clkrc = (info->clkrc & 0x80) | div; info->clkrc = (info->clkrc & 0x80) | div;
tpf->numerator = 1; tpf->numerator = 1;
tpf->denominator = info->clock_speed / div; tpf->denominator = info->clock_speed / div;
/*
* If the device is not powered up by the host driver do
* not apply any changes to H/W at this time. Instead
* the framerate will be restored right after power-up.
*/
if (info->on)
return ov7670_write(sd, REG_CLKRC, info->clkrc); return ov7670_write(sd, REG_CLKRC, info->clkrc);
return 0;
} }
/* /*
...@@ -1105,9 +1122,13 @@ static int ov7670_set_fmt(struct v4l2_subdev *sd, ...@@ -1105,9 +1122,13 @@ static int ov7670_set_fmt(struct v4l2_subdev *sd,
if (ret) if (ret)
return ret; return ret;
ret = ov7670_apply_fmt(sd); /*
if (ret) * If the device is not powered up by the host driver do
return ret; * not apply any changes to H/W at this time. Instead
* the frame format will be restored right after power-up.
*/
if (info->on)
return ov7670_apply_fmt(sd);
return 0; return 0;
} }
......
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