* [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes
@ 2026-03-27 10:21 Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 01/12] drm/bridge: tc358762: Clean up register defines Tomi Valkeinen
` (11 more replies)
0 siblings, 12 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
While trying to get Raspberry Pi display v1.1 working on Beagleboard
platforms, I noticed various small issues with the tc358762 driver.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
Changes in v2:
- Always enable VTG. There should be no downside, and it fixes unstable
hsync
- Add four new patches at the end
- Extend the patch desc in "Drop SPICMR write" a bit
- Link to v1: https://lore.kernel.org/r/20260326-tc358762-fixes-v1-0-65f479227af5@ideasonboard.com
---
Tomi Valkeinen (12):
drm/bridge: tc358762: Clean up register defines
drm/bridge: tc358762: Improce SYSCTRL register defines
drm/bridge: tc358762: Improve LCDCTRL defines
drm/bridge: tc358762: Configure SYSCTRL first
drm/bridge: tc358762: Drop SPICMR write
drm/bridge: tc358762: Improve DPI enable handling
drm/bridge: tc358762: Update comment about the number of lanes
drm/bridge: tc358762: Support VTG
drm/bridge: tc358762: Fix sync polarities
drm/bridge: tc358762: Move tc358762_init() into tc358762_enable()
drm/bridge: tc358762: Drop drm_bridge_funcs.mode_set
drm/bridge: tc358762: Set DE_POL and DCLK_POL properly
drivers/gpu/drm/bridge/tc358762.c | 202 +++++++++++++++++++++++++-------------
1 file changed, 136 insertions(+), 66 deletions(-)
---
base-commit: 11439c4635edd669ae435eec308f4ab8a0804808
change-id: 20260326-tc358762-fixes-6f666500da9e
Best regards,
--
Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 01/12] drm/bridge: tc358762: Clean up register defines
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL " Tomi Valkeinen
` (10 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
Move the defines around and rename for clarity and consistency. No
functional change.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 98df3e667d4a..833fd9913c75 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -29,17 +29,22 @@
/* PPI layer registers */
#define PPI_STARTPPI 0x0104 /* START control bit */
+#define PPI_STARTPPI_STARTPPI BIT(0)
+
#define PPI_LPTXTIMECNT 0x0114 /* LPTX timing signal */
#define PPI_D0S_ATMR 0x0144
#define PPI_D1S_ATMR 0x0148
#define PPI_D0S_CLRSIPOCOUNT 0x0164 /* Assertion timer for Lane 0 */
#define PPI_D1S_CLRSIPOCOUNT 0x0168 /* Assertion timer for Lane 1 */
-#define PPI_START_FUNCTION 1
/* DSI layer registers */
#define DSI_STARTDSI 0x0204 /* START control bit of DSI-TX */
+#define DSI_STARTDSI_STARTDSI BIT(0)
+
#define DSI_LANEENABLE 0x0210 /* Enables each lane */
-#define DSI_RX_START 1
+#define DSI_LANEENABLE_CLEN BIT(0)
+#define DSI_LANEENABLE_L0EN BIT(1)
+#define DSI_LANEENABLE_L1EN BIT(2)
/* LCDC/DPI Host Registers, based on guesswork that this matches TC358764 */
#define LCDCTRL 0x0420 /* Video Path Control */
@@ -60,14 +65,8 @@
/* System Controller Registers */
#define SYSCTRL 0x0464
-/* System registers */
#define LPX_PERIOD 3
-/* Lane enable PPI and DSI register bits */
-#define LANEENABLE_CLEN BIT(0)
-#define LANEENABLE_L0EN BIT(1)
-#define LANEENABLE_L1EN BIT(2)
-
struct tc358762 {
struct device *dev;
struct drm_bridge bridge;
@@ -118,7 +117,7 @@ static int tc358762_init(struct tc358762 *ctx)
u32 lcdctrl;
tc358762_write(ctx, DSI_LANEENABLE,
- LANEENABLE_L0EN | LANEENABLE_CLEN);
+ DSI_LANEENABLE_L0EN | DSI_LANEENABLE_CLEN);
tc358762_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5);
tc358762_write(ctx, PPI_D1S_CLRSIPOCOUNT, 5);
tc358762_write(ctx, PPI_D0S_ATMR, 0);
@@ -141,8 +140,8 @@ static int tc358762_init(struct tc358762 *ctx)
tc358762_write(ctx, SYSCTRL, 0x040f);
msleep(100);
- tc358762_write(ctx, PPI_STARTPPI, PPI_START_FUNCTION);
- tc358762_write(ctx, DSI_STARTDSI, DSI_RX_START);
+ tc358762_write(ctx, PPI_STARTPPI, PPI_STARTPPI_STARTPPI);
+ tc358762_write(ctx, DSI_STARTDSI, DSI_STARTDSI_STARTDSI);
msleep(100);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL register defines
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 01/12] drm/bridge: tc358762: Clean up register defines Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-31 5:28 ` kernel test robot
2026-04-03 8:39 ` kernel test robot
2026-03-27 10:21 ` [PATCH v2 03/12] drm/bridge: tc358762: Improve LCDCTRL defines Tomi Valkeinen
` (9 subsequent siblings)
11 siblings, 2 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
Define SYSCTRL fields. No functional changes.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 833fd9913c75..9a0b1f0c18f0 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -64,6 +64,19 @@
/* System Controller Registers */
#define SYSCTRL 0x0464
+#define SYSCTRL_DPIDATA_IO_MASK GENMASK_U32(1, 0)
+#define SYSCTRL_DPIDATA_IO_1MA 0
+#define SYSCTRL_DPIDATA_IO_2MA 1
+#define SYSCTRL_DPIDATA_IO_3MA 2
+#define SYSCTRL_DPIDATA_IO_4MA 3
+#define SYSCTRL_DPISTB_IO_MASK GENMASK_U32(3, 2)
+#define SYSCTRL_DPISTB_IO_1MA 0
+#define SYSCTRL_DPISTB_IO_2MA 1
+#define SYSCTRL_DPISTB_IO_3MA 2
+#define SYSCTRL_DPISTB_IO_4MA 3
+#define SYSCTRL_PCLKDIV_MASK GENMASK_U32(11, 8)
+#define SYSCTRL_PCLKDIV_DIV_2 2
+#define SYSCTRL_PCLKDIV_DIV_3 4
#define LPX_PERIOD 3
@@ -137,7 +150,11 @@ static int tc358762_init(struct tc358762 *ctx)
tc358762_write(ctx, LCDCTRL, lcdctrl);
- tc358762_write(ctx, SYSCTRL, 0x040f);
+ tc358762_write(ctx, SYSCTRL,
+ FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
+ FIELD_PREP(SYSCTRL_DPISTB_IO_MASK, SYSCTRL_DPISTB_IO_4MA) |
+ FIELD_PREP(SYSCTRL_PCLKDIV_MASK, SYSCTRL_PCLKDIV_DIV_3));
+
msleep(100);
tc358762_write(ctx, PPI_STARTPPI, PPI_STARTPPI_STARTPPI);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 03/12] drm/bridge: tc358762: Improve LCDCTRL defines
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 01/12] drm/bridge: tc358762: Clean up register defines Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL " Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 04/12] drm/bridge: tc358762: Configure SYSCTRL first Tomi Valkeinen
` (8 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
LCDCTRL fields are quite wrong in the driver. Fix the field defines.
A few notes about the wrong fields:
LCDCTRL_VSDELAY(1) actually sets LCDCTRL_DCLK_POL
LCDCTRL_UNK6 | LCDCTRL_VTGEN actually set LCDCTRL_PXLFORM_RGB888
LCDCTRL_RGB888 actually sets LCDCTRL_DPI_EN
The total still resulted in a working display even if the defines were
quite wrong.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 33 ++++++++++++++++++++-------------
1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 9a0b1f0c18f0..cbedffb7a705 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -46,17 +46,22 @@
#define DSI_LANEENABLE_L0EN BIT(1)
#define DSI_LANEENABLE_L1EN BIT(2)
-/* LCDC/DPI Host Registers, based on guesswork that this matches TC358764 */
+/* LCDC/DPI Registers */
#define LCDCTRL 0x0420 /* Video Path Control */
#define LCDCTRL_MSF BIT(0) /* Magic square in RGB666 */
-#define LCDCTRL_VTGEN BIT(4)/* Use chip clock for timing */
-#define LCDCTRL_UNK6 BIT(6) /* Unknown */
-#define LCDCTRL_EVTMODE BIT(5) /* Event mode */
-#define LCDCTRL_RGB888 BIT(8) /* RGB888 mode */
-#define LCDCTRL_HSPOL BIT(17) /* Polarity of HSYNC signal */
-#define LCDCTRL_DEPOL BIT(18) /* Polarity of DE signal */
-#define LCDCTRL_VSPOL BIT(19) /* Polarity of VSYNC signal */
-#define LCDCTRL_VSDELAY(v) (((v) & 0xfff) << 20) /* VSYNC delay */
+#define LCDCTRL_VTGEN BIT(1) /* Use chip clock for timing */
+#define LCDCTRL_PXLFORM GENMASK_U32(6, 4)
+#define LCDCTRL_PXLFORM_RGB666 0 /* x:R:G:B 6:8:8:8 */
+#define LCDCTRL_PXLFORM_RGB666_24 1 /* x:R:x:G:x:B 2:6:2:6:2:6 */
+#define LCDCTRL_PXLFORM_RGB565 2 /* x:R:G:B 8:5:6:5 */
+#define LCDCTRL_PXLFORM_RGB565_1 3 /* x:R:x:G:x:B 3:5:2:6:3:5 */
+#define LCDCTRL_PXLFORM_RGB565_2 4 /* x:R:x:G:x:B:x 2:5:3:6:2:5:1 */
+#define LCDCTRL_PXLFORM_RGB888 5 /* R:G:B 8:8:8 */
+#define LCDCTRL_DPI_EN BIT(8)
+#define LCDCTRL_HSYNC_POL BIT(17) /* Polarity of HSYNC signal */
+#define LCDCTRL_DE_POL BIT(18) /* Polarity of DE signal */
+#define LCDCTRL_VSYNC_POL BIT(19) /* Polarity of VSYNC signal */
+#define LCDCTRL_DCLK_POL BIT(20) /* Polarity of pixel clock */
/* SPI Master Registers */
#define SPICMR 0x0450
@@ -139,14 +144,16 @@ static int tc358762_init(struct tc358762 *ctx)
tc358762_write(ctx, SPICMR, 0x00);
- lcdctrl = LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 |
- LCDCTRL_UNK6 | LCDCTRL_VTGEN;
+ lcdctrl = FIELD_PREP(LCDCTRL_PXLFORM, LCDCTRL_PXLFORM_RGB888) |
+ LCDCTRL_DPI_EN;
+
+ lcdctrl |= LCDCTRL_DCLK_POL;
if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
- lcdctrl |= LCDCTRL_HSPOL;
+ lcdctrl |= LCDCTRL_HSYNC_POL;
if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC)
- lcdctrl |= LCDCTRL_VSPOL;
+ lcdctrl |= LCDCTRL_VSYNC_POL;
tc358762_write(ctx, LCDCTRL, lcdctrl);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 04/12] drm/bridge: tc358762: Configure SYSCTRL first
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (2 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 03/12] drm/bridge: tc358762: Improve LCDCTRL defines Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 05/12] drm/bridge: tc358762: Drop SPICMR write Tomi Valkeinen
` (7 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
SYSCTRL affects the DPI output and the clock tree, but we configure it
late, when the DPI output is already enabled and clocks are running.
Move the SYSCTRL configuration to the beginning, before anything is
enabled.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index cbedffb7a705..053579591dba 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -134,6 +134,13 @@ static int tc358762_init(struct tc358762 *ctx)
{
u32 lcdctrl;
+ tc358762_write(ctx, SYSCTRL,
+ FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
+ FIELD_PREP(SYSCTRL_DPISTB_IO_MASK, SYSCTRL_DPISTB_IO_4MA) |
+ FIELD_PREP(SYSCTRL_PCLKDIV_MASK, SYSCTRL_PCLKDIV_DIV_3));
+
+ msleep(100);
+
tc358762_write(ctx, DSI_LANEENABLE,
DSI_LANEENABLE_L0EN | DSI_LANEENABLE_CLEN);
tc358762_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5);
@@ -157,13 +164,6 @@ static int tc358762_init(struct tc358762 *ctx)
tc358762_write(ctx, LCDCTRL, lcdctrl);
- tc358762_write(ctx, SYSCTRL,
- FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
- FIELD_PREP(SYSCTRL_DPISTB_IO_MASK, SYSCTRL_DPISTB_IO_4MA) |
- FIELD_PREP(SYSCTRL_PCLKDIV_MASK, SYSCTRL_PCLKDIV_DIV_3));
-
- msleep(100);
-
tc358762_write(ctx, PPI_STARTPPI, PPI_STARTPPI_STARTPPI);
tc358762_write(ctx, DSI_STARTDSI, DSI_STARTDSI_STARTDSI);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 05/12] drm/bridge: tc358762: Drop SPICMR write
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (3 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 04/12] drm/bridge: tc358762: Configure SYSCTRL first Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 06/12] drm/bridge: tc358762: Improve DPI enable handling Tomi Valkeinen
` (6 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
Drop write to SPICMR. It's unclear why the write is there, as SPI is not
supported in the driver, and it's mostly just writing zeroes to already
zero fields (reset defaults). None of the zero bits written disable
anything wrt. SPI.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 053579591dba..52e2f3a73721 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -149,8 +149,6 @@ static int tc358762_init(struct tc358762 *ctx)
tc358762_write(ctx, PPI_D1S_ATMR, 0);
tc358762_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);
- tc358762_write(ctx, SPICMR, 0x00);
-
lcdctrl = FIELD_PREP(LCDCTRL_PXLFORM, LCDCTRL_PXLFORM_RGB888) |
LCDCTRL_DPI_EN;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 06/12] drm/bridge: tc358762: Improve DPI enable handling
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (4 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 05/12] drm/bridge: tc358762: Drop SPICMR write Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 07/12] drm/bridge: tc358762: Update comment about the number of lanes Tomi Valkeinen
` (5 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
The HW reset defaults has DPIENABLE bit as set. In the current driver we
configure and enable various things while DPIENABLE is set. This results
in a temporary DPI output with wrong timings, which may cause artifacts
on the panel.
Fix this by clearing DPIEANBLE as the first thing when we start to
enable the display. DPIENABLE is set later with the rest of the LCDCTRL
configuration, and at that time we have done all the other
configurations.
Also, for symmetry and possibly improving the DPI output at disable
time, explicitly disable DPIENABLE when disabling the bridge.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 52e2f3a73721..cc1c5ff42cbd 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -134,6 +134,12 @@ static int tc358762_init(struct tc358762 *ctx)
{
u32 lcdctrl;
+ /*
+ * DPIENABLE has reset default of 1. Make sure we don't output on
+ * DPI until we have finished the coniguration.
+ */
+ tc358762_write(ctx, LCDCTRL, 0);
+
tc358762_write(ctx, SYSCTRL,
FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
FIELD_PREP(SYSCTRL_DPISTB_IO_MASK, SYSCTRL_DPISTB_IO_4MA) |
@@ -185,6 +191,9 @@ static void tc358762_post_disable(struct drm_bridge *bridge,
ctx->pre_enabled = false;
+ /* Turn off the DPI output */
+ tc358762_write(ctx, LCDCTRL, 0);
+
if (ctx->reset_gpio)
gpiod_set_value_cansleep(ctx->reset_gpio, 0);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 07/12] drm/bridge: tc358762: Update comment about the number of lanes
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (5 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 06/12] drm/bridge: tc358762: Improve DPI enable handling Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 08/12] drm/bridge: tc358762: Support VTG Tomi Valkeinen
` (4 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
Update comment about the number of lanes.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index cc1c5ff42cbd..9fb921b3fa0d 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -305,7 +305,14 @@ static int tc358762_probe(struct mipi_dsi_device *dsi)
ctx->dev = dev;
ctx->pre_enabled = false;
- /* TODO: Find out how to get dual-lane mode working */
+ /*
+ * When using DSI clk for pixel clock (only mode supported in the driver),
+ * the pclk is derived directly from the DSI byteclk via simple divider,
+ * which is either 2 or 3.
+ * The required divider can be calculated with bitspp / 8 / nlanes. Thus,
+ * for RGB888, only nlanes = 1 works as nlanes = 2 would require divider
+ * of 1.5.
+ */
dsi->lanes = 1;
dsi->format = MIPI_DSI_FMT_RGB888;
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 08/12] drm/bridge: tc358762: Support VTG
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (6 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 07/12] drm/bridge: tc358762: Update comment about the number of lanes Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 09/12] drm/bridge: tc358762: Fix sync polarities Tomi Valkeinen
` (3 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
TC358762 can generate the DPI output's timings in two ways, either Video
Timings Generator (VTG) on or off:
- VTG off: Duplicate the timings coming from the DSI. This requires DSI
pulse mode.
- VTG on: Sync frame on DSI VSync Start, but the exact output timings
are defined in TC358762 registers. This can be used with DSI
event/burst mode.
We are currently using VTG off in the driver.
I observe that the hsync signal, on my HW setup, is not 100% stable with
VTG off, and it seems to lengthen by a single clock every now and then.
However, it then stabilizes later. To me the DSI input looks solid, but
that is more challenging to measure exactly. So I have not found the
root cause for this.
Turning VTG on removes that instability. As I dont' see any downsides
with enabling VTG (and it would allow extending the driver to use
event/burst mode in the future), let's always enable the VTG.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 9fb921b3fa0d..d3bcdf8af804 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -18,6 +18,7 @@
#include <linux/regulator/consumer.h>
#include <video/mipi_display.h>
+#include <video/videomode.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
@@ -63,6 +64,12 @@
#define LCDCTRL_VSYNC_POL BIT(19) /* Polarity of VSYNC signal */
#define LCDCTRL_DCLK_POL BIT(20) /* Polarity of pixel clock */
+#define LCDC_HSR_HBPR 0x0424
+#define LCDC_HDISPR_HFPR 0x0428
+#define LCDC_VSR_VBPR 0x042C
+#define LCDC_VDISPR_VFPR 0x0430
+#define LCDC_VFUEN 0x0434
+
/* SPI Master Registers */
#define SPICMR 0x0450
#define SPITCR 0x0454
@@ -94,6 +101,7 @@ struct tc358762 {
struct drm_display_mode mode;
bool pre_enabled;
int error;
+ bool use_vtg;
};
static int tc358762_clear_error(struct tc358762 *ctx)
@@ -155,9 +163,31 @@ static int tc358762_init(struct tc358762 *ctx)
tc358762_write(ctx, PPI_D1S_ATMR, 0);
tc358762_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);
+ if (ctx->use_vtg) {
+ struct videomode vm = { 0 };
+
+ drm_display_mode_to_videomode(&ctx->mode, &vm);
+
+ tc358762_write(ctx, LCDC_HSR_HBPR,
+ vm.hsync_len | (vm.hback_porch << 16));
+ tc358762_write(ctx, LCDC_HDISPR_HFPR,
+ vm.hactive | (vm.hfront_porch << 16));
+
+ tc358762_write(ctx, LCDC_VSR_VBPR,
+ vm.vsync_len | (vm.vback_porch << 16));
+ tc358762_write(ctx, LCDC_VDISPR_VFPR,
+ vm.vactive | (vm.vfront_porch << 16));
+
+ /* Upload VTG timings */
+ tc358762_write(ctx, LCDC_VFUEN, BIT(0));
+ }
+
lcdctrl = FIELD_PREP(LCDCTRL_PXLFORM, LCDCTRL_PXLFORM_RGB888) |
LCDCTRL_DPI_EN;
+ if (ctx->use_vtg)
+ lcdctrl |= LCDCTRL_VTGEN;
+
lcdctrl |= LCDCTRL_DCLK_POL;
if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
@@ -305,6 +335,9 @@ static int tc358762_probe(struct mipi_dsi_device *dsi)
ctx->dev = dev;
ctx->pre_enabled = false;
+ /* Always use VTG */
+ ctx->use_vtg = true;
+
/*
* When using DSI clk for pixel clock (only mode supported in the driver),
* the pclk is derived directly from the DSI byteclk via simple divider,
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 09/12] drm/bridge: tc358762: Fix sync polarities
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (7 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 08/12] drm/bridge: tc358762: Support VTG Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 10/12] drm/bridge: tc358762: Move tc358762_init() into tc358762_enable() Tomi Valkeinen
` (2 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
Setting LCDCTRL_HSYNC_POL and LCDCTRL_VSYNC_POL will make the respective
sync signal active high. The driver does this in inverse. Fix it.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index d3bcdf8af804..26999b97edae 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -190,10 +190,10 @@ static int tc358762_init(struct tc358762 *ctx)
lcdctrl |= LCDCTRL_DCLK_POL;
- if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
+ if (ctx->mode.flags & DRM_MODE_FLAG_PHSYNC)
lcdctrl |= LCDCTRL_HSYNC_POL;
- if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC)
+ if (ctx->mode.flags & DRM_MODE_FLAG_PVSYNC)
lcdctrl |= LCDCTRL_VSYNC_POL;
tc358762_write(ctx, LCDCTRL, lcdctrl);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 10/12] drm/bridge: tc358762: Move tc358762_init() into tc358762_enable()
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (8 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 09/12] drm/bridge: tc358762: Fix sync polarities Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 11/12] drm/bridge: tc358762: Drop drm_bridge_funcs.mode_set Tomi Valkeinen
2026-03-27 10:22 ` [PATCH v2 12/12] drm/bridge: tc358762: Set DE_POL and DCLK_POL properly Tomi Valkeinen
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
The only thing tc358762_enable() does is call tc358762_init(). Inline
the tc358762_init() into tc358762_enable(), for simplicity and to make
it easier to improve the tc358762_enable() in the following commits. No
functional change.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 104 ++++++++++++++++++--------------------
1 file changed, 49 insertions(+), 55 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 26999b97edae..1e16d5b2d5fe 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -138,9 +138,56 @@ static inline struct tc358762 *bridge_to_tc358762(struct drm_bridge *bridge)
return container_of(bridge, struct tc358762, bridge);
}
-static int tc358762_init(struct tc358762 *ctx)
+static void tc358762_post_disable(struct drm_bridge *bridge,
+ struct drm_atomic_state *state)
+{
+ struct tc358762 *ctx = bridge_to_tc358762(bridge);
+ int ret;
+
+ /*
+ * The post_disable hook might be called multiple times.
+ * We want to avoid regulator imbalance below.
+ */
+ if (!ctx->pre_enabled)
+ return;
+
+ ctx->pre_enabled = false;
+
+ /* Turn off the DPI output */
+ tc358762_write(ctx, LCDCTRL, 0);
+
+ if (ctx->reset_gpio)
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+
+ ret = regulator_disable(ctx->regulator);
+ if (ret < 0)
+ dev_err(ctx->dev, "error disabling regulators (%d)\n", ret);
+}
+
+static void tc358762_pre_enable(struct drm_bridge *bridge,
+ struct drm_atomic_state *state)
{
+ struct tc358762 *ctx = bridge_to_tc358762(bridge);
+ int ret;
+
+ ret = regulator_enable(ctx->regulator);
+ if (ret < 0)
+ dev_err(ctx->dev, "error enabling regulators (%d)\n", ret);
+
+ if (ctx->reset_gpio) {
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+ usleep_range(5000, 10000);
+ }
+
+ ctx->pre_enabled = true;
+}
+
+static void tc358762_enable(struct drm_bridge *bridge,
+ struct drm_atomic_state *state)
+{
+ struct tc358762 *ctx = bridge_to_tc358762(bridge);
u32 lcdctrl;
+ int ret;
/*
* DPIENABLE has reset default of 1. Make sure we don't output on
@@ -203,60 +250,7 @@ static int tc358762_init(struct tc358762 *ctx)
msleep(100);
- return tc358762_clear_error(ctx);
-}
-
-static void tc358762_post_disable(struct drm_bridge *bridge,
- struct drm_atomic_state *state)
-{
- struct tc358762 *ctx = bridge_to_tc358762(bridge);
- int ret;
-
- /*
- * The post_disable hook might be called multiple times.
- * We want to avoid regulator imbalance below.
- */
- if (!ctx->pre_enabled)
- return;
-
- ctx->pre_enabled = false;
-
- /* Turn off the DPI output */
- tc358762_write(ctx, LCDCTRL, 0);
-
- if (ctx->reset_gpio)
- gpiod_set_value_cansleep(ctx->reset_gpio, 0);
-
- ret = regulator_disable(ctx->regulator);
- if (ret < 0)
- dev_err(ctx->dev, "error disabling regulators (%d)\n", ret);
-}
-
-static void tc358762_pre_enable(struct drm_bridge *bridge,
- struct drm_atomic_state *state)
-{
- struct tc358762 *ctx = bridge_to_tc358762(bridge);
- int ret;
-
- ret = regulator_enable(ctx->regulator);
- if (ret < 0)
- dev_err(ctx->dev, "error enabling regulators (%d)\n", ret);
-
- if (ctx->reset_gpio) {
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
- usleep_range(5000, 10000);
- }
-
- ctx->pre_enabled = true;
-}
-
-static void tc358762_enable(struct drm_bridge *bridge,
- struct drm_atomic_state *state)
-{
- struct tc358762 *ctx = bridge_to_tc358762(bridge);
- int ret;
-
- ret = tc358762_init(ctx);
+ ret = tc358762_clear_error(ctx);
if (ret < 0)
dev_err(ctx->dev, "error initializing bridge (%d)\n", ret);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 11/12] drm/bridge: tc358762: Drop drm_bridge_funcs.mode_set
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (9 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 10/12] drm/bridge: tc358762: Move tc358762_init() into tc358762_enable() Tomi Valkeinen
@ 2026-03-27 10:21 ` Tomi Valkeinen
2026-03-27 10:22 ` [PATCH v2 12/12] drm/bridge: tc358762: Set DE_POL and DCLK_POL properly Tomi Valkeinen
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:21 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
drm_bridge_funcs.mode_set is deprecated. Drop it and get the
drm_display_mode from the atomic state.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 26 ++++++++++++--------------
1 file changed, 12 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index 1e16d5b2d5fe..eba910ce8bd7 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -98,7 +98,6 @@ struct tc358762 {
struct regulator *regulator;
struct drm_bridge *panel_bridge;
struct gpio_desc *reset_gpio;
- struct drm_display_mode mode;
bool pre_enabled;
int error;
bool use_vtg;
@@ -186,9 +185,18 @@ static void tc358762_enable(struct drm_bridge *bridge,
struct drm_atomic_state *state)
{
struct tc358762 *ctx = bridge_to_tc358762(bridge);
+ struct drm_connector_state *conn_state;
+ struct drm_crtc_state *crtc_state;
+ struct drm_connector *connector;
+ struct drm_display_mode *mode;
u32 lcdctrl;
int ret;
+ connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
+ conn_state = drm_atomic_get_new_connector_state(state, connector);
+ crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
+ mode = &crtc_state->mode;
+
/*
* DPIENABLE has reset default of 1. Make sure we don't output on
* DPI until we have finished the coniguration.
@@ -213,7 +221,7 @@ static void tc358762_enable(struct drm_bridge *bridge,
if (ctx->use_vtg) {
struct videomode vm = { 0 };
- drm_display_mode_to_videomode(&ctx->mode, &vm);
+ drm_display_mode_to_videomode(mode, &vm);
tc358762_write(ctx, LCDC_HSR_HBPR,
vm.hsync_len | (vm.hback_porch << 16));
@@ -237,10 +245,10 @@ static void tc358762_enable(struct drm_bridge *bridge,
lcdctrl |= LCDCTRL_DCLK_POL;
- if (ctx->mode.flags & DRM_MODE_FLAG_PHSYNC)
+ if (mode->flags & DRM_MODE_FLAG_PHSYNC)
lcdctrl |= LCDCTRL_HSYNC_POL;
- if (ctx->mode.flags & DRM_MODE_FLAG_PVSYNC)
+ if (mode->flags & DRM_MODE_FLAG_PVSYNC)
lcdctrl |= LCDCTRL_VSYNC_POL;
tc358762_write(ctx, LCDCTRL, lcdctrl);
@@ -265,15 +273,6 @@ static int tc358762_attach(struct drm_bridge *bridge,
bridge, flags);
}
-static void tc358762_bridge_mode_set(struct drm_bridge *bridge,
- const struct drm_display_mode *mode,
- const struct drm_display_mode *adj)
-{
- struct tc358762 *ctx = bridge_to_tc358762(bridge);
-
- drm_mode_copy(&ctx->mode, mode);
-}
-
static const struct drm_bridge_funcs tc358762_bridge_funcs = {
.atomic_post_disable = tc358762_post_disable,
.atomic_pre_enable = tc358762_pre_enable,
@@ -282,7 +281,6 @@ static const struct drm_bridge_funcs tc358762_bridge_funcs = {
.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
.atomic_reset = drm_atomic_helper_bridge_reset,
.attach = tc358762_attach,
- .mode_set = tc358762_bridge_mode_set,
};
static int tc358762_parse_dt(struct tc358762 *ctx)
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 12/12] drm/bridge: tc358762: Set DE_POL and DCLK_POL properly
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
` (10 preceding siblings ...)
2026-03-27 10:21 ` [PATCH v2 11/12] drm/bridge: tc358762: Drop drm_bridge_funcs.mode_set Tomi Valkeinen
@ 2026-03-27 10:22 ` Tomi Valkeinen
11 siblings, 0 replies; 15+ messages in thread
From: Tomi Valkeinen @ 2026-03-27 10:22 UTC (permalink / raw)
To: Marek Vasut, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-kernel, Dave Stevenson, Tomi Valkeinen
The driver hardcodes LCDCTRL_DCLK_POL and ~DE_POL, ignoring what the
panel actuall wants. Fix this by looking at the
bridge_state->output_bus_cfg.flags, and set the polarities correctly.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/bridge/tc358762.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c
index eba910ce8bd7..f81aac632eee 100644
--- a/drivers/gpu/drm/bridge/tc358762.c
+++ b/drivers/gpu/drm/bridge/tc358762.c
@@ -186,12 +186,15 @@ static void tc358762_enable(struct drm_bridge *bridge,
{
struct tc358762 *ctx = bridge_to_tc358762(bridge);
struct drm_connector_state *conn_state;
+ struct drm_bridge_state *bridge_state;
struct drm_crtc_state *crtc_state;
struct drm_connector *connector;
struct drm_display_mode *mode;
u32 lcdctrl;
int ret;
+ bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
+
connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
conn_state = drm_atomic_get_new_connector_state(state, connector);
crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
@@ -243,7 +246,9 @@ static void tc358762_enable(struct drm_bridge *bridge,
if (ctx->use_vtg)
lcdctrl |= LCDCTRL_VTGEN;
- lcdctrl |= LCDCTRL_DCLK_POL;
+ /* Note: DCLK_POL affects pixdata, de and syncs */
+ if (bridge_state->output_bus_cfg.flags & DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE)
+ lcdctrl |= LCDCTRL_DCLK_POL;
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
lcdctrl |= LCDCTRL_HSYNC_POL;
@@ -251,6 +256,9 @@ static void tc358762_enable(struct drm_bridge *bridge,
if (mode->flags & DRM_MODE_FLAG_PVSYNC)
lcdctrl |= LCDCTRL_VSYNC_POL;
+ if (bridge_state->output_bus_cfg.flags & DRM_BUS_FLAG_DE_LOW)
+ lcdctrl |= LCDCTRL_DE_POL;
+
tc358762_write(ctx, LCDCTRL, lcdctrl);
tc358762_write(ctx, PPI_STARTPPI, PPI_STARTPPI_STARTPPI);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL register defines
2026-03-27 10:21 ` [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL " Tomi Valkeinen
@ 2026-03-31 5:28 ` kernel test robot
2026-04-03 8:39 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2026-03-31 5:28 UTC (permalink / raw)
To: Tomi Valkeinen, Marek Vasut, Andrzej Hajda, Neil Armstrong,
Robert Foss, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: oe-kbuild-all, dri-devel, linux-kernel, Dave Stevenson,
Tomi Valkeinen
Hi Tomi,
kernel test robot noticed the following build errors:
[auto build test ERROR on 11439c4635edd669ae435eec308f4ab8a0804808]
url: https://github.com/intel-lab-lkp/linux/commits/Tomi-Valkeinen/drm-bridge-tc358762-Clean-up-register-defines/20260328-164947
base: 11439c4635edd669ae435eec308f4ab8a0804808
patch link: https://lore.kernel.org/r/20260327-tc358762-fixes-v2-2-3589d3c45f4a%40ideasonboard.com
patch subject: [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL register defines
config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20260331/202603311306.2ez4eHxU-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260331/202603311306.2ez4eHxU-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603311306.2ez4eHxU-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/gpu/drm/bridge/tc358762.c: In function 'tc358762_init':
>> drivers/gpu/drm/bridge/tc358762.c:154:24: error: implicit declaration of function 'FIELD_PREP' [-Wimplicit-function-declaration]
154 | FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
| ^~~~~~~~~~
vim +/FIELD_PREP +154 drivers/gpu/drm/bridge/tc358762.c
127
128 static int tc358762_init(struct tc358762 *ctx)
129 {
130 u32 lcdctrl;
131
132 tc358762_write(ctx, DSI_LANEENABLE,
133 DSI_LANEENABLE_L0EN | DSI_LANEENABLE_CLEN);
134 tc358762_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5);
135 tc358762_write(ctx, PPI_D1S_CLRSIPOCOUNT, 5);
136 tc358762_write(ctx, PPI_D0S_ATMR, 0);
137 tc358762_write(ctx, PPI_D1S_ATMR, 0);
138 tc358762_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);
139
140 tc358762_write(ctx, SPICMR, 0x00);
141
142 lcdctrl = LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 |
143 LCDCTRL_UNK6 | LCDCTRL_VTGEN;
144
145 if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
146 lcdctrl |= LCDCTRL_HSPOL;
147
148 if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC)
149 lcdctrl |= LCDCTRL_VSPOL;
150
151 tc358762_write(ctx, LCDCTRL, lcdctrl);
152
153 tc358762_write(ctx, SYSCTRL,
> 154 FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
155 FIELD_PREP(SYSCTRL_DPISTB_IO_MASK, SYSCTRL_DPISTB_IO_4MA) |
156 FIELD_PREP(SYSCTRL_PCLKDIV_MASK, SYSCTRL_PCLKDIV_DIV_3));
157
158 msleep(100);
159
160 tc358762_write(ctx, PPI_STARTPPI, PPI_STARTPPI_STARTPPI);
161 tc358762_write(ctx, DSI_STARTDSI, DSI_STARTDSI_STARTDSI);
162
163 msleep(100);
164
165 return tc358762_clear_error(ctx);
166 }
167
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL register defines
2026-03-27 10:21 ` [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL " Tomi Valkeinen
2026-03-31 5:28 ` kernel test robot
@ 2026-04-03 8:39 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2026-04-03 8:39 UTC (permalink / raw)
To: Tomi Valkeinen, Marek Vasut, Andrzej Hajda, Neil Armstrong,
Robert Foss, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: llvm, oe-kbuild-all, dri-devel, linux-kernel, Dave Stevenson,
Tomi Valkeinen
Hi Tomi,
kernel test robot noticed the following build errors:
[auto build test ERROR on 11439c4635edd669ae435eec308f4ab8a0804808]
url: https://github.com/intel-lab-lkp/linux/commits/Tomi-Valkeinen/drm-bridge-tc358762-Clean-up-register-defines/20260328-164947
base: 11439c4635edd669ae435eec308f4ab8a0804808
patch link: https://lore.kernel.org/r/20260327-tc358762-fixes-v2-2-3589d3c45f4a%40ideasonboard.com
patch subject: [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL register defines
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20260402/202604021223.FtCNpGqO-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260402/202604021223.FtCNpGqO-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604021223.FtCNpGqO-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/gpu/drm/bridge/tc358762.c:154:10: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
154 | FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
| ^
1 error generated.
vim +/FIELD_PREP +154 drivers/gpu/drm/bridge/tc358762.c
127
128 static int tc358762_init(struct tc358762 *ctx)
129 {
130 u32 lcdctrl;
131
132 tc358762_write(ctx, DSI_LANEENABLE,
133 DSI_LANEENABLE_L0EN | DSI_LANEENABLE_CLEN);
134 tc358762_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5);
135 tc358762_write(ctx, PPI_D1S_CLRSIPOCOUNT, 5);
136 tc358762_write(ctx, PPI_D0S_ATMR, 0);
137 tc358762_write(ctx, PPI_D1S_ATMR, 0);
138 tc358762_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);
139
140 tc358762_write(ctx, SPICMR, 0x00);
141
142 lcdctrl = LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 |
143 LCDCTRL_UNK6 | LCDCTRL_VTGEN;
144
145 if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
146 lcdctrl |= LCDCTRL_HSPOL;
147
148 if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC)
149 lcdctrl |= LCDCTRL_VSPOL;
150
151 tc358762_write(ctx, LCDCTRL, lcdctrl);
152
153 tc358762_write(ctx, SYSCTRL,
> 154 FIELD_PREP(SYSCTRL_DPIDATA_IO_MASK, SYSCTRL_DPIDATA_IO_4MA) |
155 FIELD_PREP(SYSCTRL_DPISTB_IO_MASK, SYSCTRL_DPISTB_IO_4MA) |
156 FIELD_PREP(SYSCTRL_PCLKDIV_MASK, SYSCTRL_PCLKDIV_DIV_3));
157
158 msleep(100);
159
160 tc358762_write(ctx, PPI_STARTPPI, PPI_STARTPPI_STARTPPI);
161 tc358762_write(ctx, DSI_STARTDSI, DSI_STARTDSI_STARTDSI);
162
163 msleep(100);
164
165 return tc358762_clear_error(ctx);
166 }
167
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-04-03 8:40 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-27 10:21 [PATCH v2 00/12] drm/bridge: tc358762: Various small fixes Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 01/12] drm/bridge: tc358762: Clean up register defines Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 02/12] drm/bridge: tc358762: Improce SYSCTRL " Tomi Valkeinen
2026-03-31 5:28 ` kernel test robot
2026-04-03 8:39 ` kernel test robot
2026-03-27 10:21 ` [PATCH v2 03/12] drm/bridge: tc358762: Improve LCDCTRL defines Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 04/12] drm/bridge: tc358762: Configure SYSCTRL first Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 05/12] drm/bridge: tc358762: Drop SPICMR write Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 06/12] drm/bridge: tc358762: Improve DPI enable handling Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 07/12] drm/bridge: tc358762: Update comment about the number of lanes Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 08/12] drm/bridge: tc358762: Support VTG Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 09/12] drm/bridge: tc358762: Fix sync polarities Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 10/12] drm/bridge: tc358762: Move tc358762_init() into tc358762_enable() Tomi Valkeinen
2026-03-27 10:21 ` [PATCH v2 11/12] drm/bridge: tc358762: Drop drm_bridge_funcs.mode_set Tomi Valkeinen
2026-03-27 10:22 ` [PATCH v2 12/12] drm/bridge: tc358762: Set DE_POL and DCLK_POL properly Tomi Valkeinen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox