Re: [PATCH 6/6] arm64: dts: freescale: imx8mp-verdin: Add Mezzanine with Toradex Display 10.1" LVDS V2
From: Leonardo Costa
Date: Tue Aug 18 2026 - 14:08:51 EST
On Thu, Aug 13, 2026 at 11:15:04AM -0500, Frank Li wrote:
> On Thu, Aug 13, 2026 at 12:43:29PM -0300, Leonardo Costa wrote:
> > On Thu, Aug 13, 2026 at 09:58:52AM -0500, Frank Li wrote:
> > > On Thu, Aug 13, 2026 at 10:33:35AM -0300, Leonardo Costa wrote:
> > > > From: Leonardo Costa <leonardo.costa@xxxxxxxxxxx>
> > > >
> > > > Add a device tree overlay enabling the Toradex Capacitive Touch Display
> > > > 10.1" LVDS V2 on the Verdin Development Board with Verdin iMX8M Plus
> > > > Mezzanine expansion board. The panel connects via the i.MX8M Plus LCDIF
> > > > on the Mezzanine LVDS interface (J10). The panel is an Opto Logic
> > > > SCX1001511GGC49 10.1" WXGA TFT LCD LVDS and the touch input is provided
> > > > by an ILITEK ILI251x capacitive touch controller.
> > > >
> > > > Link: https://developer.toradex.com/hardware/accessories/displays/capacitive-touch-display-101inch-lvds
> > > > Link: https://developer.toradex.com/hardware/verdin-som-family/add-ons/verdin-imx8m-plus-mezzanine
> > > > Signed-off-by: Leonardo Costa <leonardo.costa@xxxxxxxxxxx>
> > > > ---
> > >
> > > what's difference with Add Toradex Capacitive Touch Display 10.1" LVDS V2
> > >
> > > why not share one dtso?
> > >
> > > Frank
> >
> > Hi Frank,
> >
> > There are two main differences:
> >
> > 1. The mezzanine one uses different backlight controll pins, so here we
> > use the 'backlight-mezzanine' node, instead of the 'backlight' one, used
> > in the one without the mezzanine.
> >
> > 2. The touchscreen GPIO and interrupt pins are also different with the
> > mezzanine board.
>
>
> And there are for imx8mm
> https://lore.kernel.org/imx/20260724-v1-verdin-imx8mm-dtbos-v2-3-9d7988bd76f6@xxxxxxxxxxx/
>
> https://lore.kernel.org/imx/sr26lfvwasgcosfzcf4ydtwxwjjutlio2yqpgxldatpzjo7e4y@77k7gefnjzvl/
>
> Any ways, it is too late for 7.3, we have enough time for 7.4 to discuss
> work on optimization solution.
>
> If use nexus connectors, we can share one dtso now if there are not
> clock settings.
Hi Frank,
I tried implementing the nexus connectors in imx8mp-verdin-wifi-dev.dts, and
modify the Mezzanine overlay for the LVDS V2 display to do an initial test
(diff with the changes at the end of the email). They worked partially, but it
introduced an issue where the drivers come up much later. Before, the drivers
relevant for the display (in this case, LCDIF and the touch controller
specifically) came up at around ~8s. After introducing the nexus connector they
come up at around ~20s, after the board has already booted (complete logs at
https://paste.debian.net/hidden/81acfa7d):
[ 21.008400] input: ILI210x Touchscreen as /devices/platform/soc@0/30800000.bus/30a30000.i2c/i2c-1/1-0041/input/input3
[ 21.014785] [drm] Initialized imx-lcdif 1.0.0 for 32e90000.display-controller on minor 2
[ 21.029634] Console: switching to colour frame buffer device 160x50
[ 21.029823] imx-lcdif 32e90000.display-controller: [drm] fb0: imx-lcdifdrmfb frame buffer device
[ 21.031376] imx8m-blk-ctrl 32ec0000.blk-ctrl: sync_state() pending due to 32e30000.dwe
Was this behavior observed before? It may have not been noticed, since the
drivers do come up at some point, and it may not be an issue for other
interfaces, or they may actually come up earlier in other cases. In our case
this is important though, since visual feedback from the display is expected
early.
It seems that the drivers are being deferred at boot start by the
device_links_check_suppliers() function. It runs through the drivers before
they're initialized and defers them if their suppliers are not available. The
GPIO and PWM drivers are able to follow the gpio-map and pwm-map properties
(through the of_parse_phandle_with_args_map() function), but from what I see,
device_links_check_suppliers() has no such mechanism. It follows the phandle to
the nexus connector node only, and since there's no compatible driver for it,
the function defers the consumer drivers used in the overlay.
I think this is what is happening mainly because setting the
fw_devlink=permissive kernel parameter (which sets the DL_FLAG_SYNC_STATE_ONLY
flag) solved the issue, though I could be misunderstanding something.
int device_links_check_suppliers(struct device *dev)
{
...
list_for_each_entry(link, &dev->links.suppliers, c_node) {
...
if (link->status != DL_STATE_AVAILABLE &&
!device_link_test(link, DL_FLAG_SYNC_STATE_ONLY)) {
...
device_links_missing_supplier(dev);
ret = dev_err_probe(dev, -EPROBE_DEFER,
"supplier %s not ready\n", dev_name(link->supplier));
break;
}
WRITE_ONCE(link->status, DL_STATE_CONSUMER_PROBE);
}
...
}
Has this behavior been observed before? Do you know of any work being done that
addresses this?
See below the changes that I made for this test, relative to my last patch
(only a draft):
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev-mezzanine-panel-cap-touch-10inch-lvds-v2.dtso b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev-mezzanine-panel-cap-touch-10inch-lvds-v2.dtso
index b78322907192..4aa1c407af3f 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev-mezzanine-panel-cap-touch-10inch-lvds-v2.dtso
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev-mezzanine-panel-cap-touch-10inch-lvds-v2.dtso
@@ -21,9 +21,19 @@
#include "imx8mp-pinfunc.h"
&{/} {
+ backlight_lvds: backlight-lvds {
+ compatible = "pwm-backlight";
+ brightness-levels = <0 45 63 88 119 158 203 255>;
+ default-brightness-level = <4>;
+ /* Verdin GPIO 4 (SODIMM 212) */
+ enable-gpios = <&lvds_native_connector 1 GPIO_ACTIVE_HIGH>;
+ /* Verdin PWM_2 (SODIMM 16) */
+ pwms = <&lvds_native_connector 0 6666667 0>;
+ };
+
panel-lvds-native {
compatible = "optologic,scx1001511ggc49", "panel-lvds";
- backlight = <&backlight_mezzanine>;
+ backlight = <&backlight_lvds>;
data-mapping = "vesa-24";
power-supply = <®_3p3v>;
height-mm = <136>;
@@ -53,13 +63,6 @@ panel_lvds_native_in: endpoint {
};
};
-&backlight_mezzanine {
- /* Verdin PWM_2 (SODIMM 16) */
- pwms = <&pwm2 0 6666667 0>;
-
- status = "okay";
-};
-
/* Verdin I2C_2_DSI */
&i2c2 {
#address-cells = <1>;
@@ -69,10 +72,10 @@ touchscreen@41 {
compatible = "ilitek,ili251x";
reg = <0x41>;
/* Verdin GPIO_3 (SODIMM 210) */
- interrupt-parent = <&gpio1>;
- interrupts = <5 IRQ_TYPE_EDGE_RISING>;
+ interrupt-parent = <&lvds_native_connector>;
+ interrupts = <1>;
/* Verdin GPIO_2 (SODIMM 208) */
- reset-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
+ reset-gpios = <&lvds_native_connector 0 GPIO_ACTIVE_LOW>;
};
};
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
index 72a4f846d694..1103da3d34ba 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
@@ -4,6 +4,28 @@
*/
/ {
+ lvds_native_connector: lvds-mezzanine-connector {
+ // NOTE: Placeholder name, no binding for this yet
+ compatible = "tdx,verdin-lvds-connector";
+
+ #gpio-cells = <2>;
+ gpio-map = <0 0 &gpio1 1 0>, /* Touchscreen reset GPIO */
+ <1 0 &gpio1 6 0>; /* Backlight Enable GPIO */
+ gpio-map-mask = <0xffffffff 0x0>;
+ gpio-map-pass-thru = <0x0 0xffffffff>;
+
+ #pwm-cells = <3>;
+ pwm-map = <0 0 0 &pwm2 0 0 0>; /* Backlight PWM */
+ pwm-map-mask = <0x0 0x0 0x0>;
+ pwm-map-pass-thru = <0x0 0xffffffff 0xffffffff>;
+
+ #address-cells = <0>;
+ #interrupt-cells = <1>;
+ interrupt-map = <0 &gpio1 5 IRQ_TYPE_EDGE_FALLING>, /* Touchscreen interrupt */
+ <1 &gpio1 5 IRQ_TYPE_EDGE_RISING>;
+ interrupt-map-mask = <0xffffffff>;
+ };
+
native-hdmi-connector {
compatible = "hdmi-connector";
label = "X37";
Leonardo