Skip to contentSkip to conversation

media: ov5640: Fix set 15fps regression

PATCH In review Jagan Teki 3 participants 5 messages Jan 24, 2019 – Jan 29, 2019

Subsystems (3)
lore
Share & tools
lore

Jagan Teki

author
#0 lore raw

PATCH 1/1 media: ov5640: Fix set 15fps regression

The ov5640_try_frame_interval operation updates the FPS as per user input based on default ov5640_frame_rate, OV5640_30_FPS which is failed to update when user trigger 15fps.

So, initialize the default ov5640_frame_rate to OV5640_15_FPS so-that it can satisfy to update all fps.

Fixes 5a3ad937bc78 ("media: ov5640: Make the return rate type more explicit")
---
 drivers/media/i2c/ov5640.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/ov5640.c +1 -1
index 5a909abd0a2d..4081c29176c6 100644
@@ -2072,7 +2072,7 @@ static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
 				     u32 width, u32 height)
 {
 	const struct ov5640_mode_info *mode;
-	enum ov5640_frame_rate rate = OV5640_30_FPS;
+	enum ov5640_frame_rate rate = OV5640_15_FPS;
 	int minfps, maxfps, best_fps, fps;
 	int i;
 
Signature · 1 line
2.18.0.321.gffc6fa0e3
#1 lore raw
Quoted 9 lines · Jagan Teki

The ov5640_try_frame_interval operation updates the FPS as per user input based on default ov5640_frame_rate, OV5640_30_FPS which is failed to update when user trigger 15fps.

So, initialize the default ov5640_frame_rate to OV5640_15_FPS so-that it can satisfy to update all fps.

Fixes 5a3ad937bc78 ("media: ov5640: Make the return rate type more explicit")

I'm pretty sure I tested this and it was working fine. You're mentionning a regression, but what regression is there exactly (ie, what was working before that commit that doesn't work anymore?). What tools/commands are you using to see this behaviour?

It really isn't obvious from your patch and the patch you mention what could go wrong or be improved.

Maxime

Signature · 3 lines
Maxime Ripard, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
author
#2 lore raw
Quoted 9 lines · Maxime Ripard
Quoted 7 lines · Jagan Teki

The ov5640_try_frame_interval operation updates the FPS as per user input based on default ov5640_frame_rate, OV5640_30_FPS which is failed to update when user trigger 15fps.

So, initialize the default ov5640_frame_rate to OV5640_15_FPS so-that it can satisfy to update all fps.

Quoted 7 lines
Quoted 2 lines
Fixes 5a3ad937bc78 ("media: ov5640: Make the return rate type more explicit")

I'm pretty sure I tested this and it was working fine. You're mentionning a regression, but what regression is there exactly (ie, what was working before that commit that doesn't work anymore?). What tools/commands are you using to see this behaviour?

In fact I have mentioned this on your v9 [1], may be you missed it.

I have reproduced with media-ctl, below is the full log. let me know if I still miss anything.

Before this change:

# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]
# media-ctl --set-v4l2 "'ov5640 1-003c':0[fmt:UYVY8_2X8/640x480@1/15 field:none]
"
# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]

After this change:

# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]
# media-ctl --set-v4l2 "'ov5640 1-003c':0[fmt:UYVY8_2X8/640x480@1/15 field:none]
"
# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/15 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]

[1] https://patchwork.kernel.org/patch/10708931/

Acked-by
#3 lore raw

Hi everyone,

Quoted 10 lines · Jagan Teki
Quoted 9 lines · Maxime Ripard
Quoted 7 lines · Jagan Teki

The ov5640_try_frame_interval operation updates the FPS as per user input based on default ov5640_frame_rate, OV5640_30_FPS which is failed to update when user trigger 15fps.

So, initialize the default ov5640_frame_rate to OV5640_15_FPS so-that it can satisfy to update all fps.

Quoted 8 lines
Quoted 7 lines
Quoted 2 lines
Fixes 5a3ad937bc78 ("media: ov5640: Make the return rate type more explicit")

I'm pretty sure I tested this and it was working fine. You're mentionning a regression, but what regression is there exactly (ie, what was working before that commit that doesn't work anymore?). What tools/commands are you using to see this behaviour?

I think Jagan's right, here.

For the 15FPS use case, the below condition in the for loop of ov5640_try_frame_interval() never gets satisfied (0 < 0 ?) and 'rate' retains its initial value of 30FPS.

		if (abs(curr_fps - fps) < abs(best_fps - fps)) {
			best_fps = curr_fps;
			rate = i;
		}

To make more clear what's happening, I would initialize 'rate' just before 'best_fps' before the for loop. Anyway, please add:

Maxime, does this make sense to you?

Thanks
j

Quoted 121 lines

In fact I have mentioned this on your v9 [1], may be you missed it.

I have reproduced with media-ctl, below is the full log. let me know if I still miss anything.

Before this change:

# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]
# media-ctl --set-v4l2 "'ov5640 1-003c':0[fmt:UYVY8_2X8/640x480@1/15 field:none]
"
# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]

After this change:

# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]
# media-ctl --set-v4l2 "'ov5640 1-003c':0[fmt:UYVY8_2X8/640x480@1/15 field:none]
"
# media-ctl -p
Media controller API version 5.0.0

Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision 0x0
driver version 5.0.0

Device topology
- entity 1: sun6i-csi (1 pad, 1 link)
type Node subtype V4L flags 0 device node name /dev/video0
pad0: Sink
<- "ov5640 1-003c":0 [ENABLED,IMMUTABLE]

- entity 5: ov5640 1-003c (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:UYVY8_2X8/640x480@1/15 field:none colorspace:srgb
xfer:srgb ycbcr:601 quantization:full-range]

                -> "sun6i-csi":0 [ENABLED,IMMUTABLE]

[1] https://patchwork.kernel.org/patch/10708931/

#4 lore raw
Quoted 33 lines · Jacopo Mondi

Hi everyone,

Quoted 10 lines · Jagan Teki
Quoted 9 lines · Maxime Ripard
Quoted 7 lines · Jagan Teki

The ov5640_try_frame_interval operation updates the FPS as per user input based on default ov5640_frame_rate, OV5640_30_FPS which is failed to update when user trigger 15fps.

So, initialize the default ov5640_frame_rate to OV5640_15_FPS so-that it can satisfy to update all fps.

Quoted 8 lines
Quoted 7 lines
Quoted 2 lines
Fixes 5a3ad937bc78 ("media: ov5640: Make the return rate type more explicit")

I'm pretty sure I tested this and it was working fine. You're mentionning a regression, but what regression is there exactly (ie, what was working before that commit that doesn't work anymore?). What tools/commands are you using to see this behaviour?

I think Jagan's right, here.

For the 15FPS use case, the below condition in the for loop of ov5640_try_frame_interval() never gets satisfied (0 < 0 ?) and 'rate' retains its initial value of 30FPS.

		if (abs(curr_fps - fps) < abs(best_fps - fps)) {
			best_fps = curr_fps;
			rate = i;
		}
Quoted 5 lines

To make more clear what's happening, I would initialize 'rate' just before 'best_fps' before the for loop. Anyway, please add:

Maxime, does this make sense to you?

With that explanation in the commit log, yes.

Maxime

Signature · 3 lines
Maxime Ripard, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com