Re: [PATCH v5 20/27] media: ov5640: Limit frame_interval to DVP mode only

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jacopo,

On 2/24/22 10:43 AM, Jacopo Mondi wrote:
In MIPI mode the frame rate control is performed by adjusting the
frame blankings and the s_frame_interval function is not used anymore.

Only check for the per-mode supported frame rate in DVP mode and do not
restrict MIPI mode.

Disallow enum/s/g_frame_interval if the chip is used in MIPI mode.

This is breaking userspace which set framerate through media-ctl:
media-ctl -d /dev/media0 --set-v4l2 "'ov5640 1-003c':0[fmt:JPEG_1X8/640x480@1/15 field:none]" because of unsupported framerate, all the rest is ignored (resolution and format).

I can understand use of vblank to tune framerate but I would expect that compatibility with frame interval setting is kept, it's far more simple for an application to set the frame interval versus finding the right vblank to apply (not straightforward...)

On my side I have reverted this patch and added support of both, see patch proposal in reply to [PATCH v5 16/27] media: ov5640: Add VBLANK control.



While at it re-indent one function which whose parameters were wrongly
aligned.

Signed-off-by: Jacopo Mondi <jacopo@xxxxxxxxxx>
Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
---
  drivers/media/i2c/ov5640.c | 18 ++++++++++++++++--
  1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index baf368a39e0f..6b955163eb4d 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -2005,9 +2005,14 @@ ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
  	     (mode->width != width || mode->height != height)))
  		return NULL;
- /* Check to see if the current mode exceeds the max frame rate */
+	/*
+	 * Check to see if the current mode exceeds the max frame rate.
+	 * Only DVP mode uses the frame rate set by s_frame_interval, MIPI
+	 * mode controls framerate by setting blankings.
+	 */
  	timings = &mode->dvp_timings;
-	if (ov5640_framerates[fr] > ov5640_framerates[timings->max_fps])
+	if (!ov5640_is_csi2(sensor) &&
+	    ov5640_framerates[fr] > ov5640_framerates[timings->max_fps])
  		return NULL;
return mode;
@@ -3439,6 +3444,9 @@ static int ov5640_enum_frame_interval(
  	struct v4l2_fract tpf;
  	int ret;
+ if (ov5640_is_csi2(sensor))
+		return -EINVAL;
+
  	if (fie->pad != 0)
  		return -EINVAL;
  	if (fie->index >= OV5640_NUM_FRAMERATES)
@@ -3461,6 +3469,9 @@ static int ov5640_g_frame_interval(struct v4l2_subdev *sd,
  {
  	struct ov5640_dev *sensor = to_ov5640_dev(sd);
+ if (ov5640_is_csi2(sensor))
+		return -EINVAL;
+
  	mutex_lock(&sensor->lock);
  	fi->interval = sensor->frame_interval;
  	mutex_unlock(&sensor->lock);
@@ -3475,6 +3486,9 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
  	const struct ov5640_mode_info *mode;
  	int frame_rate, ret = 0;
+ if (ov5640_is_csi2(sensor))
+		return -EINVAL;
+
  	if (fi->pad != 0)
  		return -EINVAL;



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux