diff options
author | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-16 23:40:32 +0200 |
---|---|---|
committer | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-17 15:11:22 +0200 |
commit | 20ea6adbf199097c4f5f591ffee088340630dae4 (patch) | |
tree | d6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0736-media-i2c-ov7251-Separate-modes-from-frame-intervals.patch | |
parent | bca05bd072180dc38ef740b37ded9572a6db1981 (diff) | |
download | upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2 upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip |
bcm27xx: add support for linux v5.15
Build system: x86_64
Build-tested: bcm2708, bcm2709, bcm2710, bcm2711
Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B
Signed-off-by: Marty Jones <mj8263788@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0736-media-i2c-ov7251-Separate-modes-from-frame-intervals.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0736-media-i2c-ov7251-Separate-modes-from-frame-intervals.patch | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0736-media-i2c-ov7251-Separate-modes-from-frame-intervals.patch b/target/linux/bcm27xx/patches-5.15/950-0736-media-i2c-ov7251-Separate-modes-from-frame-intervals.patch new file mode 100644 index 0000000000..6ad35fda06 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0736-media-i2c-ov7251-Separate-modes-from-frame-intervals.patch @@ -0,0 +1,234 @@ +From 65e773354de288401a6c498d006b47b7f87e0936 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson <dave.stevenson@raspberrypi.com> +Date: Thu, 17 Feb 2022 17:00:27 +0000 +Subject: [PATCH] media: i2c: ov7251: Separate modes from frame + intervals + +The modes and frame intervals are independent, therefore +separate them into 2 structures. + +Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> +--- + drivers/media/i2c/ov7251.c | 85 ++++++++++++++++++-------------------- + 1 file changed, 41 insertions(+), 44 deletions(-) + +--- a/drivers/media/i2c/ov7251.c ++++ b/drivers/media/i2c/ov7251.c +@@ -79,14 +79,17 @@ struct reg_value { + u8 val; + }; + ++struct ov7251_frame_ival_info { ++ u16 vts; ++ struct v4l2_fract timeperframe; ++}; ++ + struct ov7251_mode_info { + u32 width; + u32 height; + const struct reg_value *data; + u32 data_size; + u16 exposure_def; +- u16 vts; +- struct v4l2_fract timeperframe; + }; + + struct ov7251_pll1_config { +@@ -128,6 +131,7 @@ struct ov7251 { + struct regulator *analog_regulator; + + const struct ov7251_mode_info *current_mode; ++ const struct ov7251_frame_ival_info *current_ival; + + struct v4l2_ctrl_handler ctrls; + struct v4l2_ctrl *exposure; +@@ -343,13 +347,8 @@ static const s64 link_freq[] = { + 240000000, + }; + +-static const struct ov7251_mode_info ov7251_mode_info_data[] = { ++static const struct ov7251_frame_ival_info ov7251_frame_ival_info_data[] = { + { +- .width = 640, +- .height = 480, +- .data = ov7251_setting_vga, +- .data_size = ARRAY_SIZE(ov7251_setting_vga), +- .exposure_def = 504, + .vts = 0x6bc, + .timeperframe = { + .numerator = 100, +@@ -357,11 +356,6 @@ static const struct ov7251_mode_info ov7 + } + }, + { +- .width = 640, +- .height = 480, +- .data = ov7251_setting_vga, +- .data_size = ARRAY_SIZE(ov7251_setting_vga), +- .exposure_def = 504, + .vts = 0x35c, + .timeperframe = { + .numerator = 100, +@@ -369,11 +363,6 @@ static const struct ov7251_mode_info ov7 + } + }, + { +- .width = 640, +- .height = 480, +- .data = ov7251_setting_vga, +- .data_size = ARRAY_SIZE(ov7251_setting_vga), +- .exposure_def = 504, + .vts = 0x23c, + .timeperframe = { + .numerator = 100, +@@ -382,6 +371,16 @@ static const struct ov7251_mode_info ov7 + }, + }; + ++static const struct ov7251_mode_info ov7251_mode_info_data[] = { ++ { ++ .width = 640, ++ .height = 480, ++ .data = ov7251_setting_vga, ++ .data_size = ARRAY_SIZE(ov7251_setting_vga), ++ .exposure_def = 504, ++ }, ++}; ++ + static int ov7251_regulators_enable(struct ov7251 *ov7251) + { + int ret; +@@ -789,13 +788,13 @@ static int ov7251_enum_frame_ival(struct + unsigned int index = fie->index; + unsigned int i; + +- for (i = 0; i < ARRAY_SIZE(ov7251_mode_info_data); i++) { +- if (fie->width != ov7251_mode_info_data[i].width || +- fie->height != ov7251_mode_info_data[i].height) ++ for (i = 0; i < ARRAY_SIZE(ov7251_frame_ival_info_data); i++) { ++ if (fie->width != ov7251_mode_info_data[0].width || ++ fie->height != ov7251_mode_info_data[0].height) + continue; + + if (index-- == 0) { +- fie->interval = ov7251_mode_info_data[i].timeperframe; ++ fie->interval = ov7251_frame_ival_info_data[i].timeperframe; + return 0; + } + } +@@ -854,23 +853,18 @@ static inline u32 avg_fps(const struct v + return (t->denominator + (t->numerator >> 1)) / t->numerator; + } + +-static const struct ov7251_mode_info * +-ov7251_find_mode_by_ival(struct ov7251 *ov7251, struct v4l2_fract *timeperframe) ++static const struct ov7251_frame_ival_info * ++ov7251_find_frame_ival_by_ival(struct ov7251 *ov7251, struct v4l2_fract *timeperframe) + { +- const struct ov7251_mode_info *mode = ov7251->current_mode; + unsigned int fps_req = avg_fps(timeperframe); + unsigned int max_dist_match = (unsigned int) -1; + unsigned int i, n = 0; + +- for (i = 0; i < ARRAY_SIZE(ov7251_mode_info_data); i++) { ++ for (i = 0; i < ARRAY_SIZE(ov7251_frame_ival_info_data); i++) { + unsigned int dist; + unsigned int fps_tmp; + +- if (mode->width != ov7251_mode_info_data[i].width || +- mode->height != ov7251_mode_info_data[i].height) +- continue; +- +- fps_tmp = avg_fps(&ov7251_mode_info_data[i].timeperframe); ++ fps_tmp = avg_fps(&ov7251_frame_ival_info_data[i].timeperframe); + + dist = abs(fps_req - fps_tmp); + +@@ -880,7 +874,7 @@ ov7251_find_mode_by_ival(struct ov7251 * + } + } + +- return &ov7251_mode_info_data[n]; ++ return &ov7251_frame_ival_info_data[n]; + } + + static int ov7251_set_format(struct v4l2_subdev *sd, +@@ -914,7 +908,8 @@ static int ov7251_set_format(struct v4l2 + __v4l2_ctrl_s_ctrl(ov7251->hblank, h_blank); + + ret = __v4l2_ctrl_modify_range(ov7251->exposure, 1, +- new_mode->vts - OV7251_EXPOSURE_OFFSET, ++ ov7251->current_ival->vts - ++ OV7251_EXPOSURE_OFFSET, + 1, new_mode->exposure_def); + if (ret < 0) + goto exit; +@@ -1036,11 +1031,11 @@ static int ov7251_s_stream(struct v4l2_s + goto err_power_down; + } + ret = ov7251_write_reg(ov7251, OV7251_VTS_HIGH, +- ov7251->current_mode->vts >> 8); ++ ov7251->current_ival->vts >> 8); + if (ret) + goto err_power_down; + ret = ov7251_write_reg(ov7251, OV7251_VTS_LOW, +- ov7251->current_mode->vts & 0xff); ++ ov7251->current_ival->vts & 0xff); + if (ret) + goto err_power_down; + ret = __v4l2_ctrl_handler_setup(&ov7251->ctrls); +@@ -1073,7 +1068,7 @@ static int ov7251_get_frame_interval(str + struct ov7251 *ov7251 = to_ov7251(subdev); + + mutex_lock(&ov7251->lock); +- fi->interval = ov7251->current_mode->timeperframe; ++ fi->interval = ov7251->current_ival->timeperframe; + mutex_unlock(&ov7251->lock); + + return 0; +@@ -1083,28 +1078,29 @@ static int ov7251_set_frame_interval(str + struct v4l2_subdev_frame_interval *fi) + { + struct ov7251 *ov7251 = to_ov7251(subdev); +- const struct ov7251_mode_info *new_mode; ++ const struct ov7251_frame_ival_info *new_ival; + int ret = 0; + + mutex_lock(&ov7251->lock); +- new_mode = ov7251_find_mode_by_ival(ov7251, &fi->interval); ++ new_ival = ov7251_find_frame_ival_by_ival(ov7251, &fi->interval); + +- if (new_mode != ov7251->current_mode) { ++ if (new_ival != ov7251->current_ival) { + ret = __v4l2_ctrl_modify_range(ov7251->exposure, 1, +- new_mode->vts - OV7251_EXPOSURE_OFFSET, +- 1, new_mode->exposure_def); ++ new_ival->vts - ++ OV7251_EXPOSURE_OFFSET, ++ 1, ov7251->current_mode->exposure_def); + if (ret < 0) + goto exit; + + ret = __v4l2_ctrl_s_ctrl(ov7251->exposure, +- new_mode->exposure_def); ++ ov7251->current_mode->exposure_def); + if (ret < 0) + goto exit; + +- ov7251->current_mode = new_mode; ++ ov7251->current_ival = new_ival; + } + +- fi->interval = ov7251->current_mode->timeperframe; ++ fi->interval = ov7251->current_ival->timeperframe; + + exit: + mutex_unlock(&ov7251->lock); +@@ -1316,6 +1312,7 @@ static int ov7251_probe(struct i2c_clien + mutex_init(&ov7251->lock); + + ov7251->current_mode = &ov7251_mode_info_data[0]; ++ ov7251->current_ival = &ov7251_frame_ival_info_data[0]; + + v4l2_ctrl_handler_init(&ov7251->ctrls, 10); + ov7251->ctrls.lock = &ov7251->lock; |