Hi Luca, On Fri, Mar 20, 2026 at 11:46:18AM +0100, Luca Ceresoli wrote: > The imx8mp-hdmi-tx one of many drivers based on dw-hdmi. dw-hdmi in turn > can operate in two different modes, depending on the platform data as set > by the driver: > > A. hdmi->plat_data->output_port = 0: > the HDMI output (port@1) in device tree is not used [0] > > B. hdmi->plat_data->output_port = 1: > the HDMI output (port@1) is parsed to find the next bridge > > The imx8mp-hdmi-tx driver falls in case A. This implies next_bridge will > always be NULL, and so dw_hdmi_bridge_attach() [1] will always fail if > called with the DRM_BRIDGE_ATTACH_NO_CONNECTOR flag. > > In fact case A assumes that DRM_BRIDGE_ATTACH_NO_CONNECTOR is not set and > in that case it adds the connector programmatically at bridge attach time. > > Support for DRM_BRIDGE_ATTACH_NO_CONNECTOR is implemented by dw-hdmi.c in > case B. So, in preparation to support DRM_BRIDGE_ATTACH_NO_CONNECTOR in > imx8mp-hdmi-tx, move to case B by setting hdmi->plat_data->output_port = 1. > > However this change requires that port@1 is connected to a "next > bridge" DT node, typically the HDMI connector, because dw-hdmi won't add > the connector when using DRM_BRIDGE_ATTACH_NO_CONNECTOR. > > Many dts files for imx8mp-based boards in the kernel have such a connector > described and linked to port@1, so a connector is added by the > display-connector driver along with a bridge wrapping it. Sadly some of
Hmm, display-connector driver is a bridge driver so it cannot add a connector. I assume that you mean a connector will be added by the bridge connector driver. > those dts files don't have the connector described. Adding it would solve > the problem easily, but this would break existing devices which do not > update the dtb when upgrading to a newer kernel. > > To preserve backward compatibility for such devices, introduce a module > adding the hdmi-connector node to the live device tree at init time. This > allows the dw-hdmi code to find the next bridge (the one wrapping the > hdmi-connector) and let the pipeline work as before. > > [0] > https://elixir.bootlin.com/linux/v7.0-rc1/source/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c#L3310 > [1] > https://elixir.bootlin.com/linux/v7.0-rc1/source/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c#L2907 > > Signed-off-by: Luca Ceresoli <[email protected]> > > --- > > This patch is inspired by commit 0ff223d99147 ("drm/tilcdc: Convert legacy > panel binding via DT overlay at boot time") > --- > drivers/gpu/drm/bridge/imx/Kconfig | 17 ++++++ > drivers/gpu/drm/bridge/imx/Makefile | 2 + > .../bridge/imx/imx8mp-hdmi-tx-connector-fixup.c | 60 > ++++++++++++++++++++++ > .../bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso | 38 ++++++++++++++ > drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c | 1 + > 5 files changed, 118 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/imx/Kconfig > b/drivers/gpu/drm/bridge/imx/Kconfig > index b9028a5e5a06..b9ce140a93dc 100644 > --- a/drivers/gpu/drm/bridge/imx/Kconfig > +++ b/drivers/gpu/drm/bridge/imx/Kconfig > @@ -25,6 +25,23 @@ config DRM_IMX8MP_DW_HDMI_BRIDGE > Choose this to enable support for the internal HDMI encoder found > on the i.MX8MP SoC. > > +config DRM_IMX8MP_DW_HDMI_BRIDGE_CONNECTOR_FIXUP > + bool "Support device tree blobs without an hdmi-connector node" > + default y depends on DRM_IMX_LCDIF ? > + depends on DRM_IMX8MP_DW_HDMI_BRIDGE > + depends on OF > + select OF_OVERLAY > + select DRM_DISPLAY_CONNECTOR > + help > + Modifies at early boot the live device tree of boards using the > + i.MX8MP fsl,imx8mp-hdmi-tx adding a hdmi-connector node linked to > + the htmi-tx. This is needed to support bridge-connector usage in s/htmi/hdmi/ > + the i.MX8MP LCDIF driver. > + > + You need this if you use the i.MX8MP HDMI output and your board > + device tree file does not have an hdmi-connector node connected > + to it. > + > config DRM_IMX8MP_HDMI_PAI > tristate "Freescale i.MX8MP HDMI PAI bridge support" > depends on OF > diff --git a/drivers/gpu/drm/bridge/imx/Makefile > b/drivers/gpu/drm/bridge/imx/Makefile > index 8d01fda25451..84499fe2e444 100644 > --- a/drivers/gpu/drm/bridge/imx/Makefile > +++ b/drivers/gpu/drm/bridge/imx/Makefile > @@ -1,6 +1,8 @@ > obj-$(CONFIG_DRM_IMX_LDB_HELPER) += imx-ldb-helper.o > obj-$(CONFIG_DRM_IMX_LEGACY_BRIDGE) += imx-legacy-bridge.o > obj-$(CONFIG_DRM_IMX8MP_DW_HDMI_BRIDGE) += imx8mp-hdmi-tx.o > +obj-$(CONFIG_DRM_IMX8MP_DW_HDMI_BRIDGE_CONNECTOR_FIXUP) += > imx8mp-hdmi-tx-connector-fixup.o \ > + > imx8mp-hdmi-tx-connector-fixup.dtbo.o > obj-$(CONFIG_DRM_IMX8MP_HDMI_PAI) += imx8mp-hdmi-pai.o > obj-$(CONFIG_DRM_IMX8MP_HDMI_PVI) += imx8mp-hdmi-pvi.o > obj-$(CONFIG_DRM_IMX8QM_LDB) += imx8qm-ldb.o > diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.c > b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.c > new file mode 100644 > index 000000000000..8c423b9bfa50 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.c > @@ -0,0 +1,60 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Add an hdmi-connector node to boards using the imx8mp hdmi_tx which > + * don't have one. This is needed for the i.MX LCDIF to work with > + * DRM_BRIDGE_ATTACH_NO_CONNECTOR. > + * > + * Copyright (C) 2026 GE HealthCare > + * Author: Luca Ceresoli <[email protected]> > + */ > + > +#include <linux/kernel.h> Unneeded? > +#include <linux/of.h> > +#include <linux/of_fdt.h> > +#include <linux/slab.h> Unneeded? > + > +/* Embedded dtbo symbols created by cmd_wrap_S_dtb in scripts/Makefile.dtbs > */ > +extern char __dtbo_imx8mp_hdmi_tx_connector_fixup_begin[]; > +extern char __dtbo_imx8mp_hdmi_tx_connector_fixup_end[]; > + > +static int __init imx8mp_hdmi_tx_connector_fixup_init(void) > +{ > + struct device_node *hdmi_tx __free(device_node) = NULL; Include linux/cleanup.h as __free() is used. > + struct device_node *endpoint __free(device_node) = NULL; > + struct device_node *hdmi_conn __free(device_node) = NULL; > + void *dtbo_start; > + u32 dtbo_size; > + int ovcs_id; > + int err; > + > + hdmi_tx = of_find_node_by_path("/soc@0/bus@32c00000/hdmi@32fd8000"); > + if (!of_device_is_available(hdmi_tx)) > + return 0; > + > + /* If endpoint exists, assume an hdmi-connector exists already */ > + endpoint = > of_find_node_by_path("/soc@0/bus@32c00000/hdmi@32fd8000/ports/port@1/endpoint"); > + if (endpoint) > + return 0; > + > + dtbo_start = __dtbo_imx8mp_hdmi_tx_connector_fixup_begin; > + dtbo_size = __dtbo_imx8mp_hdmi_tx_connector_fixup_end - > + __dtbo_imx8mp_hdmi_tx_connector_fixup_begin; > + > + err = of_overlay_fdt_apply(dtbo_start, dtbo_size, &ovcs_id, NULL); > + if (err) > + return err; > + > + hdmi_conn = of_find_node_by_name(NULL, "fixup-hdmi-connector"); Do you really need to find the node, since the overlay was just applied? > + if (!hdmi_conn) { > + err = -ENODEV; > + goto overlay_remove; I'd just return -ENODEV and drop overlay_remove. > + } > + > + return 0; > + > +overlay_remove: > + of_overlay_remove(&ovcs_id); > + return err; > +} > + > +subsys_initcall(imx8mp_hdmi_tx_connector_fixup_init); > diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso > b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso > new file mode 100644 > index 000000000000..ee718ca1b11b > --- /dev/null > +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso > @@ -0,0 +1,38 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * DTS overlay adding an hdmi-connector node to boards using the imx8mp > hdmi_tx > + * > + * Copyright (C) 2026 GE HealthCare > + * Author: Luca Ceresoli <[email protected]> > + */ > + > +/dts-v1/; > +/plugin/; > + > +&{/} { I see build warnings(W=1): drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso:25.8-37.4: Warning (unit_address_vs_reg): /fragment@0/__overlay__/soc@0: node has a unit name, but no reg or ranges property drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso:26.16-36.5: Warning (unit_address_vs_reg): /fragment@0/__overlay__/soc@0/bus@32c00000: node has a unit name, but no reg or ranges property drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso:27.18-35.6: Warning (unit_address_vs_reg): /fragment@0/__overlay__/soc@0/bus@32c00000/hdmi@32fd8000: node has a unit name, but no reg or ranges property drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso:29.13-33.8: Warning (unit_address_vs_reg): /fragment@0/__overlay__/soc@0/bus@32c00000/hdmi@32fd8000/ports/port@1: node has a unit name, but no reg or ranges property Here is a patch to suppress them: --- a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx-connector-fixup.dtso @@ -10,6 +10,9 @@ /plugin/; &{/} { + #address-cells = <2>; + #size-cells = <2>; + fixup-hdmi-connector { compatible = "hdmi-connector"; label = "HDMI"; @@ -23,10 +26,25 @@ fixup_hdmi_connector_in: endpoint { }; soc@0 { + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0x0 0x0 0x3e000000>; + bus@32c00000 { + reg = <0x32c00000 0x400000>; + #address-cells = <1>; + #size-cells = <1>; + hdmi@32fd8000 { + reg = <0x32fd8000 0x7eff>; + ports { + #address-cells = <1>; + #size-cells = <0>; + port@1 { + reg = <1>; + hdmi_tx_out: endpoint { remote-endpoint = <&fixup_hdmi_connector_in>; }; > + fixup-hdmi-connector { > + compatible = "hdmi-connector"; > + label = "HDMI"; > + type = "a"; What if a board uses another type? -- Regards, Liu Ying
