[PATCH 1/1] overlays: ed-ipc: Add EDATEC IPC/EXP unified board overlay

Yufeng Gao yufeng.gao at canonical.com
Mon Jul 13 01:13:40 UTC 2026


From: zjzhao <zjzhao at edatec.cn>

BugLink: https://bugs.launchpad.net/bugs/2160474

Add a new overlay for EDATEC IPC/EXP series industrial PC carrier
boards. This overlay configures PCA9535 GPIO expanders on both
i2c_csi_dsi and i2c_arm buses, with support for multiple board
profiles (IPC2100, IPC2300, IPC3100, IPC3300, PLC2010, etc.) and
optional expansion modules (exp8x8y, exp4x4y).

Signed-off-by: zjzhao <zjzhao at edatec.cn>
(cherry picked from commit 256d6b4bc33527fae9967773b2a0d3b92e1bd000 rpi-6.18.y)
Signed-off-by: Yufeng Gao <yufeng.gao at canonical.com>
---
 arch/arm/boot/dts/overlays/Makefile           |   1 +
 arch/arm/boot/dts/overlays/README             |  53 ++++
 arch/arm/boot/dts/overlays/ed-ipc-overlay.dts | 279 ++++++++++++++++++
 3 files changed, 333 insertions(+)
 create mode 100644 arch/arm/boot/dts/overlays/ed-ipc-overlay.dts

diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
index 000e575c2804..0fcfc15b130c 100644
--- a/arch/arm/boot/dts/overlays/Makefile
+++ b/arch/arm/boot/dts/overlays/Makefile
@@ -62,6 +62,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
 	draws.dtbo \
 	dwc-otg-deprecated.dtbo \
 	dwc2.dtbo \
+	ed-ipc.dtbo \
 	edt-ft5406.dtbo \
 	enc28j60.dtbo \
 	enc28j60-spi2.dtbo \
diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
index 27ef2f3a327c..8fddef1f5eea 100644
--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -1274,6 +1274,59 @@ Params: dr_mode                 Dual role mode: "host", "peripheral" or "otg"
                                 mode
 
 
+Name:   ed-ipc
+Info:   Configures the EDATEC IPC/EXP series hardware peripherals.
+        This overlay provides support for PCA9535 GPIO expanders on
+        the EDATEC industrial PC carrier boards, including interrupt
+        handling, GPIO line names, and optional secondary expander
+        on i2c_arm.
+Load:   dtoverlay=ed-ipc,<param>=<val>
+Params: addr                    I2C address for primary PCA9535 GPIO expander
+                                (default 0x20)
+
+        exp_addr                I2C address for secondary PCA9535 GPIO
+                                expander on i2c_arm (default 0x27)
+
+        ipc3100                 Enable configuration for IPC3100 board
+                                (CM5, i2c_csi_dsi0, PCA int GPIO6)
+
+        ipc2100                 Enable configuration for IPC2100 board
+                                (CM4, i2c_csi_dsi, PCA int GPIO6)
+
+        ipc2210                 Enable configuration for IPC2210 board
+                                (CM4, i2c_csi_dsi, PCA int GPIO6)
+
+        ipc3210                 Enable configuration for IPC3210 board
+                                (CM5, i2c_csi_dsi0, PCA int GPIO6)
+
+        ipc1200                 Enable configuration for IPC1200 board
+                                (CM4, i2c_csi_dsi, PCA int GPIO15)
+
+        ipc3300                 Enable configuration for IPC3300 board
+                                (CM5, i2c_arm, PCA int GPIO38)
+
+        ipc2300                 Enable configuration for IPC2300 board
+                                (CM4, i2c_arm, PCA int GPIO44)
+
+        plc2010                 Enable configuration for PLC2010 board
+                                (i2c_arm, PCA int GPIO7, addr 0x21)
+
+        exp8x8y                 Enable 8-input/8-output expansion module
+                                (CM5, i2c_arm)
+
+        exp4x4y                 Enable 4-input/4-output expansion module
+                                (CM5, i2c_arm, exp at addr 0x21)
+
+        ipc3600                 Enable combined configuration for IPC3600
+                                (IPC3100 + exp8x8y)
+
+        ipc2600                 Enable combined configuration for IPC2600
+                                (IPC2100 + exp8x8y)
+
+        ipc1220                 Enable combined configuration for IPC1220
+                                (IPC1200 + exp4x4y)
+
+
 [ The ds1307-rtc overlay has been deleted. See i2c-rtc. ]
 
 
diff --git a/arch/arm/boot/dts/overlays/ed-ipc-overlay.dts b/arch/arm/boot/dts/overlays/ed-ipc-overlay.dts
new file mode 100644
index 000000000000..1784234d45ad
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/ed-ipc-overlay.dts
@@ -0,0 +1,279 @@
+/*
+ * EDATEC IPC/EXP unified board overlay
+ */
+/dts-v1/;
+/plugin/;
+
+/ {
+	compatible = "brcm,bcm2835";
+	i2c_frag: fragment at 0 {
+		target = <&i2c_csi_dsi0>;
+		__dormant__ {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			status = "okay";
+
+			pca_base: pca at 20 {
+				compatible = "nxp,pca9535";
+				reg = <0x20>;
+				gpio-controller;
+				#gpio-cells = <2>;
+				status = "okay";
+			};
+		};
+	};
+
+	fragment at 100 {
+		target = <&i2c0if>;
+		__overlay__ {
+			status = "okay";
+		};
+	};
+
+	fragment at 101 {
+		target = <&i2c0mux>;
+		__overlay__ {
+			status = "okay";
+		};
+	};
+
+	fragment at 200 {
+		target = <&pca_base>;
+		__dormant__ {
+			gpio-line-names = "5V_GOOD", "LVD", "BUZZER_EN",
+					  "4G_RST", "4G_LED", "USER_LED";
+		};
+	};
+
+	fragment at 201 {
+		target = <&pca_base>;
+		__dormant__ {
+			gpio-line-names = "5V_GOOD", "LVD", "BUZZER_EN",
+					  "4G_RST", "4G_LED", "5G_RST",
+					  "5G_PWR_ON", "USER_LED",
+					  "MSATA_PRSNT";
+		};
+	};
+
+	fragment at 203 {
+		target = <&pca_base>;
+		__dormant__ {
+			gpio-line-names = "BL_EN_L", "BL_BTN_EN", "BL_BTN_UP",
+					  "BL_BTN_DOWN", "BUZZER_EN",
+					  "4G_RST", "MSATA_PRSNT", "FAN_EN",
+					  "NC", "NC", "NC", "NC",
+					  "NC", "NC", "NC", "PANEL_ON_L";
+		};
+	};
+
+	fragment at 205 {
+		target = <&pca_base>;
+		__dormant__ {
+			gpio-line-names = "USB_RST", "WK_RST", "4G_PWR",
+					  "4G_RST", "4G_BOOT",
+					  "4G_LED_REG_RED", "4G_LED_REG_GED",
+					  "4G_LED_SIG_RED", "4G_LED_SIG_GED",
+					  "USER_LED_RED", "USER_LED_GED",
+					  "LCD_RST", "4G_PRESENT",
+					  "IOB1_PRESENT", "IOB2_PRESENT";
+		};
+	};
+
+	fragment at 206 {
+		target = <&pca_base>;
+		__dormant__ {
+			gpio-line-names = "4G_RST", "LED_ERR", "LED_UPDATE",
+					  "LED_UDISK_BUSY", "LED_4G_EXP",
+					  "LED_UDISK_DET",
+					  "SW_FACTORY_RST", "SW_IP_ADDR_RST",
+					  "SW_START_STOP", "SW_APP_IMPORT",
+					  "SW_UDISK_REMOVE";
+		};
+	};
+
+	fragment at 210 {
+		target = <&pca_base>;
+		__dormant__ {
+			interrupt-parent = <&gpio>;
+			interrupts = <6 2>;		/* IRQ_TYPE_EDGE_FALLING */
+			pinctrl-names = "default";
+			pinctrl-0 = <&pca_irq6>;
+		};
+	};
+
+	fragment at 212 {
+		target = <&pca_base>;
+		__dormant__ {
+			interrupt-parent = <&gpio>;
+			interrupts = <38 2>;		/* IPC2300 CM5 */
+			pinctrl-names = "default";
+			pinctrl-0 = <&pca_irq38>;
+		};
+	};
+
+	fragment at 213 {
+		target = <&pca_base>;
+		__dormant__ {
+			interrupt-parent = <&gpio>;
+			interrupts = <44 2>;		/* IPC2300 CM4 */
+			pinctrl-names = "default";
+			pinctrl-0 = <&pca_irq44>;
+		};
+	};
+
+	fragment at 214 {
+		target = <&pca_base>;
+		__dormant__ {
+			interrupt-parent = <&gpio>;
+			interrupts = <7 2>;		/* PLC2010 */
+			pinctrl-names = "default";
+			pinctrl-0 = <&pca_irq7>;
+		};
+	};
+
+	fragment at 310 {
+		target = <&gpio>;
+		__dormant__ {
+			pca_irq6: pca_irq6 {
+				brcm,pins = <6>;
+				brcm,function = <0>;	/* input */
+			};
+		};
+	};
+
+	fragment at 312 {
+		target = <&gpio>;
+		__dormant__ {
+			pca_irq38: pca_irq38 {
+				brcm,pins = <38>;
+				brcm,function = <0>;	/* input */
+			};
+		};
+	};
+
+	fragment at 313 {
+		target = <&gpio>;
+		__dormant__ {
+			pca_irq44: pca_irq44 {
+				brcm,pins = <44>;
+				brcm,function = <0>;	/* input */
+			};
+		};
+	};
+
+	fragment at 314 {
+		target = <&gpio>;
+		__dormant__ {
+			pca_irq7: pca_irq7 {
+				brcm,pins = <7>;
+				brcm,function = <0>;	/* input */
+			};
+		};
+	};
+
+	fragment at 400 {
+		target = <&i2c_arm>;
+		__dormant__ {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			status = "okay";
+
+			pca_exp: pca at 27 {
+				compatible = "nxp,pca9535";
+				reg = <0x27>;
+				gpio-controller;
+				#gpio-cells = <2>;
+				status = "okay";
+			};
+		};
+	};
+
+	fragment at 500 {
+		target = <&pca_exp>;
+		__dormant__ {
+			gpio-line-names = "DI0", "DI1", "DI2", "DI3",
+					  "DI4", "DI5", "DI6", "DI7",
+					  "DO0", "DO1", "DO2", "DO3",
+					  "DO4", "DO5", "DO6", "DO7";
+		};
+	};
+
+	fragment at 501 {
+		target = <&pca_exp>;
+		__dormant__ {
+			gpio-line-names = "DI4", "DI5", "DI6", "DI7",
+					  "DO4", "DO5", "DO6", "DO7",
+					  "NC", "NC", "NC", "NC",
+					  "NC", "NC", "NC", "NC";
+		};
+	};
+
+	fragment at 410 {
+		target = <&pca_exp>;
+		__dormant__ {
+			interrupt-parent = <&gpio>;
+			interrupts = <10 2>;		/* EXP8X8Y */
+			pinctrl-names = "default";
+			pinctrl-0 = <&pca_irq10>;
+		};
+	};
+
+	fragment at 411 {
+		target = <&pca_exp>;
+		__dormant__ {
+			interrupt-parent = <&gpio>;
+			interrupts = <4 2>;		/* EXP4X4Y */
+			pinctrl-names = "default";
+			pinctrl-0 = <&pca_irq4>;
+		};
+	};
+
+	fragment at 510 {
+		target = <&gpio>;
+		__dormant__ {
+			pca_irq10: pca_irq10 {
+				brcm,pins = <10>;
+				brcm,function = <0>;	/* input */
+			};
+		};
+	};
+
+	fragment at 511 {
+		target = <&gpio>;
+		__dormant__ {
+			pca_irq4: pca_irq4 {
+				brcm,pins = <4>;
+				brcm,function = <0>;	/* input */
+			};
+		};
+	};
+
+	__overrides__ {
+		addr = <&pca_base>, "reg:0";
+		exp_addr = <&pca_exp>, "reg:0";
+		ipc3100 = <0>, "+0+200+210+310";
+		ipc2100 = <0>, "+0+200+210+310",
+			  <&i2c_frag>, "target:0=", <&i2c_csi_dsi>;
+		ipc2210 = <0>, "+0+201+210+310",
+			  <&i2c_frag>, "target:0=", <&i2c_csi_dsi>;
+		ipc3210 = <0>, "+0+201+210+310";
+		ipc1200 = <0>, "+0+205",
+			  <&i2c_frag>, "target:0=", <&i2c_csi_dsi>;
+		ipc3300 = <0>, "+0+203+212+312",
+			  <&i2c_frag>, "target:0=", <&i2c_arm>;
+		ipc2300 = <0>, "+0+203+213+313",
+			  <&i2c_frag>, "target:0=", <&i2c_arm>;
+		plc2010 = <0>, "+0+206+214+314",
+			  <&i2c_frag>, "target:0=", <&i2c_arm>,
+			  <&pca_base>, "reg:0=", <0x21>;
+		exp8x8y     = <0>, "+400+500+410+510";	/* default CM5 */
+		exp4x4y     = <0>, "+400+501+411+511",
+			      <&pca_exp>, "reg:0=", <0x21>;	/* default CM5 */
+		ipc3600 = <0>, "+0+200+210+310+400+500+410+510";
+		ipc2600 = <0>, "+0+200+210+310+400+500+410+510",
+			  <&i2c_frag>, "target:0=", <&i2c_csi_dsi>;
+		ipc1220 = <0>, "+0+205+400+501+411+511",
+			  <&i2c_frag>, "target:0=", <&i2c_csi_dsi>,
+			  <&pca_exp>, "reg:0=", <0x21>;
+	};
+};
-- 
2.43.0




More information about the kernel-team mailing list