[PATCH] media: ov5640: select the MIPI lane mode from the endpoint lane count

Jason Yang <[email protected]>
Newsgroups org.kernel.feeds.b4-sent,org.kernel.vger.linux-kernel,org.kernel.vger.linux-media
Message-ID <[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]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.