Skip to content

Commit

Permalink
media: i2c: imx415: Link frequencies are not exclusive to num lanes
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
6by9 committed Jan 6, 2025
1 parent dcfe5ed commit 73dc696
Showing 1 changed file with 23 additions and 27 deletions.
50 changes: 23 additions & 27 deletions drivers/media/i2c/imx415.c
Original file line number Diff line number Diff line change
Expand Up @@ -452,9 +452,8 @@ static const struct imx415_clk_params imx415_clk_params[] = {
},
};

/* all-pixel 2-lane 720 Mbps 15.74 Hz mode */
static const struct cci_reg_sequence imx415_mode_2_720[] = {
{ IMX415_LANEMODE, IMX415_LANEMODE_2 },
/* 720 Mbps CSI configuration */
static const struct cci_reg_sequence imx415_linkrate_720mbps[] = {
{ IMX415_TCLKPOST, 0x006F },
{ IMX415_TCLKPREPARE, 0x002F },
{ IMX415_TCLKTRAIL, 0x002F },
Expand All @@ -466,9 +465,8 @@ static const struct cci_reg_sequence imx415_mode_2_720[] = {
{ IMX415_TLPX, 0x0027 },
};

/* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */
static const struct cci_reg_sequence imx415_mode_2_1440[] = {
{ IMX415_LANEMODE, IMX415_LANEMODE_2 },
/* 1440 Mbps CSI configuration */
static const struct cci_reg_sequence imx415_linkrate_1440mbps[] = {
{ IMX415_TCLKPOST, 0x009F },
{ IMX415_TCLKPREPARE, 0x0057 },
{ IMX415_TCLKTRAIL, 0x0057 },
Expand All @@ -480,9 +478,8 @@ static const struct cci_reg_sequence imx415_mode_2_1440[] = {
{ IMX415_TLPX, 0x004F },
};

/* all-pixel 4-lane 891 Mbps 30 Hz mode */
static const struct cci_reg_sequence imx415_mode_4_891[] = {
{ IMX415_LANEMODE, IMX415_LANEMODE_4 },
/* 891 Mbps CSI configuration */
static const struct cci_reg_sequence imx415_linkrate_891mbps[] = {
{ IMX415_TCLKPOST, 0x007F },
{ IMX415_TCLKPREPARE, 0x0037 },
{ IMX415_TCLKTRAIL, 0x0037 },
Expand All @@ -501,38 +498,34 @@ 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;
};

/* mode configs */
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,
},
},
};
Expand Down Expand Up @@ -823,7 +816,7 @@ static int imx415_ctrls_init(struct imx415 *sensor)
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;
Expand Down Expand Up @@ -885,7 +878,12 @@ static int imx415_set_mode(struct imx415 *sensor, int mode)
IMX415_NUM_CLK_PARAM_REGS,
&ret);

return 0;
ret = cci_write(sensor->regmap, IMX415_LANEMODE,
sensor->num_data_lanes == 2 ? IMX415_LANEMODE_2 :
IMX415_LANEMODE_4,
NULL);

return ret;
}

static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state *state)
Expand Down Expand Up @@ -1297,8 +1295,6 @@ static int imx415_parse_hw_config(struct imx415 *sensor)
}

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;
Expand Down

0 comments on commit 73dc696

Please sign in to comment.