mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 06:34:11 +08:00
media: ov5640: Make the FPS clamping / rounding more extendable
The current code uses an algorithm to clamp the FPS values and round them to the closest supported one that isn't really allows to be extended to more than two values. Rework it a bit to make it much easier to extend the amount of FPS options we support. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Tested-by: Adam Ford <aford173@gmail.com> #imx6dq Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
5a3ad937bc
commit
f6cc192fbf
@ -2053,7 +2053,8 @@ static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
|
|||||||
{
|
{
|
||||||
const struct ov5640_mode_info *mode;
|
const struct ov5640_mode_info *mode;
|
||||||
enum ov5640_frame_rate rate = OV5640_30_FPS;
|
enum ov5640_frame_rate rate = OV5640_30_FPS;
|
||||||
u32 minfps, maxfps, fps;
|
int minfps, maxfps, best_fps, fps;
|
||||||
|
int i;
|
||||||
|
|
||||||
minfps = ov5640_framerates[OV5640_15_FPS];
|
minfps = ov5640_framerates[OV5640_15_FPS];
|
||||||
maxfps = ov5640_framerates[OV5640_30_FPS];
|
maxfps = ov5640_framerates[OV5640_30_FPS];
|
||||||
@ -2064,19 +2065,21 @@ static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
|
|||||||
return OV5640_30_FPS;
|
return OV5640_30_FPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
fps = DIV_ROUND_CLOSEST(fi->denominator, fi->numerator);
|
fps = clamp_val(DIV_ROUND_CLOSEST(fi->denominator, fi->numerator),
|
||||||
|
minfps, maxfps);
|
||||||
|
|
||||||
|
best_fps = minfps;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(ov5640_framerates); i++) {
|
||||||
|
int curr_fps = ov5640_framerates[i];
|
||||||
|
|
||||||
|
if (abs(curr_fps - fps) < abs(best_fps - fps)) {
|
||||||
|
best_fps = curr_fps;
|
||||||
|
rate = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fi->numerator = 1;
|
fi->numerator = 1;
|
||||||
if (fps > maxfps)
|
fi->denominator = best_fps;
|
||||||
fi->denominator = maxfps;
|
|
||||||
else if (fps < minfps)
|
|
||||||
fi->denominator = minfps;
|
|
||||||
else if (2 * fps >= 2 * minfps + (maxfps - minfps))
|
|
||||||
fi->denominator = maxfps;
|
|
||||||
else
|
|
||||||
fi->denominator = minfps;
|
|
||||||
|
|
||||||
rate = (fi->denominator == minfps) ? OV5640_15_FPS : OV5640_30_FPS;
|
|
||||||
|
|
||||||
mode = ov5640_find_mode(sensor, rate, width, height, false);
|
mode = ov5640_find_mode(sensor, rate, width, height, false);
|
||||||
return mode ? rate : -EINVAL;
|
return mode ? rate : -EINVAL;
|
||||||
|
Loading…
Reference in New Issue
Block a user