All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] drm/panel: Extend panels to report their types
@ 2019-08-23 19:32 Laurent Pinchart
  2019-08-23 19:32 ` [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers Laurent Pinchart
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Laurent Pinchart @ 2019-08-23 19:32 UTC (permalink / raw)
  To: dri-devel
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre,
	Vincent Abriou

Hello,

This series is the second version of a previously unnamed series that
contained

[PATCH 1/2] drm/panel: Add and fill drm_panel type field
[PATCH 2/2] drm/bridge: panel: Use drm_panel.type instead of explicit connector_type

The purpose of the change is to allow panels to report their type, in
order to create drm_connector instances with appropriate types in the
upper layers.

Patch 1/4 fixes two panel drivers to add missing drm_panel_init() calls.
Patch 2/4 then refactors the panel drivers to initialise the dev and
funcs field through the drm_panel_init() function instead of doing so
manually.

In patch 3/4 the drm_panel structure receives a new connector_type field
to report its type, set through drm_panel_init(), and all connector
drivers are updated accordingly. The panel-simple driver however only
reports the LVDS connector type for known-to-be-LVDS panels, while all
other leave the field initialised to 0, corresponding to
DRM_MODE_CONNECTOR_Unknown. Panels supported by that driver will need to
be reviewed one by one and their type updated. This was done to avoid
reporting an incorrect type, allowing upper layers to catch
DRM_MODE_CONNECTOR_Unknown and WARN() to trigger an update of the
corresponding panel.

Patch 4/4 finally modifies drm_panel_bridge_add() and its devm_
counterpart to replace the connector type argument with the type
reported by the panel. This can't unfortunately be forced upon all
drivers as several of them hardcode a DRM_MODE_CONNECTOR_Unknown type,
and would then change the connector type reported to userspace, leading
to possible breakages. A new function, drm_panel_bridge_add_typed(), is
added with the existing behaviour of drm_panel_bridge_add() to create a
panel bridge with a forced connector type, and drivers are switched to
using that function. They should then be switched back one by one to
drm_panel_bridge_add() after careful review (and clever handling of the
connector type change issue). The drm_panel_bridge_add_typed() function
is marked as deprecated and should not be used in new code.

The patches are available at

	git://linuxtv.org/pinchartl/media.git omapdrm/panels

Laurent Pinchart (4):
  drm/panel: Add missing drm_panel_init() in panel drivers
  drm/panel: Initialise panel dev and funcs through drm_panel_init()
  drm/panel: Add and fill drm_panel type field
  drm/bridge: panel: Infer connector type from panel by default

 .../gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c  |  3 +-
 drivers/gpu/drm/bridge/cdns-dsi.c             |  3 +-
 drivers/gpu/drm/bridge/lvds-encoder.c         |  3 +-
 drivers/gpu/drm/bridge/panel.c                | 69 ++++++++++++++++---
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  3 +-
 drivers/gpu/drm/drm_panel.c                   | 14 +++-
 drivers/gpu/drm/ingenic/ingenic-drm.c         |  4 +-
 drivers/gpu/drm/mcde/mcde_dsi.c               |  4 +-
 drivers/gpu/drm/panel/panel-arm-versatile.c   |  5 +-
 .../drm/panel/panel-feiyang-fy07024di26a30d.c |  5 +-
 drivers/gpu/drm/panel/panel-ilitek-ili9322.c  |  5 +-
 drivers/gpu/drm/panel/panel-ilitek-ili9881c.c |  5 +-
 drivers/gpu/drm/panel/panel-innolux-p079zca.c |  5 +-
 .../gpu/drm/panel/panel-jdi-lt070me05000.c    |  5 +-
 .../drm/panel/panel-kingdisplay-kd097d04.c    |  5 +-
 drivers/gpu/drm/panel/panel-lg-lb035q02.c     |  5 +-
 drivers/gpu/drm/panel/panel-lg-lg4573.c       |  5 +-
 drivers/gpu/drm/panel/panel-lvds.c            |  5 +-
 drivers/gpu/drm/panel/panel-nec-nl8048hl11.c  |  5 +-
 drivers/gpu/drm/panel/panel-novatek-nt39016.c |  5 +-
 .../drm/panel/panel-olimex-lcd-olinuxino.c    |  5 +-
 .../gpu/drm/panel/panel-orisetech-otm8009a.c  |  5 +-
 .../drm/panel/panel-osd-osd101t2587-53ts.c    |  5 +-
 .../drm/panel/panel-panasonic-vvx10f034n00.c  |  5 +-
 .../drm/panel/panel-raspberrypi-touchscreen.c |  4 +-
 drivers/gpu/drm/panel/panel-raydium-rm67191.c |  5 +-
 drivers/gpu/drm/panel/panel-raydium-rm68200.c |  5 +-
 .../drm/panel/panel-rocktech-jh057n00900.c    |  5 +-
 drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |  5 +-
 drivers/gpu/drm/panel/panel-samsung-ld9040.c  |  5 +-
 drivers/gpu/drm/panel/panel-samsung-s6d16d0.c |  5 +-
 drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c |  5 +-
 .../gpu/drm/panel/panel-samsung-s6e63j0x03.c  |  5 +-
 drivers/gpu/drm/panel/panel-samsung-s6e63m0.c |  5 +-
 drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c |  5 +-
 drivers/gpu/drm/panel/panel-seiko-43wvf1g.c   |  5 +-
 .../gpu/drm/panel/panel-sharp-lq101r1sx01.c   |  5 +-
 .../gpu/drm/panel/panel-sharp-ls037v7dw01.c   |  5 +-
 .../gpu/drm/panel/panel-sharp-ls043t1le01.c   |  5 +-
 drivers/gpu/drm/panel/panel-simple.c          | 28 +++++++-
 drivers/gpu/drm/panel/panel-sitronix-st7701.c |  5 +-
 .../gpu/drm/panel/panel-sitronix-st7789v.c    |  4 +-
 drivers/gpu/drm/panel/panel-sony-acx565akm.c  |  5 +-
 drivers/gpu/drm/panel/panel-tpo-td028ttec1.c  |  5 +-
 drivers/gpu/drm/panel/panel-tpo-td043mtea1.c  |  5 +-
 drivers/gpu/drm/panel/panel-tpo-tpg110.c      |  5 +-
 drivers/gpu/drm/panel/panel-truly-nt35597.c   |  5 +-
 drivers/gpu/drm/pl111/pl111_drv.c             |  4 +-
 drivers/gpu/drm/rcar-du/rcar_du_encoder.c     |  4 +-
 drivers/gpu/drm/rockchip/rockchip_rgb.c       |  3 +-
 drivers/gpu/drm/stm/ltdc.c                    |  4 +-
 drivers/gpu/drm/tilcdc/tilcdc_external.c      |  4 +-
 drivers/gpu/drm/tve200/tve200_drv.c           |  4 +-
 drivers/gpu/drm/vc4/vc4_dpi.c                 |  3 +-
 drivers/gpu/drm/vc4/vc4_dsi.c                 |  4 +-
 include/drm/drm_bridge.h                      | 11 +--
 include/drm/drm_panel.h                       | 13 +++-
 57 files changed, 217 insertions(+), 156 deletions(-)

-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers
  2019-08-23 19:32 [PATCH v2 0/4] drm/panel: Extend panels to report their types Laurent Pinchart
@ 2019-08-23 19:32 ` Laurent Pinchart
  2019-08-24  8:48   ` Sam Ravnborg
  2019-08-23 19:32 ` [PATCH v2 2/4] drm/panel: Initialise panel dev and funcs through drm_panel_init() Laurent Pinchart
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 16+ messages in thread
From: Laurent Pinchart @ 2019-08-23 19:32 UTC (permalink / raw)
  To: dri-devel
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre,
	Vincent Abriou

Panels must be initialised with drm_panel_init(). Add the missing
function call in the panel-raspberrypi-touchscreen.c and
panel-sitronix-st7789v.c drivers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 +
 drivers/gpu/drm/panel/panel-sitronix-st7789v.c        | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
index b5b14aa059ea..2aa89eaecf6f 100644
--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
@@ -426,6 +426,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
 		return PTR_ERR(ts->dsi);
 	}
 
+	drm_panel_init(&ts->base);
 	ts->base.dev = dev;
 	ts->base.funcs = &rpi_touchscreen_funcs;
 
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
index 5e3e92ea9ea6..3b2612ae931e 100644
--- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
@@ -381,6 +381,7 @@ static int st7789v_probe(struct spi_device *spi)
 	spi_set_drvdata(spi, ctx);
 	ctx->spi = spi;
 
+	drm_panel_init(&ctx->panel);
 	ctx->panel.dev = &spi->dev;
 	ctx->panel.funcs = &st7789v_drm_funcs;
 
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 2/4] drm/panel: Initialise panel dev and funcs through drm_panel_init()
  2019-08-23 19:32 [PATCH v2 0/4] drm/panel: Extend panels to report their types Laurent Pinchart
  2019-08-23 19:32 ` [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers Laurent Pinchart
@ 2019-08-23 19:32 ` Laurent Pinchart
  2019-08-24  8:50   ` Sam Ravnborg
  2019-08-23 19:32 ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Laurent Pinchart
  2019-08-23 19:32 ` [PATCH v2 4/4] drm/bridge: panel: Infer connector type from panel by default Laurent Pinchart
  3 siblings, 1 reply; 16+ messages in thread
From: Laurent Pinchart @ 2019-08-23 19:32 UTC (permalink / raw)
  To: dri-devel
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre,
	Vincent Abriou

Instead of requiring all drivers to set the dev and funcs fields of
drm_panel manually after calling drm_panel_init(), pass the data as
arguments to the function. This simplifies the panel drivers, and will
help future refactoring when adding new arguments to drm_panel_init().

The panel drivers have been updated with the following Coccinelle
semantic patch, with manual inspection to verify that no call to
drm_panel_init() with a single argument still exists.

@@
expression panel;
expression device;
identifier ops;
@@
 drm_panel_init(&panel
+	, device, &ops
 );
 ...
(
-panel.dev = device;
-panel.funcs = &ops;
|
-panel.funcs = &ops;
-panel.dev = device;
)

Suggested-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/drm_panel.c                           | 11 ++++++++---
 drivers/gpu/drm/panel/panel-arm-versatile.c           |  4 +---
 drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c |  4 +---
 drivers/gpu/drm/panel/panel-ilitek-ili9322.c          |  4 +---
 drivers/gpu/drm/panel/panel-ilitek-ili9881c.c         |  4 +---
 drivers/gpu/drm/panel/panel-innolux-p079zca.c         |  4 +---
 drivers/gpu/drm/panel/panel-jdi-lt070me05000.c        |  4 +---
 drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c    |  5 ++---
 drivers/gpu/drm/panel/panel-lg-lb035q02.c             |  4 +---
 drivers/gpu/drm/panel/panel-lg-lg4573.c               |  4 +---
 drivers/gpu/drm/panel/panel-lvds.c                    |  4 +---
 drivers/gpu/drm/panel/panel-nec-nl8048hl11.c          |  4 +---
 drivers/gpu/drm/panel/panel-novatek-nt39016.c         |  4 +---
 drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c    |  4 +---
 drivers/gpu/drm/panel/panel-orisetech-otm8009a.c      |  4 +---
 drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c    |  5 ++---
 drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c  |  5 ++---
 drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c |  4 +---
 drivers/gpu/drm/panel/panel-raydium-rm67191.c         |  4 +---
 drivers/gpu/drm/panel/panel-raydium-rm68200.c         |  4 +---
 drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c    |  4 +---
 drivers/gpu/drm/panel/panel-ronbo-rb070d30.c          |  4 +---
 drivers/gpu/drm/panel/panel-samsung-ld9040.c          |  4 +---
 drivers/gpu/drm/panel/panel-samsung-s6d16d0.c         |  4 +---
 drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c         |  4 +---
 drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c      |  4 +---
 drivers/gpu/drm/panel/panel-samsung-s6e63m0.c         |  4 +---
 drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c         |  4 +---
 drivers/gpu/drm/panel/panel-seiko-43wvf1g.c           |  4 +---
 drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c       |  4 +---
 drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c       |  4 +---
 drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c       |  5 ++---
 drivers/gpu/drm/panel/panel-simple.c                  |  4 +---
 drivers/gpu/drm/panel/panel-sitronix-st7701.c         |  4 +---
 drivers/gpu/drm/panel/panel-sitronix-st7789v.c        |  4 +---
 drivers/gpu/drm/panel/panel-sony-acx565akm.c          |  4 +---
 drivers/gpu/drm/panel/panel-tpo-td028ttec1.c          |  4 +---
 drivers/gpu/drm/panel/panel-tpo-td043mtea1.c          |  4 +---
 drivers/gpu/drm/panel/panel-tpo-tpg110.c              |  4 +---
 drivers/gpu/drm/panel/panel-truly-nt35597.c           |  4 +---
 include/drm/drm_panel.h                               |  3 ++-
 41 files changed, 53 insertions(+), 121 deletions(-)

diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index 6b0bf42039cf..ba2fad4c9648 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -44,13 +44,18 @@ static LIST_HEAD(panel_list);
 /**
  * drm_panel_init - initialize a panel
  * @panel: DRM panel
+ * @dev: parent device of the panel
+ * @funcs: panel operations
  *
- * Sets up internal fields of the panel so that it can subsequently be added
- * to the registry.
+ * Initialize the panel structure for subsequent registration with
+ * drm_panel_add().
  */
-void drm_panel_init(struct drm_panel *panel)
+void drm_panel_init(struct drm_panel *panel, struct device *dev,
+		    const struct drm_panel_funcs *funcs)
 {
 	INIT_LIST_HEAD(&panel->list);
+	panel->dev = dev;
+	panel->funcs = funcs;
 }
 EXPORT_SYMBOL(drm_panel_init);
 
diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
index 5f72c922a04b..a4333ed0f20c 100644
--- a/drivers/gpu/drm/panel/panel-arm-versatile.c
+++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
@@ -350,9 +350,7 @@ static int versatile_panel_probe(struct platform_device *pdev)
 			dev_info(dev, "panel mounted on IB2 daughterboard\n");
 	}
 
-	drm_panel_init(&vpanel->panel);
-	vpanel->panel.dev = dev;
-	vpanel->panel.funcs = &versatile_panel_drm_funcs;
+	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
 
 	return drm_panel_add(&vpanel->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
index dabf59e0f56f..7d5d7455bc01 100644
--- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
+++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
@@ -204,9 +204,7 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ctx);
 	ctx->dsi = dsi;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = &dsi->dev;
-	ctx->panel.funcs = &feiyang_funcs;
+	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
 
 	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
 	if (IS_ERR(ctx->dvdd)) {
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
index 3c58f63adbf7..ad2405baa0ac 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
@@ -895,9 +895,7 @@ static int ili9322_probe(struct spi_device *spi)
 		ili->input = ili->conf->input;
 	}
 
-	drm_panel_init(&ili->panel);
-	ili->panel.dev = dev;
-	ili->panel.funcs = &ili9322_drm_funcs;
+	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
 
 	return drm_panel_add(&ili->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
index 3ad4a46c4e94..1d714f961c00 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
@@ -433,9 +433,7 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ctx);
 	ctx->dsi = dsi;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = &dsi->dev;
-	ctx->panel.funcs = &ili9881c_funcs;
+	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
 
 	ctx->power = devm_regulator_get(&dsi->dev, "power");
 	if (IS_ERR(ctx->power)) {
diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
index d92d1c98878c..2054afc31f20 100644
--- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
+++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
@@ -487,9 +487,7 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
 	if (IS_ERR(innolux->backlight))
 		return PTR_ERR(innolux->backlight);
 
-	drm_panel_init(&innolux->base);
-	innolux->base.funcs = &innolux_panel_funcs;
-	innolux->base.dev = dev;
+	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
 
 	err = drm_panel_add(&innolux->base);
 	if (err < 0)
diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
index ff3e89e61e3f..7bfdbfbc868e 100644
--- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
+++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
@@ -437,9 +437,7 @@ static int jdi_panel_add(struct jdi_panel *jdi)
 		return ret;
 	}
 
-	drm_panel_init(&jdi->base);
-	jdi->base.funcs = &jdi_panel_funcs;
-	jdi->base.dev = &jdi->dsi->dev;
+	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
 
 	ret = drm_panel_add(&jdi->base);
 
diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
index 3ac04eb8d0fe..a47885a1a8aa 100644
--- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
+++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
@@ -391,9 +391,8 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
 	if (IS_ERR(kingdisplay->backlight))
 		return PTR_ERR(kingdisplay->backlight);
 
-	drm_panel_init(&kingdisplay->base);
-	kingdisplay->base.funcs = &kingdisplay_panel_funcs;
-	kingdisplay->base.dev = &kingdisplay->link->dev;
+	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
+		       &kingdisplay_panel_funcs);
 
 	return drm_panel_add(&kingdisplay->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
index fc82a525b071..28c3205df482 100644
--- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
+++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
@@ -196,9 +196,7 @@ static int lb035q02_probe(struct spi_device *spi)
 	if (ret < 0)
 		return ret;
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = &lcd->spi->dev;
-	lcd->panel.funcs = &lb035q02_funcs;
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
index 41bf02d122a1..608f2de91662 100644
--- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
+++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
@@ -259,9 +259,7 @@ static int lg4573_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = &spi->dev;
-	ctx->panel.funcs = &lg4573_drm_funcs;
+	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
 
 	return drm_panel_add(&ctx->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
index ad47cc95459e..3dc1ac2a6b03 100644
--- a/drivers/gpu/drm/panel/panel-lvds.c
+++ b/drivers/gpu/drm/panel/panel-lvds.c
@@ -260,9 +260,7 @@ static int panel_lvds_probe(struct platform_device *pdev)
 	 */
 
 	/* Register the panel. */
-	drm_panel_init(&lvds->panel);
-	lvds->panel.dev = lvds->dev;
-	lvds->panel.funcs = &panel_lvds_funcs;
+	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
 
 	ret = drm_panel_add(&lvds->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
index 299b217c83e1..b67636fdbc21 100644
--- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
@@ -205,9 +205,7 @@ static int nl8048_probe(struct spi_device *spi)
 	if (ret < 0)
 		return ret;
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = &lcd->spi->dev;
-	lcd->panel.funcs = &nl8048_funcs;
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
index 2ad1063b068d..64cfe111aaad 100644
--- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
+++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
@@ -292,9 +292,7 @@ static int nt39016_probe(struct spi_device *spi)
 		return err;
 	}
 
-	drm_panel_init(&panel->drm_panel);
-	panel->drm_panel.dev = dev;
-	panel->drm_panel.funcs = &nt39016_funcs;
+	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
 
 	err = drm_panel_add(&panel->drm_panel);
 	if (err < 0) {
diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
index 2bae1db3ff34..f2d6a4ec0046 100644
--- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
+++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
@@ -288,9 +288,7 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
 	if (IS_ERR(lcd->backlight))
 		return PTR_ERR(lcd->backlight);
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = dev;
-	lcd->panel.funcs = &lcd_olinuxino_funcs;
+	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
index c7b48df8869a..8b60d5e4d775 100644
--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
+++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
@@ -455,9 +455,7 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
 	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
 			  MIPI_DSI_MODE_LPM;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &otm8009a_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
 
 	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
 						     dsi->host->dev, ctx,
diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
index e0e20ecff916..38f114b03b89 100644
--- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
+++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
@@ -166,9 +166,8 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
 	if (IS_ERR(osd101t2587->backlight))
 		return PTR_ERR(osd101t2587->backlight);
 
-	drm_panel_init(&osd101t2587->base);
-	osd101t2587->base.funcs = &osd101t2587_panel_funcs;
-	osd101t2587->base.dev = &osd101t2587->dsi->dev;
+	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
+		       &osd101t2587_panel_funcs);
 
 	return drm_panel_add(&osd101t2587->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
index 3dff0b3f73c2..6035bf458074 100644
--- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
+++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
@@ -223,9 +223,8 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
 			return -EPROBE_DEFER;
 	}
 
-	drm_panel_init(&wuxga_nt->base);
-	wuxga_nt->base.funcs = &wuxga_nt_panel_funcs;
-	wuxga_nt->base.dev = &wuxga_nt->dsi->dev;
+	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
+		       &wuxga_nt_panel_funcs);
 
 	ret = drm_panel_add(&wuxga_nt->base);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
index 2aa89eaecf6f..23a801427e42 100644
--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
@@ -426,9 +426,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
 		return PTR_ERR(ts->dsi);
 	}
 
-	drm_panel_init(&ts->base);
-	ts->base.dev = dev;
-	ts->base.funcs = &rpi_touchscreen_funcs;
+	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
 
 	/* This appears last, as it's what will unblock the DSI host
 	 * driver's component bind function.
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
index 6a5d37006103..f82a1f69f13b 100644
--- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
+++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
@@ -606,9 +606,7 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
 	if (ret)
 		return ret;
 
-	drm_panel_init(&panel->panel);
-	panel->panel.funcs = &rad_panel_funcs;
-	panel->panel.dev = dev;
+	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
 	dev_set_drvdata(dev, panel);
 
 	ret = drm_panel_add(&panel->panel);
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
index ba889625ad43..f004b78fb8bc 100644
--- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
+++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
@@ -404,9 +404,7 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
 	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
 			  MIPI_DSI_MODE_LPM;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &rm68200_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
 
 	drm_panel_add(&ctx->panel);
 
diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
index b9109922397f..d7f56374f2f1 100644
--- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
+++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
@@ -343,9 +343,7 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &jh057n_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
 
 	drm_panel_add(&ctx->panel);
 
diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
index 3c15764f0c03..8708fbbe7637 100644
--- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
+++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
@@ -173,9 +173,7 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ctx);
 	ctx->dsi = dsi;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = &dsi->dev;
-	ctx->panel.funcs = &rb070d30_panel_funcs;
+	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
 
 	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
 	if (IS_ERR(ctx->gpios.reset)) {
diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
index 3be902dcedc0..71a292dbec47 100644
--- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
+++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
@@ -351,9 +351,7 @@ static int ld9040_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &ld9040_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
 
 	return drm_panel_add(&ctx->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
index f75bef24e050..4d25c96e842c 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
@@ -215,9 +215,7 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
 		return ret;
 	}
 
-	drm_panel_init(&s6->panel);
-	s6->panel.dev = dev;
-	s6->panel.funcs = &s6d16d0_drm_funcs;
+	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
 
 	ret = drm_panel_add(&s6->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
index b923de23ed65..42a3aaab49eb 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
@@ -732,9 +732,7 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
 	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
 	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &s6e3ha2_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
 
 	ret = drm_panel_add(&ctx->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
index cd90fa700c49..b4d879bf4d03 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
@@ -466,9 +466,7 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
 		return PTR_ERR(ctx->reset_gpio);
 	}
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &s6e63j0x03_funcs;
+	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
 
 	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
 						&s6e63j0x03_bl_ops, NULL);
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
index 142d395ea512..61259c2833ab 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
@@ -473,9 +473,7 @@ static int s6e63m0_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &s6e63m0_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
 
 	ret = s6e63m0_backlight_register(ctx);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
index 81858267723a..35dbffabd526 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
@@ -1017,9 +1017,7 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
 
 	ctx->brightness = GAMMA_LEVEL_NUM - 1;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &s6e8aa0_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
 
 	ret = drm_panel_add(&ctx->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
index 18b22b1294fb..0833d0c03adc 100644
--- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
+++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
@@ -274,9 +274,7 @@ static int seiko_panel_probe(struct device *dev,
 			return -EPROBE_DEFER;
 	}
 
-	drm_panel_init(&panel->base);
-	panel->base.dev = dev;
-	panel->base.funcs = &seiko_panel_funcs;
+	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
 
 	err = drm_panel_add(&panel->base);
 	if (err < 0)
diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
index e910b4ad1310..87a58cb4d945 100644
--- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
+++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
@@ -329,9 +329,7 @@ static int sharp_panel_add(struct sharp_panel *sharp)
 	if (IS_ERR(sharp->backlight))
 		return PTR_ERR(sharp->backlight);
 
-	drm_panel_init(&sharp->base);
-	sharp->base.funcs = &sharp_panel_funcs;
-	sharp->base.dev = &sharp->link1->dev;
+	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
 
 	return drm_panel_add(&sharp->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
index 46cd9a250129..96e3deb0e305 100644
--- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
@@ -185,9 +185,7 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
 		return PTR_ERR(lcd->ud_gpio);
 	}
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = &pdev->dev;
-	lcd->panel.funcs = &ls037v7dw01_funcs;
+	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
index c39abde9f9f1..ffa844ee82ad 100644
--- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
+++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
@@ -264,9 +264,8 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
 	if (IS_ERR(sharp_nt->backlight))
 		return PTR_ERR(sharp_nt->backlight);
 
-	drm_panel_init(&sharp_nt->base);
-	sharp_nt->base.funcs = &sharp_nt_panel_funcs;
-	sharp_nt->base.dev = &sharp_nt->dsi->dev;
+	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
+		       &sharp_nt_panel_funcs);
 
 	return drm_panel_add(&sharp_nt->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 28fa6ba7b767..b36c130d5cf0 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -464,9 +464,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
 		panel_simple_parse_panel_timing_node(dev, panel, &dt);
 
-	drm_panel_init(&panel->base);
-	panel->base.dev = dev;
-	panel->base.funcs = &panel_simple_funcs;
+	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
 
 	err = drm_panel_add(&panel->base);
 	if (err < 0)
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
index 09c5d9a6f9fa..3f7bcd24aa81 100644
--- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
@@ -369,7 +369,7 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
 	if (IS_ERR(st7701->backlight))
 		return PTR_ERR(st7701->backlight);
 
-	drm_panel_init(&st7701->panel);
+	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
 
 	/**
 	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
@@ -381,8 +381,6 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
 	 * ts8550b and there is no valid documentation for that.
 	 */
 	st7701->sleep_delay = 120 + desc->panel_sleep_delay;
-	st7701->panel.funcs = &st7701_funcs;
-	st7701->panel.dev = &dsi->dev;
 
 	ret = drm_panel_add(&st7701->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
index 3b2612ae931e..2eeaeee0dd7f 100644
--- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
@@ -381,9 +381,7 @@ static int st7789v_probe(struct spi_device *spi)
 	spi_set_drvdata(spi, ctx);
 	ctx->spi = spi;
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = &spi->dev;
-	ctx->panel.funcs = &st7789v_drm_funcs;
+	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
 
 	ctx->power = devm_regulator_get(&spi->dev, "power");
 	if (IS_ERR(ctx->power))
diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
index 305259b58767..5a2772b04b75 100644
--- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
@@ -648,9 +648,7 @@ static int acx565akm_probe(struct spi_device *spi)
 			return ret;
 	}
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = &lcd->spi->dev;
-	lcd->panel.funcs = &acx565akm_funcs;
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
 
 	ret = drm_panel_add(&lcd->panel);
 	if (ret < 0) {
diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
index d7b2e34626ef..8b1148d74e7b 100644
--- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
@@ -347,9 +347,7 @@ static int td028ttec1_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = &lcd->spi->dev;
-	lcd->panel.funcs = &td028ttec1_funcs;
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
index 84370562910f..bbf0c2e1c90f 100644
--- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
@@ -458,9 +458,7 @@ static int td043mtea1_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&lcd->panel);
-	lcd->panel.dev = &lcd->spi->dev;
-	lcd->panel.funcs = &td043mtea1_funcs;
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
 
 	ret = drm_panel_add(&lcd->panel);
 	if (ret < 0) {
diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
index 71591e5f5938..25524c26b241 100644
--- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
+++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
@@ -457,9 +457,7 @@ static int tpg110_probe(struct spi_device *spi)
 	if (ret)
 		return ret;
 
-	drm_panel_init(&tpg->panel);
-	tpg->panel.dev = dev;
-	tpg->panel.funcs = &tpg110_drm_funcs;
+	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
 	spi_set_drvdata(spi, tpg);
 
 	return drm_panel_add(&tpg->panel);
diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
index 77e1311b7c69..c3714be78837 100644
--- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
+++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
@@ -518,9 +518,7 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
 	/* dual port */
 	gpiod_set_value(ctx->mode_gpio, 0);
 
-	drm_panel_init(&ctx->panel);
-	ctx->panel.dev = dev;
-	ctx->panel.funcs = &truly_nt35597_drm_funcs;
+	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
 	drm_panel_add(&ctx->panel);
 
 	return 0;
diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
index 624bd15ecfab..4b9c656dc15e 100644
--- a/include/drm/drm_panel.h
+++ b/include/drm/drm_panel.h
@@ -147,7 +147,8 @@ struct drm_panel {
 	struct list_head list;
 };
 
-void drm_panel_init(struct drm_panel *panel);
+void drm_panel_init(struct drm_panel *panel, struct device *dev,
+		    const struct drm_panel_funcs *funcs);
 
 int drm_panel_add(struct drm_panel *panel);
 void drm_panel_remove(struct drm_panel *panel);
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field
  2019-08-23 19:32 [PATCH v2 0/4] drm/panel: Extend panels to report their types Laurent Pinchart
  2019-08-23 19:32 ` [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers Laurent Pinchart
  2019-08-23 19:32 ` [PATCH v2 2/4] drm/panel: Initialise panel dev and funcs through drm_panel_init() Laurent Pinchart
@ 2019-08-23 19:32 ` Laurent Pinchart
  2019-08-24  9:54   ` DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field] Sam Ravnborg
  2019-08-26  7:46   ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Boris Brezillon
  2019-08-23 19:32 ` [PATCH v2 4/4] drm/bridge: panel: Infer connector type from panel by default Laurent Pinchart
  3 siblings, 2 replies; 16+ messages in thread
From: Laurent Pinchart @ 2019-08-23 19:32 UTC (permalink / raw)
  To: dri-devel
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre,
	Vincent Abriou

Add a type field to the drm_panel structure to report the panel type,
using DRM_MODE_CONNECTOR_* macros (the values that make sense are LVDS,
eDP, DSI and DPI). This will be used to initialise the corresponding
connector type.

Update all panel drivers accordingly. The panel-simple driver only
specifies the type for the known to be LVDS panels, while all other
panels are left as unknown and will be converted on a case-by-case
basis as they all need to be carefully reviewed.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Rename the type field to connector_type
- Pass the type to the drm_panel_init() function
- Keep connector type as unknown for non-LVDS panels in panel-simple
- Flag the toshiba_lt089ac29000 panel as LVDS as reported by Boris
---
 drivers/gpu/drm/drm_panel.c                   |  5 +++-
 drivers/gpu/drm/panel/panel-arm-versatile.c   |  3 ++-
 .../drm/panel/panel-feiyang-fy07024di26a30d.c |  3 ++-
 drivers/gpu/drm/panel/panel-ilitek-ili9322.c  |  3 ++-
 drivers/gpu/drm/panel/panel-ilitek-ili9881c.c |  3 ++-
 drivers/gpu/drm/panel/panel-innolux-p079zca.c |  3 ++-
 .../gpu/drm/panel/panel-jdi-lt070me05000.c    |  3 ++-
 .../drm/panel/panel-kingdisplay-kd097d04.c    |  2 +-
 drivers/gpu/drm/panel/panel-lg-lb035q02.c     |  3 ++-
 drivers/gpu/drm/panel/panel-lg-lg4573.c       |  3 ++-
 drivers/gpu/drm/panel/panel-lvds.c            |  3 ++-
 drivers/gpu/drm/panel/panel-nec-nl8048hl11.c  |  3 ++-
 drivers/gpu/drm/panel/panel-novatek-nt39016.c |  3 ++-
 .../drm/panel/panel-olimex-lcd-olinuxino.c    |  3 ++-
 .../gpu/drm/panel/panel-orisetech-otm8009a.c  |  3 ++-
 .../drm/panel/panel-osd-osd101t2587-53ts.c    |  2 +-
 .../drm/panel/panel-panasonic-vvx10f034n00.c  |  2 +-
 .../drm/panel/panel-raspberrypi-touchscreen.c |  3 ++-
 drivers/gpu/drm/panel/panel-raydium-rm67191.c |  3 ++-
 drivers/gpu/drm/panel/panel-raydium-rm68200.c |  3 ++-
 .../drm/panel/panel-rocktech-jh057n00900.c    |  3 ++-
 drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |  3 ++-
 drivers/gpu/drm/panel/panel-samsung-ld9040.c  |  3 ++-
 drivers/gpu/drm/panel/panel-samsung-s6d16d0.c |  3 ++-
 drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c |  3 ++-
 .../gpu/drm/panel/panel-samsung-s6e63j0x03.c  |  3 ++-
 drivers/gpu/drm/panel/panel-samsung-s6e63m0.c |  3 ++-
 drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c |  3 ++-
 drivers/gpu/drm/panel/panel-seiko-43wvf1g.c   |  3 ++-
 .../gpu/drm/panel/panel-sharp-lq101r1sx01.c   |  3 ++-
 .../gpu/drm/panel/panel-sharp-ls037v7dw01.c   |  3 ++-
 .../gpu/drm/panel/panel-sharp-ls043t1le01.c   |  2 +-
 drivers/gpu/drm/panel/panel-simple.c          | 26 ++++++++++++++++++-
 drivers/gpu/drm/panel/panel-sitronix-st7701.c |  3 ++-
 .../gpu/drm/panel/panel-sitronix-st7789v.c    |  3 ++-
 drivers/gpu/drm/panel/panel-sony-acx565akm.c  |  3 ++-
 drivers/gpu/drm/panel/panel-tpo-td028ttec1.c  |  3 ++-
 drivers/gpu/drm/panel/panel-tpo-td043mtea1.c  |  3 ++-
 drivers/gpu/drm/panel/panel-tpo-tpg110.c      |  3 ++-
 drivers/gpu/drm/panel/panel-truly-nt35597.c   |  3 ++-
 include/drm/drm_panel.h                       | 12 ++++++++-
 41 files changed, 112 insertions(+), 41 deletions(-)

diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index ba2fad4c9648..ed7985c0535a 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -46,16 +46,19 @@ static LIST_HEAD(panel_list);
  * @panel: DRM panel
  * @dev: parent device of the panel
  * @funcs: panel operations
+ * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to
+ *	the panel interface
  *
  * Initialize the panel structure for subsequent registration with
  * drm_panel_add().
  */
 void drm_panel_init(struct drm_panel *panel, struct device *dev,
-		    const struct drm_panel_funcs *funcs)
+		    const struct drm_panel_funcs *funcs, int connector_type)
 {
 	INIT_LIST_HEAD(&panel->list);
 	panel->dev = dev;
 	panel->funcs = funcs;
+	panel->connector_type = connector_type;
 }
 EXPORT_SYMBOL(drm_panel_init);
 
diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
index a4333ed0f20c..a0574dc03e16 100644
--- a/drivers/gpu/drm/panel/panel-arm-versatile.c
+++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
@@ -350,7 +350,8 @@ static int versatile_panel_probe(struct platform_device *pdev)
 			dev_info(dev, "panel mounted on IB2 daughterboard\n");
 	}
 
-	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
+	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&vpanel->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
index 7d5d7455bc01..98f184b81187 100644
--- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
+++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
@@ -204,7 +204,8 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ctx);
 	ctx->dsi = dsi;
 
-	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
+	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
 	if (IS_ERR(ctx->dvdd)) {
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
index ad2405baa0ac..24955bec1958 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
@@ -895,7 +895,8 @@ static int ili9322_probe(struct spi_device *spi)
 		ili->input = ili->conf->input;
 	}
 
-	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
+	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&ili->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
index 1d714f961c00..e8789e460a16 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
@@ -433,7 +433,8 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ctx);
 	ctx->dsi = dsi;
 
-	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
+	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ctx->power = devm_regulator_get(&dsi->dev, "power");
 	if (IS_ERR(ctx->power)) {
diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
index 2054afc31f20..46bfeb982b06 100644
--- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
+++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
@@ -487,7 +487,8 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
 	if (IS_ERR(innolux->backlight))
 		return PTR_ERR(innolux->backlight);
 
-	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
+	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs
+		       DRM_MODE_CONNECTOR_DSI);
 
 	err = drm_panel_add(&innolux->base);
 	if (err < 0)
diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
index 7bfdbfbc868e..56364a93f0b8 100644
--- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
+++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
@@ -437,7 +437,8 @@ static int jdi_panel_add(struct jdi_panel *jdi)
 		return ret;
 	}
 
-	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
+	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ret = drm_panel_add(&jdi->base);
 
diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
index a47885a1a8aa..45f96556ec8c 100644
--- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
+++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
@@ -392,7 +392,7 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
 		return PTR_ERR(kingdisplay->backlight);
 
 	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
-		       &kingdisplay_panel_funcs);
+		       &kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI);
 
 	return drm_panel_add(&kingdisplay->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
index 28c3205df482..f984a5189fbf 100644
--- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
+++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
@@ -196,7 +196,8 @@ static int lb035q02_probe(struct spi_device *spi)
 	if (ret < 0)
 		return ret;
 
-	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
index 608f2de91662..db4865a4c2b9 100644
--- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
+++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
@@ -259,7 +259,8 @@ static int lg4573_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
+	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&ctx->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
index 3dc1ac2a6b03..cab3fb4177e3 100644
--- a/drivers/gpu/drm/panel/panel-lvds.c
+++ b/drivers/gpu/drm/panel/panel-lvds.c
@@ -260,7 +260,8 @@ static int panel_lvds_probe(struct platform_device *pdev)
 	 */
 
 	/* Register the panel. */
-	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
+	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs,
+		       DRM_MODE_CONNECTOR_LVDS);
 
 	ret = drm_panel_add(&lvds->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
index b67636fdbc21..c4bc7fa85fad 100644
--- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
@@ -205,7 +205,8 @@ static int nl8048_probe(struct spi_device *spi)
 	if (ret < 0)
 		return ret;
 
-	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
index 64cfe111aaad..60ccedce530c 100644
--- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
+++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
@@ -292,7 +292,8 @@ static int nt39016_probe(struct spi_device *spi)
 		return err;
 	}
 
-	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
+	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	err = drm_panel_add(&panel->drm_panel);
 	if (err < 0) {
diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
index f2d6a4ec0046..f2a72ee6ee07 100644
--- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
+++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
@@ -288,7 +288,8 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
 	if (IS_ERR(lcd->backlight))
 		return PTR_ERR(lcd->backlight);
 
-	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
+	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
index 8b60d5e4d775..bf1f928b215f 100644
--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
+++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
@@ -455,7 +455,8 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
 	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
 			  MIPI_DSI_MODE_LPM;
 
-	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
 						     dsi->host->dev, ctx,
diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
index 38f114b03b89..2b40913899d8 100644
--- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
+++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
@@ -167,7 +167,7 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
 		return PTR_ERR(osd101t2587->backlight);
 
 	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
-		       &osd101t2587_panel_funcs);
+		       &osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI);
 
 	return drm_panel_add(&osd101t2587->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
index 6035bf458074..664605071d34 100644
--- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
+++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
@@ -224,7 +224,7 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
 	}
 
 	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
-		       &wuxga_nt_panel_funcs);
+		       &wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
 
 	ret = drm_panel_add(&wuxga_nt->base);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
index 23a801427e42..09824e92fc78 100644
--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
@@ -426,7 +426,8 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
 		return PTR_ERR(ts->dsi);
 	}
 
-	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
+	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	/* This appears last, as it's what will unblock the DSI host
 	 * driver's component bind function.
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
index f82a1f69f13b..fd67fc6185c4 100644
--- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
+++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
@@ -606,7 +606,8 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
 	if (ret)
 		return ret;
 
-	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
+	drm_panel_init(&panel->panel, dev, &rad_panel_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 	dev_set_drvdata(dev, panel);
 
 	ret = drm_panel_add(&panel->panel);
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
index f004b78fb8bc..994e855721f4 100644
--- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
+++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
@@ -404,7 +404,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
 	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
 			  MIPI_DSI_MODE_LPM;
 
-	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	drm_panel_add(&ctx->panel);
 
diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
index d7f56374f2f1..31234b79d3b1 100644
--- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
+++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
@@ -343,7 +343,8 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	drm_panel_add(&ctx->panel);
 
diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
index 8708fbbe7637..170a5cda21b9 100644
--- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
+++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
@@ -173,7 +173,8 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
 	mipi_dsi_set_drvdata(dsi, ctx);
 	ctx->dsi = dsi;
 
-	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
+	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
 	if (IS_ERR(ctx->gpios.reset)) {
diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
index 71a292dbec47..250809ba37c7 100644
--- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
+++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
@@ -351,7 +351,8 @@ static int ld9040_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&ctx->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
index 4d25c96e842c..e3a0397e953e 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
@@ -215,7 +215,8 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
 		return ret;
 	}
 
-	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
+	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ret = drm_panel_add(&s6->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
index 42a3aaab49eb..938ab72c5540 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
@@ -732,7 +732,8 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
 	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
 	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
 
-	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ret = drm_panel_add(&ctx->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
index b4d879bf4d03..a60635e9226d 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
@@ -466,7 +466,8 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
 		return PTR_ERR(ctx->reset_gpio);
 	}
 
-	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
+	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
 						&s6e63j0x03_bl_ops, NULL);
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
index 61259c2833ab..ba01af0b14fd 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
@@ -473,7 +473,8 @@ static int s6e63m0_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	ret = s6e63m0_backlight_register(ctx);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
index 35dbffabd526..dbced6501204 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
@@ -1017,7 +1017,8 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
 
 	ctx->brightness = GAMMA_LEVEL_NUM - 1;
 
-	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	ret = drm_panel_add(&ctx->panel);
 	if (ret < 0)
diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
index 0833d0c03adc..b3619ba443bd 100644
--- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
+++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
@@ -274,7 +274,8 @@ static int seiko_panel_probe(struct device *dev,
 			return -EPROBE_DEFER;
 	}
 
-	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
+	drm_panel_init(&panel->base, dev, &seiko_panel_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	err = drm_panel_add(&panel->base);
 	if (err < 0)
diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
index 87a58cb4d945..5e136c3ba185 100644
--- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
+++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
@@ -329,7 +329,8 @@ static int sharp_panel_add(struct sharp_panel *sharp)
 	if (IS_ERR(sharp->backlight))
 		return PTR_ERR(sharp->backlight);
 
-	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
+	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	return drm_panel_add(&sharp->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
index 96e3deb0e305..eeab7998c7de 100644
--- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
@@ -185,7 +185,8 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
 		return PTR_ERR(lcd->ud_gpio);
 	}
 
-	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
+	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
index ffa844ee82ad..b963ba4ab589 100644
--- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
+++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
@@ -265,7 +265,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
 		return PTR_ERR(sharp_nt->backlight);
 
 	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
-		       &sharp_nt_panel_funcs);
+		       &sharp_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
 
 	return drm_panel_add(&sharp_nt->base);
 }
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index b36c130d5cf0..4b92b27eba86 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -94,6 +94,7 @@ struct panel_desc {
 
 	u32 bus_format;
 	u32 bus_flags;
+	int connector_type;
 };
 
 struct panel_simple {
@@ -464,7 +465,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
 		panel_simple_parse_panel_timing_node(dev, panel, &dt);
 
-	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
+	drm_panel_init(&panel->base, dev, &panel_simple_funcs,
+		       desc->connector_type);
 
 	err = drm_panel_add(&panel->base);
 	if (err < 0)
@@ -831,6 +833,7 @@ static const struct panel_desc auo_g133han01 = {
 		.unprepare = 1000,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing auo_g185han01_timings = {
@@ -860,6 +863,7 @@ static const struct panel_desc auo_g185han01 = {
 		.unprepare = 1000,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing auo_p320hvn03_timings = {
@@ -888,6 +892,7 @@ static const struct panel_desc auo_p320hvn03 = {
 		.unprepare = 500,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode auo_t215hvn01_mode = {
@@ -1203,6 +1208,7 @@ static const struct panel_desc dlc_dlc0700yzg_1 = {
 		.disable = 200,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing dlc_dlc1010gig_timing = {
@@ -1233,6 +1239,7 @@ static const struct panel_desc dlc_dlc1010gig = {
 		.unprepare = 60,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode edt_et035012dm6_mode = {
@@ -1499,6 +1506,7 @@ static const struct panel_desc hannstar_hsd070pww1 = {
 		.height = 94,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing hannstar_hsd100pxn1_timing = {
@@ -1523,6 +1531,7 @@ static const struct panel_desc hannstar_hsd100pxn1 = {
 		.height = 152,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
@@ -1629,6 +1638,7 @@ static const struct panel_desc innolux_g070y2_l01 = {
 		.unprepare = 800,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing innolux_g101ice_l01_timing = {
@@ -1657,6 +1667,7 @@ static const struct panel_desc innolux_g101ice_l01 = {
 		.disable = 200,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing innolux_g121i1_l01_timing = {
@@ -1684,6 +1695,7 @@ static const struct panel_desc innolux_g121i1_l01 = {
 		.disable = 20,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode innolux_g121x1_l03_mode = {
@@ -1867,6 +1879,7 @@ static const struct panel_desc koe_tx31d200vm0baa = {
 		.height = 109,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing kyo_tcg121xglp_timing = {
@@ -1891,6 +1904,7 @@ static const struct panel_desc kyo_tcg121xglp = {
 		.height = 184,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
@@ -1939,6 +1953,7 @@ static const struct panel_desc lg_lb070wv8 = {
 		.height = 91,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
@@ -2061,6 +2076,7 @@ static const struct panel_desc mitsubishi_aa070mc01 = {
 		.disable = 400,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 	.bus_flags = DRM_BUS_FLAG_DE_HIGH,
 };
 
@@ -2089,6 +2105,7 @@ static const struct panel_desc nec_nl12880bc20_05 = {
 		.disable = 50,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
@@ -2191,6 +2208,7 @@ static const struct panel_desc nlt_nl192108ac18_02d = {
 		.unprepare = 500,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode nvd_9128_mode = {
@@ -2214,6 +2232,7 @@ static const struct panel_desc nvd_9128 = {
 		.height = 88,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing okaya_rs800480t_7x0gp_timing = {
@@ -2626,6 +2645,7 @@ static const struct panel_desc sharp_lq101k1ly04 = {
 		.height = 136,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing sharp_lq123p1jx31_timing = {
@@ -2805,6 +2825,7 @@ static const struct panel_desc tianma_tm070jdhg30 = {
 		.height = 95,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct display_timing tianma_tm070rvhg71_timing = {
@@ -2829,6 +2850,7 @@ static const struct panel_desc tianma_tm070rvhg71 = {
 		.height = 86,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
@@ -2911,6 +2933,7 @@ static const struct panel_desc toshiba_lt089ac29000 = {
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
 	.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode tpk_f07a_0102_mode = {
@@ -2981,6 +3004,7 @@ static const struct panel_desc urt_umsh_8596md_lvds = {
 		.height = 91,
 	},
 	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
+	.connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct panel_desc urt_umsh_8596md_parallel = {
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
index 3f7bcd24aa81..ee3f23f45755 100644
--- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
@@ -369,7 +369,8 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
 	if (IS_ERR(st7701->backlight))
 		return PTR_ERR(st7701->backlight);
 
-	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
+	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 
 	/**
 	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
index 2eeaeee0dd7f..108a85bb6667 100644
--- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
@@ -381,7 +381,8 @@ static int st7789v_probe(struct spi_device *spi)
 	spi_set_drvdata(spi, ctx);
 	ctx->spi = spi;
 
-	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
+	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	ctx->power = devm_regulator_get(&spi->dev, "power");
 	if (IS_ERR(ctx->power))
diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
index 5a2772b04b75..6f5ce5867ff9 100644
--- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
@@ -648,7 +648,8 @@ static int acx565akm_probe(struct spi_device *spi)
 			return ret;
 	}
 
-	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	ret = drm_panel_add(&lcd->panel);
 	if (ret < 0) {
diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
index 8b1148d74e7b..1d08d03f509d 100644
--- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
@@ -347,7 +347,8 @@ static int td028ttec1_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	return drm_panel_add(&lcd->panel);
 }
diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
index bbf0c2e1c90f..416aebd23b6a 100644
--- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
@@ -458,7 +458,8 @@ static int td043mtea1_probe(struct spi_device *spi)
 		return ret;
 	}
 
-	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
+	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 
 	ret = drm_panel_add(&lcd->panel);
 	if (ret < 0) {
diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
index 25524c26b241..1a5418ae2ccf 100644
--- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
+++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
@@ -457,7 +457,8 @@ static int tpg110_probe(struct spi_device *spi)
 	if (ret)
 		return ret;
 
-	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
+	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs,
+		       DRM_MODE_CONNECTOR_DPI);
 	spi_set_drvdata(spi, tpg);
 
 	return drm_panel_add(&tpg->panel);
diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
index c3714be78837..0feea2456e14 100644
--- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
+++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
@@ -518,7 +518,8 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
 	/* dual port */
 	gpiod_set_value(ctx->mode_gpio, 0);
 
-	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
+	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs,
+		       DRM_MODE_CONNECTOR_DSI);
 	drm_panel_add(&ctx->panel);
 
 	return 0;
diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
index 4b9c656dc15e..ce8da64022b4 100644
--- a/include/drm/drm_panel.h
+++ b/include/drm/drm_panel.h
@@ -139,6 +139,15 @@ struct drm_panel {
 	 */
 	const struct drm_panel_funcs *funcs;
 
+	/**
+	 * @connector_type:
+	 *
+	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
+	 * initialise the drm_connector corresponding to the panel with the
+	 * correct connector type.
+	 */
+	int connector_type;
+
 	/**
 	 * @list:
 	 *
@@ -148,7 +157,8 @@ struct drm_panel {
 };
 
 void drm_panel_init(struct drm_panel *panel, struct device *dev,
-		    const struct drm_panel_funcs *funcs);
+		    const struct drm_panel_funcs *funcs,
+		    int connector_type);
 
 int drm_panel_add(struct drm_panel *panel);
 void drm_panel_remove(struct drm_panel *panel);
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v2 4/4] drm/bridge: panel: Infer connector type from panel by default
  2019-08-23 19:32 [PATCH v2 0/4] drm/panel: Extend panels to report their types Laurent Pinchart
                   ` (2 preceding siblings ...)
  2019-08-23 19:32 ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Laurent Pinchart
@ 2019-08-23 19:32 ` Laurent Pinchart
  2019-08-26  7:47   ` Boris Brezillon
  3 siblings, 1 reply; 16+ messages in thread
From: Laurent Pinchart @ 2019-08-23 19:32 UTC (permalink / raw)
  To: dri-devel
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre,
	Vincent Abriou

The drm panel bridge creates a connector using a connector type explicit
passed by the display controller or bridge driver that instantiates the
panel bridge. Now that drm_panel reports its connector type, we can use
it to avoid passing an explicit (and often incorrect) connector type to
drm_panel_bridge_add() and devm_drm_panel_bridge_add().

Several drivers report incorrect or unknown connector types to
userspace. Reporting a different type may result in a breakage. For that
reason, rename (devm_)drm_panel_bridge_add() to
(devm_)drm_panel_bridge_add_typed(), and add new
(devm_)drm_panel_bridge_add() functions that use the panel connector
type. Update all callers of (devm_)drm_panel_bridge_add() to the _typed
function, they will be converted one by one after testing.

The panel drivers have been updated with the following Coccinelle
semantic patch, with manual inspection and fixes to indentation.

@@
expression bridge;
expression dev;
expression panel;
identifier type;
@@
(
-bridge = drm_panel_bridge_add(panel, type);
+bridge = drm_panel_bridge_add_typed(panel, type);
|
-bridge = devm_drm_panel_bridge_add(dev, panel, type);
+bridge = devm_drm_panel_bridge_add_typed(dev, panel, type);
)

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Add and use _typed variants
---
 .../gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c  |  3 +-
 drivers/gpu/drm/bridge/cdns-dsi.c             |  3 +-
 drivers/gpu/drm/bridge/lvds-encoder.c         |  3 +-
 drivers/gpu/drm/bridge/panel.c                | 69 ++++++++++++++++---
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  3 +-
 drivers/gpu/drm/ingenic/ingenic-drm.c         |  4 +-
 drivers/gpu/drm/mcde/mcde_dsi.c               |  4 +-
 drivers/gpu/drm/pl111/pl111_drv.c             |  4 +-
 drivers/gpu/drm/rcar-du/rcar_du_encoder.c     |  4 +-
 drivers/gpu/drm/rockchip/rockchip_rgb.c       |  3 +-
 drivers/gpu/drm/stm/ltdc.c                    |  4 +-
 drivers/gpu/drm/tilcdc/tilcdc_external.c      |  4 +-
 drivers/gpu/drm/tve200/tve200_drv.c           |  4 +-
 drivers/gpu/drm/vc4/vc4_dpi.c                 |  3 +-
 drivers/gpu/drm/vc4/vc4_dsi.c                 |  4 +-
 include/drm/drm_bridge.h                      | 11 +--
 16 files changed, 93 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
index 375fa84c548b..121b62682d80 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
@@ -107,7 +107,8 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev, int endpoint)
 	output->encoder.possible_crtcs = 0x1;
 
 	if (panel) {
-		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_Unknown);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_Unknown);
 		if (IS_ERR(bridge))
 			return PTR_ERR(bridge);
 	}
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c b/drivers/gpu/drm/bridge/cdns-dsi.c
index 6166dca6be81..3a5bd4e7fd1e 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -956,7 +956,8 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host,
 
 	panel = of_drm_find_panel(np);
 	if (!IS_ERR(panel)) {
-		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_DSI);
 	} else {
 		bridge = of_drm_find_bridge(dev->dev.of_node);
 		if (!bridge)
diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c b/drivers/gpu/drm/bridge/lvds-encoder.c
index 2ab2c234f26c..e2132a8d5106 100644
--- a/drivers/gpu/drm/bridge/lvds-encoder.c
+++ b/drivers/gpu/drm/bridge/lvds-encoder.c
@@ -106,7 +106,8 @@ static int lvds_encoder_probe(struct platform_device *pdev)
 	}
 
 	lvds_encoder->panel_bridge =
-		devm_drm_panel_bridge_add(dev, panel, DRM_MODE_CONNECTOR_LVDS);
+		devm_drm_panel_bridge_add_typed(dev, panel,
+						DRM_MODE_CONNECTOR_LVDS);
 	if (IS_ERR(lvds_encoder->panel_bridge))
 		return PTR_ERR(lvds_encoder->panel_bridge);
 
diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
index b12ae3a4c5f1..9d20d4a297ee 100644
--- a/drivers/gpu/drm/bridge/panel.c
+++ b/drivers/gpu/drm/bridge/panel.c
@@ -133,8 +133,6 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
  * just calls the appropriate functions from &drm_panel.
  *
  * @panel: The drm_panel being wrapped.  Must be non-NULL.
- * @connector_type: The DRM_MODE_CONNECTOR_* for the connector to be
- * created.
  *
  * For drivers converting from directly using drm_panel: The expected
  * usage pattern is that during either encoder module probe or DSI
@@ -148,11 +146,37 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
  * drm_mode_config_cleanup() if the bridge has already been attached), then
  * drm_panel_bridge_remove() to free it.
  *
+ * The connector type is set to @panel->connector_type, which must be set to a
+ * known type. Calling this function with a panel whose connector type is
+ * DRM_MODE_CONNECTOR_Unknown will return NULL.
+ *
  * See devm_drm_panel_bridge_add() for an automatically manged version of this
  * function.
  */
-struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
-					u32 connector_type)
+struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel)
+{
+	if (WARN_ON(panel->connector_type == DRM_MODE_CONNECTOR_Unknown))
+		return NULL;
+
+	return drm_panel_bridge_add_typed(panel, panel->connector_type);
+}
+EXPORT_SYMBOL(drm_panel_bridge_add);
+
+/**
+ * drm_panel_bridge_add_typed - Creates a &drm_bridge and &drm_connector with
+ * an explicit connector type.
+ * @panel: The drm_panel being wrapped.  Must be non-NULL.
+ * @connector_type: The connector type (DRM_MODE_CONNECTOR_*)
+ *
+ * This is just like drm_panel_bridge_add(), but forces the connector type to
+ * @connector_type instead of infering it from the panel.
+ *
+ * This function is deprecated and should not be used in new drivers. Use
+ * drm_panel_bridge_add() instead, and fix panel drivers as necessary if they
+ * don't report a connector type.
+ */
+struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
+					      u32 connector_type)
 {
 	struct panel_bridge *panel_bridge;
 
@@ -176,7 +200,7 @@ struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
 
 	return &panel_bridge->bridge;
 }
-EXPORT_SYMBOL(drm_panel_bridge_add);
+EXPORT_SYMBOL(drm_panel_bridge_add_typed);
 
 /**
  * drm_panel_bridge_remove - Unregisters and frees a drm_bridge
@@ -213,15 +237,38 @@ static void devm_drm_panel_bridge_release(struct device *dev, void *res)
  * that just calls the appropriate functions from &drm_panel.
  * @dev: device to tie the bridge lifetime to
  * @panel: The drm_panel being wrapped.  Must be non-NULL.
- * @connector_type: The DRM_MODE_CONNECTOR_* for the connector to be
- * created.
  *
  * This is the managed version of drm_panel_bridge_add() which automatically
  * calls drm_panel_bridge_remove() when @dev is unbound.
  */
 struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
-					     struct drm_panel *panel,
-					     u32 connector_type)
+					     struct drm_panel *panel)
+{
+	if (WARN_ON(panel->connector_type == DRM_MODE_CONNECTOR_Unknown))
+		return NULL;
+
+	return devm_drm_panel_bridge_add_typed(dev, panel,
+					       panel->connector_type);
+}
+EXPORT_SYMBOL(devm_drm_panel_bridge_add);
+
+/**
+ * devm_drm_panel_bridge_add_typed - Creates a managed &drm_bridge and
+ * &drm_connector with an explicit connector type.
+ * @dev: device to tie the bridge lifetime to
+ * @panel: The drm_panel being wrapped.  Must be non-NULL.
+ * @connector_type: The connector type (DRM_MODE_CONNECTOR_*)
+ *
+ * This is just like devm_drm_panel_bridge_add(), but forces the connector type
+ * to @connector_type instead of infering it from the panel.
+ *
+ * This function is deprecated and should not be used in new drivers. Use
+ * devm_drm_panel_bridge_add() instead, and fix panel drivers as necessary if
+ * they don't report a connector type.
+ */
+struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
+						   struct drm_panel *panel,
+						   u32 connector_type)
 {
 	struct drm_bridge **ptr, *bridge;
 
@@ -230,7 +277,7 @@ struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
 	if (!ptr)
 		return ERR_PTR(-ENOMEM);
 
-	bridge = drm_panel_bridge_add(panel, connector_type);
+	bridge = drm_panel_bridge_add_typed(panel, connector_type);
 	if (!IS_ERR(bridge)) {
 		*ptr = bridge;
 		devres_add(dev, ptr);
@@ -240,4 +287,4 @@ struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
 
 	return bridge;
 }
-EXPORT_SYMBOL(devm_drm_panel_bridge_add);
+EXPORT_SYMBOL(devm_drm_panel_bridge_add_typed);
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
index 675442bfc1bd..b8b1c288f663 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
@@ -316,7 +316,8 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
 		return ret;
 
 	if (panel) {
-		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_DSI);
 		if (IS_ERR(bridge))
 			return PTR_ERR(bridge);
 	}
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm.c b/drivers/gpu/drm/ingenic/ingenic-drm.c
index ce1fae3a78a9..73fd33d2595c 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm.c
@@ -676,8 +676,8 @@ static int ingenic_drm_probe(struct platform_device *pdev)
 	}
 
 	if (panel) {
-		bridge = devm_drm_panel_bridge_add(dev, panel,
-						   DRM_MODE_CONNECTOR_Unknown);
+		bridge = devm_drm_panel_bridge_add_typed(dev, panel,
+							 DRM_MODE_CONNECTOR_Unknown);
 	}
 
 	priv->dma_hwdesc = dma_alloc_coherent(dev, sizeof(*priv->dma_hwdesc),
diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c
index 07f7090d08b3..ffb55d3b662c 100644
--- a/drivers/gpu/drm/mcde/mcde_dsi.c
+++ b/drivers/gpu/drm/mcde/mcde_dsi.c
@@ -922,8 +922,8 @@ static int mcde_dsi_bind(struct device *dev, struct device *master,
 		}
 	}
 	if (panel) {
-		bridge = drm_panel_bridge_add(panel,
-					      DRM_MODE_CONNECTOR_DSI);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_DSI);
 		if (IS_ERR(bridge)) {
 			dev_err(dev, "error adding panel bridge\n");
 			return PTR_ERR(bridge);
diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl111_drv.c
index 276b53473a84..63dfcda04147 100644
--- a/drivers/gpu/drm/pl111/pl111_drv.c
+++ b/drivers/gpu/drm/pl111/pl111_drv.c
@@ -150,8 +150,8 @@ static int pl111_modeset_init(struct drm_device *dev)
 		return -EPROBE_DEFER;
 
 	if (panel) {
-		bridge = drm_panel_bridge_add(panel,
-					      DRM_MODE_CONNECTOR_Unknown);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_Unknown);
 		if (IS_ERR(bridge)) {
 			ret = PTR_ERR(bridge);
 			goto out_config;
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
index 0f00bdfe2366..f940d0c6aeb9 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
@@ -84,8 +84,8 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu,
 			goto done;
 		}
 
-		bridge = devm_drm_panel_bridge_add(rcdu->dev, panel,
-						   DRM_MODE_CONNECTOR_DPI);
+		bridge = devm_drm_panel_bridge_add_typed(rcdu->dev, panel,
+							 DRM_MODE_CONNECTOR_DPI);
 		if (IS_ERR(bridge)) {
 			ret = PTR_ERR(bridge);
 			goto done;
diff --git a/drivers/gpu/drm/rockchip/rockchip_rgb.c b/drivers/gpu/drm/rockchip/rockchip_rgb.c
index 89e0bb0fe0ab..a3ba0d5914e8 100644
--- a/drivers/gpu/drm/rockchip/rockchip_rgb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_rgb.c
@@ -135,7 +135,8 @@ struct rockchip_rgb *rockchip_rgb_init(struct device *dev,
 	drm_encoder_helper_add(encoder, &rockchip_rgb_encoder_helper_funcs);
 
 	if (panel) {
-		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_LVDS);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_LVDS);
 		if (IS_ERR(bridge))
 			return ERR_CAST(bridge);
 	}
diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
index 3ab4fbf8eb0d..7cdab685b527 100644
--- a/drivers/gpu/drm/stm/ltdc.c
+++ b/drivers/gpu/drm/stm/ltdc.c
@@ -1236,8 +1236,8 @@ int ltdc_load(struct drm_device *ddev)
 	/* Add endpoints panels or bridges if any */
 	for (i = 0; i < MAX_ENDPOINTS; i++) {
 		if (panel[i]) {
-			bridge[i] = drm_panel_bridge_add(panel[i],
-							DRM_MODE_CONNECTOR_DPI);
+			bridge[i] = drm_panel_bridge_add_typed(panel[i],
+							       DRM_MODE_CONNECTOR_DPI);
 			if (IS_ERR(bridge[i])) {
 				DRM_ERROR("panel-bridge endpoint %d\n", i);
 				ret = PTR_ERR(bridge[i]);
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
index 43d756b7810e..39e9a97610db 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
@@ -139,8 +139,8 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
 	}
 
 	if (panel) {
-		bridge = devm_drm_panel_bridge_add(ddev->dev, panel,
-						   DRM_MODE_CONNECTOR_DPI);
+		bridge = devm_drm_panel_bridge_add_typed(ddev->dev, panel,
+							 DRM_MODE_CONNECTOR_DPI);
 		if (IS_ERR(bridge)) {
 			ret = PTR_ERR(bridge);
 			goto err_encoder_cleanup;
diff --git a/drivers/gpu/drm/tve200/tve200_drv.c b/drivers/gpu/drm/tve200/tve200_drv.c
index 416f24823c0a..954b09c948eb 100644
--- a/drivers/gpu/drm/tve200/tve200_drv.c
+++ b/drivers/gpu/drm/tve200/tve200_drv.c
@@ -80,8 +80,8 @@ static int tve200_modeset_init(struct drm_device *dev)
 	if (ret && ret != -ENODEV)
 		return ret;
 	if (panel) {
-		bridge = drm_panel_bridge_add(panel,
-					      DRM_MODE_CONNECTOR_Unknown);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_Unknown);
 		if (IS_ERR(bridge)) {
 			ret = PTR_ERR(bridge);
 			goto out_bridge;
diff --git a/drivers/gpu/drm/vc4/vc4_dpi.c b/drivers/gpu/drm/vc4/vc4_dpi.c
index 8a27a6acee61..c586325de2a5 100644
--- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -249,7 +249,8 @@ static int vc4_dpi_init_bridge(struct vc4_dpi *dpi)
 	}
 
 	if (panel)
-		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DPI);
+		bridge = drm_panel_bridge_add_typed(panel,
+						    DRM_MODE_CONNECTOR_DPI);
 
 	return drm_bridge_attach(dpi->encoder, bridge, NULL);
 }
diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c
index c78fa8144776..bf4d2a1a22dc 100644
--- a/drivers/gpu/drm/vc4/vc4_dsi.c
+++ b/drivers/gpu/drm/vc4/vc4_dsi.c
@@ -1575,8 +1575,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
 	}
 
 	if (panel) {
-		dsi->bridge = devm_drm_panel_bridge_add(dev, panel,
-							DRM_MODE_CONNECTOR_DSI);
+		dsi->bridge = devm_drm_panel_bridge_add_typed(dev, panel,
+							      DRM_MODE_CONNECTOR_DSI);
 		if (IS_ERR(dsi->bridge))
 			return PTR_ERR(dsi->bridge);
 	}
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 7616f6562fe4..1a4b8ecf5bdb 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -429,12 +429,15 @@ void drm_atomic_bridge_enable(struct drm_bridge *bridge,
 			      struct drm_atomic_state *state);
 
 #ifdef CONFIG_DRM_PANEL_BRIDGE
-struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
-					u32 connector_type);
+struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel);
+struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
+					      u32 connector_type);
 void drm_panel_bridge_remove(struct drm_bridge *bridge);
 struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
-					     struct drm_panel *panel,
-					     u32 connector_type);
+					     struct drm_panel *panel);
+struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
+						   struct drm_panel *panel,
+						   u32 connector_type);
 #endif
 
 #endif
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers
  2019-08-23 19:32 ` [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers Laurent Pinchart
@ 2019-08-24  8:48   ` Sam Ravnborg
  0 siblings, 0 replies; 16+ messages in thread
From: Sam Ravnborg @ 2019-08-24  8:48 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Yannick Fertre, Stefan Mavrodiev, Tomi Valkeinen,
	Ludovic Desroches, Jagan Teki, Robert Chiras, Jonas Karlman,
	Jyri Sarha, Sean Paul, Jernej Skrabec, Purism Kernel Team,
	Boris Brezillon, Nicolas Ferre, Vincent Abriou

On Fri, Aug 23, 2019 at 10:32:42PM +0300, Laurent Pinchart wrote:
> Panels must be initialised with drm_panel_init(). Add the missing
> function call in the panel-raspberrypi-touchscreen.c and
> panel-sitronix-st7789v.c drivers.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Thanks, good to have this done in the right way.

This does not solve any know bugs visible to users. At least there are
no reports I know off. So for now only applied to drm-misc-next.

	Sam

> ---
>  drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 +
>  drivers/gpu/drm/panel/panel-sitronix-st7789v.c        | 1 +
>  2 files changed, 2 insertions(+)
> 
> diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> index b5b14aa059ea..2aa89eaecf6f 100644
> --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> @@ -426,6 +426,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
>  		return PTR_ERR(ts->dsi);
>  	}
>  
> +	drm_panel_init(&ts->base);
>  	ts->base.dev = dev;
>  	ts->base.funcs = &rpi_touchscreen_funcs;
>  
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> index 5e3e92ea9ea6..3b2612ae931e 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> @@ -381,6 +381,7 @@ static int st7789v_probe(struct spi_device *spi)
>  	spi_set_drvdata(spi, ctx);
>  	ctx->spi = spi;
>  
> +	drm_panel_init(&ctx->panel);
>  	ctx->panel.dev = &spi->dev;
>  	ctx->panel.funcs = &st7789v_drm_funcs;
>  
> -- 
> Regards,
> 
> Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 2/4] drm/panel: Initialise panel dev and funcs through drm_panel_init()
  2019-08-23 19:32 ` [PATCH v2 2/4] drm/panel: Initialise panel dev and funcs through drm_panel_init() Laurent Pinchart
@ 2019-08-24  8:50   ` Sam Ravnborg
  0 siblings, 0 replies; 16+ messages in thread
From: Sam Ravnborg @ 2019-08-24  8:50 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Yannick Fertre, Stefan Mavrodiev, Tomi Valkeinen,
	Ludovic Desroches, Jagan Teki, Robert Chiras, Jonas Karlman,
	Jyri Sarha, Sean Paul, Jernej Skrabec, Purism Kernel Team,
	Boris Brezillon, Nicolas Ferre, Vincent Abriou

On Fri, Aug 23, 2019 at 10:32:43PM +0300, Laurent Pinchart wrote:
> Instead of requiring all drivers to set the dev and funcs fields of
> drm_panel manually after calling drm_panel_init(), pass the data as
> arguments to the function. This simplifies the panel drivers, and will
> help future refactoring when adding new arguments to drm_panel_init().
> 
> The panel drivers have been updated with the following Coccinelle
> semantic patch, with manual inspection to verify that no call to
> drm_panel_init() with a single argument still exists.
> 
> @@
> expression panel;
> expression device;
> identifier ops;
> @@
>  drm_panel_init(&panel
> +	, device, &ops
>  );
>  ...
> (
> -panel.dev = device;
> -panel.funcs = &ops;
> |
> -panel.funcs = &ops;
> -panel.dev = device;
> )
> 
> Suggested-by: Sam Ravnborg <sam@ravnborg.org>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Thanks, applied to drm-misc-next.
Nice use of Coccinelle.

	Sam


> ---
>  drivers/gpu/drm/drm_panel.c                           | 11 ++++++++---
>  drivers/gpu/drm/panel/panel-arm-versatile.c           |  4 +---
>  drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c |  4 +---
>  drivers/gpu/drm/panel/panel-ilitek-ili9322.c          |  4 +---
>  drivers/gpu/drm/panel/panel-ilitek-ili9881c.c         |  4 +---
>  drivers/gpu/drm/panel/panel-innolux-p079zca.c         |  4 +---
>  drivers/gpu/drm/panel/panel-jdi-lt070me05000.c        |  4 +---
>  drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c    |  5 ++---
>  drivers/gpu/drm/panel/panel-lg-lb035q02.c             |  4 +---
>  drivers/gpu/drm/panel/panel-lg-lg4573.c               |  4 +---
>  drivers/gpu/drm/panel/panel-lvds.c                    |  4 +---
>  drivers/gpu/drm/panel/panel-nec-nl8048hl11.c          |  4 +---
>  drivers/gpu/drm/panel/panel-novatek-nt39016.c         |  4 +---
>  drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c    |  4 +---
>  drivers/gpu/drm/panel/panel-orisetech-otm8009a.c      |  4 +---
>  drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c    |  5 ++---
>  drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c  |  5 ++---
>  drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c |  4 +---
>  drivers/gpu/drm/panel/panel-raydium-rm67191.c         |  4 +---
>  drivers/gpu/drm/panel/panel-raydium-rm68200.c         |  4 +---
>  drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c    |  4 +---
>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c          |  4 +---
>  drivers/gpu/drm/panel/panel-samsung-ld9040.c          |  4 +---
>  drivers/gpu/drm/panel/panel-samsung-s6d16d0.c         |  4 +---
>  drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c         |  4 +---
>  drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c      |  4 +---
>  drivers/gpu/drm/panel/panel-samsung-s6e63m0.c         |  4 +---
>  drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c         |  4 +---
>  drivers/gpu/drm/panel/panel-seiko-43wvf1g.c           |  4 +---
>  drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c       |  4 +---
>  drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c       |  4 +---
>  drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c       |  5 ++---
>  drivers/gpu/drm/panel/panel-simple.c                  |  4 +---
>  drivers/gpu/drm/panel/panel-sitronix-st7701.c         |  4 +---
>  drivers/gpu/drm/panel/panel-sitronix-st7789v.c        |  4 +---
>  drivers/gpu/drm/panel/panel-sony-acx565akm.c          |  4 +---
>  drivers/gpu/drm/panel/panel-tpo-td028ttec1.c          |  4 +---
>  drivers/gpu/drm/panel/panel-tpo-td043mtea1.c          |  4 +---
>  drivers/gpu/drm/panel/panel-tpo-tpg110.c              |  4 +---
>  drivers/gpu/drm/panel/panel-truly-nt35597.c           |  4 +---
>  include/drm/drm_panel.h                               |  3 ++-
>  41 files changed, 53 insertions(+), 121 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index 6b0bf42039cf..ba2fad4c9648 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -44,13 +44,18 @@ static LIST_HEAD(panel_list);
>  /**
>   * drm_panel_init - initialize a panel
>   * @panel: DRM panel
> + * @dev: parent device of the panel
> + * @funcs: panel operations
>   *
> - * Sets up internal fields of the panel so that it can subsequently be added
> - * to the registry.
> + * Initialize the panel structure for subsequent registration with
> + * drm_panel_add().
>   */
> -void drm_panel_init(struct drm_panel *panel)
> +void drm_panel_init(struct drm_panel *panel, struct device *dev,
> +		    const struct drm_panel_funcs *funcs)
>  {
>  	INIT_LIST_HEAD(&panel->list);
> +	panel->dev = dev;
> +	panel->funcs = funcs;
>  }
>  EXPORT_SYMBOL(drm_panel_init);
>  
> diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
> index 5f72c922a04b..a4333ed0f20c 100644
> --- a/drivers/gpu/drm/panel/panel-arm-versatile.c
> +++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
> @@ -350,9 +350,7 @@ static int versatile_panel_probe(struct platform_device *pdev)
>  			dev_info(dev, "panel mounted on IB2 daughterboard\n");
>  	}
>  
> -	drm_panel_init(&vpanel->panel);
> -	vpanel->panel.dev = dev;
> -	vpanel->panel.funcs = &versatile_panel_drm_funcs;
> +	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
>  
>  	return drm_panel_add(&vpanel->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> index dabf59e0f56f..7d5d7455bc01 100644
> --- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> @@ -204,9 +204,7 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = &dsi->dev;
> -	ctx->panel.funcs = &feiyang_funcs;
> +	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
>  
>  	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
>  	if (IS_ERR(ctx->dvdd)) {
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> index 3c58f63adbf7..ad2405baa0ac 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> @@ -895,9 +895,7 @@ static int ili9322_probe(struct spi_device *spi)
>  		ili->input = ili->conf->input;
>  	}
>  
> -	drm_panel_init(&ili->panel);
> -	ili->panel.dev = dev;
> -	ili->panel.funcs = &ili9322_drm_funcs;
> +	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
>  
>  	return drm_panel_add(&ili->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> index 3ad4a46c4e94..1d714f961c00 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> @@ -433,9 +433,7 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = &dsi->dev;
> -	ctx->panel.funcs = &ili9881c_funcs;
> +	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
>  
>  	ctx->power = devm_regulator_get(&dsi->dev, "power");
>  	if (IS_ERR(ctx->power)) {
> diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> index d92d1c98878c..2054afc31f20 100644
> --- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> +++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> @@ -487,9 +487,7 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
>  	if (IS_ERR(innolux->backlight))
>  		return PTR_ERR(innolux->backlight);
>  
> -	drm_panel_init(&innolux->base);
> -	innolux->base.funcs = &innolux_panel_funcs;
> -	innolux->base.dev = dev;
> +	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
>  
>  	err = drm_panel_add(&innolux->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> index ff3e89e61e3f..7bfdbfbc868e 100644
> --- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> @@ -437,9 +437,7 @@ static int jdi_panel_add(struct jdi_panel *jdi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&jdi->base);
> -	jdi->base.funcs = &jdi_panel_funcs;
> -	jdi->base.dev = &jdi->dsi->dev;
> +	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
>  
>  	ret = drm_panel_add(&jdi->base);
>  
> diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> index 3ac04eb8d0fe..a47885a1a8aa 100644
> --- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> +++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> @@ -391,9 +391,8 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
>  	if (IS_ERR(kingdisplay->backlight))
>  		return PTR_ERR(kingdisplay->backlight);
>  
> -	drm_panel_init(&kingdisplay->base);
> -	kingdisplay->base.funcs = &kingdisplay_panel_funcs;
> -	kingdisplay->base.dev = &kingdisplay->link->dev;
> +	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
> +		       &kingdisplay_panel_funcs);
>  
>  	return drm_panel_add(&kingdisplay->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> index fc82a525b071..28c3205df482 100644
> --- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> +++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> @@ -196,9 +196,7 @@ static int lb035q02_probe(struct spi_device *spi)
>  	if (ret < 0)
>  		return ret;
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = &lcd->spi->dev;
> -	lcd->panel.funcs = &lb035q02_funcs;
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> index 41bf02d122a1..608f2de91662 100644
> --- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
> +++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> @@ -259,9 +259,7 @@ static int lg4573_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = &spi->dev;
> -	ctx->panel.funcs = &lg4573_drm_funcs;
> +	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
>  
>  	return drm_panel_add(&ctx->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
> index ad47cc95459e..3dc1ac2a6b03 100644
> --- a/drivers/gpu/drm/panel/panel-lvds.c
> +++ b/drivers/gpu/drm/panel/panel-lvds.c
> @@ -260,9 +260,7 @@ static int panel_lvds_probe(struct platform_device *pdev)
>  	 */
>  
>  	/* Register the panel. */
> -	drm_panel_init(&lvds->panel);
> -	lvds->panel.dev = lvds->dev;
> -	lvds->panel.funcs = &panel_lvds_funcs;
> +	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
>  
>  	ret = drm_panel_add(&lvds->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> index 299b217c83e1..b67636fdbc21 100644
> --- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> @@ -205,9 +205,7 @@ static int nl8048_probe(struct spi_device *spi)
>  	if (ret < 0)
>  		return ret;
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = &lcd->spi->dev;
> -	lcd->panel.funcs = &nl8048_funcs;
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> index 2ad1063b068d..64cfe111aaad 100644
> --- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> +++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> @@ -292,9 +292,7 @@ static int nt39016_probe(struct spi_device *spi)
>  		return err;
>  	}
>  
> -	drm_panel_init(&panel->drm_panel);
> -	panel->drm_panel.dev = dev;
> -	panel->drm_panel.funcs = &nt39016_funcs;
> +	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
>  
>  	err = drm_panel_add(&panel->drm_panel);
>  	if (err < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> index 2bae1db3ff34..f2d6a4ec0046 100644
> --- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> +++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> @@ -288,9 +288,7 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
>  	if (IS_ERR(lcd->backlight))
>  		return PTR_ERR(lcd->backlight);
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = dev;
> -	lcd->panel.funcs = &lcd_olinuxino_funcs;
> +	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> index c7b48df8869a..8b60d5e4d775 100644
> --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> @@ -455,9 +455,7 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
>  			  MIPI_DSI_MODE_LPM;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &otm8009a_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
>  
>  	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
>  						     dsi->host->dev, ctx,
> diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> index e0e20ecff916..38f114b03b89 100644
> --- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> +++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> @@ -166,9 +166,8 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
>  	if (IS_ERR(osd101t2587->backlight))
>  		return PTR_ERR(osd101t2587->backlight);
>  
> -	drm_panel_init(&osd101t2587->base);
> -	osd101t2587->base.funcs = &osd101t2587_panel_funcs;
> -	osd101t2587->base.dev = &osd101t2587->dsi->dev;
> +	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
> +		       &osd101t2587_panel_funcs);
>  
>  	return drm_panel_add(&osd101t2587->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> index 3dff0b3f73c2..6035bf458074 100644
> --- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> +++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> @@ -223,9 +223,8 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
>  			return -EPROBE_DEFER;
>  	}
>  
> -	drm_panel_init(&wuxga_nt->base);
> -	wuxga_nt->base.funcs = &wuxga_nt_panel_funcs;
> -	wuxga_nt->base.dev = &wuxga_nt->dsi->dev;
> +	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
> +		       &wuxga_nt_panel_funcs);
>  
>  	ret = drm_panel_add(&wuxga_nt->base);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> index 2aa89eaecf6f..23a801427e42 100644
> --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> @@ -426,9 +426,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
>  		return PTR_ERR(ts->dsi);
>  	}
>  
> -	drm_panel_init(&ts->base);
> -	ts->base.dev = dev;
> -	ts->base.funcs = &rpi_touchscreen_funcs;
> +	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
>  
>  	/* This appears last, as it's what will unblock the DSI host
>  	 * driver's component bind function.
> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> index 6a5d37006103..f82a1f69f13b 100644
> --- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> @@ -606,9 +606,7 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
>  	if (ret)
>  		return ret;
>  
> -	drm_panel_init(&panel->panel);
> -	panel->panel.funcs = &rad_panel_funcs;
> -	panel->panel.dev = dev;
> +	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
>  	dev_set_drvdata(dev, panel);
>  
>  	ret = drm_panel_add(&panel->panel);
> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> index ba889625ad43..f004b78fb8bc 100644
> --- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> @@ -404,9 +404,7 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
>  			  MIPI_DSI_MODE_LPM;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &rm68200_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
>  
>  	drm_panel_add(&ctx->panel);
>  
> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> index b9109922397f..d7f56374f2f1 100644
> --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> @@ -343,9 +343,7 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &jh057n_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
>  
>  	drm_panel_add(&ctx->panel);
>  
> diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> index 3c15764f0c03..8708fbbe7637 100644
> --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> @@ -173,9 +173,7 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = &dsi->dev;
> -	ctx->panel.funcs = &rb070d30_panel_funcs;
> +	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
>  
>  	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
>  	if (IS_ERR(ctx->gpios.reset)) {
> diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> index 3be902dcedc0..71a292dbec47 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> @@ -351,9 +351,7 @@ static int ld9040_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &ld9040_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
>  
>  	return drm_panel_add(&ctx->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> index f75bef24e050..4d25c96e842c 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> @@ -215,9 +215,7 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&s6->panel);
> -	s6->panel.dev = dev;
> -	s6->panel.funcs = &s6d16d0_drm_funcs;
> +	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
>  
>  	ret = drm_panel_add(&s6->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> index b923de23ed65..42a3aaab49eb 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> @@ -732,9 +732,7 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
>  	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
>  	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &s6e3ha2_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
>  
>  	ret = drm_panel_add(&ctx->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> index cd90fa700c49..b4d879bf4d03 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> @@ -466,9 +466,7 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
>  		return PTR_ERR(ctx->reset_gpio);
>  	}
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &s6e63j0x03_funcs;
> +	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
>  
>  	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
>  						&s6e63j0x03_bl_ops, NULL);
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> index 142d395ea512..61259c2833ab 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> @@ -473,9 +473,7 @@ static int s6e63m0_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &s6e63m0_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
>  
>  	ret = s6e63m0_backlight_register(ctx);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> index 81858267723a..35dbffabd526 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> @@ -1017,9 +1017,7 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
>  
>  	ctx->brightness = GAMMA_LEVEL_NUM - 1;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &s6e8aa0_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
>  
>  	ret = drm_panel_add(&ctx->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> index 18b22b1294fb..0833d0c03adc 100644
> --- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> +++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> @@ -274,9 +274,7 @@ static int seiko_panel_probe(struct device *dev,
>  			return -EPROBE_DEFER;
>  	}
>  
> -	drm_panel_init(&panel->base);
> -	panel->base.dev = dev;
> -	panel->base.funcs = &seiko_panel_funcs;
> +	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
>  
>  	err = drm_panel_add(&panel->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> index e910b4ad1310..87a58cb4d945 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> @@ -329,9 +329,7 @@ static int sharp_panel_add(struct sharp_panel *sharp)
>  	if (IS_ERR(sharp->backlight))
>  		return PTR_ERR(sharp->backlight);
>  
> -	drm_panel_init(&sharp->base);
> -	sharp->base.funcs = &sharp_panel_funcs;
> -	sharp->base.dev = &sharp->link1->dev;
> +	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
>  
>  	return drm_panel_add(&sharp->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> index 46cd9a250129..96e3deb0e305 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> @@ -185,9 +185,7 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
>  		return PTR_ERR(lcd->ud_gpio);
>  	}
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = &pdev->dev;
> -	lcd->panel.funcs = &ls037v7dw01_funcs;
> +	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> index c39abde9f9f1..ffa844ee82ad 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> @@ -264,9 +264,8 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
>  	if (IS_ERR(sharp_nt->backlight))
>  		return PTR_ERR(sharp_nt->backlight);
>  
> -	drm_panel_init(&sharp_nt->base);
> -	sharp_nt->base.funcs = &sharp_nt_panel_funcs;
> -	sharp_nt->base.dev = &sharp_nt->dsi->dev;
> +	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
> +		       &sharp_nt_panel_funcs);
>  
>  	return drm_panel_add(&sharp_nt->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
> index 28fa6ba7b767..b36c130d5cf0 100644
> --- a/drivers/gpu/drm/panel/panel-simple.c
> +++ b/drivers/gpu/drm/panel/panel-simple.c
> @@ -464,9 +464,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
>  	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
>  		panel_simple_parse_panel_timing_node(dev, panel, &dt);
>  
> -	drm_panel_init(&panel->base);
> -	panel->base.dev = dev;
> -	panel->base.funcs = &panel_simple_funcs;
> +	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
>  
>  	err = drm_panel_add(&panel->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> index 09c5d9a6f9fa..3f7bcd24aa81 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> @@ -369,7 +369,7 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
>  	if (IS_ERR(st7701->backlight))
>  		return PTR_ERR(st7701->backlight);
>  
> -	drm_panel_init(&st7701->panel);
> +	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
>  
>  	/**
>  	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
> @@ -381,8 +381,6 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
>  	 * ts8550b and there is no valid documentation for that.
>  	 */
>  	st7701->sleep_delay = 120 + desc->panel_sleep_delay;
> -	st7701->panel.funcs = &st7701_funcs;
> -	st7701->panel.dev = &dsi->dev;
>  
>  	ret = drm_panel_add(&st7701->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> index 3b2612ae931e..2eeaeee0dd7f 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> @@ -381,9 +381,7 @@ static int st7789v_probe(struct spi_device *spi)
>  	spi_set_drvdata(spi, ctx);
>  	ctx->spi = spi;
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = &spi->dev;
> -	ctx->panel.funcs = &st7789v_drm_funcs;
> +	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
>  
>  	ctx->power = devm_regulator_get(&spi->dev, "power");
>  	if (IS_ERR(ctx->power))
> diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> index 305259b58767..5a2772b04b75 100644
> --- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> @@ -648,9 +648,7 @@ static int acx565akm_probe(struct spi_device *spi)
>  			return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = &lcd->spi->dev;
> -	lcd->panel.funcs = &acx565akm_funcs;
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
>  
>  	ret = drm_panel_add(&lcd->panel);
>  	if (ret < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> index d7b2e34626ef..8b1148d74e7b 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> @@ -347,9 +347,7 @@ static int td028ttec1_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = &lcd->spi->dev;
> -	lcd->panel.funcs = &td028ttec1_funcs;
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> index 84370562910f..bbf0c2e1c90f 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> @@ -458,9 +458,7 @@ static int td043mtea1_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel);
> -	lcd->panel.dev = &lcd->spi->dev;
> -	lcd->panel.funcs = &td043mtea1_funcs;
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
>  
>  	ret = drm_panel_add(&lcd->panel);
>  	if (ret < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> index 71591e5f5938..25524c26b241 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> @@ -457,9 +457,7 @@ static int tpg110_probe(struct spi_device *spi)
>  	if (ret)
>  		return ret;
>  
> -	drm_panel_init(&tpg->panel);
> -	tpg->panel.dev = dev;
> -	tpg->panel.funcs = &tpg110_drm_funcs;
> +	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
>  	spi_set_drvdata(spi, tpg);
>  
>  	return drm_panel_add(&tpg->panel);
> diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> index 77e1311b7c69..c3714be78837 100644
> --- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
> +++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> @@ -518,9 +518,7 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
>  	/* dual port */
>  	gpiod_set_value(ctx->mode_gpio, 0);
>  
> -	drm_panel_init(&ctx->panel);
> -	ctx->panel.dev = dev;
> -	ctx->panel.funcs = &truly_nt35597_drm_funcs;
> +	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
>  	drm_panel_add(&ctx->panel);
>  
>  	return 0;
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 624bd15ecfab..4b9c656dc15e 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -147,7 +147,8 @@ struct drm_panel {
>  	struct list_head list;
>  };
>  
> -void drm_panel_init(struct drm_panel *panel);
> +void drm_panel_init(struct drm_panel *panel, struct device *dev,
> +		    const struct drm_panel_funcs *funcs);
>  
>  int drm_panel_add(struct drm_panel *panel);
>  void drm_panel_remove(struct drm_panel *panel);
> -- 
> Regards,
> 
> Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-08-23 19:32 ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Laurent Pinchart
@ 2019-08-24  9:54   ` Sam Ravnborg
  2019-08-24 14:02     ` Laurent Pinchart
  2019-09-27 12:37     ` Linus Walleij
  2019-08-26  7:46   ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Boris Brezillon
  1 sibling, 2 replies; 16+ messages in thread
From: Sam Ravnborg @ 2019-08-24  9:54 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Yannick Fertre, Stefan Mavrodiev, Tomi Valkeinen,
	Ludovic Desroches, Jagan Teki, Robert Chiras, Jonas Karlman,
	Jyri Sarha, Sean Paul, Jernej Skrabec, Purism Kernel Team,
	Boris Brezillon, Nicolas Ferre, Vincent Abriou

Hi Laurent et all.

On Fri, Aug 23, 2019 at 10:32:44PM +0300, Laurent Pinchart wrote:
> Add a type field to the drm_panel structure to report the panel type,
> using DRM_MODE_CONNECTOR_* macros (the values that make sense are LVDS,
> eDP, DSI and DPI). This will be used to initialise the corresponding
> connector type.

As discussed on irc before applying this we should evaluate the
idea to introduce DRM_MODE_CONNECTOR_PANEL

Today we have:
    DRM_MODE_CONNECTOR_DPI
    DRM_MODE_CONNECTOR_DBI
    DRM_MODE_CONNECTOR_SPI
    DRM_MODE_CONNECTOR_LVDS

The question if what benefit ig gives to distingush between the
different ways panels are connected.

For example for VGA and HDMI there is a physical connector involved so
here it make good sense.
But why should userspace care if the panel is connected via DPI or LVDS?

The more generic DRM_MODE_CONNECTOR_PANEL would be equally descriptive.

We will also start to see new drivers where there will be support
for more than one type of connector interface.

Like for example ili9322:
 - 8-bit serial RGB interface
 - 24-bit parallel RGB interface
 - 8-bit ITU-R BT.601 interface
 - 8-bit ITU-R BT.656 interface

Adding DRM_MODE_CONNECTOR_PANEL may create an xkcd 927 situation.
But we should then deprecate _DPI, _DBI, _SPI, _LVDS.

	Sam


> 
> Update all panel drivers accordingly. The panel-simple driver only
> specifies the type for the known to be LVDS panels, while all other
> panels are left as unknown and will be converted on a case-by-case
> basis as they all need to be carefully reviewed.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> Changes since v1:
> 
> - Rename the type field to connector_type
> - Pass the type to the drm_panel_init() function
> - Keep connector type as unknown for non-LVDS panels in panel-simple
> - Flag the toshiba_lt089ac29000 panel as LVDS as reported by Boris
> ---
>  drivers/gpu/drm/drm_panel.c                   |  5 +++-
>  drivers/gpu/drm/panel/panel-arm-versatile.c   |  3 ++-
>  .../drm/panel/panel-feiyang-fy07024di26a30d.c |  3 ++-
>  drivers/gpu/drm/panel/panel-ilitek-ili9322.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-ilitek-ili9881c.c |  3 ++-
>  drivers/gpu/drm/panel/panel-innolux-p079zca.c |  3 ++-
>  .../gpu/drm/panel/panel-jdi-lt070me05000.c    |  3 ++-
>  .../drm/panel/panel-kingdisplay-kd097d04.c    |  2 +-
>  drivers/gpu/drm/panel/panel-lg-lb035q02.c     |  3 ++-
>  drivers/gpu/drm/panel/panel-lg-lg4573.c       |  3 ++-
>  drivers/gpu/drm/panel/panel-lvds.c            |  3 ++-
>  drivers/gpu/drm/panel/panel-nec-nl8048hl11.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-novatek-nt39016.c |  3 ++-
>  .../drm/panel/panel-olimex-lcd-olinuxino.c    |  3 ++-
>  .../gpu/drm/panel/panel-orisetech-otm8009a.c  |  3 ++-
>  .../drm/panel/panel-osd-osd101t2587-53ts.c    |  2 +-
>  .../drm/panel/panel-panasonic-vvx10f034n00.c  |  2 +-
>  .../drm/panel/panel-raspberrypi-touchscreen.c |  3 ++-
>  drivers/gpu/drm/panel/panel-raydium-rm67191.c |  3 ++-
>  drivers/gpu/drm/panel/panel-raydium-rm68200.c |  3 ++-
>  .../drm/panel/panel-rocktech-jh057n00900.c    |  3 ++-
>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-ld9040.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6d16d0.c |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c |  3 ++-
>  .../gpu/drm/panel/panel-samsung-s6e63j0x03.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6e63m0.c |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c |  3 ++-
>  drivers/gpu/drm/panel/panel-seiko-43wvf1g.c   |  3 ++-
>  .../gpu/drm/panel/panel-sharp-lq101r1sx01.c   |  3 ++-
>  .../gpu/drm/panel/panel-sharp-ls037v7dw01.c   |  3 ++-
>  .../gpu/drm/panel/panel-sharp-ls043t1le01.c   |  2 +-
>  drivers/gpu/drm/panel/panel-simple.c          | 26 ++++++++++++++++++-
>  drivers/gpu/drm/panel/panel-sitronix-st7701.c |  3 ++-
>  .../gpu/drm/panel/panel-sitronix-st7789v.c    |  3 ++-
>  drivers/gpu/drm/panel/panel-sony-acx565akm.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-tpo-td028ttec1.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-tpo-td043mtea1.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-tpo-tpg110.c      |  3 ++-
>  drivers/gpu/drm/panel/panel-truly-nt35597.c   |  3 ++-
>  include/drm/drm_panel.h                       | 12 ++++++++-
>  41 files changed, 112 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index ba2fad4c9648..ed7985c0535a 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -46,16 +46,19 @@ static LIST_HEAD(panel_list);
>   * @panel: DRM panel
>   * @dev: parent device of the panel
>   * @funcs: panel operations
> + * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to
> + *	the panel interface
>   *
>   * Initialize the panel structure for subsequent registration with
>   * drm_panel_add().
>   */
>  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> -		    const struct drm_panel_funcs *funcs)
> +		    const struct drm_panel_funcs *funcs, int connector_type)
>  {
>  	INIT_LIST_HEAD(&panel->list);
>  	panel->dev = dev;
>  	panel->funcs = funcs;
> +	panel->connector_type = connector_type;
>  }
>  EXPORT_SYMBOL(drm_panel_init);
>  
> diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
> index a4333ed0f20c..a0574dc03e16 100644
> --- a/drivers/gpu/drm/panel/panel-arm-versatile.c
> +++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
> @@ -350,7 +350,8 @@ static int versatile_panel_probe(struct platform_device *pdev)
>  			dev_info(dev, "panel mounted on IB2 daughterboard\n");
>  	}
>  
> -	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
> +	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&vpanel->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> index 7d5d7455bc01..98f184b81187 100644
> --- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> @@ -204,7 +204,8 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
> +	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
>  	if (IS_ERR(ctx->dvdd)) {
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> index ad2405baa0ac..24955bec1958 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> @@ -895,7 +895,8 @@ static int ili9322_probe(struct spi_device *spi)
>  		ili->input = ili->conf->input;
>  	}
>  
> -	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
> +	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&ili->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> index 1d714f961c00..e8789e460a16 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> @@ -433,7 +433,8 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
> +	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->power = devm_regulator_get(&dsi->dev, "power");
>  	if (IS_ERR(ctx->power)) {
> diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> index 2054afc31f20..46bfeb982b06 100644
> --- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> +++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> @@ -487,7 +487,8 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
>  	if (IS_ERR(innolux->backlight))
>  		return PTR_ERR(innolux->backlight);
>  
> -	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
> +	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	err = drm_panel_add(&innolux->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> index 7bfdbfbc868e..56364a93f0b8 100644
> --- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> @@ -437,7 +437,8 @@ static int jdi_panel_add(struct jdi_panel *jdi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
> +	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&jdi->base);
>  
> diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> index a47885a1a8aa..45f96556ec8c 100644
> --- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> +++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> @@ -392,7 +392,7 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
>  		return PTR_ERR(kingdisplay->backlight);
>  
>  	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
> -		       &kingdisplay_panel_funcs);
> +		       &kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&kingdisplay->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> index 28c3205df482..f984a5189fbf 100644
> --- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> +++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> @@ -196,7 +196,8 @@ static int lb035q02_probe(struct spi_device *spi)
>  	if (ret < 0)
>  		return ret;
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> index 608f2de91662..db4865a4c2b9 100644
> --- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
> +++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> @@ -259,7 +259,8 @@ static int lg4573_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
> +	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&ctx->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
> index 3dc1ac2a6b03..cab3fb4177e3 100644
> --- a/drivers/gpu/drm/panel/panel-lvds.c
> +++ b/drivers/gpu/drm/panel/panel-lvds.c
> @@ -260,7 +260,8 @@ static int panel_lvds_probe(struct platform_device *pdev)
>  	 */
>  
>  	/* Register the panel. */
> -	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
> +	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs,
> +		       DRM_MODE_CONNECTOR_LVDS);
>  
>  	ret = drm_panel_add(&lvds->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> index b67636fdbc21..c4bc7fa85fad 100644
> --- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> @@ -205,7 +205,8 @@ static int nl8048_probe(struct spi_device *spi)
>  	if (ret < 0)
>  		return ret;
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> index 64cfe111aaad..60ccedce530c 100644
> --- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> +++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> @@ -292,7 +292,8 @@ static int nt39016_probe(struct spi_device *spi)
>  		return err;
>  	}
>  
> -	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
> +	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	err = drm_panel_add(&panel->drm_panel);
>  	if (err < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> index f2d6a4ec0046..f2a72ee6ee07 100644
> --- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> +++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> @@ -288,7 +288,8 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
>  	if (IS_ERR(lcd->backlight))
>  		return PTR_ERR(lcd->backlight);
>  
> -	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
> +	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> index 8b60d5e4d775..bf1f928b215f 100644
> --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> @@ -455,7 +455,8 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
>  			  MIPI_DSI_MODE_LPM;
>  
> -	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
>  						     dsi->host->dev, ctx,
> diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> index 38f114b03b89..2b40913899d8 100644
> --- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> +++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> @@ -167,7 +167,7 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
>  		return PTR_ERR(osd101t2587->backlight);
>  
>  	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
> -		       &osd101t2587_panel_funcs);
> +		       &osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&osd101t2587->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> index 6035bf458074..664605071d34 100644
> --- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> +++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> @@ -224,7 +224,7 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
>  	}
>  
>  	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
> -		       &wuxga_nt_panel_funcs);
> +		       &wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&wuxga_nt->base);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> index 23a801427e42..09824e92fc78 100644
> --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> @@ -426,7 +426,8 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
>  		return PTR_ERR(ts->dsi);
>  	}
>  
> -	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
> +	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	/* This appears last, as it's what will unblock the DSI host
>  	 * driver's component bind function.
> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> index f82a1f69f13b..fd67fc6185c4 100644
> --- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> @@ -606,7 +606,8 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
>  	if (ret)
>  		return ret;
>  
> -	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
> +	drm_panel_init(&panel->panel, dev, &rad_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  	dev_set_drvdata(dev, panel);
>  
>  	ret = drm_panel_add(&panel->panel);
> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> index f004b78fb8bc..994e855721f4 100644
> --- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> @@ -404,7 +404,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
>  			  MIPI_DSI_MODE_LPM;
>  
> -	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	drm_panel_add(&ctx->panel);
>  
> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> index d7f56374f2f1..31234b79d3b1 100644
> --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> @@ -343,7 +343,8 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	drm_panel_add(&ctx->panel);
>  
> diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> index 8708fbbe7637..170a5cda21b9 100644
> --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> @@ -173,7 +173,8 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
> +	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
>  	if (IS_ERR(ctx->gpios.reset)) {
> diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> index 71a292dbec47..250809ba37c7 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> @@ -351,7 +351,8 @@ static int ld9040_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&ctx->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> index 4d25c96e842c..e3a0397e953e 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> @@ -215,7 +215,8 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
> +	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&s6->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> index 42a3aaab49eb..938ab72c5540 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> @@ -732,7 +732,8 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
>  	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
>  	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&ctx->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> index b4d879bf4d03..a60635e9226d 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> @@ -466,7 +466,8 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
>  		return PTR_ERR(ctx->reset_gpio);
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
>  						&s6e63j0x03_bl_ops, NULL);
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> index 61259c2833ab..ba01af0b14fd 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> @@ -473,7 +473,8 @@ static int s6e63m0_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ret = s6e63m0_backlight_register(ctx);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> index 35dbffabd526..dbced6501204 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> @@ -1017,7 +1017,8 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
>  
>  	ctx->brightness = GAMMA_LEVEL_NUM - 1;
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&ctx->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> index 0833d0c03adc..b3619ba443bd 100644
> --- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> +++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> @@ -274,7 +274,8 @@ static int seiko_panel_probe(struct device *dev,
>  			return -EPROBE_DEFER;
>  	}
>  
> -	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
> +	drm_panel_init(&panel->base, dev, &seiko_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	err = drm_panel_add(&panel->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> index 87a58cb4d945..5e136c3ba185 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> @@ -329,7 +329,8 @@ static int sharp_panel_add(struct sharp_panel *sharp)
>  	if (IS_ERR(sharp->backlight))
>  		return PTR_ERR(sharp->backlight);
>  
> -	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
> +	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&sharp->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> index 96e3deb0e305..eeab7998c7de 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> @@ -185,7 +185,8 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
>  		return PTR_ERR(lcd->ud_gpio);
>  	}
>  
> -	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
> +	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> index ffa844ee82ad..b963ba4ab589 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> @@ -265,7 +265,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
>  		return PTR_ERR(sharp_nt->backlight);
>  
>  	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
> -		       &sharp_nt_panel_funcs);
> +		       &sharp_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&sharp_nt->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
> index b36c130d5cf0..4b92b27eba86 100644
> --- a/drivers/gpu/drm/panel/panel-simple.c
> +++ b/drivers/gpu/drm/panel/panel-simple.c
> @@ -94,6 +94,7 @@ struct panel_desc {
>  
>  	u32 bus_format;
>  	u32 bus_flags;
> +	int connector_type;
>  };
>  
>  struct panel_simple {
> @@ -464,7 +465,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
>  	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
>  		panel_simple_parse_panel_timing_node(dev, panel, &dt);
>  
> -	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
> +	drm_panel_init(&panel->base, dev, &panel_simple_funcs,
> +		       desc->connector_type);
>  
>  	err = drm_panel_add(&panel->base);
>  	if (err < 0)
> @@ -831,6 +833,7 @@ static const struct panel_desc auo_g133han01 = {
>  		.unprepare = 1000,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing auo_g185han01_timings = {
> @@ -860,6 +863,7 @@ static const struct panel_desc auo_g185han01 = {
>  		.unprepare = 1000,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing auo_p320hvn03_timings = {
> @@ -888,6 +892,7 @@ static const struct panel_desc auo_p320hvn03 = {
>  		.unprepare = 500,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode auo_t215hvn01_mode = {
> @@ -1203,6 +1208,7 @@ static const struct panel_desc dlc_dlc0700yzg_1 = {
>  		.disable = 200,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing dlc_dlc1010gig_timing = {
> @@ -1233,6 +1239,7 @@ static const struct panel_desc dlc_dlc1010gig = {
>  		.unprepare = 60,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode edt_et035012dm6_mode = {
> @@ -1499,6 +1506,7 @@ static const struct panel_desc hannstar_hsd070pww1 = {
>  		.height = 94,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing hannstar_hsd100pxn1_timing = {
> @@ -1523,6 +1531,7 @@ static const struct panel_desc hannstar_hsd100pxn1 = {
>  		.height = 152,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
> @@ -1629,6 +1638,7 @@ static const struct panel_desc innolux_g070y2_l01 = {
>  		.unprepare = 800,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing innolux_g101ice_l01_timing = {
> @@ -1657,6 +1667,7 @@ static const struct panel_desc innolux_g101ice_l01 = {
>  		.disable = 200,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing innolux_g121i1_l01_timing = {
> @@ -1684,6 +1695,7 @@ static const struct panel_desc innolux_g121i1_l01 = {
>  		.disable = 20,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode innolux_g121x1_l03_mode = {
> @@ -1867,6 +1879,7 @@ static const struct panel_desc koe_tx31d200vm0baa = {
>  		.height = 109,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing kyo_tcg121xglp_timing = {
> @@ -1891,6 +1904,7 @@ static const struct panel_desc kyo_tcg121xglp = {
>  		.height = 184,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
> @@ -1939,6 +1953,7 @@ static const struct panel_desc lg_lb070wv8 = {
>  		.height = 91,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
> @@ -2061,6 +2076,7 @@ static const struct panel_desc mitsubishi_aa070mc01 = {
>  		.disable = 400,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  	.bus_flags = DRM_BUS_FLAG_DE_HIGH,
>  };
>  
> @@ -2089,6 +2105,7 @@ static const struct panel_desc nec_nl12880bc20_05 = {
>  		.disable = 50,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
> @@ -2191,6 +2208,7 @@ static const struct panel_desc nlt_nl192108ac18_02d = {
>  		.unprepare = 500,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode nvd_9128_mode = {
> @@ -2214,6 +2232,7 @@ static const struct panel_desc nvd_9128 = {
>  		.height = 88,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing okaya_rs800480t_7x0gp_timing = {
> @@ -2626,6 +2645,7 @@ static const struct panel_desc sharp_lq101k1ly04 = {
>  		.height = 136,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing sharp_lq123p1jx31_timing = {
> @@ -2805,6 +2825,7 @@ static const struct panel_desc tianma_tm070jdhg30 = {
>  		.height = 95,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing tianma_tm070rvhg71_timing = {
> @@ -2829,6 +2850,7 @@ static const struct panel_desc tianma_tm070rvhg71 = {
>  		.height = 86,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
> @@ -2911,6 +2933,7 @@ static const struct panel_desc toshiba_lt089ac29000 = {
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
>  	.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode tpk_f07a_0102_mode = {
> @@ -2981,6 +3004,7 @@ static const struct panel_desc urt_umsh_8596md_lvds = {
>  		.height = 91,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct panel_desc urt_umsh_8596md_parallel = {
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> index 3f7bcd24aa81..ee3f23f45755 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> @@ -369,7 +369,8 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
>  	if (IS_ERR(st7701->backlight))
>  		return PTR_ERR(st7701->backlight);
>  
> -	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
> +	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	/**
>  	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> index 2eeaeee0dd7f..108a85bb6667 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> @@ -381,7 +381,8 @@ static int st7789v_probe(struct spi_device *spi)
>  	spi_set_drvdata(spi, ctx);
>  	ctx->spi = spi;
>  
> -	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
> +	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ctx->power = devm_regulator_get(&spi->dev, "power");
>  	if (IS_ERR(ctx->power))
> diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> index 5a2772b04b75..6f5ce5867ff9 100644
> --- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> @@ -648,7 +648,8 @@ static int acx565akm_probe(struct spi_device *spi)
>  			return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ret = drm_panel_add(&lcd->panel);
>  	if (ret < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> index 8b1148d74e7b..1d08d03f509d 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> @@ -347,7 +347,8 @@ static int td028ttec1_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> index bbf0c2e1c90f..416aebd23b6a 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> @@ -458,7 +458,8 @@ static int td043mtea1_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ret = drm_panel_add(&lcd->panel);
>  	if (ret < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> index 25524c26b241..1a5418ae2ccf 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> @@ -457,7 +457,8 @@ static int tpg110_probe(struct spi_device *spi)
>  	if (ret)
>  		return ret;
>  
> -	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
> +	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  	spi_set_drvdata(spi, tpg);
>  
>  	return drm_panel_add(&tpg->panel);
> diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> index c3714be78837..0feea2456e14 100644
> --- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
> +++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> @@ -518,7 +518,8 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
>  	/* dual port */
>  	gpiod_set_value(ctx->mode_gpio, 0);
>  
> -	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  	drm_panel_add(&ctx->panel);
>  
>  	return 0;
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 4b9c656dc15e..ce8da64022b4 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -139,6 +139,15 @@ struct drm_panel {
>  	 */
>  	const struct drm_panel_funcs *funcs;
>  
> +	/**
> +	 * @connector_type:
> +	 *
> +	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
> +	 * initialise the drm_connector corresponding to the panel with the
> +	 * correct connector type.
> +	 */
> +	int connector_type;
> +
>  	/**
>  	 * @list:
>  	 *
> @@ -148,7 +157,8 @@ struct drm_panel {
>  };
>  
>  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> -		    const struct drm_panel_funcs *funcs);
> +		    const struct drm_panel_funcs *funcs,
> +		    int connector_type);
>  
>  int drm_panel_add(struct drm_panel *panel);
>  void drm_panel_remove(struct drm_panel *panel);
> -- 
> Regards,
> 
> Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-08-24  9:54   ` DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field] Sam Ravnborg
@ 2019-08-24 14:02     ` Laurent Pinchart
  2019-09-04 13:13       ` Laurent Pinchart
  2019-09-27 12:37     ` Linus Walleij
  1 sibling, 1 reply; 16+ messages in thread
From: Laurent Pinchart @ 2019-08-24 14:02 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Yannick Fertre, Stefan Mavrodiev, Tomi Valkeinen,
	Ludovic Desroches, Jagan Teki, Robert Chiras, Jonas Karlman,
	Jyri Sarha, Sean Paul, Jernej Skrabec, Purism Kernel Team,
	Boris Brezillon, Nicolas Ferre, Vincent Abriou

Hi Sam,

On Sat, Aug 24, 2019 at 11:54:21AM +0200, Sam Ravnborg wrote:
> On Fri, Aug 23, 2019 at 10:32:44PM +0300, Laurent Pinchart wrote:
> > Add a type field to the drm_panel structure to report the panel type,
> > using DRM_MODE_CONNECTOR_* macros (the values that make sense are LVDS,
> > eDP, DSI and DPI). This will be used to initialise the corresponding
> > connector type.
> 
> As discussed on irc before applying this we should evaluate the
> idea to introduce DRM_MODE_CONNECTOR_PANEL

Thank you for bringing it up.

> Today we have:
>     DRM_MODE_CONNECTOR_DPI
>     DRM_MODE_CONNECTOR_DBI
>     DRM_MODE_CONNECTOR_SPI
>     DRM_MODE_CONNECTOR_LVDS
> 
> The question if what benefit ig gives to distingush between the
> different ways panels are connected.
> 
> For example for VGA and HDMI there is a physical connector involved so
> here it make good sense.
> But why should userspace care if the panel is connected via DPI or LVDS?
> 
> The more generic DRM_MODE_CONNECTOR_PANEL would be equally descriptive.
> 
> We will also start to see new drivers where there will be support
> for more than one type of connector interface.
> 
> Like for example ili9322:
>  - 8-bit serial RGB interface
>  - 24-bit parallel RGB interface
>  - 8-bit ITU-R BT.601 interface
>  - 8-bit ITU-R BT.656 interface
> 
> Adding DRM_MODE_CONNECTOR_PANEL may create an xkcd 927 situation.
> But we should then deprecate _DPI, _DBI, _SPI, _LVDS.

_DBI doesn't exist, but we also have _eDP.

The discussions originated from the fact that a number of drivers
incorrectly report their connector type for panels today (including
reporting DRM_MODE_CONNECTOR_Unknown), and they can't be fixed without a
risk or breaking userspace, especially as the connector type is also
used to name the connector (it would at least break command line mode
setting as reported by Nicolas Ferre). It also makes it difficult for a
driver to exhibit the right behaviour on new systems (that don't need to
care about backward compatibility) without breaking the already
supported systems.

There were also recent discussions about adding a _DBI connector type,
which will increase this mess. I pointed out in a few IRC discussions
that I think the different connector types for panels were a mistake,
and that we should have gone for DRM_MODE_CONNECTOR_PANEL in the first
place. It's of course too late to fix this, but going forward, instead
of introducing a _DBI connector type, I think we'd be much better off
with _PANEL.

> > Update all panel drivers accordingly. The panel-simple driver only
> > specifies the type for the known to be LVDS panels, while all other
> > panels are left as unknown and will be converted on a case-by-case
> > basis as they all need to be carefully reviewed.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> > Changes since v1:
> > 
> > - Rename the type field to connector_type
> > - Pass the type to the drm_panel_init() function
> > - Keep connector type as unknown for non-LVDS panels in panel-simple
> > - Flag the toshiba_lt089ac29000 panel as LVDS as reported by Boris
> > ---
> >  drivers/gpu/drm/drm_panel.c                   |  5 +++-
> >  drivers/gpu/drm/panel/panel-arm-versatile.c   |  3 ++-
> >  .../drm/panel/panel-feiyang-fy07024di26a30d.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-ilitek-ili9322.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-ilitek-ili9881c.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-innolux-p079zca.c |  3 ++-
> >  .../gpu/drm/panel/panel-jdi-lt070me05000.c    |  3 ++-
> >  .../drm/panel/panel-kingdisplay-kd097d04.c    |  2 +-
> >  drivers/gpu/drm/panel/panel-lg-lb035q02.c     |  3 ++-
> >  drivers/gpu/drm/panel/panel-lg-lg4573.c       |  3 ++-
> >  drivers/gpu/drm/panel/panel-lvds.c            |  3 ++-
> >  drivers/gpu/drm/panel/panel-nec-nl8048hl11.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-novatek-nt39016.c |  3 ++-
> >  .../drm/panel/panel-olimex-lcd-olinuxino.c    |  3 ++-
> >  .../gpu/drm/panel/panel-orisetech-otm8009a.c  |  3 ++-
> >  .../drm/panel/panel-osd-osd101t2587-53ts.c    |  2 +-
> >  .../drm/panel/panel-panasonic-vvx10f034n00.c  |  2 +-
> >  .../drm/panel/panel-raspberrypi-touchscreen.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-raydium-rm67191.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-raydium-rm68200.c |  3 ++-
> >  .../drm/panel/panel-rocktech-jh057n00900.c    |  3 ++-
> >  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-samsung-ld9040.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-samsung-s6d16d0.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c |  3 ++-
> >  .../gpu/drm/panel/panel-samsung-s6e63j0x03.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-samsung-s6e63m0.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c |  3 ++-
> >  drivers/gpu/drm/panel/panel-seiko-43wvf1g.c   |  3 ++-
> >  .../gpu/drm/panel/panel-sharp-lq101r1sx01.c   |  3 ++-
> >  .../gpu/drm/panel/panel-sharp-ls037v7dw01.c   |  3 ++-
> >  .../gpu/drm/panel/panel-sharp-ls043t1le01.c   |  2 +-
> >  drivers/gpu/drm/panel/panel-simple.c          | 26 ++++++++++++++++++-
> >  drivers/gpu/drm/panel/panel-sitronix-st7701.c |  3 ++-
> >  .../gpu/drm/panel/panel-sitronix-st7789v.c    |  3 ++-
> >  drivers/gpu/drm/panel/panel-sony-acx565akm.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-tpo-td028ttec1.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-tpo-td043mtea1.c  |  3 ++-
> >  drivers/gpu/drm/panel/panel-tpo-tpg110.c      |  3 ++-
> >  drivers/gpu/drm/panel/panel-truly-nt35597.c   |  3 ++-
> >  include/drm/drm_panel.h                       | 12 ++++++++-
> >  41 files changed, 112 insertions(+), 41 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> > index ba2fad4c9648..ed7985c0535a 100644
> > --- a/drivers/gpu/drm/drm_panel.c
> > +++ b/drivers/gpu/drm/drm_panel.c
> > @@ -46,16 +46,19 @@ static LIST_HEAD(panel_list);
> >   * @panel: DRM panel
> >   * @dev: parent device of the panel
> >   * @funcs: panel operations
> > + * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to
> > + *	the panel interface
> >   *
> >   * Initialize the panel structure for subsequent registration with
> >   * drm_panel_add().
> >   */
> >  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> > -		    const struct drm_panel_funcs *funcs)
> > +		    const struct drm_panel_funcs *funcs, int connector_type)
> >  {
> >  	INIT_LIST_HEAD(&panel->list);
> >  	panel->dev = dev;
> >  	panel->funcs = funcs;
> > +	panel->connector_type = connector_type;
> >  }
> >  EXPORT_SYMBOL(drm_panel_init);
> >  
> > diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
> > index a4333ed0f20c..a0574dc03e16 100644
> > --- a/drivers/gpu/drm/panel/panel-arm-versatile.c
> > +++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
> > @@ -350,7 +350,8 @@ static int versatile_panel_probe(struct platform_device *pdev)
> >  			dev_info(dev, "panel mounted on IB2 daughterboard\n");
> >  	}
> >  
> > -	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
> > +	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&vpanel->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> > index 7d5d7455bc01..98f184b81187 100644
> > --- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> > +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> > @@ -204,7 +204,8 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
> >  	mipi_dsi_set_drvdata(dsi, ctx);
> >  	ctx->dsi = dsi;
> >  
> > -	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
> > +	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
> >  	if (IS_ERR(ctx->dvdd)) {
> > diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> > index ad2405baa0ac..24955bec1958 100644
> > --- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> > +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> > @@ -895,7 +895,8 @@ static int ili9322_probe(struct spi_device *spi)
> >  		ili->input = ili->conf->input;
> >  	}
> >  
> > -	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
> > +	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&ili->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> > index 1d714f961c00..e8789e460a16 100644
> > --- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> > +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> > @@ -433,7 +433,8 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
> >  	mipi_dsi_set_drvdata(dsi, ctx);
> >  	ctx->dsi = dsi;
> >  
> > -	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
> > +	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ctx->power = devm_regulator_get(&dsi->dev, "power");
> >  	if (IS_ERR(ctx->power)) {
> > diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> > index 2054afc31f20..46bfeb982b06 100644
> > --- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> > +++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> > @@ -487,7 +487,8 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
> >  	if (IS_ERR(innolux->backlight))
> >  		return PTR_ERR(innolux->backlight);
> >  
> > -	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
> > +	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	err = drm_panel_add(&innolux->base);
> >  	if (err < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> > index 7bfdbfbc868e..56364a93f0b8 100644
> > --- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> > +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> > @@ -437,7 +437,8 @@ static int jdi_panel_add(struct jdi_panel *jdi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
> > +	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ret = drm_panel_add(&jdi->base);
> >  
> > diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> > index a47885a1a8aa..45f96556ec8c 100644
> > --- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> > +++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> > @@ -392,7 +392,7 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
> >  		return PTR_ERR(kingdisplay->backlight);
> >  
> >  	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
> > -		       &kingdisplay_panel_funcs);
> > +		       &kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >  
> >  	return drm_panel_add(&kingdisplay->base);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> > index 28c3205df482..f984a5189fbf 100644
> > --- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> > +++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> > @@ -196,7 +196,8 @@ static int lb035q02_probe(struct spi_device *spi)
> >  	if (ret < 0)
> >  		return ret;
> >  
> > -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
> > +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&lcd->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> > index 608f2de91662..db4865a4c2b9 100644
> > --- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
> > +++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> > @@ -259,7 +259,8 @@ static int lg4573_probe(struct spi_device *spi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
> > +	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&ctx->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
> > index 3dc1ac2a6b03..cab3fb4177e3 100644
> > --- a/drivers/gpu/drm/panel/panel-lvds.c
> > +++ b/drivers/gpu/drm/panel/panel-lvds.c
> > @@ -260,7 +260,8 @@ static int panel_lvds_probe(struct platform_device *pdev)
> >  	 */
> >  
> >  	/* Register the panel. */
> > -	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
> > +	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs,
> > +		       DRM_MODE_CONNECTOR_LVDS);
> >  
> >  	ret = drm_panel_add(&lvds->panel);
> >  	if (ret < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> > index b67636fdbc21..c4bc7fa85fad 100644
> > --- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> > +++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> > @@ -205,7 +205,8 @@ static int nl8048_probe(struct spi_device *spi)
> >  	if (ret < 0)
> >  		return ret;
> >  
> > -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
> > +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&lcd->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> > index 64cfe111aaad..60ccedce530c 100644
> > --- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> > +++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> > @@ -292,7 +292,8 @@ static int nt39016_probe(struct spi_device *spi)
> >  		return err;
> >  	}
> >  
> > -	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
> > +	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	err = drm_panel_add(&panel->drm_panel);
> >  	if (err < 0) {
> > diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> > index f2d6a4ec0046..f2a72ee6ee07 100644
> > --- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> > +++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> > @@ -288,7 +288,8 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
> >  	if (IS_ERR(lcd->backlight))
> >  		return PTR_ERR(lcd->backlight);
> >  
> > -	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
> > +	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&lcd->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> > index 8b60d5e4d775..bf1f928b215f 100644
> > --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> > +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> > @@ -455,7 +455,8 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
> >  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
> >  			  MIPI_DSI_MODE_LPM;
> >  
> > -	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
> >  						     dsi->host->dev, ctx,
> > diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> > index 38f114b03b89..2b40913899d8 100644
> > --- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> > +++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> > @@ -167,7 +167,7 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
> >  		return PTR_ERR(osd101t2587->backlight);
> >  
> >  	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
> > -		       &osd101t2587_panel_funcs);
> > +		       &osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >  
> >  	return drm_panel_add(&osd101t2587->base);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> > index 6035bf458074..664605071d34 100644
> > --- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> > +++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> > @@ -224,7 +224,7 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
> >  	}
> >  
> >  	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
> > -		       &wuxga_nt_panel_funcs);
> > +		       &wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ret = drm_panel_add(&wuxga_nt->base);
> >  	if (ret < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> > index 23a801427e42..09824e92fc78 100644
> > --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> > +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> > @@ -426,7 +426,8 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
> >  		return PTR_ERR(ts->dsi);
> >  	}
> >  
> > -	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
> > +	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	/* This appears last, as it's what will unblock the DSI host
> >  	 * driver's component bind function.
> > diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> > index f82a1f69f13b..fd67fc6185c4 100644
> > --- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> > +++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> > @@ -606,7 +606,8 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
> >  	if (ret)
> >  		return ret;
> >  
> > -	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
> > +	drm_panel_init(&panel->panel, dev, &rad_panel_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  	dev_set_drvdata(dev, panel);
> >  
> >  	ret = drm_panel_add(&panel->panel);
> > diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> > index f004b78fb8bc..994e855721f4 100644
> > --- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> > +++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> > @@ -404,7 +404,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
> >  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
> >  			  MIPI_DSI_MODE_LPM;
> >  
> > -	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	drm_panel_add(&ctx->panel);
> >  
> > diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> > index d7f56374f2f1..31234b79d3b1 100644
> > --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> > +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> > @@ -343,7 +343,8 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	drm_panel_add(&ctx->panel);
> >  
> > diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> > index 8708fbbe7637..170a5cda21b9 100644
> > --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> > +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> > @@ -173,7 +173,8 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
> >  	mipi_dsi_set_drvdata(dsi, ctx);
> >  	ctx->dsi = dsi;
> >  
> > -	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
> > +	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
> >  	if (IS_ERR(ctx->gpios.reset)) {
> > diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> > index 71a292dbec47..250809ba37c7 100644
> > --- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> > +++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> > @@ -351,7 +351,8 @@ static int ld9040_probe(struct spi_device *spi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&ctx->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> > index 4d25c96e842c..e3a0397e953e 100644
> > --- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> > +++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> > @@ -215,7 +215,8 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
> > +	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ret = drm_panel_add(&s6->panel);
> >  	if (ret < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> > index 42a3aaab49eb..938ab72c5540 100644
> > --- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> > +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> > @@ -732,7 +732,8 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
> >  	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
> >  	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
> >  
> > -	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ret = drm_panel_add(&ctx->panel);
> >  	if (ret < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> > index b4d879bf4d03..a60635e9226d 100644
> > --- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> > +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> > @@ -466,7 +466,8 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
> >  		return PTR_ERR(ctx->reset_gpio);
> >  	}
> >  
> > -	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
> >  						&s6e63j0x03_bl_ops, NULL);
> > diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> > index 61259c2833ab..ba01af0b14fd 100644
> > --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> > +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> > @@ -473,7 +473,8 @@ static int s6e63m0_probe(struct spi_device *spi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	ret = s6e63m0_backlight_register(ctx);
> >  	if (ret < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> > index 35dbffabd526..dbced6501204 100644
> > --- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> > +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> > @@ -1017,7 +1017,8 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
> >  
> >  	ctx->brightness = GAMMA_LEVEL_NUM - 1;
> >  
> > -	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	ret = drm_panel_add(&ctx->panel);
> >  	if (ret < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> > index 0833d0c03adc..b3619ba443bd 100644
> > --- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> > +++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> > @@ -274,7 +274,8 @@ static int seiko_panel_probe(struct device *dev,
> >  			return -EPROBE_DEFER;
> >  	}
> >  
> > -	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
> > +	drm_panel_init(&panel->base, dev, &seiko_panel_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	err = drm_panel_add(&panel->base);
> >  	if (err < 0)
> > diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> > index 87a58cb4d945..5e136c3ba185 100644
> > --- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> > +++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> > @@ -329,7 +329,8 @@ static int sharp_panel_add(struct sharp_panel *sharp)
> >  	if (IS_ERR(sharp->backlight))
> >  		return PTR_ERR(sharp->backlight);
> >  
> > -	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
> > +	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	return drm_panel_add(&sharp->base);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> > index 96e3deb0e305..eeab7998c7de 100644
> > --- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> > +++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> > @@ -185,7 +185,8 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
> >  		return PTR_ERR(lcd->ud_gpio);
> >  	}
> >  
> > -	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
> > +	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&lcd->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> > index ffa844ee82ad..b963ba4ab589 100644
> > --- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> > +++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> > @@ -265,7 +265,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
> >  		return PTR_ERR(sharp_nt->backlight);
> >  
> >  	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
> > -		       &sharp_nt_panel_funcs);
> > +		       &sharp_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >  
> >  	return drm_panel_add(&sharp_nt->base);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
> > index b36c130d5cf0..4b92b27eba86 100644
> > --- a/drivers/gpu/drm/panel/panel-simple.c
> > +++ b/drivers/gpu/drm/panel/panel-simple.c
> > @@ -94,6 +94,7 @@ struct panel_desc {
> >  
> >  	u32 bus_format;
> >  	u32 bus_flags;
> > +	int connector_type;
> >  };
> >  
> >  struct panel_simple {
> > @@ -464,7 +465,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
> >  	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
> >  		panel_simple_parse_panel_timing_node(dev, panel, &dt);
> >  
> > -	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
> > +	drm_panel_init(&panel->base, dev, &panel_simple_funcs,
> > +		       desc->connector_type);
> >  
> >  	err = drm_panel_add(&panel->base);
> >  	if (err < 0)
> > @@ -831,6 +833,7 @@ static const struct panel_desc auo_g133han01 = {
> >  		.unprepare = 1000,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing auo_g185han01_timings = {
> > @@ -860,6 +863,7 @@ static const struct panel_desc auo_g185han01 = {
> >  		.unprepare = 1000,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing auo_p320hvn03_timings = {
> > @@ -888,6 +892,7 @@ static const struct panel_desc auo_p320hvn03 = {
> >  		.unprepare = 500,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode auo_t215hvn01_mode = {
> > @@ -1203,6 +1208,7 @@ static const struct panel_desc dlc_dlc0700yzg_1 = {
> >  		.disable = 200,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing dlc_dlc1010gig_timing = {
> > @@ -1233,6 +1239,7 @@ static const struct panel_desc dlc_dlc1010gig = {
> >  		.unprepare = 60,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode edt_et035012dm6_mode = {
> > @@ -1499,6 +1506,7 @@ static const struct panel_desc hannstar_hsd070pww1 = {
> >  		.height = 94,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing hannstar_hsd100pxn1_timing = {
> > @@ -1523,6 +1531,7 @@ static const struct panel_desc hannstar_hsd100pxn1 = {
> >  		.height = 152,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
> > @@ -1629,6 +1638,7 @@ static const struct panel_desc innolux_g070y2_l01 = {
> >  		.unprepare = 800,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing innolux_g101ice_l01_timing = {
> > @@ -1657,6 +1667,7 @@ static const struct panel_desc innolux_g101ice_l01 = {
> >  		.disable = 200,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing innolux_g121i1_l01_timing = {
> > @@ -1684,6 +1695,7 @@ static const struct panel_desc innolux_g121i1_l01 = {
> >  		.disable = 20,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode innolux_g121x1_l03_mode = {
> > @@ -1867,6 +1879,7 @@ static const struct panel_desc koe_tx31d200vm0baa = {
> >  		.height = 109,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing kyo_tcg121xglp_timing = {
> > @@ -1891,6 +1904,7 @@ static const struct panel_desc kyo_tcg121xglp = {
> >  		.height = 184,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
> > @@ -1939,6 +1953,7 @@ static const struct panel_desc lg_lb070wv8 = {
> >  		.height = 91,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
> > @@ -2061,6 +2076,7 @@ static const struct panel_desc mitsubishi_aa070mc01 = {
> >  		.disable = 400,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  	.bus_flags = DRM_BUS_FLAG_DE_HIGH,
> >  };
> >  
> > @@ -2089,6 +2105,7 @@ static const struct panel_desc nec_nl12880bc20_05 = {
> >  		.disable = 50,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
> > @@ -2191,6 +2208,7 @@ static const struct panel_desc nlt_nl192108ac18_02d = {
> >  		.unprepare = 500,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode nvd_9128_mode = {
> > @@ -2214,6 +2232,7 @@ static const struct panel_desc nvd_9128 = {
> >  		.height = 88,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing okaya_rs800480t_7x0gp_timing = {
> > @@ -2626,6 +2645,7 @@ static const struct panel_desc sharp_lq101k1ly04 = {
> >  		.height = 136,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing sharp_lq123p1jx31_timing = {
> > @@ -2805,6 +2825,7 @@ static const struct panel_desc tianma_tm070jdhg30 = {
> >  		.height = 95,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct display_timing tianma_tm070rvhg71_timing = {
> > @@ -2829,6 +2850,7 @@ static const struct panel_desc tianma_tm070rvhg71 = {
> >  		.height = 86,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
> > @@ -2911,6 +2933,7 @@ static const struct panel_desc toshiba_lt089ac29000 = {
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
> >  	.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct drm_display_mode tpk_f07a_0102_mode = {
> > @@ -2981,6 +3004,7 @@ static const struct panel_desc urt_umsh_8596md_lvds = {
> >  		.height = 91,
> >  	},
> >  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> > +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >  };
> >  
> >  static const struct panel_desc urt_umsh_8596md_parallel = {
> > diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> > index 3f7bcd24aa81..ee3f23f45755 100644
> > --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> > +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> > @@ -369,7 +369,8 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
> >  	if (IS_ERR(st7701->backlight))
> >  		return PTR_ERR(st7701->backlight);
> >  
> > -	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
> > +	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  
> >  	/**
> >  	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
> > diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> > index 2eeaeee0dd7f..108a85bb6667 100644
> > --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> > +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> > @@ -381,7 +381,8 @@ static int st7789v_probe(struct spi_device *spi)
> >  	spi_set_drvdata(spi, ctx);
> >  	ctx->spi = spi;
> >  
> > -	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
> > +	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	ctx->power = devm_regulator_get(&spi->dev, "power");
> >  	if (IS_ERR(ctx->power))
> > diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> > index 5a2772b04b75..6f5ce5867ff9 100644
> > --- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> > +++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> > @@ -648,7 +648,8 @@ static int acx565akm_probe(struct spi_device *spi)
> >  			return ret;
> >  	}
> >  
> > -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
> > +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	ret = drm_panel_add(&lcd->panel);
> >  	if (ret < 0) {
> > diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> > index 8b1148d74e7b..1d08d03f509d 100644
> > --- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> > +++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> > @@ -347,7 +347,8 @@ static int td028ttec1_probe(struct spi_device *spi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
> > +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	return drm_panel_add(&lcd->panel);
> >  }
> > diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> > index bbf0c2e1c90f..416aebd23b6a 100644
> > --- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> > +++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> > @@ -458,7 +458,8 @@ static int td043mtea1_probe(struct spi_device *spi)
> >  		return ret;
> >  	}
> >  
> > -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
> > +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  
> >  	ret = drm_panel_add(&lcd->panel);
> >  	if (ret < 0) {
> > diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> > index 25524c26b241..1a5418ae2ccf 100644
> > --- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> > +++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> > @@ -457,7 +457,8 @@ static int tpg110_probe(struct spi_device *spi)
> >  	if (ret)
> >  		return ret;
> >  
> > -	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
> > +	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DPI);
> >  	spi_set_drvdata(spi, tpg);
> >  
> >  	return drm_panel_add(&tpg->panel);
> > diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> > index c3714be78837..0feea2456e14 100644
> > --- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
> > +++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> > @@ -518,7 +518,8 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
> >  	/* dual port */
> >  	gpiod_set_value(ctx->mode_gpio, 0);
> >  
> > -	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
> > +	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs,
> > +		       DRM_MODE_CONNECTOR_DSI);
> >  	drm_panel_add(&ctx->panel);
> >  
> >  	return 0;
> > diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> > index 4b9c656dc15e..ce8da64022b4 100644
> > --- a/include/drm/drm_panel.h
> > +++ b/include/drm/drm_panel.h
> > @@ -139,6 +139,15 @@ struct drm_panel {
> >  	 */
> >  	const struct drm_panel_funcs *funcs;
> >  
> > +	/**
> > +	 * @connector_type:
> > +	 *
> > +	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
> > +	 * initialise the drm_connector corresponding to the panel with the
> > +	 * correct connector type.
> > +	 */
> > +	int connector_type;
> > +
> >  	/**
> >  	 * @list:
> >  	 *
> > @@ -148,7 +157,8 @@ struct drm_panel {
> >  };
> >  
> >  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> > -		    const struct drm_panel_funcs *funcs);
> > +		    const struct drm_panel_funcs *funcs,
> > +		    int connector_type);
> >  
> >  int drm_panel_add(struct drm_panel *panel);
> >  void drm_panel_remove(struct drm_panel *panel);

-- 
Regards,

Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field
  2019-08-23 19:32 ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Laurent Pinchart
  2019-08-24  9:54   ` DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field] Sam Ravnborg
@ 2019-08-26  7:46   ` Boris Brezillon
  1 sibling, 0 replies; 16+ messages in thread
From: Boris Brezillon @ 2019-08-26  7:46 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre

On Fri, 23 Aug 2019 22:32:44 +0300
Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote:

> Add a type field to the drm_panel structure to report the panel type,
> using DRM_MODE_CONNECTOR_* macros (the values that make sense are LVDS,
> eDP, DSI and DPI). This will be used to initialise the corresponding
> connector type.
> 
> Update all panel drivers accordingly. The panel-simple driver only
> specifies the type for the known to be LVDS panels, while all other
> panels are left as unknown and will be converted on a case-by-case
> basis as they all need to be carefully reviewed.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>

> ---
> Changes since v1:
> 
> - Rename the type field to connector_type
> - Pass the type to the drm_panel_init() function
> - Keep connector type as unknown for non-LVDS panels in panel-simple
> - Flag the toshiba_lt089ac29000 panel as LVDS as reported by Boris
> ---
>  drivers/gpu/drm/drm_panel.c                   |  5 +++-
>  drivers/gpu/drm/panel/panel-arm-versatile.c   |  3 ++-
>  .../drm/panel/panel-feiyang-fy07024di26a30d.c |  3 ++-
>  drivers/gpu/drm/panel/panel-ilitek-ili9322.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-ilitek-ili9881c.c |  3 ++-
>  drivers/gpu/drm/panel/panel-innolux-p079zca.c |  3 ++-
>  .../gpu/drm/panel/panel-jdi-lt070me05000.c    |  3 ++-
>  .../drm/panel/panel-kingdisplay-kd097d04.c    |  2 +-
>  drivers/gpu/drm/panel/panel-lg-lb035q02.c     |  3 ++-
>  drivers/gpu/drm/panel/panel-lg-lg4573.c       |  3 ++-
>  drivers/gpu/drm/panel/panel-lvds.c            |  3 ++-
>  drivers/gpu/drm/panel/panel-nec-nl8048hl11.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-novatek-nt39016.c |  3 ++-
>  .../drm/panel/panel-olimex-lcd-olinuxino.c    |  3 ++-
>  .../gpu/drm/panel/panel-orisetech-otm8009a.c  |  3 ++-
>  .../drm/panel/panel-osd-osd101t2587-53ts.c    |  2 +-
>  .../drm/panel/panel-panasonic-vvx10f034n00.c  |  2 +-
>  .../drm/panel/panel-raspberrypi-touchscreen.c |  3 ++-
>  drivers/gpu/drm/panel/panel-raydium-rm67191.c |  3 ++-
>  drivers/gpu/drm/panel/panel-raydium-rm68200.c |  3 ++-
>  .../drm/panel/panel-rocktech-jh057n00900.c    |  3 ++-
>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-ld9040.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6d16d0.c |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c |  3 ++-
>  .../gpu/drm/panel/panel-samsung-s6e63j0x03.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6e63m0.c |  3 ++-
>  drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c |  3 ++-
>  drivers/gpu/drm/panel/panel-seiko-43wvf1g.c   |  3 ++-
>  .../gpu/drm/panel/panel-sharp-lq101r1sx01.c   |  3 ++-
>  .../gpu/drm/panel/panel-sharp-ls037v7dw01.c   |  3 ++-
>  .../gpu/drm/panel/panel-sharp-ls043t1le01.c   |  2 +-
>  drivers/gpu/drm/panel/panel-simple.c          | 26 ++++++++++++++++++-
>  drivers/gpu/drm/panel/panel-sitronix-st7701.c |  3 ++-
>  .../gpu/drm/panel/panel-sitronix-st7789v.c    |  3 ++-
>  drivers/gpu/drm/panel/panel-sony-acx565akm.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-tpo-td028ttec1.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-tpo-td043mtea1.c  |  3 ++-
>  drivers/gpu/drm/panel/panel-tpo-tpg110.c      |  3 ++-
>  drivers/gpu/drm/panel/panel-truly-nt35597.c   |  3 ++-
>  include/drm/drm_panel.h                       | 12 ++++++++-
>  41 files changed, 112 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index ba2fad4c9648..ed7985c0535a 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -46,16 +46,19 @@ static LIST_HEAD(panel_list);
>   * @panel: DRM panel
>   * @dev: parent device of the panel
>   * @funcs: panel operations
> + * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to
> + *	the panel interface
>   *
>   * Initialize the panel structure for subsequent registration with
>   * drm_panel_add().
>   */
>  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> -		    const struct drm_panel_funcs *funcs)
> +		    const struct drm_panel_funcs *funcs, int connector_type)
>  {
>  	INIT_LIST_HEAD(&panel->list);
>  	panel->dev = dev;
>  	panel->funcs = funcs;
> +	panel->connector_type = connector_type;
>  }
>  EXPORT_SYMBOL(drm_panel_init);
>  
> diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
> index a4333ed0f20c..a0574dc03e16 100644
> --- a/drivers/gpu/drm/panel/panel-arm-versatile.c
> +++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
> @@ -350,7 +350,8 @@ static int versatile_panel_probe(struct platform_device *pdev)
>  			dev_info(dev, "panel mounted on IB2 daughterboard\n");
>  	}
>  
> -	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
> +	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&vpanel->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> index 7d5d7455bc01..98f184b81187 100644
> --- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> @@ -204,7 +204,8 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
> +	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
>  	if (IS_ERR(ctx->dvdd)) {
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> index ad2405baa0ac..24955bec1958 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> @@ -895,7 +895,8 @@ static int ili9322_probe(struct spi_device *spi)
>  		ili->input = ili->conf->input;
>  	}
>  
> -	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
> +	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&ili->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> index 1d714f961c00..e8789e460a16 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> @@ -433,7 +433,8 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
> +	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->power = devm_regulator_get(&dsi->dev, "power");
>  	if (IS_ERR(ctx->power)) {
> diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> index 2054afc31f20..46bfeb982b06 100644
> --- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> +++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> @@ -487,7 +487,8 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
>  	if (IS_ERR(innolux->backlight))
>  		return PTR_ERR(innolux->backlight);
>  
> -	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
> +	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	err = drm_panel_add(&innolux->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> index 7bfdbfbc868e..56364a93f0b8 100644
> --- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> @@ -437,7 +437,8 @@ static int jdi_panel_add(struct jdi_panel *jdi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
> +	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&jdi->base);
>  
> diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> index a47885a1a8aa..45f96556ec8c 100644
> --- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> +++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> @@ -392,7 +392,7 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
>  		return PTR_ERR(kingdisplay->backlight);
>  
>  	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
> -		       &kingdisplay_panel_funcs);
> +		       &kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&kingdisplay->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> index 28c3205df482..f984a5189fbf 100644
> --- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> +++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> @@ -196,7 +196,8 @@ static int lb035q02_probe(struct spi_device *spi)
>  	if (ret < 0)
>  		return ret;
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> index 608f2de91662..db4865a4c2b9 100644
> --- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
> +++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> @@ -259,7 +259,8 @@ static int lg4573_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
> +	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&ctx->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
> index 3dc1ac2a6b03..cab3fb4177e3 100644
> --- a/drivers/gpu/drm/panel/panel-lvds.c
> +++ b/drivers/gpu/drm/panel/panel-lvds.c
> @@ -260,7 +260,8 @@ static int panel_lvds_probe(struct platform_device *pdev)
>  	 */
>  
>  	/* Register the panel. */
> -	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
> +	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs,
> +		       DRM_MODE_CONNECTOR_LVDS);
>  
>  	ret = drm_panel_add(&lvds->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> index b67636fdbc21..c4bc7fa85fad 100644
> --- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> +++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> @@ -205,7 +205,8 @@ static int nl8048_probe(struct spi_device *spi)
>  	if (ret < 0)
>  		return ret;
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> index 64cfe111aaad..60ccedce530c 100644
> --- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> +++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> @@ -292,7 +292,8 @@ static int nt39016_probe(struct spi_device *spi)
>  		return err;
>  	}
>  
> -	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
> +	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	err = drm_panel_add(&panel->drm_panel);
>  	if (err < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> index f2d6a4ec0046..f2a72ee6ee07 100644
> --- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> +++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> @@ -288,7 +288,8 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
>  	if (IS_ERR(lcd->backlight))
>  		return PTR_ERR(lcd->backlight);
>  
> -	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
> +	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> index 8b60d5e4d775..bf1f928b215f 100644
> --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> @@ -455,7 +455,8 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
>  			  MIPI_DSI_MODE_LPM;
>  
> -	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
>  						     dsi->host->dev, ctx,
> diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> index 38f114b03b89..2b40913899d8 100644
> --- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> +++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> @@ -167,7 +167,7 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
>  		return PTR_ERR(osd101t2587->backlight);
>  
>  	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
> -		       &osd101t2587_panel_funcs);
> +		       &osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&osd101t2587->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> index 6035bf458074..664605071d34 100644
> --- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> +++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> @@ -224,7 +224,7 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
>  	}
>  
>  	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
> -		       &wuxga_nt_panel_funcs);
> +		       &wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&wuxga_nt->base);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> index 23a801427e42..09824e92fc78 100644
> --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> @@ -426,7 +426,8 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
>  		return PTR_ERR(ts->dsi);
>  	}
>  
> -	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
> +	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	/* This appears last, as it's what will unblock the DSI host
>  	 * driver's component bind function.
> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> index f82a1f69f13b..fd67fc6185c4 100644
> --- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> @@ -606,7 +606,8 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
>  	if (ret)
>  		return ret;
>  
> -	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
> +	drm_panel_init(&panel->panel, dev, &rad_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  	dev_set_drvdata(dev, panel);
>  
>  	ret = drm_panel_add(&panel->panel);
> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> index f004b78fb8bc..994e855721f4 100644
> --- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> @@ -404,7 +404,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
>  			  MIPI_DSI_MODE_LPM;
>  
> -	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	drm_panel_add(&ctx->panel);
>  
> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> index d7f56374f2f1..31234b79d3b1 100644
> --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> @@ -343,7 +343,8 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	drm_panel_add(&ctx->panel);
>  
> diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> index 8708fbbe7637..170a5cda21b9 100644
> --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> @@ -173,7 +173,8 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  	ctx->dsi = dsi;
>  
> -	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
> +	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
>  	if (IS_ERR(ctx->gpios.reset)) {
> diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> index 71a292dbec47..250809ba37c7 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> @@ -351,7 +351,8 @@ static int ld9040_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&ctx->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> index 4d25c96e842c..e3a0397e953e 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> @@ -215,7 +215,8 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
> +	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&s6->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> index 42a3aaab49eb..938ab72c5540 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> @@ -732,7 +732,8 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
>  	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
>  	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&ctx->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> index b4d879bf4d03..a60635e9226d 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> @@ -466,7 +466,8 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
>  		return PTR_ERR(ctx->reset_gpio);
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
>  						&s6e63j0x03_bl_ops, NULL);
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> index 61259c2833ab..ba01af0b14fd 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> @@ -473,7 +473,8 @@ static int s6e63m0_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ret = s6e63m0_backlight_register(ctx);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> index 35dbffabd526..dbced6501204 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> @@ -1017,7 +1017,8 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
>  
>  	ctx->brightness = GAMMA_LEVEL_NUM - 1;
>  
> -	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_add(&ctx->panel);
>  	if (ret < 0)
> diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> index 0833d0c03adc..b3619ba443bd 100644
> --- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> +++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> @@ -274,7 +274,8 @@ static int seiko_panel_probe(struct device *dev,
>  			return -EPROBE_DEFER;
>  	}
>  
> -	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
> +	drm_panel_init(&panel->base, dev, &seiko_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	err = drm_panel_add(&panel->base);
>  	if (err < 0)
> diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> index 87a58cb4d945..5e136c3ba185 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> @@ -329,7 +329,8 @@ static int sharp_panel_add(struct sharp_panel *sharp)
>  	if (IS_ERR(sharp->backlight))
>  		return PTR_ERR(sharp->backlight);
>  
> -	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
> +	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&sharp->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> index 96e3deb0e305..eeab7998c7de 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> @@ -185,7 +185,8 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
>  		return PTR_ERR(lcd->ud_gpio);
>  	}
>  
> -	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
> +	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> index ffa844ee82ad..b963ba4ab589 100644
> --- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> +++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> @@ -265,7 +265,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
>  		return PTR_ERR(sharp_nt->backlight);
>  
>  	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
> -		       &sharp_nt_panel_funcs);
> +		       &sharp_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
>  
>  	return drm_panel_add(&sharp_nt->base);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
> index b36c130d5cf0..4b92b27eba86 100644
> --- a/drivers/gpu/drm/panel/panel-simple.c
> +++ b/drivers/gpu/drm/panel/panel-simple.c
> @@ -94,6 +94,7 @@ struct panel_desc {
>  
>  	u32 bus_format;
>  	u32 bus_flags;
> +	int connector_type;
>  };
>  
>  struct panel_simple {
> @@ -464,7 +465,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
>  	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
>  		panel_simple_parse_panel_timing_node(dev, panel, &dt);
>  
> -	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
> +	drm_panel_init(&panel->base, dev, &panel_simple_funcs,
> +		       desc->connector_type);
>  
>  	err = drm_panel_add(&panel->base);
>  	if (err < 0)
> @@ -831,6 +833,7 @@ static const struct panel_desc auo_g133han01 = {
>  		.unprepare = 1000,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing auo_g185han01_timings = {
> @@ -860,6 +863,7 @@ static const struct panel_desc auo_g185han01 = {
>  		.unprepare = 1000,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing auo_p320hvn03_timings = {
> @@ -888,6 +892,7 @@ static const struct panel_desc auo_p320hvn03 = {
>  		.unprepare = 500,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode auo_t215hvn01_mode = {
> @@ -1203,6 +1208,7 @@ static const struct panel_desc dlc_dlc0700yzg_1 = {
>  		.disable = 200,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing dlc_dlc1010gig_timing = {
> @@ -1233,6 +1239,7 @@ static const struct panel_desc dlc_dlc1010gig = {
>  		.unprepare = 60,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode edt_et035012dm6_mode = {
> @@ -1499,6 +1506,7 @@ static const struct panel_desc hannstar_hsd070pww1 = {
>  		.height = 94,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing hannstar_hsd100pxn1_timing = {
> @@ -1523,6 +1531,7 @@ static const struct panel_desc hannstar_hsd100pxn1 = {
>  		.height = 152,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
> @@ -1629,6 +1638,7 @@ static const struct panel_desc innolux_g070y2_l01 = {
>  		.unprepare = 800,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing innolux_g101ice_l01_timing = {
> @@ -1657,6 +1667,7 @@ static const struct panel_desc innolux_g101ice_l01 = {
>  		.disable = 200,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing innolux_g121i1_l01_timing = {
> @@ -1684,6 +1695,7 @@ static const struct panel_desc innolux_g121i1_l01 = {
>  		.disable = 20,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode innolux_g121x1_l03_mode = {
> @@ -1867,6 +1879,7 @@ static const struct panel_desc koe_tx31d200vm0baa = {
>  		.height = 109,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing kyo_tcg121xglp_timing = {
> @@ -1891,6 +1904,7 @@ static const struct panel_desc kyo_tcg121xglp = {
>  		.height = 184,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
> @@ -1939,6 +1953,7 @@ static const struct panel_desc lg_lb070wv8 = {
>  		.height = 91,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
> @@ -2061,6 +2076,7 @@ static const struct panel_desc mitsubishi_aa070mc01 = {
>  		.disable = 400,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  	.bus_flags = DRM_BUS_FLAG_DE_HIGH,
>  };
>  
> @@ -2089,6 +2105,7 @@ static const struct panel_desc nec_nl12880bc20_05 = {
>  		.disable = 50,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
> @@ -2191,6 +2208,7 @@ static const struct panel_desc nlt_nl192108ac18_02d = {
>  		.unprepare = 500,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode nvd_9128_mode = {
> @@ -2214,6 +2232,7 @@ static const struct panel_desc nvd_9128 = {
>  		.height = 88,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing okaya_rs800480t_7x0gp_timing = {
> @@ -2626,6 +2645,7 @@ static const struct panel_desc sharp_lq101k1ly04 = {
>  		.height = 136,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing sharp_lq123p1jx31_timing = {
> @@ -2805,6 +2825,7 @@ static const struct panel_desc tianma_tm070jdhg30 = {
>  		.height = 95,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct display_timing tianma_tm070rvhg71_timing = {
> @@ -2829,6 +2850,7 @@ static const struct panel_desc tianma_tm070rvhg71 = {
>  		.height = 86,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
> @@ -2911,6 +2933,7 @@ static const struct panel_desc toshiba_lt089ac29000 = {
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
>  	.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct drm_display_mode tpk_f07a_0102_mode = {
> @@ -2981,6 +3004,7 @@ static const struct panel_desc urt_umsh_8596md_lvds = {
>  		.height = 91,
>  	},
>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
>  };
>  
>  static const struct panel_desc urt_umsh_8596md_parallel = {
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> index 3f7bcd24aa81..ee3f23f45755 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> @@ -369,7 +369,8 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
>  	if (IS_ERR(st7701->backlight))
>  		return PTR_ERR(st7701->backlight);
>  
> -	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
> +	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  
>  	/**
>  	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> index 2eeaeee0dd7f..108a85bb6667 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> @@ -381,7 +381,8 @@ static int st7789v_probe(struct spi_device *spi)
>  	spi_set_drvdata(spi, ctx);
>  	ctx->spi = spi;
>  
> -	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
> +	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ctx->power = devm_regulator_get(&spi->dev, "power");
>  	if (IS_ERR(ctx->power))
> diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> index 5a2772b04b75..6f5ce5867ff9 100644
> --- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> +++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> @@ -648,7 +648,8 @@ static int acx565akm_probe(struct spi_device *spi)
>  			return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ret = drm_panel_add(&lcd->panel);
>  	if (ret < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> index 8b1148d74e7b..1d08d03f509d 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> @@ -347,7 +347,8 @@ static int td028ttec1_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_panel_add(&lcd->panel);
>  }
> diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> index bbf0c2e1c90f..416aebd23b6a 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> @@ -458,7 +458,8 @@ static int td043mtea1_probe(struct spi_device *spi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  
>  	ret = drm_panel_add(&lcd->panel);
>  	if (ret < 0) {
> diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> index 25524c26b241..1a5418ae2ccf 100644
> --- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> +++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> @@ -457,7 +457,8 @@ static int tpg110_probe(struct spi_device *spi)
>  	if (ret)
>  		return ret;
>  
> -	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
> +	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DPI);
>  	spi_set_drvdata(spi, tpg);
>  
>  	return drm_panel_add(&tpg->panel);
> diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> index c3714be78837..0feea2456e14 100644
> --- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
> +++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> @@ -518,7 +518,8 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
>  	/* dual port */
>  	gpiod_set_value(ctx->mode_gpio, 0);
>  
> -	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
> +	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs,
> +		       DRM_MODE_CONNECTOR_DSI);
>  	drm_panel_add(&ctx->panel);
>  
>  	return 0;
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 4b9c656dc15e..ce8da64022b4 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -139,6 +139,15 @@ struct drm_panel {
>  	 */
>  	const struct drm_panel_funcs *funcs;
>  
> +	/**
> +	 * @connector_type:
> +	 *
> +	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
> +	 * initialise the drm_connector corresponding to the panel with the
> +	 * correct connector type.
> +	 */
> +	int connector_type;
> +
>  	/**
>  	 * @list:
>  	 *
> @@ -148,7 +157,8 @@ struct drm_panel {
>  };
>  
>  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> -		    const struct drm_panel_funcs *funcs);
> +		    const struct drm_panel_funcs *funcs,
> +		    int connector_type);
>  
>  int drm_panel_add(struct drm_panel *panel);
>  void drm_panel_remove(struct drm_panel *panel);

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v2 4/4] drm/bridge: panel: Infer connector type from panel by default
  2019-08-23 19:32 ` [PATCH v2 4/4] drm/bridge: panel: Infer connector type from panel by default Laurent Pinchart
@ 2019-08-26  7:47   ` Boris Brezillon
  0 siblings, 0 replies; 16+ messages in thread
From: Boris Brezillon @ 2019-08-26  7:47 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Sam Ravnborg, Yannick Fertre, Stefan Mavrodiev,
	Tomi Valkeinen, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Jonas Karlman, Jyri Sarha, Sean Paul, Jernej Skrabec,
	Purism Kernel Team, Boris Brezillon, Nicolas Ferre

On Fri, 23 Aug 2019 22:32:45 +0300
Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote:

> The drm panel bridge creates a connector using a connector type explicit

								  ^explicitly

> passed by the display controller or bridge driver that instantiates the
> panel bridge. Now that drm_panel reports its connector type, we can use
> it to avoid passing an explicit (and often incorrect) connector type to
> drm_panel_bridge_add() and devm_drm_panel_bridge_add().
> 
> Several drivers report incorrect or unknown connector types to
> userspace. Reporting a different type may result in a breakage. For that
> reason, rename (devm_)drm_panel_bridge_add() to
> (devm_)drm_panel_bridge_add_typed(), and add new
> (devm_)drm_panel_bridge_add() functions that use the panel connector
> type. Update all callers of (devm_)drm_panel_bridge_add() to the _typed
> function, they will be converted one by one after testing.
> 
> The panel drivers have been updated with the following Coccinelle
> semantic patch, with manual inspection and fixes to indentation.
> 
> @@
> expression bridge;
> expression dev;
> expression panel;
> identifier type;
> @@
> (
> -bridge = drm_panel_bridge_add(panel, type);
> +bridge = drm_panel_bridge_add_typed(panel, type);
> |
> -bridge = devm_drm_panel_bridge_add(dev, panel, type);
> +bridge = devm_drm_panel_bridge_add_typed(dev, panel, type);
> )
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>

> ---
> Changes since v1:
> 
> - Add and use _typed variants
> ---
>  .../gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c  |  3 +-
>  drivers/gpu/drm/bridge/cdns-dsi.c             |  3 +-
>  drivers/gpu/drm/bridge/lvds-encoder.c         |  3 +-
>  drivers/gpu/drm/bridge/panel.c                | 69 ++++++++++++++++---
>  drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  3 +-
>  drivers/gpu/drm/ingenic/ingenic-drm.c         |  4 +-
>  drivers/gpu/drm/mcde/mcde_dsi.c               |  4 +-
>  drivers/gpu/drm/pl111/pl111_drv.c             |  4 +-
>  drivers/gpu/drm/rcar-du/rcar_du_encoder.c     |  4 +-
>  drivers/gpu/drm/rockchip/rockchip_rgb.c       |  3 +-
>  drivers/gpu/drm/stm/ltdc.c                    |  4 +-
>  drivers/gpu/drm/tilcdc/tilcdc_external.c      |  4 +-
>  drivers/gpu/drm/tve200/tve200_drv.c           |  4 +-
>  drivers/gpu/drm/vc4/vc4_dpi.c                 |  3 +-
>  drivers/gpu/drm/vc4/vc4_dsi.c                 |  4 +-
>  include/drm/drm_bridge.h                      | 11 +--
>  16 files changed, 93 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> index 375fa84c548b..121b62682d80 100644
> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> @@ -107,7 +107,8 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev, int endpoint)
>  	output->encoder.possible_crtcs = 0x1;
>  
>  	if (panel) {
> -		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_Unknown);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_Unknown);
>  		if (IS_ERR(bridge))
>  			return PTR_ERR(bridge);
>  	}
> diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c b/drivers/gpu/drm/bridge/cdns-dsi.c
> index 6166dca6be81..3a5bd4e7fd1e 100644
> --- a/drivers/gpu/drm/bridge/cdns-dsi.c
> +++ b/drivers/gpu/drm/bridge/cdns-dsi.c
> @@ -956,7 +956,8 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host,
>  
>  	panel = of_drm_find_panel(np);
>  	if (!IS_ERR(panel)) {
> -		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_DSI);
>  	} else {
>  		bridge = of_drm_find_bridge(dev->dev.of_node);
>  		if (!bridge)
> diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c b/drivers/gpu/drm/bridge/lvds-encoder.c
> index 2ab2c234f26c..e2132a8d5106 100644
> --- a/drivers/gpu/drm/bridge/lvds-encoder.c
> +++ b/drivers/gpu/drm/bridge/lvds-encoder.c
> @@ -106,7 +106,8 @@ static int lvds_encoder_probe(struct platform_device *pdev)
>  	}
>  
>  	lvds_encoder->panel_bridge =
> -		devm_drm_panel_bridge_add(dev, panel, DRM_MODE_CONNECTOR_LVDS);
> +		devm_drm_panel_bridge_add_typed(dev, panel,
> +						DRM_MODE_CONNECTOR_LVDS);
>  	if (IS_ERR(lvds_encoder->panel_bridge))
>  		return PTR_ERR(lvds_encoder->panel_bridge);
>  
> diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
> index b12ae3a4c5f1..9d20d4a297ee 100644
> --- a/drivers/gpu/drm/bridge/panel.c
> +++ b/drivers/gpu/drm/bridge/panel.c
> @@ -133,8 +133,6 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
>   * just calls the appropriate functions from &drm_panel.
>   *
>   * @panel: The drm_panel being wrapped.  Must be non-NULL.
> - * @connector_type: The DRM_MODE_CONNECTOR_* for the connector to be
> - * created.
>   *
>   * For drivers converting from directly using drm_panel: The expected
>   * usage pattern is that during either encoder module probe or DSI
> @@ -148,11 +146,37 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
>   * drm_mode_config_cleanup() if the bridge has already been attached), then
>   * drm_panel_bridge_remove() to free it.
>   *
> + * The connector type is set to @panel->connector_type, which must be set to a
> + * known type. Calling this function with a panel whose connector type is
> + * DRM_MODE_CONNECTOR_Unknown will return NULL.
> + *
>   * See devm_drm_panel_bridge_add() for an automatically manged version of this
>   * function.
>   */
> -struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
> -					u32 connector_type)
> +struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel)
> +{
> +	if (WARN_ON(panel->connector_type == DRM_MODE_CONNECTOR_Unknown))
> +		return NULL;
> +
> +	return drm_panel_bridge_add_typed(panel, panel->connector_type);
> +}
> +EXPORT_SYMBOL(drm_panel_bridge_add);
> +
> +/**
> + * drm_panel_bridge_add_typed - Creates a &drm_bridge and &drm_connector with
> + * an explicit connector type.
> + * @panel: The drm_panel being wrapped.  Must be non-NULL.
> + * @connector_type: The connector type (DRM_MODE_CONNECTOR_*)
> + *
> + * This is just like drm_panel_bridge_add(), but forces the connector type to
> + * @connector_type instead of infering it from the panel.
> + *
> + * This function is deprecated and should not be used in new drivers. Use
> + * drm_panel_bridge_add() instead, and fix panel drivers as necessary if they
> + * don't report a connector type.
> + */
> +struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
> +					      u32 connector_type)
>  {
>  	struct panel_bridge *panel_bridge;
>  
> @@ -176,7 +200,7 @@ struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
>  
>  	return &panel_bridge->bridge;
>  }
> -EXPORT_SYMBOL(drm_panel_bridge_add);
> +EXPORT_SYMBOL(drm_panel_bridge_add_typed);
>  
>  /**
>   * drm_panel_bridge_remove - Unregisters and frees a drm_bridge
> @@ -213,15 +237,38 @@ static void devm_drm_panel_bridge_release(struct device *dev, void *res)
>   * that just calls the appropriate functions from &drm_panel.
>   * @dev: device to tie the bridge lifetime to
>   * @panel: The drm_panel being wrapped.  Must be non-NULL.
> - * @connector_type: The DRM_MODE_CONNECTOR_* for the connector to be
> - * created.
>   *
>   * This is the managed version of drm_panel_bridge_add() which automatically
>   * calls drm_panel_bridge_remove() when @dev is unbound.
>   */
>  struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
> -					     struct drm_panel *panel,
> -					     u32 connector_type)
> +					     struct drm_panel *panel)
> +{
> +	if (WARN_ON(panel->connector_type == DRM_MODE_CONNECTOR_Unknown))
> +		return NULL;
> +
> +	return devm_drm_panel_bridge_add_typed(dev, panel,
> +					       panel->connector_type);
> +}
> +EXPORT_SYMBOL(devm_drm_panel_bridge_add);
> +
> +/**
> + * devm_drm_panel_bridge_add_typed - Creates a managed &drm_bridge and
> + * &drm_connector with an explicit connector type.
> + * @dev: device to tie the bridge lifetime to
> + * @panel: The drm_panel being wrapped.  Must be non-NULL.
> + * @connector_type: The connector type (DRM_MODE_CONNECTOR_*)
> + *
> + * This is just like devm_drm_panel_bridge_add(), but forces the connector type
> + * to @connector_type instead of infering it from the panel.
> + *
> + * This function is deprecated and should not be used in new drivers. Use
> + * devm_drm_panel_bridge_add() instead, and fix panel drivers as necessary if
> + * they don't report a connector type.
> + */
> +struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
> +						   struct drm_panel *panel,
> +						   u32 connector_type)
>  {
>  	struct drm_bridge **ptr, *bridge;
>  
> @@ -230,7 +277,7 @@ struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
>  	if (!ptr)
>  		return ERR_PTR(-ENOMEM);
>  
> -	bridge = drm_panel_bridge_add(panel, connector_type);
> +	bridge = drm_panel_bridge_add_typed(panel, connector_type);
>  	if (!IS_ERR(bridge)) {
>  		*ptr = bridge;
>  		devres_add(dev, ptr);
> @@ -240,4 +287,4 @@ struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
>  
>  	return bridge;
>  }
> -EXPORT_SYMBOL(devm_drm_panel_bridge_add);
> +EXPORT_SYMBOL(devm_drm_panel_bridge_add_typed);
> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
> index 675442bfc1bd..b8b1c288f663 100644
> --- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
> @@ -316,7 +316,8 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
>  		return ret;
>  
>  	if (panel) {
> -		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_DSI);
>  		if (IS_ERR(bridge))
>  			return PTR_ERR(bridge);
>  	}
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm.c b/drivers/gpu/drm/ingenic/ingenic-drm.c
> index ce1fae3a78a9..73fd33d2595c 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm.c
> @@ -676,8 +676,8 @@ static int ingenic_drm_probe(struct platform_device *pdev)
>  	}
>  
>  	if (panel) {
> -		bridge = devm_drm_panel_bridge_add(dev, panel,
> -						   DRM_MODE_CONNECTOR_Unknown);
> +		bridge = devm_drm_panel_bridge_add_typed(dev, panel,
> +							 DRM_MODE_CONNECTOR_Unknown);
>  	}
>  
>  	priv->dma_hwdesc = dma_alloc_coherent(dev, sizeof(*priv->dma_hwdesc),
> diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c
> index 07f7090d08b3..ffb55d3b662c 100644
> --- a/drivers/gpu/drm/mcde/mcde_dsi.c
> +++ b/drivers/gpu/drm/mcde/mcde_dsi.c
> @@ -922,8 +922,8 @@ static int mcde_dsi_bind(struct device *dev, struct device *master,
>  		}
>  	}
>  	if (panel) {
> -		bridge = drm_panel_bridge_add(panel,
> -					      DRM_MODE_CONNECTOR_DSI);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_DSI);
>  		if (IS_ERR(bridge)) {
>  			dev_err(dev, "error adding panel bridge\n");
>  			return PTR_ERR(bridge);
> diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl111_drv.c
> index 276b53473a84..63dfcda04147 100644
> --- a/drivers/gpu/drm/pl111/pl111_drv.c
> +++ b/drivers/gpu/drm/pl111/pl111_drv.c
> @@ -150,8 +150,8 @@ static int pl111_modeset_init(struct drm_device *dev)
>  		return -EPROBE_DEFER;
>  
>  	if (panel) {
> -		bridge = drm_panel_bridge_add(panel,
> -					      DRM_MODE_CONNECTOR_Unknown);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_Unknown);
>  		if (IS_ERR(bridge)) {
>  			ret = PTR_ERR(bridge);
>  			goto out_config;
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> index 0f00bdfe2366..f940d0c6aeb9 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> @@ -84,8 +84,8 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu,
>  			goto done;
>  		}
>  
> -		bridge = devm_drm_panel_bridge_add(rcdu->dev, panel,
> -						   DRM_MODE_CONNECTOR_DPI);
> +		bridge = devm_drm_panel_bridge_add_typed(rcdu->dev, panel,
> +							 DRM_MODE_CONNECTOR_DPI);
>  		if (IS_ERR(bridge)) {
>  			ret = PTR_ERR(bridge);
>  			goto done;
> diff --git a/drivers/gpu/drm/rockchip/rockchip_rgb.c b/drivers/gpu/drm/rockchip/rockchip_rgb.c
> index 89e0bb0fe0ab..a3ba0d5914e8 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_rgb.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_rgb.c
> @@ -135,7 +135,8 @@ struct rockchip_rgb *rockchip_rgb_init(struct device *dev,
>  	drm_encoder_helper_add(encoder, &rockchip_rgb_encoder_helper_funcs);
>  
>  	if (panel) {
> -		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_LVDS);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_LVDS);
>  		if (IS_ERR(bridge))
>  			return ERR_CAST(bridge);
>  	}
> diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
> index 3ab4fbf8eb0d..7cdab685b527 100644
> --- a/drivers/gpu/drm/stm/ltdc.c
> +++ b/drivers/gpu/drm/stm/ltdc.c
> @@ -1236,8 +1236,8 @@ int ltdc_load(struct drm_device *ddev)
>  	/* Add endpoints panels or bridges if any */
>  	for (i = 0; i < MAX_ENDPOINTS; i++) {
>  		if (panel[i]) {
> -			bridge[i] = drm_panel_bridge_add(panel[i],
> -							DRM_MODE_CONNECTOR_DPI);
> +			bridge[i] = drm_panel_bridge_add_typed(panel[i],
> +							       DRM_MODE_CONNECTOR_DPI);
>  			if (IS_ERR(bridge[i])) {
>  				DRM_ERROR("panel-bridge endpoint %d\n", i);
>  				ret = PTR_ERR(bridge[i]);
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> index 43d756b7810e..39e9a97610db 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
> @@ -139,8 +139,8 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
>  	}
>  
>  	if (panel) {
> -		bridge = devm_drm_panel_bridge_add(ddev->dev, panel,
> -						   DRM_MODE_CONNECTOR_DPI);
> +		bridge = devm_drm_panel_bridge_add_typed(ddev->dev, panel,
> +							 DRM_MODE_CONNECTOR_DPI);
>  		if (IS_ERR(bridge)) {
>  			ret = PTR_ERR(bridge);
>  			goto err_encoder_cleanup;
> diff --git a/drivers/gpu/drm/tve200/tve200_drv.c b/drivers/gpu/drm/tve200/tve200_drv.c
> index 416f24823c0a..954b09c948eb 100644
> --- a/drivers/gpu/drm/tve200/tve200_drv.c
> +++ b/drivers/gpu/drm/tve200/tve200_drv.c
> @@ -80,8 +80,8 @@ static int tve200_modeset_init(struct drm_device *dev)
>  	if (ret && ret != -ENODEV)
>  		return ret;
>  	if (panel) {
> -		bridge = drm_panel_bridge_add(panel,
> -					      DRM_MODE_CONNECTOR_Unknown);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_Unknown);
>  		if (IS_ERR(bridge)) {
>  			ret = PTR_ERR(bridge);
>  			goto out_bridge;
> diff --git a/drivers/gpu/drm/vc4/vc4_dpi.c b/drivers/gpu/drm/vc4/vc4_dpi.c
> index 8a27a6acee61..c586325de2a5 100644
> --- a/drivers/gpu/drm/vc4/vc4_dpi.c
> +++ b/drivers/gpu/drm/vc4/vc4_dpi.c
> @@ -249,7 +249,8 @@ static int vc4_dpi_init_bridge(struct vc4_dpi *dpi)
>  	}
>  
>  	if (panel)
> -		bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DPI);
> +		bridge = drm_panel_bridge_add_typed(panel,
> +						    DRM_MODE_CONNECTOR_DPI);
>  
>  	return drm_bridge_attach(dpi->encoder, bridge, NULL);
>  }
> diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c
> index c78fa8144776..bf4d2a1a22dc 100644
> --- a/drivers/gpu/drm/vc4/vc4_dsi.c
> +++ b/drivers/gpu/drm/vc4/vc4_dsi.c
> @@ -1575,8 +1575,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
>  	}
>  
>  	if (panel) {
> -		dsi->bridge = devm_drm_panel_bridge_add(dev, panel,
> -							DRM_MODE_CONNECTOR_DSI);
> +		dsi->bridge = devm_drm_panel_bridge_add_typed(dev, panel,
> +							      DRM_MODE_CONNECTOR_DSI);
>  		if (IS_ERR(dsi->bridge))
>  			return PTR_ERR(dsi->bridge);
>  	}
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 7616f6562fe4..1a4b8ecf5bdb 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -429,12 +429,15 @@ void drm_atomic_bridge_enable(struct drm_bridge *bridge,
>  			      struct drm_atomic_state *state);
>  
>  #ifdef CONFIG_DRM_PANEL_BRIDGE
> -struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
> -					u32 connector_type);
> +struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel);
> +struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
> +					      u32 connector_type);
>  void drm_panel_bridge_remove(struct drm_bridge *bridge);
>  struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
> -					     struct drm_panel *panel,
> -					     u32 connector_type);
> +					     struct drm_panel *panel);
> +struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
> +						   struct drm_panel *panel,
> +						   u32 connector_type);
>  #endif
>  
>  #endif

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-08-24 14:02     ` Laurent Pinchart
@ 2019-09-04 13:13       ` Laurent Pinchart
  0 siblings, 0 replies; 16+ messages in thread
From: Laurent Pinchart @ 2019-09-04 13:13 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, dri-devel, Nicolas Ferre, Paul Cercueil,
	Thierry Reding, Stefan Mavrodiev, Sean Paul, Ludovic Desroches,
	Tomi Valkeinen, Jagan Teki, Robert Chiras, Jonas Karlman,
	Jyri Sarha, Vincent Abriou, Jernej Skrabec, Purism Kernel Team,
	Boris Brezillon, Philippe Cornu, Yannick Fertre

Hi Sam,

On Sat, Aug 24, 2019 at 05:02:34PM +0300, Laurent Pinchart wrote:
> On Sat, Aug 24, 2019 at 11:54:21AM +0200, Sam Ravnborg wrote:
> > On Fri, Aug 23, 2019 at 10:32:44PM +0300, Laurent Pinchart wrote:
> >> Add a type field to the drm_panel structure to report the panel type,
> >> using DRM_MODE_CONNECTOR_* macros (the values that make sense are LVDS,
> >> eDP, DSI and DPI). This will be used to initialise the corresponding
> >> connector type.
> > 
> > As discussed on irc before applying this we should evaluate the
> > idea to introduce DRM_MODE_CONNECTOR_PANEL
> 
> Thank you for bringing it up.
> 
> > Today we have:
> >     DRM_MODE_CONNECTOR_DPI
> >     DRM_MODE_CONNECTOR_DBI
> >     DRM_MODE_CONNECTOR_SPI
> >     DRM_MODE_CONNECTOR_LVDS
> > 
> > The question if what benefit ig gives to distingush between the
> > different ways panels are connected.
> > 
> > For example for VGA and HDMI there is a physical connector involved so
> > here it make good sense.
> > But why should userspace care if the panel is connected via DPI or LVDS?
> > 
> > The more generic DRM_MODE_CONNECTOR_PANEL would be equally descriptive.
> > 
> > We will also start to see new drivers where there will be support
> > for more than one type of connector interface.
> > 
> > Like for example ili9322:
> >  - 8-bit serial RGB interface
> >  - 24-bit parallel RGB interface
> >  - 8-bit ITU-R BT.601 interface
> >  - 8-bit ITU-R BT.656 interface
> > 
> > Adding DRM_MODE_CONNECTOR_PANEL may create an xkcd 927 situation.
> > But we should then deprecate _DPI, _DBI, _SPI, _LVDS.
> 
> _DBI doesn't exist, but we also have _eDP.
> 
> The discussions originated from the fact that a number of drivers
> incorrectly report their connector type for panels today (including
> reporting DRM_MODE_CONNECTOR_Unknown), and they can't be fixed without a
> risk or breaking userspace, especially as the connector type is also
> used to name the connector (it would at least break command line mode
> setting as reported by Nicolas Ferre). It also makes it difficult for a
> driver to exhibit the right behaviour on new systems (that don't need to
> care about backward compatibility) without breaking the already
> supported systems.
> 
> There were also recent discussions about adding a _DBI connector type,
> which will increase this mess. I pointed out in a few IRC discussions
> that I think the different connector types for panels were a mistake,
> and that we should have gone for DRM_MODE_CONNECTOR_PANEL in the first
> place. It's of course too late to fix this, but going forward, instead
> of introducing a _DBI connector type, I think we'd be much better off
> with _PANEL.

Do you think it makes sense to merge this patch, regardless of the
outcome of the DRM_MODE_CONNECTOR_PANEL panel discussion (which looks
like a lack of discussion at the moment...) ? The patch allows exposing
the correct panel type to userspace, without hindering in any way a
future addition of DRM_MODE_CONNECTOR_PANEL.

> >> Update all panel drivers accordingly. The panel-simple driver only
> >> specifies the type for the known to be LVDS panels, while all other
> >> panels are left as unknown and will be converted on a case-by-case
> >> basis as they all need to be carefully reviewed.
> >> 
> >> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> >> ---
> >> Changes since v1:
> >> 
> >> - Rename the type field to connector_type
> >> - Pass the type to the drm_panel_init() function
> >> - Keep connector type as unknown for non-LVDS panels in panel-simple
> >> - Flag the toshiba_lt089ac29000 panel as LVDS as reported by Boris
> >> ---
> >>  drivers/gpu/drm/drm_panel.c                   |  5 +++-
> >>  drivers/gpu/drm/panel/panel-arm-versatile.c   |  3 ++-
> >>  .../drm/panel/panel-feiyang-fy07024di26a30d.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-ilitek-ili9322.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-ilitek-ili9881c.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-innolux-p079zca.c |  3 ++-
> >>  .../gpu/drm/panel/panel-jdi-lt070me05000.c    |  3 ++-
> >>  .../drm/panel/panel-kingdisplay-kd097d04.c    |  2 +-
> >>  drivers/gpu/drm/panel/panel-lg-lb035q02.c     |  3 ++-
> >>  drivers/gpu/drm/panel/panel-lg-lg4573.c       |  3 ++-
> >>  drivers/gpu/drm/panel/panel-lvds.c            |  3 ++-
> >>  drivers/gpu/drm/panel/panel-nec-nl8048hl11.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-novatek-nt39016.c |  3 ++-
> >>  .../drm/panel/panel-olimex-lcd-olinuxino.c    |  3 ++-
> >>  .../gpu/drm/panel/panel-orisetech-otm8009a.c  |  3 ++-
> >>  .../drm/panel/panel-osd-osd101t2587-53ts.c    |  2 +-
> >>  .../drm/panel/panel-panasonic-vvx10f034n00.c  |  2 +-
> >>  .../drm/panel/panel-raspberrypi-touchscreen.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-raydium-rm67191.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-raydium-rm68200.c |  3 ++-
> >>  .../drm/panel/panel-rocktech-jh057n00900.c    |  3 ++-
> >>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-samsung-ld9040.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-samsung-s6d16d0.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c |  3 ++-
> >>  .../gpu/drm/panel/panel-samsung-s6e63j0x03.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-samsung-s6e63m0.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c |  3 ++-
> >>  drivers/gpu/drm/panel/panel-seiko-43wvf1g.c   |  3 ++-
> >>  .../gpu/drm/panel/panel-sharp-lq101r1sx01.c   |  3 ++-
> >>  .../gpu/drm/panel/panel-sharp-ls037v7dw01.c   |  3 ++-
> >>  .../gpu/drm/panel/panel-sharp-ls043t1le01.c   |  2 +-
> >>  drivers/gpu/drm/panel/panel-simple.c          | 26 ++++++++++++++++++-
> >>  drivers/gpu/drm/panel/panel-sitronix-st7701.c |  3 ++-
> >>  .../gpu/drm/panel/panel-sitronix-st7789v.c    |  3 ++-
> >>  drivers/gpu/drm/panel/panel-sony-acx565akm.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-tpo-td028ttec1.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-tpo-td043mtea1.c  |  3 ++-
> >>  drivers/gpu/drm/panel/panel-tpo-tpg110.c      |  3 ++-
> >>  drivers/gpu/drm/panel/panel-truly-nt35597.c   |  3 ++-
> >>  include/drm/drm_panel.h                       | 12 ++++++++-
> >>  41 files changed, 112 insertions(+), 41 deletions(-)
> >> 
> >> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> >> index ba2fad4c9648..ed7985c0535a 100644
> >> --- a/drivers/gpu/drm/drm_panel.c
> >> +++ b/drivers/gpu/drm/drm_panel.c
> >> @@ -46,16 +46,19 @@ static LIST_HEAD(panel_list);
> >>   * @panel: DRM panel
> >>   * @dev: parent device of the panel
> >>   * @funcs: panel operations
> >> + * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to
> >> + *	the panel interface
> >>   *
> >>   * Initialize the panel structure for subsequent registration with
> >>   * drm_panel_add().
> >>   */
> >>  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> >> -		    const struct drm_panel_funcs *funcs)
> >> +		    const struct drm_panel_funcs *funcs, int connector_type)
> >>  {
> >>  	INIT_LIST_HEAD(&panel->list);
> >>  	panel->dev = dev;
> >>  	panel->funcs = funcs;
> >> +	panel->connector_type = connector_type;
> >>  }
> >>  EXPORT_SYMBOL(drm_panel_init);
> >>  
> >> diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c
> >> index a4333ed0f20c..a0574dc03e16 100644
> >> --- a/drivers/gpu/drm/panel/panel-arm-versatile.c
> >> +++ b/drivers/gpu/drm/panel/panel-arm-versatile.c
> >> @@ -350,7 +350,8 @@ static int versatile_panel_probe(struct platform_device *pdev)
> >>  			dev_info(dev, "panel mounted on IB2 daughterboard\n");
> >>  	}
> >>  
> >> -	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs);
> >> +	drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&vpanel->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> >> index 7d5d7455bc01..98f184b81187 100644
> >> --- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> >> +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
> >> @@ -204,7 +204,8 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi)
> >>  	mipi_dsi_set_drvdata(dsi, ctx);
> >>  	ctx->dsi = dsi;
> >>  
> >> -	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs);
> >> +	drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd");
> >>  	if (IS_ERR(ctx->dvdd)) {
> >> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> >> index ad2405baa0ac..24955bec1958 100644
> >> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> >> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> >> @@ -895,7 +895,8 @@ static int ili9322_probe(struct spi_device *spi)
> >>  		ili->input = ili->conf->input;
> >>  	}
> >>  
> >> -	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs);
> >> +	drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&ili->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> >> index 1d714f961c00..e8789e460a16 100644
> >> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> >> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
> >> @@ -433,7 +433,8 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
> >>  	mipi_dsi_set_drvdata(dsi, ctx);
> >>  	ctx->dsi = dsi;
> >>  
> >> -	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs);
> >> +	drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ctx->power = devm_regulator_get(&dsi->dev, "power");
> >>  	if (IS_ERR(ctx->power)) {
> >> diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> >> index 2054afc31f20..46bfeb982b06 100644
> >> --- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> >> +++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c
> >> @@ -487,7 +487,8 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi,
> >>  	if (IS_ERR(innolux->backlight))
> >>  		return PTR_ERR(innolux->backlight);
> >>  
> >> -	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs);
> >> +	drm_panel_init(&innolux->base, dev, &innolux_panel_funcs
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	err = drm_panel_add(&innolux->base);
> >>  	if (err < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> >> index 7bfdbfbc868e..56364a93f0b8 100644
> >> --- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> >> +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
> >> @@ -437,7 +437,8 @@ static int jdi_panel_add(struct jdi_panel *jdi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs);
> >> +	drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ret = drm_panel_add(&jdi->base);
> >>  
> >> diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> >> index a47885a1a8aa..45f96556ec8c 100644
> >> --- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> >> +++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c
> >> @@ -392,7 +392,7 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
> >>  		return PTR_ERR(kingdisplay->backlight);
> >>  
> >>  	drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
> >> -		       &kingdisplay_panel_funcs);
> >> +		       &kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	return drm_panel_add(&kingdisplay->base);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> >> index 28c3205df482..f984a5189fbf 100644
> >> --- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> >> +++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c
> >> @@ -196,7 +196,8 @@ static int lb035q02_probe(struct spi_device *spi)
> >>  	if (ret < 0)
> >>  		return ret;
> >>  
> >> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs);
> >> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&lcd->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> >> index 608f2de91662..db4865a4c2b9 100644
> >> --- a/drivers/gpu/drm/panel/panel-lg-lg4573.c
> >> +++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c
> >> @@ -259,7 +259,8 @@ static int lg4573_probe(struct spi_device *spi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&ctx->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c
> >> index 3dc1ac2a6b03..cab3fb4177e3 100644
> >> --- a/drivers/gpu/drm/panel/panel-lvds.c
> >> +++ b/drivers/gpu/drm/panel/panel-lvds.c
> >> @@ -260,7 +260,8 @@ static int panel_lvds_probe(struct platform_device *pdev)
> >>  	 */
> >>  
> >>  	/* Register the panel. */
> >> -	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs);
> >> +	drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs,
> >> +		       DRM_MODE_CONNECTOR_LVDS);
> >>  
> >>  	ret = drm_panel_add(&lvds->panel);
> >>  	if (ret < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> >> index b67636fdbc21..c4bc7fa85fad 100644
> >> --- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> >> +++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c
> >> @@ -205,7 +205,8 @@ static int nl8048_probe(struct spi_device *spi)
> >>  	if (ret < 0)
> >>  		return ret;
> >>  
> >> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs);
> >> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&lcd->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> >> index 64cfe111aaad..60ccedce530c 100644
> >> --- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> >> +++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c
> >> @@ -292,7 +292,8 @@ static int nt39016_probe(struct spi_device *spi)
> >>  		return err;
> >>  	}
> >>  
> >> -	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs);
> >> +	drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	err = drm_panel_add(&panel->drm_panel);
> >>  	if (err < 0) {
> >> diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> >> index f2d6a4ec0046..f2a72ee6ee07 100644
> >> --- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> >> +++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
> >> @@ -288,7 +288,8 @@ static int lcd_olinuxino_probe(struct i2c_client *client,
> >>  	if (IS_ERR(lcd->backlight))
> >>  		return PTR_ERR(lcd->backlight);
> >>  
> >> -	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs);
> >> +	drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&lcd->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> >> index 8b60d5e4d775..bf1f928b215f 100644
> >> --- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> >> +++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c
> >> @@ -455,7 +455,8 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
> >>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
> >>  			  MIPI_DSI_MODE_LPM;
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev),
> >>  						     dsi->host->dev, ctx,
> >> diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> >> index 38f114b03b89..2b40913899d8 100644
> >> --- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> >> +++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c
> >> @@ -167,7 +167,7 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
> >>  		return PTR_ERR(osd101t2587->backlight);
> >>  
> >>  	drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
> >> -		       &osd101t2587_panel_funcs);
> >> +		       &osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	return drm_panel_add(&osd101t2587->base);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> >> index 6035bf458074..664605071d34 100644
> >> --- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> >> +++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c
> >> @@ -224,7 +224,7 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
> >>  	}
> >>  
> >>  	drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
> >> -		       &wuxga_nt_panel_funcs);
> >> +		       &wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ret = drm_panel_add(&wuxga_nt->base);
> >>  	if (ret < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> >> index 23a801427e42..09824e92fc78 100644
> >> --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> >> +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
> >> @@ -426,7 +426,8 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c,
> >>  		return PTR_ERR(ts->dsi);
> >>  	}
> >>  
> >> -	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs);
> >> +	drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	/* This appears last, as it's what will unblock the DSI host
> >>  	 * driver's component bind function.
> >> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> >> index f82a1f69f13b..fd67fc6185c4 100644
> >> --- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> >> +++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c
> >> @@ -606,7 +606,8 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi)
> >>  	if (ret)
> >>  		return ret;
> >>  
> >> -	drm_panel_init(&panel->panel, dev, &rad_panel_funcs);
> >> +	drm_panel_init(&panel->panel, dev, &rad_panel_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  	dev_set_drvdata(dev, panel);
> >>  
> >>  	ret = drm_panel_add(&panel->panel);
> >> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> >> index f004b78fb8bc..994e855721f4 100644
> >> --- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> >> +++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c
> >> @@ -404,7 +404,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi)
> >>  	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
> >>  			  MIPI_DSI_MODE_LPM;
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	drm_panel_add(&ctx->panel);
> >>  
> >> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> >> index d7f56374f2f1..31234b79d3b1 100644
> >> --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> >> +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> >> @@ -343,7 +343,8 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	drm_panel_add(&ctx->panel);
> >>  
> >> diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> >> index 8708fbbe7637..170a5cda21b9 100644
> >> --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> >> +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
> >> @@ -173,7 +173,8 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi)
> >>  	mipi_dsi_set_drvdata(dsi, ctx);
> >>  	ctx->dsi = dsi;
> >>  
> >> -	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs);
> >> +	drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
> >>  	if (IS_ERR(ctx->gpios.reset)) {
> >> diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> >> index 71a292dbec47..250809ba37c7 100644
> >> --- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> >> +++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c
> >> @@ -351,7 +351,8 @@ static int ld9040_probe(struct spi_device *spi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&ctx->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> >> index 4d25c96e842c..e3a0397e953e 100644
> >> --- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> >> +++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c
> >> @@ -215,7 +215,8 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs);
> >> +	drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ret = drm_panel_add(&s6->panel);
> >>  	if (ret < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> >> index 42a3aaab49eb..938ab72c5540 100644
> >> --- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> >> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c
> >> @@ -732,7 +732,8 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
> >>  	ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
> >>  	ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ret = drm_panel_add(&ctx->panel);
> >>  	if (ret < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> >> index b4d879bf4d03..a60635e9226d 100644
> >> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> >> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c
> >> @@ -466,7 +466,8 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
> >>  		return PTR_ERR(ctx->reset_gpio);
> >>  	}
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx,
> >>  						&s6e63j0x03_bl_ops, NULL);
> >> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> >> index 61259c2833ab..ba01af0b14fd 100644
> >> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> >> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> >> @@ -473,7 +473,8 @@ static int s6e63m0_probe(struct spi_device *spi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	ret = s6e63m0_backlight_register(ctx);
> >>  	if (ret < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> >> index 35dbffabd526..dbced6501204 100644
> >> --- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> >> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
> >> @@ -1017,7 +1017,8 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi)
> >>  
> >>  	ctx->brightness = GAMMA_LEVEL_NUM - 1;
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	ret = drm_panel_add(&ctx->panel);
> >>  	if (ret < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> >> index 0833d0c03adc..b3619ba443bd 100644
> >> --- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> >> +++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c
> >> @@ -274,7 +274,8 @@ static int seiko_panel_probe(struct device *dev,
> >>  			return -EPROBE_DEFER;
> >>  	}
> >>  
> >> -	drm_panel_init(&panel->base, dev, &seiko_panel_funcs);
> >> +	drm_panel_init(&panel->base, dev, &seiko_panel_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	err = drm_panel_add(&panel->base);
> >>  	if (err < 0)
> >> diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> >> index 87a58cb4d945..5e136c3ba185 100644
> >> --- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> >> +++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c
> >> @@ -329,7 +329,8 @@ static int sharp_panel_add(struct sharp_panel *sharp)
> >>  	if (IS_ERR(sharp->backlight))
> >>  		return PTR_ERR(sharp->backlight);
> >>  
> >> -	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs);
> >> +	drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	return drm_panel_add(&sharp->base);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> >> index 96e3deb0e305..eeab7998c7de 100644
> >> --- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> >> +++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c
> >> @@ -185,7 +185,8 @@ static int ls037v7dw01_probe(struct platform_device *pdev)
> >>  		return PTR_ERR(lcd->ud_gpio);
> >>  	}
> >>  
> >> -	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs);
> >> +	drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&lcd->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> >> index ffa844ee82ad..b963ba4ab589 100644
> >> --- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> >> +++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
> >> @@ -265,7 +265,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt)
> >>  		return PTR_ERR(sharp_nt->backlight);
> >>  
> >>  	drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev,
> >> -		       &sharp_nt_panel_funcs);
> >> +		       &sharp_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	return drm_panel_add(&sharp_nt->base);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
> >> index b36c130d5cf0..4b92b27eba86 100644
> >> --- a/drivers/gpu/drm/panel/panel-simple.c
> >> +++ b/drivers/gpu/drm/panel/panel-simple.c
> >> @@ -94,6 +94,7 @@ struct panel_desc {
> >>  
> >>  	u32 bus_format;
> >>  	u32 bus_flags;
> >> +	int connector_type;
> >>  };
> >>  
> >>  struct panel_simple {
> >> @@ -464,7 +465,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
> >>  	if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
> >>  		panel_simple_parse_panel_timing_node(dev, panel, &dt);
> >>  
> >> -	drm_panel_init(&panel->base, dev, &panel_simple_funcs);
> >> +	drm_panel_init(&panel->base, dev, &panel_simple_funcs,
> >> +		       desc->connector_type);
> >>  
> >>  	err = drm_panel_add(&panel->base);
> >>  	if (err < 0)
> >> @@ -831,6 +833,7 @@ static const struct panel_desc auo_g133han01 = {
> >>  		.unprepare = 1000,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing auo_g185han01_timings = {
> >> @@ -860,6 +863,7 @@ static const struct panel_desc auo_g185han01 = {
> >>  		.unprepare = 1000,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing auo_p320hvn03_timings = {
> >> @@ -888,6 +892,7 @@ static const struct panel_desc auo_p320hvn03 = {
> >>  		.unprepare = 500,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode auo_t215hvn01_mode = {
> >> @@ -1203,6 +1208,7 @@ static const struct panel_desc dlc_dlc0700yzg_1 = {
> >>  		.disable = 200,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing dlc_dlc1010gig_timing = {
> >> @@ -1233,6 +1239,7 @@ static const struct panel_desc dlc_dlc1010gig = {
> >>  		.unprepare = 60,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode edt_et035012dm6_mode = {
> >> @@ -1499,6 +1506,7 @@ static const struct panel_desc hannstar_hsd070pww1 = {
> >>  		.height = 94,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing hannstar_hsd100pxn1_timing = {
> >> @@ -1523,6 +1531,7 @@ static const struct panel_desc hannstar_hsd100pxn1 = {
> >>  		.height = 152,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
> >> @@ -1629,6 +1638,7 @@ static const struct panel_desc innolux_g070y2_l01 = {
> >>  		.unprepare = 800,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing innolux_g101ice_l01_timing = {
> >> @@ -1657,6 +1667,7 @@ static const struct panel_desc innolux_g101ice_l01 = {
> >>  		.disable = 200,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing innolux_g121i1_l01_timing = {
> >> @@ -1684,6 +1695,7 @@ static const struct panel_desc innolux_g121i1_l01 = {
> >>  		.disable = 20,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode innolux_g121x1_l03_mode = {
> >> @@ -1867,6 +1879,7 @@ static const struct panel_desc koe_tx31d200vm0baa = {
> >>  		.height = 109,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing kyo_tcg121xglp_timing = {
> >> @@ -1891,6 +1904,7 @@ static const struct panel_desc kyo_tcg121xglp = {
> >>  		.height = 184,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
> >> @@ -1939,6 +1953,7 @@ static const struct panel_desc lg_lb070wv8 = {
> >>  		.height = 91,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode lg_lp079qx1_sp0v_mode = {
> >> @@ -2061,6 +2076,7 @@ static const struct panel_desc mitsubishi_aa070mc01 = {
> >>  		.disable = 400,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  	.bus_flags = DRM_BUS_FLAG_DE_HIGH,
> >>  };
> >>  
> >> @@ -2089,6 +2105,7 @@ static const struct panel_desc nec_nl12880bc20_05 = {
> >>  		.disable = 50,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
> >> @@ -2191,6 +2208,7 @@ static const struct panel_desc nlt_nl192108ac18_02d = {
> >>  		.unprepare = 500,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode nvd_9128_mode = {
> >> @@ -2214,6 +2232,7 @@ static const struct panel_desc nvd_9128 = {
> >>  		.height = 88,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing okaya_rs800480t_7x0gp_timing = {
> >> @@ -2626,6 +2645,7 @@ static const struct panel_desc sharp_lq101k1ly04 = {
> >>  		.height = 136,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing sharp_lq123p1jx31_timing = {
> >> @@ -2805,6 +2825,7 @@ static const struct panel_desc tianma_tm070jdhg30 = {
> >>  		.height = 95,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct display_timing tianma_tm070rvhg71_timing = {
> >> @@ -2829,6 +2850,7 @@ static const struct panel_desc tianma_tm070rvhg71 = {
> >>  		.height = 86,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
> >> @@ -2911,6 +2933,7 @@ static const struct panel_desc toshiba_lt089ac29000 = {
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
> >>  	.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct drm_display_mode tpk_f07a_0102_mode = {
> >> @@ -2981,6 +3004,7 @@ static const struct panel_desc urt_umsh_8596md_lvds = {
> >>  		.height = 91,
> >>  	},
> >>  	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> >> +	.connector_type = DRM_MODE_CONNECTOR_LVDS,
> >>  };
> >>  
> >>  static const struct panel_desc urt_umsh_8596md_parallel = {
> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> >> index 3f7bcd24aa81..ee3f23f45755 100644
> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> >> @@ -369,7 +369,8 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
> >>  	if (IS_ERR(st7701->backlight))
> >>  		return PTR_ERR(st7701->backlight);
> >>  
> >> -	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs);
> >> +	drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  
> >>  	/**
> >>  	 * Once sleep out has been issued, ST7701 IC required to wait 120ms
> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> >> index 2eeaeee0dd7f..108a85bb6667 100644
> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c
> >> @@ -381,7 +381,8 @@ static int st7789v_probe(struct spi_device *spi)
> >>  	spi_set_drvdata(spi, ctx);
> >>  	ctx->spi = spi;
> >>  
> >> -	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	ctx->power = devm_regulator_get(&spi->dev, "power");
> >>  	if (IS_ERR(ctx->power))
> >> diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> >> index 5a2772b04b75..6f5ce5867ff9 100644
> >> --- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> >> +++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
> >> @@ -648,7 +648,8 @@ static int acx565akm_probe(struct spi_device *spi)
> >>  			return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs);
> >> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	ret = drm_panel_add(&lcd->panel);
> >>  	if (ret < 0) {
> >> diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> >> index 8b1148d74e7b..1d08d03f509d 100644
> >> --- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> >> +++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c
> >> @@ -347,7 +347,8 @@ static int td028ttec1_probe(struct spi_device *spi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs);
> >> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	return drm_panel_add(&lcd->panel);
> >>  }
> >> diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> >> index bbf0c2e1c90f..416aebd23b6a 100644
> >> --- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> >> +++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c
> >> @@ -458,7 +458,8 @@ static int td043mtea1_probe(struct spi_device *spi)
> >>  		return ret;
> >>  	}
> >>  
> >> -	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs);
> >> +	drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  
> >>  	ret = drm_panel_add(&lcd->panel);
> >>  	if (ret < 0) {
> >> diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> >> index 25524c26b241..1a5418ae2ccf 100644
> >> --- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> >> +++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c
> >> @@ -457,7 +457,8 @@ static int tpg110_probe(struct spi_device *spi)
> >>  	if (ret)
> >>  		return ret;
> >>  
> >> -	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs);
> >> +	drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DPI);
> >>  	spi_set_drvdata(spi, tpg);
> >>  
> >>  	return drm_panel_add(&tpg->panel);
> >> diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> >> index c3714be78837..0feea2456e14 100644
> >> --- a/drivers/gpu/drm/panel/panel-truly-nt35597.c
> >> +++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c
> >> @@ -518,7 +518,8 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx)
> >>  	/* dual port */
> >>  	gpiod_set_value(ctx->mode_gpio, 0);
> >>  
> >> -	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs);
> >> +	drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs,
> >> +		       DRM_MODE_CONNECTOR_DSI);
> >>  	drm_panel_add(&ctx->panel);
> >>  
> >>  	return 0;
> >> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> >> index 4b9c656dc15e..ce8da64022b4 100644
> >> --- a/include/drm/drm_panel.h
> >> +++ b/include/drm/drm_panel.h
> >> @@ -139,6 +139,15 @@ struct drm_panel {
> >>  	 */
> >>  	const struct drm_panel_funcs *funcs;
> >>  
> >> +	/**
> >> +	 * @connector_type:
> >> +	 *
> >> +	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
> >> +	 * initialise the drm_connector corresponding to the panel with the
> >> +	 * correct connector type.
> >> +	 */
> >> +	int connector_type;
> >> +
> >>  	/**
> >>  	 * @list:
> >>  	 *
> >> @@ -148,7 +157,8 @@ struct drm_panel {
> >>  };
> >>  
> >>  void drm_panel_init(struct drm_panel *panel, struct device *dev,
> >> -		    const struct drm_panel_funcs *funcs);
> >> +		    const struct drm_panel_funcs *funcs,
> >> +		    int connector_type);
> >>  
> >>  int drm_panel_add(struct drm_panel *panel);
> >>  void drm_panel_remove(struct drm_panel *panel);

-- 
Regards,

Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-08-24  9:54   ` DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field] Sam Ravnborg
  2019-08-24 14:02     ` Laurent Pinchart
@ 2019-09-27 12:37     ` Linus Walleij
  2019-09-27 12:44       ` Daniel Stone
  1 sibling, 1 reply; 16+ messages in thread
From: Linus Walleij @ 2019-09-27 12:37 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, open list:DRM PANEL DRIVERS, Philippe Cornu,
	Paul Cercueil, Thierry Reding, Laurent Pinchart, Yannick Fertre,
	Stefan Mavrodiev, Tomi Valkeinen, Ludovic Desroches, Jagan Teki,
	Robert Chiras, Jonas Karlman, Jyri Sarha, Sean Paul,
	Jernej Skrabec, Purism Kernel Team, Boris Brezillon

Just a drive-by comment:

On Sat, Aug 24, 2019 at 11:54 AM Sam Ravnborg <sam@ravnborg.org> wrote:

> We will also start to see new drivers where there will be support
> for more than one type of connector interface.
>
> Like for example ili9322:
>  - 8-bit serial RGB interface
>  - 24-bit parallel RGB interface
>  - 8-bit ITU-R BT.601 interface
>  - 8-bit ITU-R BT.656 interface

I just found all these weird references when making the ILI9322 driver
and trying to really understand what was going on in the hardware.
I have this special nack (shared with many kernel developers) that I
need to know what is going on.

I think what is actually the case is that a *lot* of panels that we
support (especially the so-called "simple" panels) are actually complex,
like the ILI9322, just that many of them are undocumented, set up by
ROM or bootloaders, their SPI/I2C lines forgotten about and the
sum result added as a "simple panel" in panel-simple.c.

This is fine I guess to get some basic support up and going,
but all of a sudden someone will use that bridge/panel with
some other input from the list above and ooops wrongly modeled,
the DT compatible string makes no sense etc.

Also the ILI9322 can actually set up gamma correction which is
very nice for professional applications. I haven't seen any way for
DRM to do gamma correction properly or any framework for it
to adjust and propagate gamma to/from userspace (seems like
another enormous task), but I am pretty sure it will be there one
of these days so I put in some comments and placeholders.

Yours,
Linus Walleij
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-09-27 12:37     ` Linus Walleij
@ 2019-09-27 12:44       ` Daniel Stone
  2019-09-27 14:28         ` Tomi Valkeinen
  0 siblings, 1 reply; 16+ messages in thread
From: Daniel Stone @ 2019-09-27 12:44 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, open list:DRM PANEL DRIVERS, Nicolas Ferre,
	Paul Cercueil, Thierry Reding, Laurent Pinchart, Sam Ravnborg,
	Stefan Mavrodiev, Vincent Abriou, Ludovic Desroches,
	Tomi Valkeinen, Jagan Teki, Robert Chiras, Jonas Karlman,
	Jyri Sarha, Sean Paul, Jernej Skrabec, Purism Kernel Team

Hi Linus,

On Fri, 27 Sep 2019 at 13:37, Linus Walleij <linus.walleij@linaro.org> wrote:
> Also the ILI9322 can actually set up gamma correction which is
> very nice for professional applications. I haven't seen any way for
> DRM to do gamma correction properly or any framework for it
> to adjust and propagate gamma to/from userspace (seems like
> another enormous task), but I am pretty sure it will be there one
> of these days so I put in some comments and placeholders.

Gamma correction has been supported since approximately the dawn of
time with a 3x8-bit LUT.

Obviously more modern hardware has far more complex colour management.
This is also supported, and is approximately described here:
https://dri.freedesktop.org/docs/drm/gpu/drm-kms.html#color-management-properties

Both planes and CRTCs can have a LUT -> matrix transform -> LUT
pipeline. There are also additional properties for fixed transforms,
e.g. limited 16-235 <-> full 0-255 range translation.

Cheers,
Daniel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-09-27 12:44       ` Daniel Stone
@ 2019-09-27 14:28         ` Tomi Valkeinen
  2019-10-08  8:42           ` Daniel Vetter
  0 siblings, 1 reply; 16+ messages in thread
From: Tomi Valkeinen @ 2019-09-27 14:28 UTC (permalink / raw)
  To: Daniel Stone, Linus Walleij
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	Guido Günther, open list:DRM PANEL DRIVERS, Nicolas Ferre,
	Paul Cercueil, Thierry Reding, Laurent Pinchart, Sam Ravnborg,
	Stefan Mavrodiev, Vincent Abriou, Ludovic Desroches, Jagan Teki,
	Robert Chiras, Jonas Karlman, Jyri Sarha, Sean Paul,
	Jernej Skrabec, Purism Kernel Team, Boris Brezillon

On 27/09/2019 15:44, Daniel Stone wrote:
> Hi Linus,
> 
> On Fri, 27 Sep 2019 at 13:37, Linus Walleij <linus.walleij@linaro.org> wrote:
>> Also the ILI9322 can actually set up gamma correction which is
>> very nice for professional applications. I haven't seen any way for
>> DRM to do gamma correction properly or any framework for it
>> to adjust and propagate gamma to/from userspace (seems like
>> another enormous task), but I am pretty sure it will be there one
>> of these days so I put in some comments and placeholders.
> 
> Gamma correction has been supported since approximately the dawn of
> time with a 3x8-bit LUT.

But, afaik, only in the display controller side. I don't think we have 
means to have any properties for the panels or bridges.

  Tomi

-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field]
  2019-09-27 14:28         ` Tomi Valkeinen
@ 2019-10-08  8:42           ` Daniel Vetter
  0 siblings, 0 replies; 16+ messages in thread
From: Daniel Vetter @ 2019-10-08  8:42 UTC (permalink / raw)
  To: Tomi Valkeinen
  Cc: Alexandre Belloni, Neil Armstrong, Maxime Ripard,
	open list:DRM PANEL DRIVERS, Philippe Cornu, Paul Cercueil,
	Thierry Reding, Laurent Pinchart, Sam Ravnborg, Stefan Mavrodiev,
	Vincent Abriou, Ludovic Desroches, Jagan Teki, Robert Chiras,
	Guido Günther, Jonas Karlman, Jyri Sarha, Sean Paul,
	Jernej Skrabec, Purism Kernel Team, Boris Brezillon

On Fri, Sep 27, 2019 at 05:28:03PM +0300, Tomi Valkeinen wrote:
> On 27/09/2019 15:44, Daniel Stone wrote:
> > Hi Linus,
> > 
> > On Fri, 27 Sep 2019 at 13:37, Linus Walleij <linus.walleij@linaro.org> wrote:
> > > Also the ILI9322 can actually set up gamma correction which is
> > > very nice for professional applications. I haven't seen any way for
> > > DRM to do gamma correction properly or any framework for it
> > > to adjust and propagate gamma to/from userspace (seems like
> > > another enormous task), but I am pretty sure it will be there one
> > > of these days so I put in some comments and placeholders.
> > 
> > Gamma correction has been supported since approximately the dawn of
> > time with a 3x8-bit LUT.
> 
> But, afaik, only in the display controller side. I don't think we have means
> to have any properties for the panels or bridges.

I guess would need some semi-elaborate negotiation dance to make sure you
only correct in either the bridge/panel or in the crtc, but should be
doable. I don't think we need a new property or change anything with the
uapi here, just kernel internals.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-10-08  8:42 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-23 19:32 [PATCH v2 0/4] drm/panel: Extend panels to report their types Laurent Pinchart
2019-08-23 19:32 ` [PATCH v2 1/4] drm/panel: Add missing drm_panel_init() in panel drivers Laurent Pinchart
2019-08-24  8:48   ` Sam Ravnborg
2019-08-23 19:32 ` [PATCH v2 2/4] drm/panel: Initialise panel dev and funcs through drm_panel_init() Laurent Pinchart
2019-08-24  8:50   ` Sam Ravnborg
2019-08-23 19:32 ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Laurent Pinchart
2019-08-24  9:54   ` DRM_MODE_CONNECTOR_PANEL? [Was: drm/panel: Add and fill drm_panel type field] Sam Ravnborg
2019-08-24 14:02     ` Laurent Pinchart
2019-09-04 13:13       ` Laurent Pinchart
2019-09-27 12:37     ` Linus Walleij
2019-09-27 12:44       ` Daniel Stone
2019-09-27 14:28         ` Tomi Valkeinen
2019-10-08  8:42           ` Daniel Vetter
2019-08-26  7:46   ` [PATCH v2 3/4] drm/panel: Add and fill drm_panel type field Boris Brezillon
2019-08-23 19:32 ` [PATCH v2 4/4] drm/bridge: panel: Infer connector type from panel by default Laurent Pinchart
2019-08-26  7:47   ` Boris Brezillon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.