Adds latest 6.6 patches from the Raspberry Pi repository. These patches were generated from: https://github.com/raspberrypi/linux/commits/rpi-6.6.y/ With the following command: git format-patch -N v6.6.83..HEAD (HEAD -> 08d4e8f52256bd422d8a1f876411603f627d0a82) Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
137 lines
4.2 KiB
Diff
137 lines
4.2 KiB
Diff
From 0292614f8cd061f71f975dae7d74fe5324545321 Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
Date: Thu, 2 Jan 2025 12:43:01 +0000
|
|
Subject: [PATCH] media: i2c: imx415: Link frequencies are not exclusive to num
|
|
lanes
|
|
|
|
The link frequencies are equally valid in 2 or 4 lane modes, but
|
|
they change the hmax_min value for the mode as the MIPI block
|
|
has to have sufficient time to send the pixel data for each line.
|
|
|
|
Remove the association with number of lanes, and add hmax_min
|
|
configuration for both lane options.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
---
|
|
drivers/media/i2c/imx415.c | 49 +++++++++++++++++---------------------
|
|
1 file changed, 22 insertions(+), 27 deletions(-)
|
|
|
|
--- a/drivers/media/i2c/imx415.c
|
|
+++ b/drivers/media/i2c/imx415.c
|
|
@@ -462,9 +462,8 @@ static const struct imx415_clk_params im
|
|
},
|
|
};
|
|
|
|
-/* all-pixel 2-lane 720 Mbps 15.74 Hz mode */
|
|
-static const struct imx415_reg imx415_mode_2_720[] = {
|
|
- { IMX415_LANEMODE, IMX415_LANEMODE_2 },
|
|
+/* 720 Mbps CSI configuration */
|
|
+static const struct imx415_reg imx415_linkrate_720mbps[] = {
|
|
{ IMX415_TCLKPOST, 0x006F },
|
|
{ IMX415_TCLKPREPARE, 0x002F },
|
|
{ IMX415_TCLKTRAIL, 0x002F },
|
|
@@ -476,9 +475,8 @@ static const struct imx415_reg imx415_mo
|
|
{ IMX415_TLPX, 0x0027 },
|
|
};
|
|
|
|
-/* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */
|
|
-static const struct imx415_reg imx415_mode_2_1440[] = {
|
|
- { IMX415_LANEMODE, IMX415_LANEMODE_2 },
|
|
+/* 1440 Mbps CSI configuration */
|
|
+static const struct imx415_reg imx415_linkrate_1440mbps[] = {
|
|
{ IMX415_TCLKPOST, 0x009F },
|
|
{ IMX415_TCLKPREPARE, 0x0057 },
|
|
{ IMX415_TCLKTRAIL, 0x0057 },
|
|
@@ -490,9 +488,8 @@ static const struct imx415_reg imx415_mo
|
|
{ IMX415_TLPX, 0x004F },
|
|
};
|
|
|
|
-/* all-pixel 4-lane 891 Mbps 30 Hz mode */
|
|
-static const struct imx415_reg imx415_mode_4_891[] = {
|
|
- { IMX415_LANEMODE, IMX415_LANEMODE_4 },
|
|
+/* 891 Mbps */
|
|
+static const struct imx415_reg imx415_linkrate_891mbps[] = {
|
|
{ IMX415_TCLKPOST, 0x007F },
|
|
{ IMX415_TCLKPREPARE, 0x0037 },
|
|
{ IMX415_TCLKTRAIL, 0x0037 },
|
|
@@ -511,8 +508,7 @@ struct imx415_mode_reg_list {
|
|
|
|
struct imx415_mode {
|
|
u64 lane_rate;
|
|
- u32 lanes;
|
|
- u32 hmax_min;
|
|
+ u32 hmax_min[2];
|
|
struct imx415_mode_reg_list reg_list;
|
|
};
|
|
|
|
@@ -520,29 +516,26 @@ struct imx415_mode {
|
|
static const struct imx415_mode supported_modes[] = {
|
|
{
|
|
.lane_rate = 720000000,
|
|
- .lanes = 2,
|
|
- .hmax_min = 2032,
|
|
+ .hmax_min = { 2032, 1066 },
|
|
.reg_list = {
|
|
- .num_of_regs = ARRAY_SIZE(imx415_mode_2_720),
|
|
- .regs = imx415_mode_2_720,
|
|
+ .num_of_regs = ARRAY_SIZE(imx415_linkrate_720mbps),
|
|
+ .regs = imx415_linkrate_720mbps,
|
|
},
|
|
},
|
|
{
|
|
.lane_rate = 1440000000,
|
|
- .lanes = 2,
|
|
- .hmax_min = 1066,
|
|
+ .hmax_min = { 1066, 533 },
|
|
.reg_list = {
|
|
- .num_of_regs = ARRAY_SIZE(imx415_mode_2_1440),
|
|
- .regs = imx415_mode_2_1440,
|
|
+ .num_of_regs = ARRAY_SIZE(imx415_linkrate_1440mbps),
|
|
+ .regs = imx415_linkrate_1440mbps,
|
|
},
|
|
},
|
|
{
|
|
.lane_rate = 891000000,
|
|
- .lanes = 4,
|
|
- .hmax_min = 1100,
|
|
+ .hmax_min = { 1100, 550 },
|
|
.reg_list = {
|
|
- .num_of_regs = ARRAY_SIZE(imx415_mode_4_891),
|
|
- .regs = imx415_mode_4_891,
|
|
+ .num_of_regs = ARRAY_SIZE(imx415_linkrate_891mbps),
|
|
+ .regs = imx415_linkrate_891mbps,
|
|
},
|
|
},
|
|
};
|
|
@@ -876,7 +869,7 @@ static int imx415_ctrls_init(struct imx4
|
|
IMX415_AGAIN_MAX, IMX415_AGAIN_STEP,
|
|
IMX415_AGAIN_MIN);
|
|
|
|
- hblank_min = (supported_modes[sensor->cur_mode].hmax_min *
|
|
+ hblank_min = (supported_modes[sensor->cur_mode].hmax_min[sensor->num_data_lanes == 2 ? 0 : 1] *
|
|
IMX415_HMAX_MULTIPLIER) - IMX415_PIXEL_ARRAY_WIDTH;
|
|
hblank_max = (IMX415_HMAX_MAX * IMX415_HMAX_MULTIPLIER) -
|
|
IMX415_PIXEL_ARRAY_WIDTH;
|
|
@@ -944,7 +937,11 @@ static int imx415_set_mode(struct imx415
|
|
return ret;
|
|
}
|
|
|
|
- return 0;
|
|
+ ret = imx415_write(sensor, IMX415_LANEMODE,
|
|
+ sensor->num_data_lanes == 2 ? IMX415_LANEMODE_2 :
|
|
+ IMX415_LANEMODE_4);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state *state)
|
|
@@ -1373,8 +1370,6 @@ static int imx415_parse_hw_config(struct
|
|
}
|
|
|
|
for (j = 0; j < ARRAY_SIZE(supported_modes); ++j) {
|
|
- if (sensor->num_data_lanes != supported_modes[j].lanes)
|
|
- continue;
|
|
if (bus_cfg.link_frequencies[i] * 2 !=
|
|
supported_modes[j].lane_rate)
|
|
continue;
|