aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0734-media-i2c-ov7251-Set-VTS-instead-of-having-full-tabl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0734-media-i2c-ov7251-Set-VTS-instead-of-having-full-tabl.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0734-media-i2c-ov7251-Set-VTS-instead-of-having-full-tabl.patch373
1 files changed, 373 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0734-media-i2c-ov7251-Set-VTS-instead-of-having-full-tabl.patch b/target/linux/bcm27xx/patches-5.15/950-0734-media-i2c-ov7251-Set-VTS-instead-of-having-full-tabl.patch
new file mode 100644
index 0000000000..3e08ae27a6
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0734-media-i2c-ov7251-Set-VTS-instead-of-having-full-tabl.patch
@@ -0,0 +1,373 @@
+From 26934caec8e9a365d71e437333998002b2f2879c Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Thu, 17 Feb 2022 16:24:51 +0000
+Subject: [PATCH] media: i2c: ov7251: Set VTS instead of having full
+ tables for FPS.
+
+The driver did have a full copy of the registers for each of
+the 30, 60, and 90 fps modes. The main difference between them were
+registers 0x380e/f which set the total height of the frame (VTS).
+
+Remove the excess register settings, and Set that register value
+explicitly for each mode.
+
+This has dropped a change for the 30fps mode to registers 0x3016,
+0x3017, 0x3018, 0x301a, 0x301b, and 0x301c. The data available
+doesn't describe these registers, but the sensor seems fully
+functional without the alternate settings.
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+---
+ drivers/media/i2c/ov7251.c | 286 +++----------------------------------
+ 1 file changed, 21 insertions(+), 265 deletions(-)
+
+--- a/drivers/media/i2c/ov7251.c
++++ b/drivers/media/i2c/ov7251.c
+@@ -39,6 +39,8 @@
+ #define OV7251_AEC_AGC_ADJ_1 0x350b
+ /* HTS is registers 0x380c and 0x380d */
+ #define OV7251_HTS 0x3a0
++#define OV7251_VTS_HIGH 0x380e
++#define OV7251_VTS_LOW 0x380f
+ #define OV7251_TIMING_FORMAT1 0x3820
+ #define OV7251_TIMING_FORMAT1_VFLIP BIT(2)
+ #define OV7251_TIMING_FORMAT2 0x3821
+@@ -82,6 +84,7 @@ struct ov7251_mode_info {
+ u32 data_size;
+ u16 exposure_max;
+ u16 exposure_def;
++ u16 vts;
+ struct v4l2_fract timeperframe;
+ };
+
+@@ -204,263 +207,7 @@ static const struct reg_value ov7251_glo
+ { 0x303b, 0x02 },
+ };
+
+-static const struct reg_value ov7251_setting_vga_30fps[] = {
+- { 0x3005, 0x00 },
+- { 0x3012, 0xc0 },
+- { 0x3013, 0xd2 },
+- { 0x3014, 0x04 },
+- { 0x3016, 0xf0 },
+- { 0x3017, 0xf0 },
+- { 0x3018, 0xf0 },
+- { 0x301a, 0xf0 },
+- { 0x301b, 0xf0 },
+- { 0x301c, 0xf0 },
+- { 0x3023, 0x05 },
+- { 0x3037, 0xf0 },
+- { 0x3106, 0xda },
+- { 0x3503, 0x07 },
+- { 0x3509, 0x10 },
+- { 0x3600, 0x1c },
+- { 0x3602, 0x62 },
+- { 0x3620, 0xb7 },
+- { 0x3622, 0x04 },
+- { 0x3626, 0x21 },
+- { 0x3627, 0x30 },
+- { 0x3630, 0x44 },
+- { 0x3631, 0x35 },
+- { 0x3634, 0x60 },
+- { 0x3636, 0x00 },
+- { 0x3662, 0x01 },
+- { 0x3663, 0x70 },
+- { 0x3664, 0x50 },
+- { 0x3666, 0x0a },
+- { 0x3669, 0x1a },
+- { 0x366a, 0x00 },
+- { 0x366b, 0x50 },
+- { 0x3673, 0x01 },
+- { 0x3674, 0xff },
+- { 0x3675, 0x03 },
+- { 0x3705, 0xc1 },
+- { 0x3709, 0x40 },
+- { 0x373c, 0x08 },
+- { 0x3742, 0x00 },
+- { 0x3757, 0xb3 },
+- { 0x3788, 0x00 },
+- { 0x37a8, 0x01 },
+- { 0x37a9, 0xc0 },
+- { 0x3800, 0x00 },
+- { 0x3801, 0x04 },
+- { 0x3802, 0x00 },
+- { 0x3803, 0x04 },
+- { 0x3804, 0x02 },
+- { 0x3805, 0x8b },
+- { 0x3806, 0x01 },
+- { 0x3807, 0xeb },
+- { 0x3808, 0x02 }, /* width high */
+- { 0x3809, 0x80 }, /* width low */
+- { 0x380a, 0x01 }, /* height high */
+- { 0x380b, 0xe0 }, /* height low */
+- { 0x380c, 0x03 }, /* total horiz timing high */
+- { 0x380d, 0xa0 }, /* total horiz timing low */
+- { 0x380e, 0x06 }, /* total vertical timing high */
+- { 0x380f, 0xbc }, /* total vertical timing low */
+- { 0x3810, 0x00 },
+- { 0x3811, 0x04 },
+- { 0x3812, 0x00 },
+- { 0x3813, 0x05 },
+- { 0x3814, 0x11 },
+- { 0x3815, 0x11 },
+- { 0x3820, 0x40 },
+- { 0x3821, 0x00 },
+- { 0x382f, 0x0e },
+- { 0x3832, 0x00 },
+- { 0x3833, 0x05 },
+- { 0x3834, 0x00 },
+- { 0x3835, 0x0c },
+- { 0x3837, 0x00 },
+- { 0x3b80, 0x00 },
+- { 0x3b81, 0xa5 },
+- { 0x3b82, 0x10 },
+- { 0x3b83, 0x00 },
+- { 0x3b84, 0x08 },
+- { 0x3b85, 0x00 },
+- { 0x3b86, 0x01 },
+- { 0x3b87, 0x00 },
+- { 0x3b88, 0x00 },
+- { 0x3b89, 0x00 },
+- { 0x3b8a, 0x00 },
+- { 0x3b8b, 0x05 },
+- { 0x3b8c, 0x00 },
+- { 0x3b8d, 0x00 },
+- { 0x3b8e, 0x00 },
+- { 0x3b8f, 0x1a },
+- { 0x3b94, 0x05 },
+- { 0x3b95, 0xf2 },
+- { 0x3b96, 0x40 },
+- { 0x3c00, 0x89 },
+- { 0x3c01, 0x63 },
+- { 0x3c02, 0x01 },
+- { 0x3c03, 0x00 },
+- { 0x3c04, 0x00 },
+- { 0x3c05, 0x03 },
+- { 0x3c06, 0x00 },
+- { 0x3c07, 0x06 },
+- { 0x3c0c, 0x01 },
+- { 0x3c0d, 0xd0 },
+- { 0x3c0e, 0x02 },
+- { 0x3c0f, 0x0a },
+- { 0x4001, 0x42 },
+- { 0x4004, 0x04 },
+- { 0x4005, 0x00 },
+- { 0x404e, 0x01 },
+- { 0x4300, 0xff },
+- { 0x4301, 0x00 },
+- { 0x4315, 0x00 },
+- { 0x4501, 0x48 },
+- { 0x4600, 0x00 },
+- { 0x4601, 0x4e },
+- { 0x4801, 0x0f },
+- { 0x4806, 0x0f },
+- { 0x4819, 0xaa },
+- { 0x4823, 0x3e },
+- { 0x4837, 0x19 },
+- { 0x4a0d, 0x00 },
+- { 0x4a47, 0x7f },
+- { 0x4a49, 0xf0 },
+- { 0x4a4b, 0x30 },
+- { 0x5000, 0x85 },
+- { 0x5001, 0x80 },
+-};
+-
+-static const struct reg_value ov7251_setting_vga_60fps[] = {
+- { 0x3005, 0x00 },
+- { 0x3012, 0xc0 },
+- { 0x3013, 0xd2 },
+- { 0x3014, 0x04 },
+- { 0x3016, 0x10 },
+- { 0x3017, 0x00 },
+- { 0x3018, 0x00 },
+- { 0x301a, 0x00 },
+- { 0x301b, 0x00 },
+- { 0x301c, 0x00 },
+- { 0x3023, 0x05 },
+- { 0x3037, 0xf0 },
+- { 0x3106, 0xda },
+- { 0x3503, 0x07 },
+- { 0x3509, 0x10 },
+- { 0x3600, 0x1c },
+- { 0x3602, 0x62 },
+- { 0x3620, 0xb7 },
+- { 0x3622, 0x04 },
+- { 0x3626, 0x21 },
+- { 0x3627, 0x30 },
+- { 0x3630, 0x44 },
+- { 0x3631, 0x35 },
+- { 0x3634, 0x60 },
+- { 0x3636, 0x00 },
+- { 0x3662, 0x01 },
+- { 0x3663, 0x70 },
+- { 0x3664, 0x50 },
+- { 0x3666, 0x0a },
+- { 0x3669, 0x1a },
+- { 0x366a, 0x00 },
+- { 0x366b, 0x50 },
+- { 0x3673, 0x01 },
+- { 0x3674, 0xff },
+- { 0x3675, 0x03 },
+- { 0x3705, 0xc1 },
+- { 0x3709, 0x40 },
+- { 0x373c, 0x08 },
+- { 0x3742, 0x00 },
+- { 0x3757, 0xb3 },
+- { 0x3788, 0x00 },
+- { 0x37a8, 0x01 },
+- { 0x37a9, 0xc0 },
+- { 0x3800, 0x00 },
+- { 0x3801, 0x04 },
+- { 0x3802, 0x00 },
+- { 0x3803, 0x04 },
+- { 0x3804, 0x02 },
+- { 0x3805, 0x8b },
+- { 0x3806, 0x01 },
+- { 0x3807, 0xeb },
+- { 0x3808, 0x02 }, /* width high */
+- { 0x3809, 0x80 }, /* width low */
+- { 0x380a, 0x01 }, /* height high */
+- { 0x380b, 0xe0 }, /* height low */
+- { 0x380c, 0x03 }, /* total horiz timing high */
+- { 0x380d, 0xa0 }, /* total horiz timing low */
+- { 0x380e, 0x03 }, /* total vertical timing high */
+- { 0x380f, 0x5c }, /* total vertical timing low */
+- { 0x3810, 0x00 },
+- { 0x3811, 0x04 },
+- { 0x3812, 0x00 },
+- { 0x3813, 0x05 },
+- { 0x3814, 0x11 },
+- { 0x3815, 0x11 },
+- { 0x3820, 0x40 },
+- { 0x3821, 0x00 },
+- { 0x382f, 0x0e },
+- { 0x3832, 0x00 },
+- { 0x3833, 0x05 },
+- { 0x3834, 0x00 },
+- { 0x3835, 0x0c },
+- { 0x3837, 0x00 },
+- { 0x3b80, 0x00 },
+- { 0x3b81, 0xa5 },
+- { 0x3b82, 0x10 },
+- { 0x3b83, 0x00 },
+- { 0x3b84, 0x08 },
+- { 0x3b85, 0x00 },
+- { 0x3b86, 0x01 },
+- { 0x3b87, 0x00 },
+- { 0x3b88, 0x00 },
+- { 0x3b89, 0x00 },
+- { 0x3b8a, 0x00 },
+- { 0x3b8b, 0x05 },
+- { 0x3b8c, 0x00 },
+- { 0x3b8d, 0x00 },
+- { 0x3b8e, 0x00 },
+- { 0x3b8f, 0x1a },
+- { 0x3b94, 0x05 },
+- { 0x3b95, 0xf2 },
+- { 0x3b96, 0x40 },
+- { 0x3c00, 0x89 },
+- { 0x3c01, 0x63 },
+- { 0x3c02, 0x01 },
+- { 0x3c03, 0x00 },
+- { 0x3c04, 0x00 },
+- { 0x3c05, 0x03 },
+- { 0x3c06, 0x00 },
+- { 0x3c07, 0x06 },
+- { 0x3c0c, 0x01 },
+- { 0x3c0d, 0xd0 },
+- { 0x3c0e, 0x02 },
+- { 0x3c0f, 0x0a },
+- { 0x4001, 0x42 },
+- { 0x4004, 0x04 },
+- { 0x4005, 0x00 },
+- { 0x404e, 0x01 },
+- { 0x4300, 0xff },
+- { 0x4301, 0x00 },
+- { 0x4315, 0x00 },
+- { 0x4501, 0x48 },
+- { 0x4600, 0x00 },
+- { 0x4601, 0x4e },
+- { 0x4801, 0x0f },
+- { 0x4806, 0x0f },
+- { 0x4819, 0xaa },
+- { 0x4823, 0x3e },
+- { 0x4837, 0x19 },
+- { 0x4a0d, 0x00 },
+- { 0x4a47, 0x7f },
+- { 0x4a49, 0xf0 },
+- { 0x4a4b, 0x30 },
+- { 0x5000, 0x85 },
+- { 0x5001, 0x80 },
+-};
+-
+-static const struct reg_value ov7251_setting_vga_90fps[] = {
++static const struct reg_value ov7251_setting_vga[] = {
+ { 0x3005, 0x00 },
+ { 0x3012, 0xc0 },
+ { 0x3013, 0xd2 },
+@@ -518,8 +265,6 @@ static const struct reg_value ov7251_set
+ { 0x380b, 0xe0 }, /* height low */
+ { 0x380c, 0x03 }, /* total horiz timing high */
+ { 0x380d, 0xa0 }, /* total horiz timing low */
+- { 0x380e, 0x02 }, /* total vertical timing high */
+- { 0x380f, 0x3c }, /* total vertical timing low */
+ { 0x3810, 0x00 },
+ { 0x3811, 0x04 },
+ { 0x3812, 0x00 },
+@@ -601,10 +346,11 @@ static const struct ov7251_mode_info ov7
+ {
+ .width = 640,
+ .height = 480,
+- .data = ov7251_setting_vga_30fps,
+- .data_size = ARRAY_SIZE(ov7251_setting_vga_30fps),
++ .data = ov7251_setting_vga,
++ .data_size = ARRAY_SIZE(ov7251_setting_vga),
+ .exposure_max = 1704,
+ .exposure_def = 504,
++ .vts = 0x6bc,
+ .timeperframe = {
+ .numerator = 100,
+ .denominator = 3000
+@@ -613,10 +359,11 @@ static const struct ov7251_mode_info ov7
+ {
+ .width = 640,
+ .height = 480,
+- .data = ov7251_setting_vga_60fps,
+- .data_size = ARRAY_SIZE(ov7251_setting_vga_60fps),
++ .data = ov7251_setting_vga,
++ .data_size = ARRAY_SIZE(ov7251_setting_vga),
+ .exposure_max = 840,
+ .exposure_def = 504,
++ .vts = 0x35c,
+ .timeperframe = {
+ .numerator = 100,
+ .denominator = 6014
+@@ -625,10 +372,11 @@ static const struct ov7251_mode_info ov7
+ {
+ .width = 640,
+ .height = 480,
+- .data = ov7251_setting_vga_90fps,
+- .data_size = ARRAY_SIZE(ov7251_setting_vga_90fps),
++ .data = ov7251_setting_vga,
++ .data_size = ARRAY_SIZE(ov7251_setting_vga),
+ .exposure_max = 552,
+ .exposure_def = 504,
++ .vts = 0x23c,
+ .timeperframe = {
+ .numerator = 100,
+ .denominator = 9043
+@@ -1289,6 +1037,14 @@ static int ov7251_s_stream(struct v4l2_s
+ ov7251->current_mode->height);
+ goto err_power_down;
+ }
++ ret = ov7251_write_reg(ov7251, OV7251_VTS_HIGH,
++ ov7251->current_mode->vts >> 8);
++ if (ret)
++ goto err_power_down;
++ ret = ov7251_write_reg(ov7251, OV7251_VTS_LOW,
++ ov7251->current_mode->vts & 0xff);
++ if (ret)
++ goto err_power_down;
+ ret = __v4l2_ctrl_handler_setup(&ov7251->ctrls);
+ if (ret < 0) {
+ dev_err(ov7251->dev, "could not sync v4l2 controls\n");