diff mbox series

[v2] media: ov5640: do not change mode if format or frame interval is unchanged

Message ID 1534152111-16837-1-git-send-email-hugues.fruchet@st.com (mailing list archive)
State New, archived
Headers show
Series [v2] media: ov5640: do not change mode if format or frame interval is unchanged | expand

Commit Message

Hugues FRUCHET Aug. 13, 2018, 9:21 a.m. UTC
Save load of mode registers array when V4L2 client sets a format or a
frame interval which selects the same mode than the current one.

Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>
---
Version 2:
  - Fix fuzzy image because of JPEG default format not being
    changed according to new format selected, fix this.
  - Init sequence initialises format to YUV422 UYVY but
    sensor->fmt initial value was set to JPEG, fix this.


 drivers/media/i2c/ov5640.c | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

Comments

Hugues FRUCHET Aug. 16, 2018, 9:56 a.m. UTC | #1
Hi all,

Please ignore this v2, the v1 was merged.
I've just pushed a new patch which fixes the regression observed, see:
https://www.mail-archive.com/linux-media@vger.kernel.org/msg134413.html

Sorry for inconvenience.

Best regards,
Hugues.

On 08/13/2018 11:21 AM, Hugues Fruchet wrote:
> Save load of mode registers array when V4L2 client sets a format or a
> frame interval which selects the same mode than the current one.
> 
> Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>
> ---
> Version 2:
>    - Fix fuzzy image because of JPEG default format not being
>      changed according to new format selected, fix this.
>    - Init sequence initialises format to YUV422 UYVY but
>      sensor->fmt initial value was set to JPEG, fix this.
> 
> 
>   drivers/media/i2c/ov5640.c | 33 ++++++++++++++++++++++++---------
>   1 file changed, 24 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
> index 1ecbb7a..2ddd86d 100644
> --- a/drivers/media/i2c/ov5640.c
> +++ b/drivers/media/i2c/ov5640.c
> @@ -223,6 +223,7 @@ struct ov5640_dev {
>   	int power_count;
>   
>   	struct v4l2_mbus_framefmt fmt;
> +	bool pending_fmt_change;
>   
>   	const struct ov5640_mode_info *current_mode;
>   	enum ov5640_frame_rate current_fr;
> @@ -255,7 +256,7 @@ static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
>    * should be identified and removed to speed register load time
>    * over i2c.
>    */
> -
> +/* YUV422 UYVY VGA@30fps */
>   static const struct reg_value ov5640_init_setting_30fps_VGA[] = {
>   	{0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0},
>   	{0x3103, 0x03, 0, 0}, {0x3017, 0x00, 0, 0}, {0x3018, 0x00, 0, 0},
> @@ -1966,9 +1967,14 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
>   		goto out;
>   	}
>   
> -	sensor->current_mode = new_mode;
> -	sensor->fmt = *mbus_fmt;
> -	sensor->pending_mode_change = true;
> +	if (new_mode != sensor->current_mode) {
> +		sensor->current_mode = new_mode;
> +		sensor->pending_mode_change = true;
> +	}
> +	if (mbus_fmt->code != sensor->fmt.code) {
> +		sensor->fmt = *mbus_fmt;
> +		sensor->pending_fmt_change = true;
> +	}
>   out:
>   	mutex_unlock(&sensor->lock);
>   	return ret;
> @@ -2508,8 +2514,10 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
>   		goto out;
>   	}
>   
> -	sensor->current_mode = mode;
> -	sensor->pending_mode_change = true;
> +	if (mode != sensor->current_mode) {
> +		sensor->current_mode = mode;
> +		sensor->pending_mode_change = true;
> +	}
>   out:
>   	mutex_unlock(&sensor->lock);
>   	return ret;
> @@ -2540,10 +2548,13 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
>   			ret = ov5640_set_mode(sensor, sensor->current_mode);
>   			if (ret)
>   				goto out;
> +		}
>   
> +		if (enable && sensor->pending_fmt_change) {
>   			ret = ov5640_set_framefmt(sensor, &sensor->fmt);
>   			if (ret)
>   				goto out;
> +			sensor->pending_fmt_change = false;
>   		}
>   
>   		if (sensor->ep.bus_type == V4L2_MBUS_CSI2)
> @@ -2638,9 +2649,14 @@ static int ov5640_probe(struct i2c_client *client,
>   		return -ENOMEM;
>   
>   	sensor->i2c_client = client;
> +
> +	/*
> +	 * default init sequence initialize sensor to
> +	 * YUV422 UYVY VGA@30fps
> +	 */
>   	fmt = &sensor->fmt;
> -	fmt->code = ov5640_formats[0].code;
> -	fmt->colorspace = ov5640_formats[0].colorspace;
> +	fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
> +	fmt->colorspace = V4L2_COLORSPACE_SRGB;
>   	fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
>   	fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
>   	fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
> @@ -2652,7 +2668,6 @@ 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->pending_mode_change = true;
>   
>   	sensor->ae_target = 52;
>   
>
Sakari Ailus Sept. 1, 2018, 10:56 a.m. UTC | #2
On Thu, Aug 16, 2018 at 09:56:13AM +0000, Hugues FRUCHET wrote:
> Hi all,
> 
> Please ignore this v2, the v1 was merged.
> I've just pushed a new patch which fixes the regression observed, see:
> https://www.mail-archive.com/linux-media@vger.kernel.org/msg134413.html
> 
> Sorry for inconvenience.

No worries; thanks for the fix!
diff mbox series

Patch

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 1ecbb7a..2ddd86d 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -223,6 +223,7 @@  struct ov5640_dev {
 	int power_count;
 
 	struct v4l2_mbus_framefmt fmt;
+	bool pending_fmt_change;
 
 	const struct ov5640_mode_info *current_mode;
 	enum ov5640_frame_rate current_fr;
@@ -255,7 +256,7 @@  static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
  * should be identified and removed to speed register load time
  * over i2c.
  */
-
+/* YUV422 UYVY VGA@30fps */
 static const struct reg_value ov5640_init_setting_30fps_VGA[] = {
 	{0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0},
 	{0x3103, 0x03, 0, 0}, {0x3017, 0x00, 0, 0}, {0x3018, 0x00, 0, 0},
@@ -1966,9 +1967,14 @@  static int ov5640_set_fmt(struct v4l2_subdev *sd,
 		goto out;
 	}
 
-	sensor->current_mode = new_mode;
-	sensor->fmt = *mbus_fmt;
-	sensor->pending_mode_change = true;
+	if (new_mode != sensor->current_mode) {
+		sensor->current_mode = new_mode;
+		sensor->pending_mode_change = true;
+	}
+	if (mbus_fmt->code != sensor->fmt.code) {
+		sensor->fmt = *mbus_fmt;
+		sensor->pending_fmt_change = true;
+	}
 out:
 	mutex_unlock(&sensor->lock);
 	return ret;
@@ -2508,8 +2514,10 @@  static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
 		goto out;
 	}
 
-	sensor->current_mode = mode;
-	sensor->pending_mode_change = true;
+	if (mode != sensor->current_mode) {
+		sensor->current_mode = mode;
+		sensor->pending_mode_change = true;
+	}
 out:
 	mutex_unlock(&sensor->lock);
 	return ret;
@@ -2540,10 +2548,13 @@  static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
 			ret = ov5640_set_mode(sensor, sensor->current_mode);
 			if (ret)
 				goto out;
+		}
 
+		if (enable && sensor->pending_fmt_change) {
 			ret = ov5640_set_framefmt(sensor, &sensor->fmt);
 			if (ret)
 				goto out;
+			sensor->pending_fmt_change = false;
 		}
 
 		if (sensor->ep.bus_type == V4L2_MBUS_CSI2)
@@ -2638,9 +2649,14 @@  static int ov5640_probe(struct i2c_client *client,
 		return -ENOMEM;
 
 	sensor->i2c_client = client;
+
+	/*
+	 * default init sequence initialize sensor to
+	 * YUV422 UYVY VGA@30fps
+	 */
 	fmt = &sensor->fmt;
-	fmt->code = ov5640_formats[0].code;
-	fmt->colorspace = ov5640_formats[0].colorspace;
+	fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
+	fmt->colorspace = V4L2_COLORSPACE_SRGB;
 	fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
 	fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
 	fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
@@ -2652,7 +2668,6 @@  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->pending_mode_change = true;
 
 	sensor->ae_target = 52;