mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-17 05:45:20 +00:00
media: ov5640: Remove frame rate check from find_mode()
The current implementation of ov5640_find_mode() fails if the frame rate programmed with s_frame_interval doesn't match the maximum frame rate for the current mode. This causes issues when moving from one mode with higher FPS to another one which only supports a lower FPS range with tools like media-ctl. It also forces users that do not use s_frame_interval(), but rather configure blankings explicitly, to adjust the programmed FPS range to avoid failures. For this reason, remove the FPS check from ov5640_find_mode() and only perform it at s_frame_interval() time. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
19f2e3e63d
commit
b6ae502297
@ -1995,8 +1995,7 @@ static int ov5640_set_virtual_channel(struct ov5640_dev *sensor)
|
||||
}
|
||||
|
||||
static const struct ov5640_mode_info *
|
||||
ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
|
||||
int width, int height, bool nearest)
|
||||
ov5640_find_mode(struct ov5640_dev *sensor, int width, int height, bool nearest)
|
||||
{
|
||||
const struct ov5640_mode_info *mode;
|
||||
|
||||
@ -2009,10 +2008,6 @@ 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 */
|
||||
if (ov5640_framerates[fr] > ov5640_framerates[mode->max_fps])
|
||||
return NULL;
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
@ -2649,7 +2644,7 @@ static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
|
||||
fi->denominator = best_fps;
|
||||
|
||||
find_mode:
|
||||
mode = ov5640_find_mode(sensor, rate, width, height, false);
|
||||
mode = ov5640_find_mode(sensor, width, height, false);
|
||||
return mode ? rate : -EINVAL;
|
||||
}
|
||||
|
||||
@ -2687,7 +2682,7 @@ static int ov5640_try_fmt_internal(struct v4l2_subdev *sd,
|
||||
const struct ov5640_mode_info *mode;
|
||||
int i;
|
||||
|
||||
mode = ov5640_find_mode(sensor, fr, fmt->width, fmt->height, true);
|
||||
mode = ov5640_find_mode(sensor, fmt->width, fmt->height, true);
|
||||
if (!mode)
|
||||
return -EINVAL;
|
||||
fmt->width = mode->width;
|
||||
@ -3481,13 +3476,17 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
|
||||
goto out;
|
||||
}
|
||||
|
||||
mode = ov5640_find_mode(sensor, frame_rate, mode->width,
|
||||
mode->height, true);
|
||||
mode = ov5640_find_mode(sensor, mode->width, mode->height, true);
|
||||
if (!mode) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ov5640_framerates[frame_rate] > ov5640_framerates[mode->max_fps]) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (mode != sensor->current_mode ||
|
||||
frame_rate != sensor->current_fr) {
|
||||
sensor->current_fr = frame_rate;
|
||||
|
Loading…
x
Reference in New Issue
Block a user