* [PATCH v1 0/2] arm: dts: nxp: imx: add Draeger M48 CPU board
@ 2026-09-23 14:49 Petko Manolov
2026-09-23 14:49 ` [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board Petko Manolov
2026-09-23 14:49 ` [PATCH v1 2/2] arm: dts: nxp: imx: Add devicetree files for M48 Petko Manolov
0 siblings, 2 replies; 6+ messages in thread
From: Petko Manolov @ 2026-09-23 14:49 UTC (permalink / raw)
To: linux-kernel
Cc: devicetree, arnemaximilian.richter, martynas.grybauskas,
Petko Manolov
Adds the device trees for “Dräger M48 on NXP i.MX6 (Q|DL) and Intel/Altera
SoCFPGA Cyclone V” board variant. It has both (the SoC and FPGA) on the
same carrier and they are cross-monitoring each other. The SoCFPGA boots
independently off qspi flash.
This is the imx6 devicetree part. There are two bindings as well as device
trees, since M48 is using two parts: imx6q and imx6dl.
Petko Manolov (2):
dt-bindings: arm: fsl: add Draeger M48 dual-cpu board
arm: dts: nxp: imx: Add devicetree files for M48
.../devicetree/bindings/arm/fsl.yaml | 2 +
arch/arm/boot/dts/nxp/imx/Makefile | 2 +
.../boot/dts/nxp/imx/imx6dl-draeger-m48.dts | 23 ++
.../boot/dts/nxp/imx/imx6q-draeger-m48.dts | 23 ++
.../boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi | 369 ++++++++++++++++++
.../boot/dts/nxp/imx/imx6qp-draeger-m48.dts | 78 ++++
6 files changed, 497 insertions(+)
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6q-draeger-m48.dts
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts
--
2.47.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board
2026-09-23 14:49 [PATCH v1 0/2] arm: dts: nxp: imx: add Draeger M48 CPU board Petko Manolov
@ 2026-09-23 14:49 ` Petko Manolov
2026-09-23 14:55 ` sashiko-bot
2026-09-23 16:32 ` Conor Dooley
2026-09-23 14:49 ` [PATCH v1 2/2] arm: dts: nxp: imx: Add devicetree files for M48 Petko Manolov
1 sibling, 2 replies; 6+ messages in thread
From: Petko Manolov @ 2026-09-23 14:49 UTC (permalink / raw)
To: linux-kernel
Cc: devicetree, arnemaximilian.richter, martynas.grybauskas,
Petko Manolov
M48 is a heterogeneous board made by Draeger that is based on two
independent cpus, that are monitoring each other. One of them is
imx6, the other is Altera SoCFPGA Cyclone 5. The latter is booting
independently off qspi.
The imx6 parts that are used in M48 are imx6q and imx6dl, hence the
two bindings.
Signed-off-by: Petko Manolov <petko.manolov@konsulko.com>
---
Documentation/devicetree/bindings/arm/fsl.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/arm/fsl.yaml b/Documentation/devicetree/bindings/arm/fsl.yaml
index 656f2596e1d5..8f3a04228780 100644
--- a/Documentation/devicetree/bindings/arm/fsl.yaml
+++ b/Documentation/devicetree/bindings/arm/fsl.yaml
@@ -260,6 +260,7 @@ properties:
- boundary,imx6q-nitrogen6x
- compulab,cm-fx6 # CompuLab CM-FX6
- dmo,imx6q-edmqmx6 # Data Modul eDM-QMX6 Board
+ - draeger,imx6q-m48 # Draeger imx6q variant of M48
- ds,imx6q-sbc # Da Sheng COM-9XX Modules
- embest,imx6q-marsboard # Embest MarS Board i.MX6Dual
- emtrion,emcon-mx6 # emCON-MX6D or emCON-MX6Q SoM
@@ -458,6 +459,7 @@ properties:
- boundary,imx6dl-nit6xlite # Boundary Devices Nitrogen6 Lite
- boundary,imx6dl-nitrogen6x # Boundary Devices Nitrogen6x
- bticino,imx6dl-mamoj # BTicino i.MX6DL Mamoj
+ - draeger,imx6dl-m48 # Draeger imx6dl variant of M48
- eckelmann,imx6dl-ci4x10
- emtrion,emcon-mx6 # emCON-MX6S or emCON-MX6DL SoM
- emtrion,emcon-mx6-avari # emCON-MX6S or emCON-MX6DL SoM on Avari Base
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 2/2] arm: dts: nxp: imx: Add devicetree files for M48
2026-09-23 14:49 [PATCH v1 0/2] arm: dts: nxp: imx: add Draeger M48 CPU board Petko Manolov
2026-09-23 14:49 ` [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board Petko Manolov
@ 2026-09-23 14:49 ` Petko Manolov
2026-09-23 15:04 ` sashiko-bot
1 sibling, 1 reply; 6+ messages in thread
From: Petko Manolov @ 2026-09-23 14:49 UTC (permalink / raw)
To: linux-kernel
Cc: devicetree, arnemaximilian.richter, martynas.grybauskas,
Petko Manolov
M48 is a heterogeneous board made by Draeger that is based on two
independent cpus, that are monitoring each other. One of them is
imx6, the other is Altera SoCFPGA Cyclone 5. The latter is booting
independently off qspi.
This one adds the DT for the two variants of M48 that are based on
imx6q and imx6dl.
Signed-off-by: Petko Manolov <petko.manolov@konsulko.com>
---
arch/arm/boot/dts/nxp/imx/Makefile | 2 +
.../boot/dts/nxp/imx/imx6dl-draeger-m48.dts | 23 ++
.../boot/dts/nxp/imx/imx6q-draeger-m48.dts | 23 ++
.../boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi | 369 ++++++++++++++++++
.../boot/dts/nxp/imx/imx6qp-draeger-m48.dts | 78 ++++
5 files changed, 495 insertions(+)
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6q-draeger-m48.dts
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi
create mode 100644 arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts
diff --git a/arch/arm/boot/dts/nxp/imx/Makefile b/arch/arm/boot/dts/nxp/imx/Makefile
index 1a2539fa19b4..44b393256235 100644
--- a/arch/arm/boot/dts/nxp/imx/Makefile
+++ b/arch/arm/boot/dts/nxp/imx/Makefile
@@ -220,6 +220,8 @@ dtb-$(CONFIG_SOC_IMX6Q) += \
imx6q-dmo-edmqmx6.dtb \
imx6q-dms-ba16.dtb \
imx6q-ds.dtb \
+ imx6q-draeger-m48.dtb \
+ imx6dl-draeger-m48.dtb \
imx6q-emcon-avari.dtb \
imx6q-evi.dtb \
imx6dl-b105pv2.dtb \
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts
new file mode 100644
index 000000000000..45809770d16f
--- /dev/null
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * (C) Copyright 2020 Draeger and Licensors, info@draeger.com
+ * Based on work by Russell King
+ *
+ * Device Tree file for Drager M48 Board
+ */
+
+/dts-v1/;
+
+#include "imx6dl.dtsi"
+/* PAD config disabled in imx6qdl-draeger-m48.dtsi by setting value to 0x80000000
+ * PAD configuration register must not be 0, so it is set to 0xfff
+ */
+#define MX6QDL_PAD_CTL_GRP_DDR_TYPE_RGMII 0x768 0xfff 0x000 0x000C0000 0x0
+#define MX6QDL_PAD_CTL_GRP_RGMII_TERM 0x788 0xfff 0x000 0x00000200 0x0
+#include "imx6qdl-draeger-m48.dtsi"
+
+/ {
+ model = "Draeger M48 i.MX6 DualLite";
+ compatible = "draeger,imx6dl-m48", "fsl,imx6dl";
+};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-draeger-m48.dts b/arch/arm/boot/dts/nxp/imx/imx6q-draeger-m48.dts
new file mode 100644
index 000000000000..1266b8451fa1
--- /dev/null
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-draeger-m48.dts
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * (C) Copyright 2020 Draeger and Licensors, info@draeger.com
+ *
+ * Device Tree file for Drager M48 Board
+ */
+
+/dts-v1/;
+
+#include "imx6q.dtsi"
+/* PAD config disabled in imx6qdl-draeger-m48.dtsi by setting value to 0x80000000
+ * PAD configuration register must not be 0, so it is set to 0xfff
+ */
+#define MX6QDL_PAD_CTL_GRP_DDR_TYPE_RGMII 0x790 0xfff 0x000 0x000C0000 0x0
+#define MX6QDL_PAD_CTL_GRP_RGMII_TERM 0x7ac 0xfff 0x000 0x00000200 0x0
+
+#include "imx6qdl-draeger-m48.dtsi"
+
+/ {
+ model = "Draeger M48 i.MX6 Quad";
+ compatible = "draeger,imx6q-m48", "fsl,imx6q";
+};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi
new file mode 100644
index 000000000000..bcfe7b2556cb
--- /dev/null
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi
@@ -0,0 +1,369 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2020 Draeger and Licensors, info@draeger.com
+ * Based on work by Russell King
+ *
+ * Device Tree file for Drager M48 Board
+ */
+#include <dt-bindings/clock/imx6qdl-clock.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+&iomuxc {
+ m48 {
+ pinctrl_m48_uart1: m48-uart1 {
+ fsl,pins = <
+ MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x1b010
+ MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA 0x1b010
+ >;
+ };
+
+ pinctrl_m48_hdmi: m48-hdmi {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x1b0b0
+ MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x1b0b0
+ >;
+ };
+
+ pinctrl_m48_lvds: m48-lvds {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_A22__GPIO2_IO16 0x1b010 /* DISPLAY_EN */
+ MX6QDL_PAD_EIM_A20__GPIO2_IO18 0x1b010 /* BACKLIGHT_EN */
+ MX6QDL_PAD_EIM_A18__GPIO2_IO20 0x1b010 /* DISP0_CONTRAST */
+ >;
+ };
+
+ pinctrl_m48_i2c2: m48-i2c2 {
+ fsl,pins = <
+ MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b820
+ MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b820
+ >;
+ };
+
+ pinctrl_m48_i2c2_gpio: m48-i2c2_gpio {
+ fsl,pins = <
+ MX6QDL_PAD_KEY_COL3__GPIO4_IO12 0x1b820
+ MX6QDL_PAD_KEY_ROW3__GPIO4_IO13 0x1b820
+ >;
+#define GP_I2C2_SCL <&gpio4 12 GPIO_ACTIVE_HIGH>
+#define GP_I2C2_SDA <&gpio4 13 GPIO_ACTIVE_HIGH>
+ };
+
+ pinctrl_m48_i2c3: m48-i2c3 {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D17__I2C3_SCL 0x4001b820
+ MX6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b820
+ >;
+ };
+
+ pinctrl_m48_i2c3_gpio: m48-i2c3_gpio {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D17__GPIO3_IO17 0x1b820
+ MX6QDL_PAD_EIM_D18__GPIO3_IO18 0x1b820
+ >;
+#define GP_I2C3_SCL <&gpio3 17 GPIO_ACTIVE_HIGH>
+#define GP_I2C3_SDA <&gpio3 18 GPIO_ACTIVE_HIGH>
+ };
+
+ pinctrl_m48_usdhc3: m48-usdhc3 {
+ fsl,pins = <
+ MX6QDL_PAD_SD3_CMD__SD3_CMD 0x1B060
+ MX6QDL_PAD_SD3_CLK__SD3_CLK 0x1B060
+ MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x1B060
+ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x1B060
+ MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x1B060
+ MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x1B060
+ MX6QDL_PAD_NANDF_CS1__SD3_VSELECT 0x1B060
+ >;
+ };
+
+ pinctrl_m48_enet: enetgrp {
+ fsl,pins = <
+ MX6QDL_PAD_KEY_COL1__ENET_MDIO 0x1b0b0
+ MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
+ MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x13018
+ MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1B018
+ MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1B018
+ MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1B018
+ MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1B018
+ MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x13018
+ MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
+ MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x13030
+ MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x1B030
+ MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x1B030
+ MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1B030
+ MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1B030
+ MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x13030
+ MX6QDL_PAD_CTL_GRP_DDR_TYPE_RGMII 0x80000000
+ MX6QDL_PAD_CTL_GRP_RGMII_TERM 0x80000000
+ >;
+ };
+ };
+};
+
+&i2c2 {
+ clock-frequency = <100000>;
+ pinctrl-names = "default", "gpio";
+ pinctrl-0 = <&pinctrl_m48_i2c2>;
+ pinctrl-1 = <&pinctrl_m48_i2c2_gpio>;
+ scl-gpios = GP_I2C2_SCL;
+ sda-gpios = GP_I2C2_SDA;
+ status = "okay";
+
+ eeprom_mac: eeprom@50 {
+ compatible = "atmel,24c08";
+ reg = <0x50>;
+ pagesize = <16>;
+ };
+};
+
+&i2c3 {
+ pinctrl-names = "default", "gpio";
+ pinctrl-0 = <&pinctrl_m48_i2c3>;
+ pinctrl-1 = <&pinctrl_m48_i2c3_gpio>;
+ scl-gpios = GP_I2C3_SCL;
+ sda-gpios = GP_I2C3_SDA;
+ status = "okay";
+};
+
+&uart1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_m48_uart1>;
+ status = "okay";
+};
+
+&usdhc3 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_m48_usdhc3>;
+ non-removable;
+ fsl,wp-controller;
+ status = "okay";
+};
+
+&fec {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_m48_enet>;
+ phy-mode = "rgmii-id";
+ phy-handle = <ðphy>;
+ status = "okay";
+
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ethphy: ethernet-phy@0 {
+ reg = <0>;
+ rxc-skew-ps = <1380>;
+ rxd0-skew-ps = <0>;
+ rxd1-skew-ps = <0>;
+ rxd2-skew-ps = <0>;
+ rxd3-skew-ps = <0>;
+ rxdv-skew-ps = <0>;
+ txc-skew-ps = <1860>;
+ txd0-skew-ps = <0>;
+ txd1-skew-ps = <0>;
+ txd2-skew-ps = <0>;
+ txd3-skew-ps = <0>;
+ txen-skew-ps = <0>;
+ status = "okay";
+ };
+ };
+};
+
+&hdmi {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_m48_hdmi>;
+
+ display-timings {
+ native-mode = <&hdmi0>;
+
+ hdmi0: hdmi {
+ clock-frequency = <65000000>;
+ hactive = <1024>;
+ vactive = <768>;
+ hback-porch = <220>;
+ hfront-porch = <40>;
+ vback-porch = <21>;
+ vfront-porch = <7>;
+ hsync-len = <60>;
+ vsync-len = <10>;
+ };
+
+ hdmi1: hdmi-1280x800-24@60 {
+ clock-frequency = <71000000>;
+ hactive = <1280>;
+ vactive = <800>;
+ hback-porch = <80>;
+ hfront-porch = <48>;
+ vback-porch = <14>;
+ vfront-porch = <3>;
+ hsync-len = <32>;
+ vsync-len = <6>;
+ };
+
+ hdmi2: hdmi-1366x768-32@60 {
+ clock-frequency = <72000000>;
+ hactive = <1366>;
+ vactive = <768>;
+ hback-porch = <80>;
+ hfront-porch = <48>;
+ vback-porch = <14>;
+ vfront-porch = <3>;
+ hsync-len = <32>;
+ vsync-len = <5>;
+ };
+ };
+};
+
+&ldb {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_m48_lvds>;
+
+ lvds-channel@0 {
+ fsl,data-mapping = "spwg";
+ fsl,default-data-width = <24>;
+ status = "okay";
+
+ display-timings {
+ native-mode = <&timing0>;
+
+ timing0: 1920x1080-32@60 {
+ fsl,dual-channel;
+
+ /* LVDS split mode */
+ clock-frequency = <71190000>;
+
+ /* pixclk /2 */
+ hactive = <1920>;
+ vactive = <1080>;
+ hback-porch = <60>;
+
+ /* left * 2 */
+ hfront-porch = <60>;
+
+ /* right * 2 */
+ vback-porch = <30>;
+ vfront-porch = <3>;
+ hsync-len = <60>;
+
+ /* hsync * 2 */
+ vsync-len = <17>;
+ };
+
+ timing1: 1366x768-32@60 {
+ clock-frequency = <72000000>;
+ hactive = <1366>;
+ vactive = <768>;
+ hback-porch = <80>;
+ hfront-porch = <48>;
+ vback-porch = <14>;
+ vfront-porch = <3>;
+ hsync-len = <32>;
+ vsync-len = <5>;
+ };
+
+ timing2: 1280x800-24@60 {
+ fsl,data-width = <18>;
+ clock-frequency = <71000000>;
+ hactive = <1280>;
+ vactive = <800>;
+ hback-porch = <80>;
+ hfront-porch = <48>;
+ vback-porch = <14>;
+ vfront-porch = <3>;
+ hsync-len = <32>;
+ vsync-len = <6>;
+ };
+
+ timing3: Tianma_1280x800-24@60 {
+ fsl,data-width = <18>;
+ clock-frequency = <67254000>;
+ hactive = <1280>;
+ vactive = <800>;
+ hback-porch = <5>;
+ hfront-porch = <27>;
+ vback-porch = <2>;
+ vfront-porch = <26>;
+ hsync-len = <32>;
+ vsync-len = <6>;
+ };
+
+ timing4: 1024x768-24@60 {
+ fsl,data-width = <18>;
+ clock-frequency = <65000000>;
+ hactive = <1024>;
+ vactive = <768>;
+ hback-porch = <160>;
+ hfront-porch = <24>;
+ vback-porch = <29>;
+ vfront-porch = <3>;
+ hsync-len = <136>;
+ vsync-len = <6>;
+ };
+
+ timing5: 800x600-32@60 {
+ clock-frequency = <40000000>;
+ hactive = <800>;
+ vactive = <600>;
+ hback-porch = <120>;
+ hfront-porch = <40>;
+ vback-porch = <28>;
+ vfront-porch = <13>;
+ hsync-len = <80>;
+ vsync-len = <4>;
+ };
+
+ timing6: 800x480-32@60 {
+ clock-frequency = <25000000>;
+ hactive = <800>;
+ vactive = <480>;
+ hback-porch = <8>;
+ hfront-porch = <8>;
+ vback-porch = <8>;
+ vfront-porch = <8>;
+ hsync-len = <4>;
+ vsync-len = <4>;
+ };
+
+ timing7: 640x480-32@60 {
+ clock-frequency = <25175000>;
+ hactive = <640>;
+ vactive = <480>;
+ hback-porch = <48>;
+ hfront-porch = <16>;
+ vback-porch = <33>;
+ vfront-porch = <10>;
+ hsync-len = <96>;
+ vsync-len = <2>;
+ };
+ };
+ };
+};
+
+/ {
+ aliases {
+ mmc0 = &usdhc3;
+ mmc1 = &usdhc4;
+ eeprom_mac = &eeprom_mac;
+ };
+
+ /* Will be filled by the bootloader */
+ memory@10000000 {
+ device_type = "memory";
+ reg = <0x10000000 0x80000000>;
+ };
+
+ chosen {
+ stdout-path = &uart1;
+ };
+
+ config {
+ #ifdef LEGACY_BOOT
+ bootcmd = "startM48;errorMsg";
+ bootcmd = "startKernel;errorMsg";
+ #endif
+
+ };
+};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts b/arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts
new file mode 100644
index 000000000000..ab331596abd9
--- /dev/null
+++ b/arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2020 Draeger and Licensors, info@draeger.com
+ *
+ * Device Tree file for Drager M48 Board
+ */
+
+/dts-v1/;
+
+#include "imx6q.dtsi"
+/* PAD config disabled in imx6qdl-draeger-m48.dtsi by setting value to 0x80000000
+ * PAD configuration register must not be 0, so it is set to 0xfff
+ */
+#define MX6QDL_PAD_CTL_GRP_DDR_TYPE_RGMII 0x790 0xfff 0x000 0x000C0000 0x0
+#define MX6QDL_PAD_CTL_GRP_RGMII_TERM 0x7ac 0xfff 0x000 0x00000200 0x0
+#define IMX_PAD_SION 0x40000000 /* set SION */
+
+#include "imx6qdl-draeger-m48.dtsi"
+#include "imx6qdl-draeger-m48-u-boot.dtsi"
+
+/ {
+ model = "Draeger M48 i.MX6 Quad Plus";
+ compatible = "draeger,imx6qp-m48", "fsl,imx6qp";
+
+ vccq_sdhc3: regulator-vccq-sdhc3 {
+ compatible = "regulator-gpio";
+ regulator-name = "SDHC3 VccQ";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_m48_regulatorvccq_sdhc3>;
+ gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>;
+ gpios-states = <1>;
+ states = <3300000 0>, <1800000 1>;
+ };
+};
+
+&iomuxc {
+ m48 {
+ pinctrl_m48_usdhc3_100mhz: m48-usdhc3_100mhz {
+ fsl,pins = <
+ MX6QDL_PAD_SD3_CMD__SD3_CMD 0x1B0E9
+ MX6QDL_PAD_SD3_CLK__SD3_CLK 0x1B0E9
+ MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x1B0E9
+ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x1B0E9
+ MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x1B0E9
+ MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x1B0E9
+ >;
+ };
+ pinctrl_m48_usdhc3_200mhz: m48-usdhc3_200mhz {
+ fsl,pins = <
+ MX6QDL_PAD_SD3_CMD__SD3_CMD 0x1B0E9
+ MX6QDL_PAD_SD3_CLK__SD3_CLK 0x1B0E9
+ MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x1B0E9
+ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x1B0E9
+ MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x1B0E9
+ MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x1B0E9
+ >;
+ };
+
+ pinctrl_m48_regulatorvccq_sdhc3: m48-vccq-sdhc3 {
+ fsl,pins = <MX6QDL_PAD_NANDF_CS3__GPIO6_IO16 (0x1B0B0 | IMX_PAD_SION)>;
+ };
+ };
+};
+
+&usdhc3 {
+ compatible = "fsl,imx6qp-usdhc";
+ vqmmc-supply = <&vccq_sdhc3>;
+ pinctrl-names = "default", "state_100mhz", "state_200mhz";
+ pinctrl-0 = <&pinctrl_m48_usdhc3>;
+ pinctrl-1 = <&pinctrl_m48_usdhc3_100mhz>;
+ pinctrl-2 = <&pinctrl_m48_usdhc3_200mhz>;
+ sd-uhs-sdr12;
+ sd-uhs-sdr25;
+ sd-uhs-sdr50;
+ sd-uhs-ddr50;
+};
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board
2026-09-23 14:49 ` [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board Petko Manolov
@ 2026-09-23 14:55 ` sashiko-bot
2026-09-23 16:32 ` Conor Dooley
1 sibling, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-09-23 14:55 UTC (permalink / raw)
To: Petko Manolov; +Cc: robh, devicetree, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] dt-bindings: missing 'draeger' vendor prefix in vendor-prefixes.yaml
--
commit cb9d16ad6756673a5b26300c6dbed7353bb41b62
Author: Petko Manolov <petko.manolov@konsulko.com>
dt-bindings: arm: fsl: add Draeger M48 dual-cpu board
This adds device tree binding compatible strings for the Draeger M48
heterogeneous board. The bindings support both the i.MX6Q and i.MX6DL
variants used in the hardware.
> diff --git a/Documentation/devicetree/bindings/arm/fsl.yaml b/Documentation/devicetree/bindings/arm/fsl.yaml
> index 86876311ec59a..2abcae70f33b8 100644
> --- a/Documentation/devicetree/bindings/arm/fsl.yaml
> +++ b/Documentation/devicetree/bindings/arm/fsl.yaml
> @@ -260,6 +260,7 @@ properties:
> - boundary,imx6q-nitrogen6x
> - compulab,cm-fx6 # CompuLab CM-FX6
> - dmo,imx6q-edmqmx6 # Data Modul eDM-QMX6 Board
> + - draeger,imx6q-m48 # Draeger imx6q variant of M48
[Severity: Low]
Is the "draeger" vendor prefix documented in vendor-prefixes.yaml?
The dt-bindings subsystem requires every newly introduced vendor prefix to
be formally documented. Failing to add it can cause make dt_binding_check
to fail with a schema validation error for an unrecognized vendor prefix.
> - ds,imx6q-sbc # Da Sheng COM-9XX Modules
> - embest,imx6q-marsboard # Embest MarS Board i.MX6Dual
> - emtrion,emcon-mx6 # emCON-MX6D or emCON-MX6Q SoM
[ ... ]
> @@ -458,6 +459,7 @@ properties:
> - boundary,imx6dl-nit6xlite # Boundary Devices Nitrogen6 Lite
> - boundary,imx6dl-nitrogen6x # Boundary Devices Nitrogen6x
> - bticino,imx6dl-mamoj # BTicino i.MX6DL Mamoj
> + - draeger,imx6dl-m48 # Draeger imx6dl variant of M48
[Severity: Low]
Will this also trigger a validation error during make dt_binding_check?
Similar to the previous addition, this introduces the undocumented "draeger"
prefix for the i.MX6DL variant, which leaves the binding implementation
incomplete.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260923144905.3365851-1-petko.manolov@konsulko.com?part=1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 2/2] arm: dts: nxp: imx: Add devicetree files for M48
2026-09-23 14:49 ` [PATCH v1 2/2] arm: dts: nxp: imx: Add devicetree files for M48 Petko Manolov
@ 2026-09-23 15:04 ` sashiko-bot
0 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-09-23 15:04 UTC (permalink / raw)
To: Petko Manolov; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 6 potential issue(s) to consider:
- [High] pinctrl: imx: heap buffer overflow during probe due to invalid GPR pad config
- [High] drm/imx: LDB probe failure due to unsupported and missing device tree properties
- [Medium] dts: imx6qp-draeger-m48: missing Quad Plus hardware features due to wrong include
- [Low] dts: include of non-existent U-Boot dtsi file breaks compilation
- [Low] kbuild: missing device tree binary target for i.MX6 Quad Plus
- [Low] dts: missing #else directive causes skipped properties or duplicate syntax error
--
commit a3be5f85dbb9af1e9cf58843b4f41c4f63c8e8f5
Author: Petko Manolov <petko.manolov@konsulko.com>
arm: dts: nxp: imx: Add devicetree files for M48
This commit adds device tree definitions for two variants of the Draeger
M48 board based on the i.MX6Q and i.MX6DL SoCs. It includes a common
dtsi and specific dts files for the Quad, DualLite, and Quad Plus variants.
> diff --git a/arch/arm/boot/dts/nxp/imx/Makefile b/arch/arm/boot/dts/nxp/imx/Makefile
> --- a/arch/arm/boot/dts/nxp/imx/Makefile
> +++ b/arch/arm/boot/dts/nxp/imx/Makefile
[ ... ]
> @@ -220,6 +220,8 @@ dtb-$(CONFIG_SOC_IMX6Q) += \
> imx6q-dmo-edmqmx6.dtb \
> imx6q-dms-ba16.dtb \
> imx6q-ds.dtb \
> + imx6q-draeger-m48.dtb \
> + imx6dl-draeger-m48.dtb \
> imx6q-emcon-avari.dtb \
[Severity: Low]
Does this Makefile section miss the target for the Quad Plus variant?
The patch introduces imx6qp-draeger-m48.dts, but it appears to be omitted
from the dtb-$(CONFIG_SOC_IMX6Q) compilation list. This means it might not
be built during a standard make dtbs run.
> diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts
> --- /dev/null
> +++ b/arch/arm/boot/dts/nxp/imx/imx6dl-draeger-m48.dts
[ ... ]
> +#include "imx6dl.dtsi"
> +/* PAD config disabled in imx6qdl-draeger-m48.dtsi by setting value to 0x80000000
> + * PAD configuration register must not be 0, so it is set to 0xfff
> + */
> +#define MX6QDL_PAD_CTL_GRP_DDR_TYPE_RGMII 0x768 0xfff 0x000 0x000C0000 0x0
> +#define MX6QDL_PAD_CTL_GRP_RGMII_TERM 0x788 0xfff 0x000 0x00000200 0x0
[Severity: High]
Could these macro definitions cause a heap buffer overflow during the imx
pinctrl driver probe?
These macros appear to define raw IOMUXC GPR register offsets (0x768 and
0x788) in the position normally used for pad mux_reg values.
When the pinctrl-imx driver parses these entries in imx_pinctrl_parse_pin_mmio():
*pin_id = (mux_reg != -1) ? mux_reg / 4 : conf_reg / 4;
pin_reg = &ipctl->pin_regs[*pin_id];
pin->pin = *pin_id;
pin_reg->mux_reg = mux_reg;
pin_reg->conf_reg = conf_reg;
It calculates the array index as mux_reg / 4 (which evaluates to 474+). Since
the destination array ipctl->pin_regs is allocated based on the total number of
pins (~216 for i.MX6), writing to these calculated indices writes past the end
of the heap allocation, likely causing memory corruption and an early kernel
panic. (The same issue applies to the i.MX6Q and i.MX6QP dts files).
> diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi
> --- /dev/null
> +++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-draeger-m48.dtsi
[ ... ]
> + lvds-channel@0 {
> + fsl,data-mapping = "spwg";
> + fsl,default-data-width = <24>;
[Severity: High]
Will the imx-ldb driver probe fail here due to this property name?
The property fsl,default-data-width does not seem to exist in the bindings.
Because fsl,data-width is missing on the channel node, of_get_bus_format()
resolves the width to 0.
When the driver compares datawidth == 0 against valid widths (18 or 24) in
imx_ldb_bit_mappings, it will return -ENOENT, aborting the entire LVDS
controller probe and leaving the display non-functional.
> + status = "okay";
> +
> + display-timings {
> + native-mode = <&timing0>;
> +
> + timing0: 1920x1080-32@60 {
> + fsl,dual-channel;
[Severity: High]
Is this property nested too deeply to be parsed?
Properties like fsl,dual-channel and fsl,data-width appear to be wrongly
nested inside the display-timings subnodes, where the imx-ldb driver's parser
will likely ignore them. They should be placed directly on the lvds-channel@0
node.
[ ... ]
> + config {
> + #ifdef LEGACY_BOOT
> + bootcmd = "startM48;errorMsg";
> + bootcmd = "startKernel;errorMsg";
> + #endif
> +
> + };
> +};
[Severity: Low]
Is there a missing #else directive in this block?
If LEGACY_BOOT is defined, dtc will fail with a 'Duplicate property name'
syntax error. If it is undefined, both properties are excluded by the
preprocessor, leaving the config node unexpectedly empty.
> diff --git a/arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts b/arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts
> --- /dev/null
> +++ b/arch/arm/boot/dts/nxp/imx/imx6qp-draeger-m48.dts
[ ... ]
> +/dts-v1/;
> +
> +#include "imx6q.dtsi"
[Severity: Medium]
Does this include the incorrect SoC base definitions?
The device tree explicitly declares compatibility with fsl,imx6qp below, but
it includes imx6q.dtsi instead of imx6qp.dtsi. This omits the Quad Plus
specific fixes, clocks, and peripheral updates (like fsl,imx6qp-pre and
fsl,imx6qp-prg), causing the Quad Plus hardware to be initialized with missing
hardware features.
> +/* PAD config disabled in imx6qdl-draeger-m48.dtsi by setting value to 0x80000000
> + * PAD configuration register must not be 0, so it is set to 0xfff
> + */
> +#define MX6QDL_PAD_CTL_GRP_DDR_TYPE_RGMII 0x790 0xfff 0x000 0x000C0000 0x0
> +#define MX6QDL_PAD_CTL_GRP_RGMII_TERM 0x7ac 0xfff 0x000 0x00000200 0x0
> +#define IMX_PAD_SION 0x40000000 /* set SION */
> +
> +#include "imx6qdl-draeger-m48.dtsi"
> +#include "imx6qdl-draeger-m48-u-boot.dtsi"
[Severity: Low]
Does this include cause a fatal build error?
The file imx6qdl-draeger-m48-u-boot.dtsi does not appear to exist in the
upstream kernel source tree. Attempting to build this device tree results
in a C preprocessor 'No such file or directory' error.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260923144905.3365851-1-petko.manolov@konsulko.com?part=2
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board
2026-09-23 14:49 ` [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board Petko Manolov
2026-09-23 14:55 ` sashiko-bot
@ 2026-09-23 16:32 ` Conor Dooley
1 sibling, 0 replies; 6+ messages in thread
From: Conor Dooley @ 2026-09-23 16:32 UTC (permalink / raw)
To: Petko Manolov
Cc: linux-kernel, devicetree, arnemaximilian.richter,
martynas.grybauskas
[-- Attachment #1: Type: text/plain, Size: 75 bytes --]
Acked-by: Conor Dooley <conor.dooley@microchip.com>
pw-bot: not-applicable
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-23 16:32 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-23 14:49 [PATCH v1 0/2] arm: dts: nxp: imx: add Draeger M48 CPU board Petko Manolov
2026-09-23 14:49 ` [PATCH v1 1/2] dt-bindings: arm: fsl: add Draeger M48 dual-cpu board Petko Manolov
2026-09-23 14:55 ` sashiko-bot
2026-09-23 16:32 ` Conor Dooley
2026-09-23 14:49 ` [PATCH v1 2/2] arm: dts: nxp: imx: Add devicetree files for M48 Petko Manolov
2026-09-23 15:04 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox