[PATCH] media: ov5640: select the MIPI lane mode from the endpoint lane count
Jason Yang via B4 Relay <[email protected]>
| Newsgroups | org.kernel.vger.linux-media,org.kernel.feeds.b4-sent,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Jason Yang <[email protected]> ov5640_set_stream_mipi() always programs IO_MIPI_CTRL00 with 0x45, which selects the two data lane mode: the number of data lanes described in the devicetree endpoint only feeds the sensor's clock tree computations, so a module wired with one data lane starts streaming in two lane mode and the receiver never assembles a frame. Select the lane mode from the endpoint instead. The one lane encoding is [7:5] = 001 per the current sensor manual (version 2.33). The 2.03 manual documented 000/001 for one/two lanes; OmniVision corrected the table in version 2.1, which is why the long-standing comment here found 001 unusable for two lanes and validated 010 instead. The power-up path also programs a two data lane mode, but that value is overwritten when streaming starts, so it is left alone. Tested with a single data lane module on an i.MX8MP board (imx-mipi-csis receiver), where the unpatched value produces no frames at all, and on an RK3588 board. Fixes: 19a81c1426c1 ("[media] add Omnivision OV5640 sensor driver") Cc: [email protected] # no in-tree 1-lane users Signed-off-by: Jason Yang <[email protected]> Assisted-by: Claude:claude-opus-5 --- The three [7:5] encodings were exercised individually on the i.MX8MP board (v7.2-rc4, data-lanes = <1>) by patching the value and capturing with v4l2-ctl: 001 (this patch): 30/30 frames, zero PHY error events in steady state (3 x 300 frames) 000 (2.03 manual / NXP KB): same result 010 (unpatched two lane mode): no frames; the receiver logs only start-of-transmission errors and never assembles one The RK3588 run used the same module and devicetree (data-lanes = <1>) through a Rockchip CSI-2 receiver, streaming to natural EOS with a clean kernel log. Happy to run additional tests on either platform if that would help. --- drivers/media/i2c/ov5640.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c index 8deb5f5501fa..ef731709bdc8 100644 --- a/drivers/media/i2c/ov5640.c +++ b/drivers/media/i2c/ov5640.c @@ -1826,27 +1826,27 @@ static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on) static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on) { + u8 val; int ret; /* * Enable/disable the MIPI interface * - * 0x300e = on ? 0x45 : 0x40 - * - * FIXME: the sensor manual (version 2.03) reports - * [7:5] = 000 : 1 data lane mode - * [7:5] = 001 : 2 data lanes mode - * But this settings do not work, while the following ones - * have been validated for 2 data lanes mode. - * + * [7:5] = 001 : 1 data lane mode * [7:5] = 010 : 2 data lanes mode + * Encodings per version 2.33 of the sensor manual. * [4] = 0 : Power up MIPI HS Tx * [3] = 0 : Power up MIPI LS Rx * [2] = 1/0 : MIPI interface enable/disable * [1:0] = 01/00: FIXME: 'debug' */ - ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, - on ? 0x45 : 0x40); + if (on) + val = sensor->ep.bus.mipi_csi2.num_data_lanes == 1 ? + 0x25 : 0x45; + else + val = 0x40; + + ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, val); if (ret) return ret; @@ -2535,7 +2535,7 @@ static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on) * Power up MIPI HS Tx and LS Rx; 2 data lanes mode * * 0x300e = 0x40 - * [7:5] = 010 : 2 data lanes mode (see FIXME note in + * [7:5] = 010 : 2 data lanes mode (see the note in * "ov5640_set_stream_mipi()") * [4] = 0 : Power up MIPI HS Tx * [3] = 0 : Power up MIPI LS Rx --- base-commit: 1590cf0329716306e948a8fc29f1d3ee87d3989f change-id: 20260811-ov5640-1lane-v1-b0fe37eab4d8 Best regards, -- Jason Yang <[email protected]>