Commit dc29a1c1 authored by Hugues Fruchet's avatar Hugues Fruchet Committed by Mauro Carvalho Chehab
Browse files

media: ov5640: fix exposure regression



Symptom was black image when capturing HD or 5Mp picture
due to manual exposure set to 1 while it was intended to
set autoexposure to "manual", fix this.

Fixes: bf4a4b51 ("media: ov5640: Don't force the auto exposure state at start time").

Signed-off-by: default avatarHugues Fruchet <hugues.fruchet@st.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: default avatarJacopo Mondi <jacopo@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 bad1774e
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -959,6 +959,12 @@ static int ov5640_load_regs(struct ov5640_dev *sensor,
	return ov5640_set_timings(sensor, mode);
}

static int ov5640_set_autoexposure(struct ov5640_dev *sensor, bool on)
{
	return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
			      BIT(0), on ? 0 : BIT(0));
}

/* read exposure, in number of line periods */
static int ov5640_get_exposure(struct ov5640_dev *sensor)
{
@@ -1603,7 +1609,7 @@ static int ov5640_set_mode_exposure_calc(struct ov5640_dev *sensor,
 */
static int ov5640_set_mode_direct(struct ov5640_dev *sensor,
				  const struct ov5640_mode_info *mode,
				  s32 exposure)
				  bool auto_exp)
{
	int ret;

@@ -1620,7 +1626,8 @@ static int ov5640_set_mode_direct(struct ov5640_dev *sensor,
	if (ret)
		return ret;

	return __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, exposure);
	return __v4l2_ctrl_s_ctrl(sensor->ctrls.auto_exp, auto_exp ?
				  V4L2_EXPOSURE_AUTO : V4L2_EXPOSURE_MANUAL);
}

static int ov5640_set_mode(struct ov5640_dev *sensor,
@@ -1628,7 +1635,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor,
{
	const struct ov5640_mode_info *mode = sensor->current_mode;
	enum ov5640_downsize_mode dn_mode, orig_dn_mode;
	s32 exposure;
	bool auto_exp =  sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO;
	int ret;

	dn_mode = mode->dn_mode;
@@ -1639,8 +1646,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor,
	if (ret)
		return ret;

	exposure = sensor->ctrls.auto_exp->val;
	ret = ov5640_set_exposure(sensor, V4L2_EXPOSURE_MANUAL);
	ret = ov5640_set_autoexposure(sensor, false);
	if (ret)
		return ret;

@@ -1656,7 +1662,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor,
		 * change inside subsampling or scaling
		 * download firmware directly
		 */
		ret = ov5640_set_mode_direct(sensor, mode, exposure);
		ret = ov5640_set_mode_direct(sensor, mode, auto_exp);
	}

	if (ret < 0)