|
@@ -226,6 +226,7 @@ struct ov5640_dev {
|
|
|
bool pending_fmt_change;
|
|
|
|
|
|
const struct ov5640_mode_info *current_mode;
|
|
|
+ const struct ov5640_mode_info *last_mode;
|
|
|
enum ov5640_frame_rate current_fr;
|
|
|
struct v4l2_fract frame_interval;
|
|
|
|
|
@@ -1629,10 +1630,10 @@ static int ov5640_set_mode_direct(struct ov5640_dev *sensor,
|
|
|
return ov5640_load_regs(sensor, mode);
|
|
|
}
|
|
|
|
|
|
-static int ov5640_set_mode(struct ov5640_dev *sensor,
|
|
|
- const struct ov5640_mode_info *orig_mode)
|
|
|
+static int ov5640_set_mode(struct ov5640_dev *sensor)
|
|
|
{
|
|
|
const struct ov5640_mode_info *mode = sensor->current_mode;
|
|
|
+ const struct ov5640_mode_info *orig_mode = sensor->last_mode;
|
|
|
enum ov5640_downsize_mode dn_mode, orig_dn_mode;
|
|
|
bool auto_gain = sensor->ctrls.auto_gain->val == 1;
|
|
|
bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO;
|
|
@@ -1694,6 +1695,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor,
|
|
|
return ret;
|
|
|
|
|
|
sensor->pending_mode_change = false;
|
|
|
+ sensor->last_mode = mode;
|
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -1719,6 +1721,7 @@ static int ov5640_restore_mode(struct ov5640_dev *sensor)
|
|
|
ret = ov5640_load_regs(sensor, &ov5640_mode_init_data);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
+ sensor->last_mode = &ov5640_mode_init_data;
|
|
|
|
|
|
ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f,
|
|
|
(ilog2(OV5640_SCLK2X_ROOT_DIVIDER_DEFAULT) << 2) |
|
|
@@ -1727,7 +1730,7 @@ static int ov5640_restore_mode(struct ov5640_dev *sensor)
|
|
|
return ret;
|
|
|
|
|
|
/* now restore the last capture mode */
|
|
|
- ret = ov5640_set_mode(sensor, &ov5640_mode_init_data);
|
|
|
+ ret = ov5640_set_mode(sensor);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
@@ -2610,7 +2613,7 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
|
|
|
|
|
|
if (sensor->streaming == !enable) {
|
|
|
if (enable && sensor->pending_mode_change) {
|
|
|
- ret = ov5640_set_mode(sensor, sensor->current_mode);
|
|
|
+ ret = ov5640_set_mode(sensor);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
}
|
|
@@ -2733,6 +2736,7 @@ static int ov5640_probe(struct i2c_client *client,
|
|
|
sensor->current_fr = OV5640_30_FPS;
|
|
|
sensor->current_mode =
|
|
|
&ov5640_mode_data[OV5640_30_FPS][OV5640_MODE_VGA_640_480];
|
|
|
+ sensor->last_mode = sensor->current_mode;
|
|
|
|
|
|
sensor->ae_target = 52;
|
|
|
|