devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] i.MX91/93 parallel display bridge
@ 2025-02-11  8:41 Alexander Stein
  2025-02-11  8:41 ` [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge Alexander Stein
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Alexander Stein @ 2025-02-11  8:41 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Alexander Stein
  Cc: dri-devel, devicetree, imx, linux-arm-kernel, linux-kernel

Hi,

i.MX91/93 support a parallel display interface. There is a single register
for configuring the output format. There is not much documentation, but
apparently this does some internal conversion.
Add a bridge driver (similar to fsl-ldb.c) for connecting a bridge/panel
to lcdif.
I'm a bit unsure about the name. There is no dedicated IP, according to
reference manual, just that single register. I would also agree
to imx9-dpi or imx93-dpi.
Note: It's only applicable to i.MX91/93, but not i.MX95!

Tested on TQMa9352 on MBa91xxCA

Best regards,
Alexander

Alexander Stein (2):
  dt-bindings: display: bridge: ldb: Implement simple Freescale
    i.MX91/93 DPI bridge
  drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display
    bridge

 .../bridge/fsl,imx9-parallel-disp-fmt.yaml    |  78 +++++++
 drivers/gpu/drm/bridge/Kconfig                |  10 +
 drivers/gpu/drm/bridge/Makefile               |   1 +
 .../gpu/drm/bridge/imx9-parallel-disp-fmt.c   | 213 ++++++++++++++++++
 4 files changed, 302 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
 create mode 100644 drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c

-- 
2.34.1


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

* [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge
  2025-02-11  8:41 [PATCH 0/2] i.MX91/93 parallel display bridge Alexander Stein
@ 2025-02-11  8:41 ` Alexander Stein
  2025-02-11 16:53   ` Frank Li
  2025-02-11  8:41 ` [PATCH 2/2] drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display bridge Alexander Stein
  2025-02-12  3:26 ` [PATCH 0/2] " Liu Ying
  2 siblings, 1 reply; 6+ messages in thread
From: Alexander Stein @ 2025-02-11  8:41 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Alexander Stein
  Cc: dri-devel, devicetree, imx, linux-arm-kernel, linux-kernel

The i.MX91/93 contains a single syscon registers which is responsible
for configuring DPI output format. Add DT binding which represents
this configuration as a bridge.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
 .../bridge/fsl,imx9-parallel-disp-fmt.yaml    | 78 +++++++++++++++++++
 1 file changed, 78 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml

diff --git a/Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml b/Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
new file mode 100644
index 0000000000000..54cb73b59b1eb
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/fsl,imx9-parallel-disp-fmt.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Freescale i.MX91/93 DPI bridge
+
+maintainers:
+  - Alexander Stein <alexander.stein@ew.tq-group.com>
+
+description: |
+  The i.MX91/93 mediamix contains a single register which is responsible
+  for configuring the parallel display output format. This describes
+  this registers as bridge within the DT.
+
+properties:
+  compatible:
+    const: fsl,imx9-parallel-display-format
+
+  reg:
+    maxItems: 1
+
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+
+    properties:
+      port@0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: Video port for DPI input.
+
+      port@1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: Video port for DPI output (panel or bridge).
+
+    required:
+      - port@0
+      - port@1
+
+required:
+  - compatible
+  - reg
+  - ports
+
+additionalProperties: false
+
+examples:
+  - |
+    blk-ctrl {
+        #address-cells = <1>;
+        #size-cells = <1>;
+
+        bridge@60 {
+            compatible = "fsl,imx9-parallel-display-format";
+            reg = <0x60 0x4>;
+            status = "disabled";
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@0 {
+                    reg = <0>;
+
+                    dpi_from_lcdif: endpoint {
+                        remote-endpoint = <&lcdif_to_dpi>;
+                    };
+                };
+
+                port@1 {
+                    reg = <1>;
+
+                    dpi_out: endpoint {
+                    };
+                };
+            };
+        };
+    };
-- 
2.34.1


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

* [PATCH 2/2] drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display bridge
  2025-02-11  8:41 [PATCH 0/2] i.MX91/93 parallel display bridge Alexander Stein
  2025-02-11  8:41 ` [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge Alexander Stein
@ 2025-02-11  8:41 ` Alexander Stein
  2025-02-11 16:47   ` Frank Li
  2025-02-12  3:26 ` [PATCH 0/2] " Liu Ying
  2 siblings, 1 reply; 6+ messages in thread
From: Alexander Stein @ 2025-02-11  8:41 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Alexander Stein
  Cc: dri-devel, devicetree, imx, linux-arm-kernel, linux-kernel

i.MX91/93 have a single register specifying parallel display output
format. Add a bridge driver for setting the corresponding format.
Currently only RGB565, RGB666 and RGB888 output is supported.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
 drivers/gpu/drm/bridge/Kconfig                |  10 +
 drivers/gpu/drm/bridge/Makefile               |   1 +
 .../gpu/drm/bridge/imx9-parallel-disp-fmt.c   | 213 ++++++++++++++++++
 3 files changed, 224 insertions(+)
 create mode 100644 drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c

diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index 6b4664d91faa8..8b69977787883 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -90,6 +90,16 @@ config DRM_FSL_LDB
 	help
 	  Support for i.MX8MP DPI-to-LVDS on-SoC encoder.
 
+config DRM_IMX9_PARALLEL_DISPLAY_FORMAT
+	tristate "Support for i.MX93 parallel display format"
+	depends on OF && MFD_SYSCON
+	depends on ARCH_MXC || COMPILE_TEST
+	select DRM_KMS_HELPER
+	select DRM_PANEL_BRIDGE
+	help
+	  Support for internal parallel display format configuration
+	  found on i.MX91 and i.MX93 processors.
+
 config DRM_ITE_IT6263
 	tristate "ITE IT6263 LVDS/HDMI bridge"
 	depends on OF
diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile
index 97304b429a530..ee3406fed880f 100644
--- a/drivers/gpu/drm/bridge/Makefile
+++ b/drivers/gpu/drm/bridge/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_DRM_CHRONTEL_CH7033) += chrontel-ch7033.o
 obj-$(CONFIG_DRM_CROS_EC_ANX7688) += cros-ec-anx7688.o
 obj-$(CONFIG_DRM_DISPLAY_CONNECTOR) += display-connector.o
 obj-$(CONFIG_DRM_FSL_LDB) += fsl-ldb.o
+obj-$(CONFIG_DRM_IMX9_PARALLEL_DISPLAY_FORMAT) += imx9-parallel-disp-fmt.o
 obj-$(CONFIG_DRM_ITE_IT6263) += ite-it6263.o
 obj-$(CONFIG_DRM_ITE_IT6505) += ite-it6505.o
 obj-$(CONFIG_DRM_LONTIUM_LT8912B) += lontium-lt8912b.o
diff --git a/drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c b/drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c
new file mode 100644
index 0000000000000..c37bdda53377c
--- /dev/null
+++ b/drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c
@@ -0,0 +1,213 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2022 NXP
+ * Copyright (c) 2026 TQ-Systems GmbH <linux@ew.tq-group.com>,
+ * D-82229 Seefeld, Germany.
+ * Author: Alexander Stein
+ */
+
+#include <linux/media-bus-format.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_bridge.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+
+#define DISPLAY_MUX_CTRL		0x60
+#define  PARALLEL_DISP_FORMAT		GENMASK(10, 8)
+#define  FORMAT_RGB888_TO_RGB888	FIELD_PREP(PARALLEL_DISP_FORMAT, 0)
+#define  FORMAT_RGB888_TO_RGB666	FIELD_PREP(PARALLEL_DISP_FORMAT, 1)
+#define  FORMAT_RGB565_TO_RGB565	FIELD_PREP(PARALLEL_DISP_FORMAT, 2)
+#define  FORMAT_RGB555_TO_RGB555	FIELD_PREP(PARALLEL_DISP_FORMAT, 3)
+#define  FORMAT_YUV_TO_YCBCR24		FIELD_PREP(PARALLEL_DISP_FORMAT, 4)
+#define  FORMAT_YUV_TO_YUV444		FIELD_PREP(PARALLEL_DISP_FORMAT, 5)
+
+struct imx9_pdf {
+	struct device *dev;
+	struct drm_bridge bridge;
+	struct drm_bridge *panel_bridge;
+	struct regmap *regmap;
+};
+
+static inline struct imx9_pdf *to_imx9_pdf(struct drm_bridge *bridge)
+{
+	return container_of(bridge, struct imx9_pdf, bridge);
+}
+
+static int imx9_pdf_attach(struct drm_bridge *bridge,
+	enum drm_bridge_attach_flags flags)
+{
+	struct imx9_pdf *pdf = to_imx9_pdf(bridge);
+
+	return drm_bridge_attach(bridge->encoder, pdf->panel_bridge,
+	       			 bridge, flags);
+}
+
+static void imx9_pdf_atomic_enable(struct drm_bridge *bridge,
+				   struct drm_bridge_state *old_bridge_state)
+{
+	struct imx9_pdf *pdf = to_imx9_pdf(bridge);
+	struct drm_atomic_state *state = old_bridge_state->base.state;
+	const struct drm_bridge_state *bridge_state;
+	u32 format;
+
+	/* Get the bus format from the bridge state. */
+	bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
+
+	switch (bridge_state->output_bus_cfg.format) {
+	case MEDIA_BUS_FMT_RGB565_1X16:
+		format = FORMAT_RGB565_TO_RGB565;
+		break;
+	case MEDIA_BUS_FMT_RGB666_1X18:
+		format = FORMAT_RGB888_TO_RGB666;
+		break;
+	case MEDIA_BUS_FMT_RGB888_1X24:
+		format = FORMAT_RGB888_TO_RGB888;
+		break;
+	default:
+		/*
+		 * Some bridges still don't set the correct bus format.
+		 * Just print a warning.
+		 */
+		dev_warn(pdf->dev,
+			 "Unsupported bus format 0x%04x, please check output bridge driver\n",
+			 bridge_state->output_bus_cfg.format);
+		return;
+	}
+
+	regmap_update_bits(pdf->regmap, DISPLAY_MUX_CTRL, PARALLEL_DISP_FORMAT,
+			   format);
+}
+
+#define MAX_INPUT_SEL_FORMATS 2
+static u32 *
+imx9_pdf_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+				   struct drm_bridge_state *bridge_state,
+				   struct drm_crtc_state *crtc_state,
+				   struct drm_connector_state *conn_state,
+				   u32 output_fmt,
+				   unsigned int *num_input_fmts)
+{
+	u32 *input_fmts;
+
+	*num_input_fmts = 0;
+
+	input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
+			     GFP_KERNEL);
+	if (!input_fmts)
+		return NULL;
+
+	input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
+	input_fmts[1] = MEDIA_BUS_FMT_RGB565_1X16;
+	*num_input_fmts = MAX_INPUT_SEL_FORMATS;
+
+	return input_fmts;
+}
+
+#define MAX_OUTPUT_SEL_FORMATS 3
+static u32 *
+imx9_pdf_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
+				    struct drm_bridge_state *bridge_state,
+				    struct drm_crtc_state *crtc_state,
+				    struct drm_connector_state *conn_state,
+				    unsigned int *num_output_fmts)
+{
+	u32 *output_fmts;
+
+	*num_output_fmts = 0;
+
+	output_fmts = kcalloc(MAX_OUTPUT_SEL_FORMATS, sizeof(*output_fmts),
+			     GFP_KERNEL);
+	if (!output_fmts)
+		return NULL;
+
+	output_fmts[0] = MEDIA_BUS_FMT_RGB565_1X16;
+	output_fmts[1] = MEDIA_BUS_FMT_RGB666_1X18;
+	output_fmts[2] = MEDIA_BUS_FMT_RGB888_1X24;
+	*num_output_fmts = MAX_OUTPUT_SEL_FORMATS;
+
+	return output_fmts;
+}
+
+static enum drm_mode_status
+imx9_pdf_mode_valid(struct drm_bridge *bridge,
+		   const struct drm_display_info *info,
+		   const struct drm_display_mode *mode)
+{
+	if (mode->clock > 80000)
+		return MODE_CLOCK_HIGH;
+
+	return MODE_OK;
+}
+
+static const struct drm_bridge_funcs funcs = {
+	.attach = imx9_pdf_attach,
+	.atomic_enable = imx9_pdf_atomic_enable,
+	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
+	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
+	.atomic_get_input_bus_fmts = imx9_pdf_atomic_get_input_bus_fmts,
+	.atomic_get_output_bus_fmts = imx9_pdf_atomic_get_output_bus_fmts,
+	.atomic_reset = drm_atomic_helper_bridge_reset,
+	.mode_valid = imx9_pdf_mode_valid,
+};
+
+static int imx9_pdf_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *remote;
+	struct drm_panel *panel;
+	struct imx9_pdf *pdf;
+
+	pdf = devm_kzalloc(dev, sizeof(*pdf), GFP_KERNEL);
+	if (!pdf)
+		return -ENOMEM;
+
+	pdf->dev = &pdev->dev;
+	pdf->bridge.funcs = &funcs;
+	pdf->bridge.of_node = dev->of_node;
+	pdf->bridge.type = DRM_MODE_CONNECTOR_DPI;
+
+	pdf->regmap = syscon_node_to_regmap(dev->of_node->parent);
+	if (IS_ERR(pdf->regmap))
+		return dev_err_probe(dev, PTR_ERR(pdf->regmap),
+				     "failed to get regmap\n");
+
+	remote = of_graph_get_remote_node(dev->of_node, 1, 0);
+	panel = of_drm_find_panel(remote);
+	of_node_put(remote);
+	if (IS_ERR(panel))
+		return PTR_ERR(panel);
+
+	pdf->panel_bridge = devm_drm_panel_bridge_add(dev, panel);
+	if (IS_ERR(pdf->panel_bridge))
+		return PTR_ERR(pdf->panel_bridge);
+
+	platform_set_drvdata(pdev, pdf);
+
+	devm_drm_bridge_add(dev, &pdf->bridge);
+
+	return 0;
+}
+
+static const struct of_device_id imx9_pdf_dt_ids[] = {
+	{ .compatible = "fsl,imx9-parallel-display-format", },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx9_pdf_dt_ids);
+
+static struct platform_driver imx9_pdf_driver = {
+	.probe		= imx9_pdf_probe,
+	.driver		= {
+		.name		= "imx9-parallel-display-format",
+		.of_match_table	= imx9_pdf_dt_ids,
+	},
+};
+module_platform_driver(imx9_pdf_driver);
+
+MODULE_AUTHOR("Alexander Stein <alexander.stein@ew.tq-group.com>");
+MODULE_DESCRIPTION("i.MX91/i.MX93 parallel display format driver");
+MODULE_LICENSE("GPL v2");
-- 
2.34.1


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

* Re: [PATCH 2/2] drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display bridge
  2025-02-11  8:41 ` [PATCH 2/2] drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display bridge Alexander Stein
@ 2025-02-11 16:47   ` Frank Li
  0 siblings, 0 replies; 6+ messages in thread
From: Frank Li @ 2025-02-11 16:47 UTC (permalink / raw)
  To: Alexander Stein
  Cc: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, dri-devel, devicetree,
	imx, linux-arm-kernel, linux-kernel

On Tue, Feb 11, 2025 at 09:41:19AM +0100, Alexander Stein wrote:
> i.MX91/93 have a single register specifying parallel display output
> format. Add a bridge driver for setting the corresponding format.
> Currently only RGB565, RGB666 and RGB888 output is supported.
>
> Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> ---
>  drivers/gpu/drm/bridge/Kconfig                |  10 +
>  drivers/gpu/drm/bridge/Makefile               |   1 +
>  .../gpu/drm/bridge/imx9-parallel-disp-fmt.c   | 213 ++++++++++++++++++
>  3 files changed, 224 insertions(+)
>  create mode 100644 drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c
>
> diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
> index 6b4664d91faa8..8b69977787883 100644
> --- a/drivers/gpu/drm/bridge/Kconfig
> +++ b/drivers/gpu/drm/bridge/Kconfig
> @@ -90,6 +90,16 @@ config DRM_FSL_LDB
>  	help
>  	  Support for i.MX8MP DPI-to-LVDS on-SoC encoder.
>
> +config DRM_IMX9_PARALLEL_DISPLAY_FORMAT
> +	tristate "Support for i.MX93 parallel display format"
> +	depends on OF && MFD_SYSCON
> +	depends on ARCH_MXC || COMPILE_TEST
> +	select DRM_KMS_HELPER
> +	select DRM_PANEL_BRIDGE
> +	help
> +	  Support for internal parallel display format configuration
> +	  found on i.MX91 and i.MX93 processors.
> +
>  config DRM_ITE_IT6263
>  	tristate "ITE IT6263 LVDS/HDMI bridge"
>  	depends on OF
> diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile
> index 97304b429a530..ee3406fed880f 100644
> --- a/drivers/gpu/drm/bridge/Makefile
> +++ b/drivers/gpu/drm/bridge/Makefile
> @@ -6,6 +6,7 @@ obj-$(CONFIG_DRM_CHRONTEL_CH7033) += chrontel-ch7033.o
>  obj-$(CONFIG_DRM_CROS_EC_ANX7688) += cros-ec-anx7688.o
>  obj-$(CONFIG_DRM_DISPLAY_CONNECTOR) += display-connector.o
>  obj-$(CONFIG_DRM_FSL_LDB) += fsl-ldb.o
> +obj-$(CONFIG_DRM_IMX9_PARALLEL_DISPLAY_FORMAT) += imx9-parallel-disp-fmt.o
>  obj-$(CONFIG_DRM_ITE_IT6263) += ite-it6263.o
>  obj-$(CONFIG_DRM_ITE_IT6505) += ite-it6505.o
>  obj-$(CONFIG_DRM_LONTIUM_LT8912B) += lontium-lt8912b.o
> diff --git a/drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c b/drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c
> new file mode 100644
> index 0000000000000..c37bdda53377c
> --- /dev/null
> +++ b/drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c
> @@ -0,0 +1,213 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2022 NXP
> + * Copyright (c) 2026 TQ-Systems GmbH <linux@ew.tq-group.com>,
> + * D-82229 Seefeld, Germany.
> + * Author: Alexander Stein
> + */
> +
> +#include <linux/media-bus-format.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +#include <drm/drm_atomic_helper.h>
> +#include <drm/drm_bridge.h>
> +#include <drm/drm_of.h>
> +#include <drm/drm_panel.h>
> +
> +#define DISPLAY_MUX_CTRL		0x60

look like you have not use reg in dts and hardcode 0x60 here.

Frank

> +#define  PARALLEL_DISP_FORMAT		GENMASK(10, 8)
> +#define  FORMAT_RGB888_TO_RGB888	FIELD_PREP(PARALLEL_DISP_FORMAT, 0)
> +#define  FORMAT_RGB888_TO_RGB666	FIELD_PREP(PARALLEL_DISP_FORMAT, 1)
> +#define  FORMAT_RGB565_TO_RGB565	FIELD_PREP(PARALLEL_DISP_FORMAT, 2)
> +#define  FORMAT_RGB555_TO_RGB555	FIELD_PREP(PARALLEL_DISP_FORMAT, 3)
> +#define  FORMAT_YUV_TO_YCBCR24		FIELD_PREP(PARALLEL_DISP_FORMAT, 4)
> +#define  FORMAT_YUV_TO_YUV444		FIELD_PREP(PARALLEL_DISP_FORMAT, 5)
> +
> +struct imx9_pdf {
> +	struct device *dev;
> +	struct drm_bridge bridge;
> +	struct drm_bridge *panel_bridge;
> +	struct regmap *regmap;
> +};
> +
> +static inline struct imx9_pdf *to_imx9_pdf(struct drm_bridge *bridge)
> +{
> +	return container_of(bridge, struct imx9_pdf, bridge);
> +}
> +
> +static int imx9_pdf_attach(struct drm_bridge *bridge,
> +	enum drm_bridge_attach_flags flags)
> +{
> +	struct imx9_pdf *pdf = to_imx9_pdf(bridge);
> +
> +	return drm_bridge_attach(bridge->encoder, pdf->panel_bridge,
> +	       			 bridge, flags);
> +}
> +
> +static void imx9_pdf_atomic_enable(struct drm_bridge *bridge,
> +				   struct drm_bridge_state *old_bridge_state)
> +{
> +	struct imx9_pdf *pdf = to_imx9_pdf(bridge);
> +	struct drm_atomic_state *state = old_bridge_state->base.state;
> +	const struct drm_bridge_state *bridge_state;
> +	u32 format;
> +
> +	/* Get the bus format from the bridge state. */
> +	bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
> +
> +	switch (bridge_state->output_bus_cfg.format) {
> +	case MEDIA_BUS_FMT_RGB565_1X16:
> +		format = FORMAT_RGB565_TO_RGB565;
> +		break;
> +	case MEDIA_BUS_FMT_RGB666_1X18:
> +		format = FORMAT_RGB888_TO_RGB666;
> +		break;
> +	case MEDIA_BUS_FMT_RGB888_1X24:
> +		format = FORMAT_RGB888_TO_RGB888;
> +		break;
> +	default:
> +		/*
> +		 * Some bridges still don't set the correct bus format.
> +		 * Just print a warning.
> +		 */
> +		dev_warn(pdf->dev,
> +			 "Unsupported bus format 0x%04x, please check output bridge driver\n",
> +			 bridge_state->output_bus_cfg.format);
> +		return;
> +	}
> +
> +	regmap_update_bits(pdf->regmap, DISPLAY_MUX_CTRL, PARALLEL_DISP_FORMAT,
> +			   format);
> +}
> +
> +#define MAX_INPUT_SEL_FORMATS 2
> +static u32 *
> +imx9_pdf_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
> +				   struct drm_bridge_state *bridge_state,
> +				   struct drm_crtc_state *crtc_state,
> +				   struct drm_connector_state *conn_state,
> +				   u32 output_fmt,
> +				   unsigned int *num_input_fmts)
> +{
> +	u32 *input_fmts;
> +
> +	*num_input_fmts = 0;
> +
> +	input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
> +			     GFP_KERNEL);
> +	if (!input_fmts)
> +		return NULL;
> +
> +	input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
> +	input_fmts[1] = MEDIA_BUS_FMT_RGB565_1X16;
> +	*num_input_fmts = MAX_INPUT_SEL_FORMATS;
> +
> +	return input_fmts;
> +}
> +
> +#define MAX_OUTPUT_SEL_FORMATS 3
> +static u32 *
> +imx9_pdf_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
> +				    struct drm_bridge_state *bridge_state,
> +				    struct drm_crtc_state *crtc_state,
> +				    struct drm_connector_state *conn_state,
> +				    unsigned int *num_output_fmts)
> +{
> +	u32 *output_fmts;
> +
> +	*num_output_fmts = 0;
> +
> +	output_fmts = kcalloc(MAX_OUTPUT_SEL_FORMATS, sizeof(*output_fmts),
> +			     GFP_KERNEL);
> +	if (!output_fmts)
> +		return NULL;
> +
> +	output_fmts[0] = MEDIA_BUS_FMT_RGB565_1X16;
> +	output_fmts[1] = MEDIA_BUS_FMT_RGB666_1X18;
> +	output_fmts[2] = MEDIA_BUS_FMT_RGB888_1X24;
> +	*num_output_fmts = MAX_OUTPUT_SEL_FORMATS;
> +
> +	return output_fmts;
> +}
> +
> +static enum drm_mode_status
> +imx9_pdf_mode_valid(struct drm_bridge *bridge,
> +		   const struct drm_display_info *info,
> +		   const struct drm_display_mode *mode)
> +{
> +	if (mode->clock > 80000)
> +		return MODE_CLOCK_HIGH;
> +
> +	return MODE_OK;
> +}
> +
> +static const struct drm_bridge_funcs funcs = {
> +	.attach = imx9_pdf_attach,
> +	.atomic_enable = imx9_pdf_atomic_enable,
> +	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
> +	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
> +	.atomic_get_input_bus_fmts = imx9_pdf_atomic_get_input_bus_fmts,
> +	.atomic_get_output_bus_fmts = imx9_pdf_atomic_get_output_bus_fmts,
> +	.atomic_reset = drm_atomic_helper_bridge_reset,
> +	.mode_valid = imx9_pdf_mode_valid,
> +};
> +
> +static int imx9_pdf_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *remote;
> +	struct drm_panel *panel;
> +	struct imx9_pdf *pdf;
> +
> +	pdf = devm_kzalloc(dev, sizeof(*pdf), GFP_KERNEL);
> +	if (!pdf)
> +		return -ENOMEM;
> +
> +	pdf->dev = &pdev->dev;
> +	pdf->bridge.funcs = &funcs;
> +	pdf->bridge.of_node = dev->of_node;
> +	pdf->bridge.type = DRM_MODE_CONNECTOR_DPI;
> +
> +	pdf->regmap = syscon_node_to_regmap(dev->of_node->parent);
> +	if (IS_ERR(pdf->regmap))
> +		return dev_err_probe(dev, PTR_ERR(pdf->regmap),
> +				     "failed to get regmap\n");
> +
> +	remote = of_graph_get_remote_node(dev->of_node, 1, 0);
> +	panel = of_drm_find_panel(remote);
> +	of_node_put(remote);
> +	if (IS_ERR(panel))
> +		return PTR_ERR(panel);
> +
> +	pdf->panel_bridge = devm_drm_panel_bridge_add(dev, panel);
> +	if (IS_ERR(pdf->panel_bridge))
> +		return PTR_ERR(pdf->panel_bridge);
> +
> +	platform_set_drvdata(pdev, pdf);
> +
> +	devm_drm_bridge_add(dev, &pdf->bridge);
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id imx9_pdf_dt_ids[] = {
> +	{ .compatible = "fsl,imx9-parallel-display-format", },
> +	{ /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, imx9_pdf_dt_ids);
> +
> +static struct platform_driver imx9_pdf_driver = {
> +	.probe		= imx9_pdf_probe,
> +	.driver		= {
> +		.name		= "imx9-parallel-display-format",
> +		.of_match_table	= imx9_pdf_dt_ids,
> +	},
> +};
> +module_platform_driver(imx9_pdf_driver);
> +
> +MODULE_AUTHOR("Alexander Stein <alexander.stein@ew.tq-group.com>");
> +MODULE_DESCRIPTION("i.MX91/i.MX93 parallel display format driver");
> +MODULE_LICENSE("GPL v2");
> --
> 2.34.1
>

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

* Re: [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge
  2025-02-11  8:41 ` [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge Alexander Stein
@ 2025-02-11 16:53   ` Frank Li
  0 siblings, 0 replies; 6+ messages in thread
From: Frank Li @ 2025-02-11 16:53 UTC (permalink / raw)
  To: Alexander Stein
  Cc: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, dri-devel, devicetree,
	imx, linux-arm-kernel, linux-kernel

On Tue, Feb 11, 2025 at 09:41:18AM +0100, Alexander Stein wrote:
> The i.MX91/93 contains a single syscon registers which is responsible
> for configuring DPI output format. Add DT binding which represents
> this configuration as a bridge.
>
> Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> ---
>  .../bridge/fsl,imx9-parallel-disp-fmt.yaml    | 78 +++++++++++++++++++
>  1 file changed, 78 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
>
> diff --git a/Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml b/Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
> new file mode 100644
> index 0000000000000..54cb73b59b1eb
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
> @@ -0,0 +1,78 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/display/bridge/fsl,imx9-parallel-disp-fmt.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Freescale i.MX91/93 DPI bridge
> +
> +maintainers:
> +  - Alexander Stein <alexander.stein@ew.tq-group.com>
> +
> +description: |

Needn't |

> +  The i.MX91/93 mediamix contains a single register which is responsible
> +  for configuring the parallel display output format. This describes
> +  this registers as bridge within the DT.
> +
> +properties:
> +  compatible:
> +    const: fsl,imx9-parallel-display-format


look like it should belong a property in fsl,imx8mm-disp-blk-ctrl.yaml.

Rob provide similar suggestion at
https://lore.kernel.org/imx/20250203220655.GA123074-robh@kernel.org/

Or at least, uplayer mfd yaml should link to this file.

Frank
> +
> +  reg:
> +    maxItems: 1
> +
> +  ports:
> +    $ref: /schemas/graph.yaml#/properties/ports
> +
> +    properties:
> +      port@0:
> +        $ref: /schemas/graph.yaml#/properties/port
> +        description: Video port for DPI input.
> +
> +      port@1:
> +        $ref: /schemas/graph.yaml#/properties/port
> +        description: Video port for DPI output (panel or bridge).
> +
> +    required:
> +      - port@0
> +      - port@1
> +
> +required:
> +  - compatible
> +  - reg
> +  - ports
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    blk-ctrl {
> +        #address-cells = <1>;
> +        #size-cells = <1>;
> +
> +        bridge@60 {
> +            compatible = "fsl,imx9-parallel-display-format";
> +            reg = <0x60 0x4>;
> +            status = "disabled";
> +
> +            ports {
> +                #address-cells = <1>;
> +                #size-cells = <0>;
> +
> +                port@0 {
> +                    reg = <0>;
> +
> +                    dpi_from_lcdif: endpoint {
> +                        remote-endpoint = <&lcdif_to_dpi>;
> +                    };
> +                };
> +
> +                port@1 {
> +                    reg = <1>;
> +
> +                    dpi_out: endpoint {
> +                    };
> +                };
> +            };
> +        };
> +    };
> --
> 2.34.1
>

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

* Re: [PATCH 0/2] i.MX91/93 parallel display bridge
  2025-02-11  8:41 [PATCH 0/2] i.MX91/93 parallel display bridge Alexander Stein
  2025-02-11  8:41 ` [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge Alexander Stein
  2025-02-11  8:41 ` [PATCH 2/2] drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display bridge Alexander Stein
@ 2025-02-12  3:26 ` Liu Ying
  2 siblings, 0 replies; 6+ messages in thread
From: Liu Ying @ 2025-02-12  3:26 UTC (permalink / raw)
  To: Alexander Stein, Andrzej Hajda, Neil Armstrong, Robert Foss,
	Laurent Pinchart, Jonas Karlman, Jernej Skrabec, David Airlie,
	Simona Vetter, Maarten Lankhorst, Maxime Ripard,
	Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam
  Cc: dri-devel, devicetree, imx, linux-arm-kernel, linux-kernel

On 02/11/2025, Alexander Stein wrote:
> Hi,

Hi Alexander,

> 
> i.MX91/93 support a parallel display interface. There is a single register
> for configuring the output format. There is not much documentation, but
> apparently this does some internal conversion.
> Add a bridge driver (similar to fsl-ldb.c) for connecting a bridge/panel
> to lcdif.
> I'm a bit unsure about the name. There is no dedicated IP, according to
> reference manual, just that single register. I would also agree
> to imx9-dpi or imx93-dpi.
> Note: It's only applicable to i.MX91/93, but not i.MX95!
> 
> Tested on TQMa9352 on MBa91xxCA
> 
> Best regards,
> Alexander
> 
> Alexander Stein (2):
>   dt-bindings: display: bridge: ldb: Implement simple Freescale
>     i.MX91/93 DPI bridge
>   drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display
>     bridge
> 
>  .../bridge/fsl,imx9-parallel-disp-fmt.yaml    |  78 +++++++
>  drivers/gpu/drm/bridge/Kconfig                |  10 +
>  drivers/gpu/drm/bridge/Makefile               |   1 +
>  .../gpu/drm/bridge/imx9-parallel-disp-fmt.c   | 213 ++++++++++++++++++
>  4 files changed, 302 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/display/bridge/fsl,imx9-parallel-disp-fmt.yaml
>  create mode 100644 drivers/gpu/drm/bridge/imx9-parallel-disp-fmt.c
> 

Thanks for your patch series.  However, I have already sent a patch series[1]
to add the i.MX93 parallel display format configuration support.  I may send
a new version to rename .remove_new to .remove in the bridge driver at least.

[1] https://patchwork.freedesktop.org/series/113457/

-- 
Regards,
Liu Ying

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

end of thread, other threads:[~2025-02-12  3:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-11  8:41 [PATCH 0/2] i.MX91/93 parallel display bridge Alexander Stein
2025-02-11  8:41 ` [PATCH 1/2] dt-bindings: display: bridge: ldb: Implement simple Freescale i.MX91/93 DPI bridge Alexander Stein
2025-02-11 16:53   ` Frank Li
2025-02-11  8:41 ` [PATCH 2/2] drm: bridge: imx9-parallel-disp-fmt: add i.MX91/93 parallel display bridge Alexander Stein
2025-02-11 16:47   ` Frank Li
2025-02-12  3:26 ` [PATCH 0/2] " Liu Ying

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).