Message ID | 20180302143500.32650-4-maxime.ripard@bootlin.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Mar 02, 2018 at 03:34:51PM +0100, Maxime Ripard wrote: > The sensor needs to have the auto exposure stopped while changing mode. > However, when the new mode is set, the driver will force the auto exposure > on, disregarding whether the control has been changed or not. > > Bypass the controls code entirely to do that, and only use the control > value cached when restoring the auto exposure mode. > > Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> > --- > drivers/media/i2c/ov5640.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index e6a23eb55c1d..0d8f979416cc 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -1579,7 +1579,9 @@ static int ov5640_set_mode_direct(struct ov5640_dev *sensor, > ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_gain, 1); > if (ret) > return ret; > - return __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, V4L2_EXPOSURE_AUTO); > + > + return __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, > + sensor->ctrls.auto_exp->val); > } > > static int ov5640_set_mode(struct ov5640_dev *sensor, > @@ -1596,7 +1598,8 @@ static int ov5640_set_mode(struct ov5640_dev *sensor, > ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_gain, 0); > if (ret) > return ret; > - ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, V4L2_EXPOSURE_MANUAL); > + > + ret = ov5640_set_exposure(sensor, V4L2_EXPOSURE_MANUAL); > if (ret) > return ret; > The s_ctrl callback won't be called if the control framework still has the same value set. I think you could store the value manually, and retain __v4l2_ctrl_s_ctrl() call in ov5640_set_mode().
diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c index e6a23eb55c1d..0d8f979416cc 100644 --- a/drivers/media/i2c/ov5640.c +++ b/drivers/media/i2c/ov5640.c @@ -1579,7 +1579,9 @@ static int ov5640_set_mode_direct(struct ov5640_dev *sensor, ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_gain, 1); if (ret) return ret; - return __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, V4L2_EXPOSURE_AUTO); + + return __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, + sensor->ctrls.auto_exp->val); } static int ov5640_set_mode(struct ov5640_dev *sensor, @@ -1596,7 +1598,8 @@ static int ov5640_set_mode(struct ov5640_dev *sensor, ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_gain, 0); if (ret) return ret; - ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, V4L2_EXPOSURE_MANUAL); + + ret = ov5640_set_exposure(sensor, V4L2_EXPOSURE_MANUAL); if (ret) return ret;
The sensor needs to have the auto exposure stopped while changing mode. However, when the new mode is set, the driver will force the auto exposure on, disregarding whether the control has been changed or not. Bypass the controls code entirely to do that, and only use the control value cached when restoring the auto exposure mode. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> --- drivers/media/i2c/ov5640.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)