media: ov5640: Fix set 15fps regression
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.
--- drivers/media/i2c/ov5640.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/ov5640.c +1 -1
@@ -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
Quoted 9 lines · Jagan Teki
The
ov5640_try_frame_intervaloperation updates the FPS as per user input based on defaultov5640_frame_rate,OV5640_30_FPSwhich is failed to update when user trigger 15fps.So, initialize the default
ov5640_frame_ratetoOV5640_15_FPSso-that it can satisfy to update all fps.Fixes 5a3ad937bc78 ("media: ov5640: Make the return rate type more explicit")Signed-off-by Jagan Teki <[email protected]>
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
Quoted 9 lines · Maxime Ripard
Quoted 7 lines · Jagan Teki
The
ov5640_try_frame_intervaloperation updates the FPS as per user input based on defaultov5640_frame_rate,OV5640_30_FPSwhich is failed to update when user trigger 15fps.So, initialize the default
ov5640_frame_ratetoOV5640_15_FPSso-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")Signed-off-by Jagan Teki <[email protected]>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/commandsare 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]
Jacopo Mondi
Acked-byHi everyone,
Quoted 10 lines · Jagan Teki
Quoted 9 lines · Maxime Ripard
Quoted 7 lines · Jagan Teki
The
ov5640_try_frame_intervaloperation updates the FPS as per user input based on defaultov5640_frame_rate,OV5640_30_FPSwhich is failed to update when user trigger 15fps.So, initialize the default
ov5640_frame_ratetoOV5640_15_FPSso-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")Signed-off-by Jagan Teki <[email protected]>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/commandsare 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.0Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision0x0
driver version 5.0.0Device 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.0Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision0x0
driver version 5.0.0Device 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.0Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision0x0
driver version 5.0.0Device 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.0Media device information
------------------------
driver sun6i-csi
model Allwinner Video Capture Device
serial
bus info
hw revision0x0
driver version 5.0.0Device 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]
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_intervaloperation updates the FPS as per user input based on defaultov5640_frame_rate,OV5640_30_FPSwhich is failed to update when user trigger 15fps.So, initialize the default
ov5640_frame_ratetoOV5640_15_FPSso-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")Signed-off-by Jagan Teki <[email protected]>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/commandsare 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:Acked-by Jacopo Mondi <[email protected]>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