[OpenWrt-Devel,V3,5/5] brcm63xx: register GPIOs through DT
diff mbox

Message ID 54C529E5.20706@gmail.com
State Accepted
Delegated to: Jonas Gorski
Headers show

Commit Message

Álvaro Fernández Rojas Jan. 25, 2015, 5:37 p.m. UTC
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---

Comments

Jonas Gorski Feb. 27, 2015, 6:17 p.m. UTC | #1
On Sun, Jan 25, 2015 at 6:37 PM, Álvaro Fernández Rojas
<noltari@gmail.com> wrote:

Thanks, I applied this with a few fixed led polarities and removal of
the appropriate entries from the board_info structs.


Jonas

Patch
diff mbox

diff --git a/target/linux/brcm63xx/config-3.14 b/target/linux/brcm63xx/config-3.14
index dd27f47..a5c1721 100644
--- a/target/linux/brcm63xx/config-3.14
+++ b/target/linux/brcm63xx/config-3.14
@@ -76,7 +76,10 @@  CONFIG_GENERIC_IRQ_SHOW=y
 CONFIG_GENERIC_PCI_IOMAP=y
 CONFIG_GENERIC_SMP_IDLE_THREAD=y
 CONFIG_GPIOLIB=y
+CONFIG_GPIO_74X164=y
 CONFIG_GPIO_DEVRES=y
+CONFIG_GPIO_GENERIC=y
+CONFIG_GPIO_GENERIC_PLATFORM=y
 CONFIG_GPIO_SYSFS=y
 # CONFIG_HAMRADIO is not set
 CONFIG_HAS_DMA=y
diff --git a/target/linux/brcm63xx/config-3.18 b/target/linux/brcm63xx/config-3.18
index e3cf020..d5f9425 100644
--- a/target/linux/brcm63xx/config-3.18
+++ b/target/linux/brcm63xx/config-3.18
@@ -80,7 +80,10 @@  CONFIG_GENERIC_IRQ_SHOW=y
 CONFIG_GENERIC_PCI_IOMAP=y
 CONFIG_GENERIC_SMP_IDLE_THREAD=y
 CONFIG_GPIOLIB=y
+CONFIG_GPIO_74X164=y
 CONFIG_GPIO_DEVRES=y
+CONFIG_GPIO_GENERIC=y
+CONFIG_GPIO_GENERIC_PLATFORM=y
 CONFIG_GPIO_SYSFS=y
 # CONFIG_HAMRADIO is not set
 CONFIG_HAS_DMA=y
diff --git a/target/linux/brcm63xx/dts/a226g.dts b/target/linux/brcm63xx/dts/a226g.dts
index 9aff81b..1b40507 100644
--- a/target/linux/brcm63xx/dts/a226g.dts
+++ b/target/linux/brcm63xx/dts/a226g.dts
@@ -5,6 +5,83 @@ 
 / {
 	model = "Pirelli A226G";
 	compatible = "pirelli,a226g", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wps {
+			label = "wps";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x211>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		voip_red {
+			label = "DWV-S0:red:VoIP";
+			gpios = <&gpio0 0 1>;
+		};
+		eth_red {
+			label = "DWV-S0:red:ethernet";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_green {
+			label = "DWV-S0:green:ADSL";
+			gpios = <&gpio0 2 1>;
+		};
+		usb_green {
+			label = "DWV-S0:green:USB";
+			gpios = <&gpio0 3 1>;
+		};
+		power_green {
+			label = "DWV-S0:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "DWV-S0:red:power";
+			gpios = <&gpio0 5 1>;
+		};
+		inet_red {
+			label = "DWV-S0:red:internet";
+			gpios = <&gpio0 6 1>;
+		};
+		inet_green {
+			label = "DWV-S0:green:internet";
+			gpios = <&gpio0 7 1>;
+		};
+		eth_green {
+			label = "DWV-S0:green:ethernet";
+			gpios = <&gpio0 8 1>;
+		};
+		voip_green {
+			label = "DWV-S0:green:VoIP";
+			gpios = <&gpio0 9 1>;
+		};
+		wifi_red {
+			label = "DWV-S0:red:wifi";
+			gpios = <&gpio0 10 1>;
+		};
+		usb_red {
+			label = "DWV-S0:red:USB";
+			gpios = <&gpio0 11 1>;
+		};
+		dsl_red {
+			label = "DWV-S0:red:ADSL";
+			gpios = <&gpio0 12 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/a226m-fwb.dts b/target/linux/brcm63xx/dts/a226m-fwb.dts
index 1abf870..011f312 100644
--- a/target/linux/brcm63xx/dts/a226m-fwb.dts
+++ b/target/linux/brcm63xx/dts/a226m-fwb.dts
@@ -5,6 +5,83 @@ 
 / {
 	model = "Pirelli A226M-FWB";
 	compatible = "pirelli,a226m-fwb", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wps {
+			label = "wps";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x211>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		voip_red {
+			label = "DWV-S0:red:VoIP";
+			gpios = <&gpio0 0 1>;
+		};
+		eth_red {
+			label = "DWV-S0:red:ethernet";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_green {
+			label = "DWV-S0:green:ADSL";
+			gpios = <&gpio0 2 1>;
+		};
+		usb_green {
+			label = "DWV-S0:green:USB";
+			gpios = <&gpio0 3 1>;
+		};
+		power_green {
+			label = "DWV-S0:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "DWV-S0:red:power";
+			gpios = <&gpio0 5 1>;
+		};
+		inet_red {
+			label = "DWV-S0:red:internet";
+			gpios = <&gpio0 6 1>;
+		};
+		inet_green {
+			label = "DWV-S0:green:internet";
+			gpios = <&gpio0 7 1>;
+		};
+		eth_green {
+			label = "DWV-S0:green:ethernet";
+			gpios = <&gpio0 8 1>;
+		};
+		voip_green {
+			label = "DWV-S0:green:VoIP";
+			gpios = <&gpio0 9 1>;
+		};
+		wifi_red {
+			label = "DWV-S0:red:wifi";
+			gpios = <&gpio0 10 1>;
+		};
+		usb_red {
+			label = "DWV-S0:red:USB";
+			gpios = <&gpio0 11 1>;
+		};
+		dsl_red {
+			label = "DWV-S0:red:ADSL";
+			gpios = <&gpio0 12 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/a226m.dts b/target/linux/brcm63xx/dts/a226m.dts
index ba6382e..13400f2 100644
--- a/target/linux/brcm63xx/dts/a226m.dts
+++ b/target/linux/brcm63xx/dts/a226m.dts
@@ -5,6 +5,83 @@ 
 / {
 	model = "Pirelli A226M";
 	compatible = "pirelli,a226m", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wps {
+			label = "wps";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x211>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		voip_red {
+			label = "DWV-S0:red:VoIP";
+			gpios = <&gpio0 0 1>;
+		};
+		eth_red {
+			label = "DWV-S0:red:ethernet";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_green {
+			label = "DWV-S0:green:ADSL";
+			gpios = <&gpio0 2 1>;
+		};
+		usb_green {
+			label = "DWV-S0:green:USB";
+			gpios = <&gpio0 3 1>;
+		};
+		power_green {
+			label = "DWV-S0:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "DWV-S0:red:power";
+			gpios = <&gpio0 5 1>;
+		};
+		inet_red {
+			label = "DWV-S0:red:internet";
+			gpios = <&gpio0 6 1>;
+		};
+		inet_green {
+			label = "DWV-S0:green:internet";
+			gpios = <&gpio0 7 1>;
+		};
+		eth_green {
+			label = "DWV-S0:green:ethernet";
+			gpios = <&gpio0 8 1>;
+		};
+		voip_green {
+			label = "DWV-S0:green:VoIP";
+			gpios = <&gpio0 9 1>;
+		};
+		wifi_red {
+			label = "DWV-S0:red:wifi";
+			gpios = <&gpio0 10 1>;
+		};
+		usb_red {
+			label = "DWV-S0:red:USB";
+			gpios = <&gpio0 11 1>;
+		};
+		dsl_red {
+			label = "DWV-S0:red:ADSL";
+			gpios = <&gpio0 12 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/a4001n.dts b/target/linux/brcm63xx/dts/a4001n.dts
index 011fbf4..1f8eaf6 100644
--- a/target/linux/brcm63xx/dts/a4001n.dts
+++ b/target/linux/brcm63xx/dts/a4001n.dts
@@ -5,4 +5,49 @@ 
 / {
 	model = "ADB P.DG A4001N";
 	compatible = "adb,a4001n", "brcm,bcm6328";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 23 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio0 24 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_red {
+			label = "A4001N:red:inet";
+			gpios = <&gpio0 1 0>;
+		};
+		power_red {
+			label = "A4001N:red:power";
+			gpios = <&gpio0 4 0>;
+		};
+		power_green {
+			label = "A4001N:green:power";
+			gpios = <&gpio0 8 0>;
+			default-state = "on";
+		};
+		usb_green {
+			label = "A4001N:green:usb";
+			gpios = <&gpio0 10 1>;
+		};
+		dsl_green {
+			label = "A4001N:green:dsl";
+			gpios = <&gpio0 11 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/a4001n1.dts b/target/linux/brcm63xx/dts/a4001n1.dts
index 2bdd201..d45210f 100644
--- a/target/linux/brcm63xx/dts/a4001n1.dts
+++ b/target/linux/brcm63xx/dts/a4001n1.dts
@@ -5,4 +5,77 @@ 
 / {
 	model = "ADB P.DG A4001N1";
 	compatible = "adb,a4001n1", "brcm,bcm6328";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 23 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wlan";
+			gpios = <&gpio0 24 1>;
+			linux,code = <0xee>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_red {
+			label = "A4001N1:red:inet";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "A4001N1:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		power_red {
+			label = "A4001N1:red:power";
+			gpios = <&gpio0 4 1>;
+		};
+		ppp_red {
+			label = "A4001N1:red:ppp";
+			gpios = <&gpio0 5 1>;
+		};
+		usb_green {
+			label = "A4001N1:green:3g";
+			gpios = <&gpio0 6 1>;
+		};
+		usb_red {
+			label = "A4001N1:red:3g";
+			gpios = <&gpio0 7 1>;
+		};
+		power_green {
+			label = "A4001N1:green:power";
+			gpios = <&gpio0 8 1>;
+			default-state = "on";
+		};
+		wlan_green {
+			label = "A4001N1:green:wlan";
+			gpios = <&gpio0 9 1>;
+		};
+		wlan_red {
+			label = "A4001N1:red:wlan";
+			gpios = <&gpio0 10 1>;
+		};
+		inet_green {
+			label = "A4001N1:green:inet";
+			gpios = <&gpio0 11 1>;
+		};
+		eth_red {
+			label = "A4001N1:red:eth";
+			gpios = <&gpio0 20 1>;
+		};
+		eth_green {
+			label = "A4001N1:green:eth";
+			gpios = <&gpio0 31 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/agpf-s0.dts b/target/linux/brcm63xx/dts/agpf-s0.dts
index 9d66b89..eaa45b9 100644
--- a/target/linux/brcm63xx/dts/agpf-s0.dts
+++ b/target/linux/brcm63xx/dts/agpf-s0.dts
@@ -5,6 +5,87 @@ 
 / {
 	model = "Pirelli Alice Gate AGPF-S0";
 	compatible = "pirelli,agpf-s0", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wps {
+			label = "wps";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x211>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "AGPF-S0:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "AGPF-S0:red:power";
+			gpios = <&gpio0 5 1>;
+		};
+		service_green {
+			label = "AGPF-S0:green:service";
+			gpios = <&gpio0 6 1>;
+		};
+		service_red {
+			label = "AGPF-S0:red:service";
+			gpios = <&gpio0 7 1>;
+		};
+		dsl_green {
+			label = "AGPF-S0:green:adsl";
+			gpios = <&gpio0 9 1>;
+		};
+		dsl_red {
+			label = "AGPF-S0:red:adsl";
+			gpios = <&gpio0 10 1>;
+		};
+		wifi_green {
+			label = "AGPF-S0:green:wifi";
+			gpios = <&gpio0 22 1>;
+		};
+		wifi_red {
+			label = "AGPF-S0:red:wifi";
+			gpios = <&gpio0 23 1>;
+		};
+		inet_red {
+			label = "AGPF-S0:red:internet";
+			gpios = <&gpio0 24 1>;
+		};
+		inet_green {
+			label = "AGPF-S0:green:internet";
+			gpios = <&gpio0 25 1>;
+		};
+		usr1_green {
+			label = "AGPF-S0:green:usr1";
+			gpios = <&gpio0 26 1>;
+		};
+		usr1_red {
+			label = "AGPF-S0:red:usr1";
+			gpios = <&gpio0 27 1>;
+		};
+		usr2_green {
+			label = "AGPF-S0:green:usr2";
+			gpios = <&gpio0 29 1>;
+		};
+		usr2_red {
+			label = "AGPF-S0:red:usr2";
+			gpios = <&gpio0 30 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/ar-5381u.dts b/target/linux/brcm63xx/dts/ar-5381u.dts
index 812108a..d5f728a 100644
--- a/target/linux/brcm63xx/dts/ar-5381u.dts
+++ b/target/linux/brcm63xx/dts/ar-5381u.dts
@@ -5,4 +5,36 @@ 
 / {
 	model = "Comtrend AR-5381u";
 	compatible = "comtrend,ar-5381u", "brcm,bcm6328";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 23 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		alarm_red {
+			label = "AR-5381u:red:alarm";
+			gpios = <&gpio0 2 1>;
+		};
+		inet_green {
+			label = "AR-5381u:green:inet";
+			gpios = <&gpio0 3 1>;
+		};
+		power_green {
+			label = "AR-5381u:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/ar-5387un.dts b/target/linux/brcm63xx/dts/ar-5387un.dts
index d24a655..a8883e2 100644
--- a/target/linux/brcm63xx/dts/ar-5387un.dts
+++ b/target/linux/brcm63xx/dts/ar-5387un.dts
@@ -5,4 +5,44 @@ 
 / {
 	model = "Comtrend AR-5387un";
 	compatible = "comtrend,ar-5387un", "brcm,bcm6328";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 23 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_red {
+			label = "AR-5387un:red:inet";
+			gpios = <&gpio0 1 0>;
+		};
+		power_red {
+			label = "AR-5387un:red:power";
+			gpios = <&gpio0 4 0>;
+		};
+		inet_green {
+			label = "AR-5387un:green:inet";
+			gpios = <&gpio0 7 0>;
+		};
+		power_green {
+			label = "AR-5387un:green:power";
+			gpios = <&gpio0 8 0>;
+			default-state = "on";
+		};
+		dsl_green {
+			label = "AR-5387un:green:dsl";
+			gpios = <&gpio0 11 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/ar1004g.dts b/target/linux/brcm63xx/dts/ar1004g.dts
index c5bea28a..fdd5c47 100644
--- a/target/linux/brcm63xx/dts/ar1004g.dts
+++ b/target/linux/brcm63xx/dts/ar1004g.dts
@@ -5,4 +5,36 @@ 
 / {
 	model = "ASMAX AR 1004g";
 	compatible = "asmax,ar1004g", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "AR1004G:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		inet_green {
+			label = "AR1004G:green:inet";
+			gpios = <&gpio0 3 1>;
+		};
+		power_red {
+			label = "AR1004G:red:power";
+			gpios = <&gpio0 6 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6318.dtsi b/target/linux/brcm63xx/dts/bcm6318.dtsi
index 97bdea7..c15f613 100644
--- a/target/linux/brcm63xx/dts/bcm6318.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6318.dtsi
@@ -3,6 +3,10 @@ 
 	#size-cells = <1>;
 	compatible = "brcm,bcm6318";
 
+	aliases {
+		gpio0 = &gpio0;
+	};
+
 	cpus {
 		#address-cells = <1>;
 		#size-cells = <0>;
@@ -51,5 +55,29 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <2>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000084 0x4>, <0x1000008c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
+
+		gpio1: gpio-controller@1000080 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000080 0x4>, <0x10000088 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <18>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm63268.dtsi b/target/linux/brcm63xx/dts/bcm63268.dtsi
index bc80d70..d0d9246 100644
--- a/target/linux/brcm63xx/dts/bcm63268.dtsi
+++ b/target/linux/brcm63xx/dts/bcm63268.dtsi
@@ -3,6 +3,10 @@ 
 	#size-cells = <1>;
 	compatible = "brcm,bcm63268";
 
+	aliases {
+		gpio0 = &gpio0;
+	};
+
 	cpus {
 		#address-cells = <1>;
 		#size-cells = <0>;
@@ -58,5 +62,29 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <2>, <3>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x100000c4 0x4>, <0x100000cc 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
+
+		gpio1: gpio-controller@1000080 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x100000c0 0x4>, <0x100000c8 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <20>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6328.dtsi b/target/linux/brcm63xx/dts/bcm6328.dtsi
index 53f96ff..ccb61e0 100644
--- a/target/linux/brcm63xx/dts/bcm6328.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6328.dtsi
@@ -3,6 +3,10 @@ 
 	#size-cells = <1>;
 	compatible = "brcm,bcm6328";
 
+	aliases {
+		gpio0 = &gpio0;
+	};
+
 	cpus {
 		#address-cells = <1>;
 		#size-cells = <0>;
@@ -51,5 +55,17 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <2>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000084 0x4>, <0x1000008c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6338.dtsi b/target/linux/brcm63xx/dts/bcm6338.dtsi
index c1980f4..858bcf0 100644
--- a/target/linux/brcm63xx/dts/bcm6338.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6338.dtsi
@@ -5,6 +5,7 @@ 
 
 	aliases {
 		pflash = &pflash;
+		gpio0 = &gpio0;
 	};
 
 	cpus {
@@ -65,5 +66,17 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <3>, <4>, <5>, <6>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0xfffe0404 0x4>, <0xfffe040c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <8>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6345.dtsi b/target/linux/brcm63xx/dts/bcm6345.dtsi
index e8e7016..6d7d1d6 100644
--- a/target/linux/brcm63xx/dts/bcm6345.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6345.dtsi
@@ -5,6 +5,7 @@ 
 
 	aliases {
 		pflash = &pflash;
+		gpio0 = &gpio0;
 	};
 
 	cpus {
@@ -65,5 +66,17 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <3>, <4>, <5>, <6>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0xfffe0404 0x4>, <0xfffe0408 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <16>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6348.dtsi b/target/linux/brcm63xx/dts/bcm6348.dtsi
index 7dd423b..3facb50 100644
--- a/target/linux/brcm63xx/dts/bcm6348.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6348.dtsi
@@ -5,6 +5,7 @@ 
 
 	aliases {
 		pflash = &pflash;
+		gpio0 = &gpio0;
 	};
 
 	cpus {
@@ -67,5 +68,29 @@ 
 
 			brcm,field-width = <5>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0xfffe0404 0x4>, <0xfffe040c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
+
+		gpio1: gpio-controller@1000080 {
+			compatible = "basic-mmio-gpio";
+			reg = <0xfffe0400 0x4>, <0xfffe0408 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <5>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6358.dtsi b/target/linux/brcm63xx/dts/bcm6358.dtsi
index 7217b8d..711b7de 100644
--- a/target/linux/brcm63xx/dts/bcm6358.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6358.dtsi
@@ -5,6 +5,7 @@ 
 
 	aliases {
 		pflash = &pflash;
+		gpio0 = &gpio0;
 	};
 
 	cpus {
@@ -83,5 +84,29 @@ 
 			interrupt-parent = <&periph_intc>;
 			interrupts = <20>, <21>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0xfffe0084 0x4>, <0xfffe008c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
+
+		gpio1: gpio-controller@1000080 {
+			compatible = "basic-mmio-gpio";
+			reg = <0xfffe0080 0x4>, <0xfffe0088 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <8>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6362.dtsi b/target/linux/brcm63xx/dts/bcm6362.dtsi
index 4e2e41d..6db82f9 100644
--- a/target/linux/brcm63xx/dts/bcm6362.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6362.dtsi
@@ -3,6 +3,10 @@ 
 	#size-cells = <1>;
 	compatible = "brcm,bcm6362";
 
+	aliases {
+		gpio0 = &gpio0;
+	};
+
 	cpus {
 		#address-cells = <1>;
 		#size-cells = <0>;
@@ -58,5 +62,29 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <2>, <3>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000084 0x4>, <0x1000008c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
+
+		gpio1: gpio-controller@1000080 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000080 0x4>, <0x10000088 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <16>;
+			byte-be;
+		};
 	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm6368.dtsi b/target/linux/brcm63xx/dts/bcm6368.dtsi
index 27b9f62..b294ccd 100644
--- a/target/linux/brcm63xx/dts/bcm6368.dtsi
+++ b/target/linux/brcm63xx/dts/bcm6368.dtsi
@@ -5,6 +5,7 @@ 
 
 	aliases {
 		pflash = &pflash;
+		gpio0 = &gpio0;
 	};
 
 	cpus {
@@ -73,6 +74,30 @@ 
 			interrupt-parent = <&cpu_intc>;
 			interrupts = <2>, <3>;
 		};
+
+		gpio0: gpio-controller@10000084 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000084 0x4>, <0x1000008c 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <32>;
+			byte-be;
+		};
+
+		gpio1: gpio-controller@1000080 {
+			compatible = "basic-mmio-gpio";
+			reg = <0x10000080 0x4>, <0x10000088 0x4>;
+			reg-names = "dirout", "dat";
+
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			num-gpios = <6>;
+			byte-be;
+		};
 	};
 
 	pflash: nor@18000000 {
diff --git a/target/linux/brcm63xx/dts/bcm963281TAN.dts b/target/linux/brcm63xx/dts/bcm963281TAN.dts
index be69997..f257125 100644
--- a/target/linux/brcm63xx/dts/bcm963281TAN.dts
+++ b/target/linux/brcm63xx/dts/bcm963281TAN.dts
@@ -5,4 +5,34 @@ 
 / {
 	model = "Broadcom bcm963281TAN reference board";
 	compatible = "brcm,bcm963281TAN", "brcm,bcm6328";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet {
+			label = "963281TAN::internet";
+			gpios = <&gpio0 1 1>;
+		};
+		power {
+			label = "963281TAN::power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		inet_fail {
+			label = "963281TAN::internet-fail";
+			gpios = <&gpio0 7 1>;
+		};
+		power_fail {
+			label = "963281TAN::power-fail";
+			gpios = <&gpio0 8 1>;
+		};
+		wps {
+			label = "963281TAN::wps";
+			gpios = <&gpio0 9 1>;
+		};
+		dsl {
+			label = "963281TAN::dsl";
+			gpios = <&gpio0 11 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96328avng.dts b/target/linux/brcm63xx/dts/bcm96328avng.dts
index 52e7daf..8dbdbda 100644
--- a/target/linux/brcm63xx/dts/bcm96328avng.dts
+++ b/target/linux/brcm63xx/dts/bcm96328avng.dts
@@ -5,4 +5,34 @@ 
 / {
 	model = "Broadcom BCM96328avng reference board";
 	compatible = "brcm,bcm96328avng", "brcm,bcm6328";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_fail {
+			label = "96328avng::internet-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		dsl {
+			label = "96328avng::dsl";
+			gpios = <&gpio0 3 1>;
+		};
+		power {
+			label = "96328avng::power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_fail {
+			label = "96328avng::power-fail";
+			gpios = <&gpio0 8 1>;
+		};
+		wps {
+			label = "96328avng::wps";
+			gpios = <&gpio0 9 1>;
+		};
+		inet {
+			label = "96328avng::internet";
+			gpios = <&gpio0 11 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96338GW.dts b/target/linux/brcm63xx/dts/bcm96338GW.dts
index 2040e2f..d378df1 100644
--- a/target/linux/brcm63xx/dts/bcm96338GW.dts
+++ b/target/linux/brcm63xx/dts/bcm96338GW.dts
@@ -5,4 +5,30 @@ 
 / {
 	model = "Broadcom BCM96338GW reference board";
 	compatible = "brcm,bcm96338gw", "brcm,bcm6338";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96338GW:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96338GW:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_green {
+			label = "96338GW:green:adsl";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96338GW:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+		ses_green {
+			label = "96338GW:green:ses";
+			gpios = <&gpio0 5 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96338W.dts b/target/linux/brcm63xx/dts/bcm96338W.dts
index 1609541..9cca783 100644
--- a/target/linux/brcm63xx/dts/bcm96338W.dts
+++ b/target/linux/brcm63xx/dts/bcm96338W.dts
@@ -5,4 +5,30 @@ 
 / {
 	model = "Broadcom BCM96338W reference board";
 	compatible = "brcm,bcm96338w", "brcm,bcm6338";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96338W:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96338W:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_green {
+			label = "96338W:green:adsl";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96338W:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+		ses_green {
+			label = "96338W:green:ses";
+			gpios = <&gpio0 5 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96348GW-10.dts b/target/linux/brcm63xx/dts/bcm96348GW-10.dts
index 172ee62..173a8c3 100644
--- a/target/linux/brcm63xx/dts/bcm96348GW-10.dts
+++ b/target/linux/brcm63xx/dts/bcm96348GW-10.dts
@@ -5,4 +5,44 @@ 
 / {
 	model = "Broadcom BCM96348GW-10 reference board";
 	compatible = "brcm,bcm96348gw-10", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 6 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348GW-10:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348GW-10:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348GW-10:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348GW-10:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348GW-10:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96348GW-11.dts b/target/linux/brcm63xx/dts/bcm96348GW-11.dts
index 906ecab..15828a1 100644
--- a/target/linux/brcm63xx/dts/bcm96348GW-11.dts
+++ b/target/linux/brcm63xx/dts/bcm96348GW-11.dts
@@ -5,4 +5,44 @@ 
 / {
 	model = "Broadcom BCM96348GW-11 reference board";
 	compatible = "brcm,bcm96348gw-11", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348GW-11:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348GW-11:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348GW-11:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348GW-11:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348GW-11:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96348GW.dts b/target/linux/brcm63xx/dts/bcm96348GW.dts
index cd039f8..fcce239 100644
--- a/target/linux/brcm63xx/dts/bcm96348GW.dts
+++ b/target/linux/brcm63xx/dts/bcm96348GW.dts
@@ -5,4 +5,44 @@ 
 / {
 	model = "Broadcom BCM96348GW reference board";
 	compatible = "brcm,bcm96348gw", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 4 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348GW:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348GW:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348GW:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348GW:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348GW:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96348R.dts b/target/linux/brcm63xx/dts/bcm96348R.dts
index 004abcb..69842b1 100644
--- a/target/linux/brcm63xx/dts/bcm96348R.dts
+++ b/target/linux/brcm63xx/dts/bcm96348R.dts
@@ -5,4 +5,30 @@ 
 / {
 	model = "Broadcom 96348R reference board";
 	compatible = "brcm,bcm96348r", "brcm,bcm6348";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348R:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348R:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348R:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348R:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348R:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96358VW.dts b/target/linux/brcm63xx/dts/bcm96358VW.dts
index a978d41..57e26f6 100644
--- a/target/linux/brcm63xx/dts/bcm96358VW.dts
+++ b/target/linux/brcm63xx/dts/bcm96358VW.dts
@@ -5,4 +5,30 @@ 
 / {
 	model = "Broadcom BCM96358VW reference board";
 	compatible = "brcm,bcm96358vw", "brcm,bcm6358";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96358VW:green:power";
+			gpios = <&gpio0 4 0>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96358VW:green:stop";
+			gpios = <&gpio0 5 0>;
+		};
+		adsl_fail_green {
+			label = "96358VW:green:adsl-fail";
+			gpios = <&gpio0 15 1>;
+		};
+		ppp_green {
+			label = "96358VW:green:ppp";
+			gpios = <&gpio0 22 1>;
+		};
+		ppp_fail_green {
+			label = "96358VW:green:ppp-fail";
+			gpios = <&gpio0 23 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96358VW2.dts b/target/linux/brcm63xx/dts/bcm96358VW2.dts
index bcf3c81..730426f 100644
--- a/target/linux/brcm63xx/dts/bcm96358VW2.dts
+++ b/target/linux/brcm63xx/dts/bcm96358VW2.dts
@@ -5,4 +5,26 @@ 
 / {
 	model = "Broadcom BCM96358VW2 reference board";
 	compatible = "brcm,bcm96358vw2", "brcm,bcm6358";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		stop_green {
+			label = "96358VW2:green:stop";
+			gpios = <&gpio0 4 1>;
+		};
+		power_green {
+			label = "96358VW2:green:power";
+			gpios = <&gpio0 5 1>;
+			default-state = "on";
+		};
+		adsl_green {
+			label = "96358VW2:green:adsl";
+			gpios = <&gpio0 22 1>;
+		};
+		ppp_fail_green {
+			label = "96358VW2:green:ppp-fail";
+			gpios = <&gpio0 23 0>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96368MVNgr.dts b/target/linux/brcm63xx/dts/bcm96368MVNgr.dts
index b274bfd..fa3e6e8 100644
--- a/target/linux/brcm63xx/dts/bcm96368MVNgr.dts
+++ b/target/linux/brcm63xx/dts/bcm96368MVNgr.dts
@@ -5,4 +5,30 @@ 
 / {
 	model = "Broadcom BCM96368MVNgr reference board";
 	compatible = "brcm,bcm96368mvngr", "brcm,bcm6368";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		dsl_green {
+			label = "96368MVNgr:green:adsl";
+			gpios = <&gpio0 2 1>;
+		};
+		inet_fail_green {
+			label = "96368MVNgr:green:inet-fail";
+			gpios = <&gpio0 3 0>;
+		};
+		inet_green {
+			label = "96368MVNgr:green:inet";
+			gpios = <&gpio0 5 0>;
+		};
+		power_green {
+			label = "96368MVNgr:green:power";
+			gpios = <&gpio0 22 0>;
+			default-state = "on";
+		};
+		wps_green {
+			label = "96368MVNgr:green:wps";
+			gpios = <&gpio0 23 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/bcm96368MVWG.dts b/target/linux/brcm63xx/dts/bcm96368MVWG.dts
index f462411..0fb3566 100644
--- a/target/linux/brcm63xx/dts/bcm96368MVWG.dts
+++ b/target/linux/brcm63xx/dts/bcm96368MVWG.dts
@@ -5,4 +5,30 @@ 
 / {
 	model = "Broadcom BCM96368MVWG reference board";
 	compatible = "brcm,bcm96368mvwg", "brcm,bcm6368";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		dsl_green {
+			label = "96368MVWG:green:adsl";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96368MVWG:green:ppp";
+			gpios = <&gpio0 5 0>;
+		};
+		power_green {
+			label = "96368MVWG:green:power";
+			gpios = <&gpio0 22 0>;
+			default-state = "on";
+		};
+		wps_green {
+			label = "96368MVWG:green:wps";
+			gpios = <&gpio0 23 1>;
+		};
+		ppp_fail_red {
+			label = "96368MVWG:red:ppp-fail";
+			gpios = <&gpio0 31 0>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/cpva642.dts b/target/linux/brcm63xx/dts/cpva642.dts
index a12dd81..c65efb4 100644
--- a/target/linux/brcm63xx/dts/cpva642.dts
+++ b/target/linux/brcm63xx/dts/cpva642.dts
@@ -5,6 +5,71 @@ 
 / {
 	model = "Telsey CPVA642-type (CPA-ZNTE60T)";
 	compatible = "telsey,cpva642", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 4 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		eth_green {
+			label = "CPVA642:green:ether";
+			gpios = <&gpio0 1 1>;
+		};
+		phone2_green {
+			label = "CPVA642:green:phone2";
+			gpios = <&gpio0 2 1>;
+		};
+		usb_green {
+			label = "CPVA642:green:usb";
+			gpios = <&gpio0 3 1>;
+		};
+		phone1_green {
+			label = "CPVA642:green:phone1";
+			gpios = <&gpio0 4 1>;
+		};
+		wifi_red {
+			label = "CPVA642:red:wifi";
+			gpios = <&gpio0 6 1>;
+		};
+		link_red {
+			label = "CPVA642:red:link";
+			gpios = <&gpio0 9 1>;
+		};
+		link_green {
+			label = "CPVA642:green:link";
+			gpios = <&gpio0 10 1>;
+		};
+		power_green {
+			label = "CPVA642:green:power";
+			gpios = <&gpio0 11 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "CPVA642:red:power";
+			gpios = <&gpio0 14 1>;
+		};
+		wifi_green {
+			label = "CPVA642:green:wifi";
+			gpios = <&gpio0 28 0>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/ct-5365.dts b/target/linux/brcm63xx/dts/ct-5365.dts
index 2ada4f8..7b89bf2 100644
--- a/target/linux/brcm63xx/dts/ct-5365.dts
+++ b/target/linux/brcm63xx/dts/ct-5365.dts
@@ -5,6 +5,48 @@ 
 / {
 	model = "Comtrend CT-5365";
 	compatible = "comtrend,ct-5365", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+		wlan {
+			label = "wlan";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0xee>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio1 3 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348A-122:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		alarm_red {
+			label = "96348A-122:red:alarm";
+			gpios = <&gpio0 2 1>;
+		};
+		wps_green {
+			label = "96348A-122:green:wps";
+			gpios = <&gpio0 6 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/ct-6373.dts b/target/linux/brcm63xx/dts/ct-6373.dts
index 1aca23a..b8be39d 100644
--- a/target/linux/brcm63xx/dts/ct-6373.dts
+++ b/target/linux/brcm63xx/dts/ct-6373.dts
@@ -5,6 +5,74 @@ 
 / {
 	model = "Comtrend CT-6373";
 	compatible = "comtrend,ct-6373", "brcm,bcm6358";
+
+	spi-gpio {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-gpio";
+
+		gpio-mosi = <&gpio0 7 0>;
+		gpio-sck = <&gpio0 6 0>;
+		num-chipselects = <0>;
+
+		hc595: gpio-spi-controller@0 {
+			compatible = "fairchild,74hc595";
+			reg = <0>;
+			registers-number = <1>;
+			spi-max-frequency = <100000>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 3 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "CT6373-1:green:power";
+			gpios = <&gpio0 0 0>;
+			default-state = "on";
+		};
+		usb_green {
+			label = "CT6373-1:green:usb";
+			gpios = <&gpio0 3 1>;
+		};
+		wlan_green {
+			label = "CT6373-1:green:wlan";
+			gpios = <&gpio0 9 1>;
+		};
+		dsl_green {
+			label = "CT6373-1:green:adsl";
+			gpios = <&hc595 0 1>;
+		};
+		line_green {
+			label = "CT6373-1:green:line";
+			gpios = <&hc595 1 1>;
+		};
+		fxs1_green {
+			label = "CT6373-1:green:fxs1";
+			gpios = <&hc595 2 1>;
+		};
+		fxs2_green {
+			label = "CT6373-1:green:fxs2";
+			gpios = <&hc595 3 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/ct536plus.dts b/target/linux/brcm63xx/dts/ct536plus.dts
index d8e2d3b..c92bc90 100644
--- a/target/linux/brcm63xx/dts/ct536plus.dts
+++ b/target/linux/brcm63xx/dts/ct536plus.dts
@@ -5,4 +5,32 @@ 
 / {
 	model = "Comtrend CT-536+/CT-5621T";
 	compatible = "comtrend,ct536+", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "CT536_CT5621:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		adsl_fail_green {
+			label = "CT536_CT5621:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/dg834gtpn.dts b/target/linux/brcm63xx/dts/dg834gtpn.dts
index 8742985..f4ece9e 100644
--- a/target/linux/brcm63xx/dts/dg834gtpn.dts
+++ b/target/linux/brcm63xx/dts/dg834gtpn.dts
@@ -5,6 +5,46 @@ 
 / {
 	model = "Netgear DG834GT/PN";
 	compatible = "netgear,dg834gtpn", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 6 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348GW-10:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348GW-10:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348GW-10:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348GW-10:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348GW-10:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/dsl-2640b-b.dts b/target/linux/brcm63xx/dts/dsl-2640b-b.dts
index efc0dc5..6f2bda6 100644
--- a/target/linux/brcm63xx/dts/dsl-2640b-b.dts
+++ b/target/linux/brcm63xx/dts/dsl-2640b-b.dts
@@ -5,6 +5,42 @@ 
 / {
 	model = "D-Link DSL-2640B rev B2";
 	compatible = "d-link,dsl-2640b-b", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 7 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "D-4P-W:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		status {
+			label = "D-4P-W::status";
+			gpios = <&gpio0 3 1>;
+		};
+		inet_green {
+			label = "D-4P-W:green:internet";
+			gpios = <&gpio0 4 1>;
+		};
+		inet_red {
+			label = "D-4P-W:red:internet";
+			gpios = <&gpio0 5 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/dsl-2650u.dts b/target/linux/brcm63xx/dts/dsl-2650u.dts
index 23b3301..7e88e01 100644
--- a/target/linux/brcm63xx/dts/dsl-2650u.dts
+++ b/target/linux/brcm63xx/dts/dsl-2650u.dts
@@ -5,6 +5,28 @@ 
 / {
 	model = "D-Link DSL-2650U";
 	compatible = "d-link,dsl-2650u", "brcm,bcm6358";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		stop_green {
+			label = "96358VW2:green:stop";
+			gpios = <&gpio0 4 1>;
+		};
+		power_green {
+			label = "96358VW2:green:power";
+			gpios = <&gpio0 5 1>;
+			default-state = "on";
+		};
+		adsl_green {
+			label = "96358VW2:green:adsl";
+			gpios = <&gpio0 22 1>;
+		};
+		ppp_fail_green {
+			label = "96358VW2:green:ppp-fail";
+			gpios = <&gpio0 23 0>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/dsl-274xb-c.dts b/target/linux/brcm63xx/dts/dsl-274xb-c.dts
index e36ddfa..df0f853 100644
--- a/target/linux/brcm63xx/dts/dsl-274xb-c.dts
+++ b/target/linux/brcm63xx/dts/dsl-274xb-c.dts
@@ -5,6 +5,46 @@ 
 / {
 	model = "D-Link DSL-2740B/DSL-2741B rev C2/3";
 	compatible = "d-link,dsl-274xb-c2", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_green {
+			label = "dsl-274xb:green:internet";
+			gpios = <&gpio0 2 1>;
+		};
+		power_red {
+			label = "dsl-274xb:red:power";
+			gpios = <&gpio0 4 1>;
+		};
+		power_green {
+			label = "dsl-274xb:green:power";
+			gpios = <&gpio0 5 1>;
+			default-state = "on";
+		};
+		dsl_green {
+			label = "dsl-274xb:green:adsl";
+			gpios = <&gpio0 9 1>;
+		};
+		inet_red {
+			label = "dsl-274xb:red:internet";
+			gpios = <&gpio0 10 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/dsl-274xb-f.dts b/target/linux/brcm63xx/dts/dsl-274xb-f.dts
index a17f988..f8ad084 100644
--- a/target/linux/brcm63xx/dts/dsl-274xb-f.dts
+++ b/target/linux/brcm63xx/dts/dsl-274xb-f.dts
@@ -5,4 +5,58 @@ 
 / {
 	model = "D-Link DSL-2740B/DSL-2741B rev F1";
 	compatible = "d-link,dsl-274xb-f", "brcm,bcm6328";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wifi {
+			label = "wifi";
+			gpios = <&gpio0 10 1>;
+			linux,code = <0xee>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio0 23 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio0 24 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_red {
+			label = "dsl-274xb:red:internet";
+			gpios = <&gpio0 2 1>;
+		};
+		dsl_green {
+			label = "dsl-274xb:green:dsl";
+			gpios = <&gpio0 3 1>;
+		};
+		power_green {
+			label = "dsl-274xb:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "dsl-274xb:red:power";
+			gpios = <&gpio0 8 1>;
+		};
+		wps_blue {
+			label = "dsl-274xb:blue:wps";
+			gpios = <&gpio0 9 1>;
+		};
+		inet_green {
+			label = "dsl-274xb:green:internet";
+			gpios = <&gpio0 11 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/dva-g3810bn_tl.dts b/target/linux/brcm63xx/dts/dva-g3810bn_tl.dts
index 20accd7..263485d 100644
--- a/target/linux/brcm63xx/dts/dva-g3810bn_tl.dts
+++ b/target/linux/brcm63xx/dts/dva-g3810bn_tl.dts
@@ -5,4 +5,44 @@ 
 / {
 	model = "D-Link DVA-G3810BN/TL";
 	compatible = "d-link,dva-g3810bn/tl", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		voip {
+			label = "DVAG3810BN::voip";
+			gpios = <&gpio0 1 0>;
+		};
+		power {
+			label = "DVAG3810BN::power";
+			gpios = <&gpio0 4 0>;
+			default-state = "on";
+		};
+		stop {
+			label = "DVAG3810BN::stop";
+			gpios = <&gpio0 5 0>;
+		};
+		dsl {
+			label = "DVAG3810BN::dsl";
+			gpios = <&gpio0 22 1>;
+		};
+		inet {
+			label = "DVAG3810BN::internet";
+			gpios = <&gpio0 23 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/f5d7633.dts b/target/linux/brcm63xx/dts/f5d7633.dts
index 9393413..81e1e25 100644
--- a/target/linux/brcm63xx/dts/f5d7633.dts
+++ b/target/linux/brcm63xx/dts/f5d7633.dts
@@ -5,6 +5,46 @@ 
 / {
 	model = "Belkin F5D7633";
 	compatible = "belkin,f5d7633", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 6 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348GW-10:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348GW-10:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348GW-10:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348GW-10:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348GW-10:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/fast2504n.dts b/target/linux/brcm63xx/dts/fast2504n.dts
index 2f202a3..a3bb927 100644
--- a/target/linux/brcm63xx/dts/fast2504n.dts
+++ b/target/linux/brcm63xx/dts/fast2504n.dts
@@ -5,4 +5,53 @@ 
 / {
 	model = "Sagem F@ST2504n";
 	compatible = "sagem,f@st2504n", "brcm,bcm6362";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 24 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio0 25 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_orange {
+			label = "fast2504n:orange:power";
+			gpios = <&gpio0 2 1>;
+		};
+		power_green {
+			label = "fast2504n:green:power";
+			gpios = <&gpio0 10 1>;
+			default-state = "on";
+		};
+		inet_red {
+			label = "fast2504n:red:internet";
+			gpios = <&gpio0 26 1>;
+		};
+		ok_green {
+			label = "fast2504n:green:ok";
+			gpios = <&gpio0 28 1>;
+		};
+		ok_orange {
+			label = "fast2504n:orange:ok";
+			gpios = <&gpio0 29 1>;
+		};
+		wlan_orangee {
+			label = "fast2504n:orange:wlan";
+			gpios = <&gpio0 30 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/fast2604.dts b/target/linux/brcm63xx/dts/fast2604.dts
index 5dcaa55..b5bc487 100644
--- a/target/linux/brcm63xx/dts/fast2604.dts
+++ b/target/linux/brcm63xx/dts/fast2604.dts
@@ -5,6 +5,42 @@ 
 / {
 	model = "Sagem F@ST2604";
 	compatible = "sagem,f@st2604", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "F@ST2604:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "F@ST2604:red:power";
+			gpios = <&gpio0 1 1>;
+		};
+		inet_red {
+			label = "F@ST2604:red:inet";
+			gpios = <&gpio0 4 1>;
+		};
+		wps_green {
+			label = "F@ST2604:green:wps";
+			gpios = <&gpio0 5 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/fast2704v2.dts b/target/linux/brcm63xx/dts/fast2704v2.dts
index f001b77..053ad35 100644
--- a/target/linux/brcm63xx/dts/fast2704v2.dts
+++ b/target/linux/brcm63xx/dts/fast2704v2.dts
@@ -5,4 +5,62 @@ 
 / {
 	model = "Sagem F@ST2704V2";
 	compatible = "sagem,f@st2704v2", "brcm,bcm6328";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		rfkill {
+			label = "rfkill";
+			gpios = <&gpio0 15 1>;
+			linux,code = <0xee>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio0 23 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio0 24 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		usb_green {
+			label = "F@ST2704V2:green:usb";
+			gpios = <&gpio0 1 1>;
+		};
+		inet_red {
+			label = "F@ST2704V2:red:inet";
+			gpios = <&gpio0 2 1>;
+		};
+		dsl_green {
+			label = "F@ST2704V2:green:dsl";
+			gpios = <&gpio0 3 1>;
+		};
+		power_green {
+			label = "F@ST2704V2:green:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "F@ST2704V2:red:power";
+			gpios = <&gpio0 5 1>;
+		};
+		wps_green {
+			label = "F@ST2704V2:green:wps";
+			gpios = <&gpio0 10 1>;
+		};
+		inet_green {
+			label = "F@ST2704V2:green:inet";
+			gpios = <&gpio0 11 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/gw6000.dts b/target/linux/brcm63xx/dts/gw6000.dts
index f0b5c54..a9f8028 100644
--- a/target/linux/brcm63xx/dts/gw6000.dts
+++ b/target/linux/brcm63xx/dts/gw6000.dts
@@ -5,4 +5,18 @@ 
 / {
 	model = "TECOM GW6000";
 	compatible = "tecom,gw6000", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 4 1>;
+			linux,code = <0x198>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/gw6200.dts b/target/linux/brcm63xx/dts/gw6200.dts
index 4165030..2ffdf96 100644
--- a/target/linux/brcm63xx/dts/gw6200.dts
+++ b/target/linux/brcm63xx/dts/gw6200.dts
@@ -5,4 +5,39 @@ 
 / {
 	model = "TECOM GW6200";
 	compatible = "tecom,gw6200", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 4 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		line1_green {
+			label = "GW6200:green:line1";
+			gpios = <&gpio0 4 1>;
+		};
+		line2_green {
+			label = "GW6200:green:line2";
+			gpios = <&gpio0 5 1>;
+		};
+		line3_green {
+			label = "GW6200:green:line3";
+			gpios = <&gpio0 6 1>;
+		};
+		tel_green {
+			label = "GW6200:green:tel";
+			gpios = <&gpio0 7 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/hg520v.dts b/target/linux/brcm63xx/dts/hg520v.dts
index bc8af33..88647fa 100644
--- a/target/linux/brcm63xx/dts/hg520v.dts
+++ b/target/linux/brcm63xx/dts/hg520v.dts
@@ -5,6 +5,29 @@ 
 / {
 	model = "Huawei EchoLife HG520v";
 	compatible = "huawei,hg520v", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_green {
+			label = "HW520:green:net";
+			gpios = <&gpio1 0 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/hg553.dts b/target/linux/brcm63xx/dts/hg553.dts
index 75fec8b..140e2de 100644
--- a/target/linux/brcm63xx/dts/hg553.dts
+++ b/target/linux/brcm63xx/dts/hg553.dts
@@ -5,6 +5,48 @@ 
 / {
 	model = "Huawei EchoLife HG553";
 	compatible = "huawei,hg553", "brcm,bcm6358";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "HW553:blue:power";
+			gpios = <&gpio0 4 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "HW553:red:power";
+			gpios = <&gpio0 5 1>;
+		};
+		hspa_red {
+			label = "HW553:red:hspa";
+			gpios = <&gpio0 12 1>;
+		};
+		hspa_blue {
+			label = "HW553:blue:hspa";
+			gpios = <&gpio0 13 1>;
+		};
+		lan_red {
+			label = "HW553:red:lan";
+			gpios = <&gpio0 22 1>;
+		};
+		lan_blue {
+			label = "HW553:blue:lan";
+			gpios = <&gpio0 23 1>;
+		};
+		wifi_red {
+			label = "HW553:red:wifi";
+			gpios = <&gpio0 25 1>;
+		};
+		dsl_red {
+			label = "HW553:red:adsl";
+			gpios = <&gpio1 2 1>;
+		};
+		dsl_blue {
+			label = "HW553:blue:adsl";
+			gpios = <&gpio1 3 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/hg556a-a.dts b/target/linux/brcm63xx/dts/hg556a-a.dts
index bf43571..70f10dc 100644
--- a/target/linux/brcm63xx/dts/hg556a-a.dts
+++ b/target/linux/brcm63xx/dts/hg556a-a.dts
@@ -5,6 +5,94 @@ 
 / {
 	model = "Huawei EchoLife HG556a (version A)";
 	compatible = "huawei,hg556a-a", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		help {
+			label = "help";
+			gpios = <&gpio0 8 1>;
+			linux,code = <0x8a>;
+		};
+		wlan {
+			label = "wlan";
+			gpios = <&gpio0 9 1>;
+			linux,code = <0xee>;
+		};
+		restart {
+			label = "restart";
+			gpios = <&gpio0 10 1>;
+			linux,code = <0x198>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio0 11 1>;
+			linux,code = <0xab>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		message_red {
+			label = "HW556:red:message";
+			gpios = <&gpio0 0 1>;
+		};
+		hspa_red {
+			label = "HW556:red:hspa";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_red {
+			label = "HW556:red:dsl";
+			gpios = <&gpio0 2 1>;
+		};
+		power_red {
+			label = "HW556:red:power";
+			gpios = <&gpio0 3 1>;
+			default-state = "on";
+		};
+		all_red {
+			label = "HW556:red:all";
+			gpios = <&gpio0 6 1>;
+			default-state = "on";
+		};
+		lan1_green {
+			label = "HW556:green:lan1";
+			gpios = <&gpio0 12 1>;
+		};
+		lan1_red {
+			label = "HW556:red:lan1";
+			gpios = <&gpio0 13 1>;
+		};
+		lan2_green {
+			label = "HW556:green:lan2";
+			gpios = <&gpio0 15 1>;
+		};
+		lan2_red {
+			label = "HW556:red:lan2";
+			gpios = <&gpio0 22 1>;
+		};
+		lan3_green {
+			label = "HW556:green:lan3";
+			gpios = <&gpio0 23 1>;
+		};
+		lan3_red {
+			label = "HW556:red:lan3";
+			gpios = <&gpio0 26 1>;
+		};
+		lan4_green {
+			label = "HW556:green:lan4";
+			gpios = <&gpio0 27 1>;
+		};
+		lan4_red {
+			label = "HW556:red:lan4";
+			gpios = <&gpio0 28 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/hg556a-b.dts b/target/linux/brcm63xx/dts/hg556a-b.dts
index 6d218c2..b42e86f 100644
--- a/target/linux/brcm63xx/dts/hg556a-b.dts
+++ b/target/linux/brcm63xx/dts/hg556a-b.dts
@@ -5,6 +5,94 @@ 
 / {
 	model = "Huawei EchoLife HG556a (version B)";
 	compatible = "huawei,hg556a-b", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		help {
+			label = "help";
+			gpios = <&gpio0 8 1>;
+			linux,code = <0x8a>;
+		};
+		wlan {
+			label = "wlan";
+			gpios = <&gpio0 9 1>;
+			linux,code = <0xee>;
+		};
+		restart {
+			label = "restart";
+			gpios = <&gpio0 10 1>;
+			linux,code = <0x198>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio0 11 1>;
+			linux,code = <0xab>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		message_red {
+			label = "HW556:red:message";
+			gpios = <&gpio0 0 1>;
+		};
+		hspa_red {
+			label = "HW556:red:hspa";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_red {
+			label = "HW556:red:dsl";
+			gpios = <&gpio0 2 1>;
+		};
+		power_red {
+			label = "HW556:red:power";
+			gpios = <&gpio0 3 1>;
+			default-state = "on";
+		};
+		all_red {
+			label = "HW556:red:all";
+			gpios = <&gpio0 6 1>;
+			default-state = "on";
+		};
+		lan1_green {
+			label = "HW556:green:lan1";
+			gpios = <&gpio0 12 1>;
+		};
+		lan1_red {
+			label = "HW556:red:lan1";
+			gpios = <&gpio0 13 1>;
+		};
+		lan2_green {
+			label = "HW556:green:lan2";
+			gpios = <&gpio0 15 1>;
+		};
+		lan2_red {
+			label = "HW556:red:lan2";
+			gpios = <&gpio0 22 1>;
+		};
+		lan3_green {
+			label = "HW556:green:lan3";
+			gpios = <&gpio0 23 1>;
+		};
+		lan3_red {
+			label = "HW556:red:lan3";
+			gpios = <&gpio0 26 1>;
+		};
+		lan4_green {
+			label = "HW556:green:lan4";
+			gpios = <&gpio0 27 1>;
+		};
+		lan4_red {
+			label = "HW556:red:lan4";
+			gpios = <&gpio0 28 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/hg556a-c.dts b/target/linux/brcm63xx/dts/hg556a-c.dts
index a5bccda..4c845ed 100644
--- a/target/linux/brcm63xx/dts/hg556a-c.dts
+++ b/target/linux/brcm63xx/dts/hg556a-c.dts
@@ -5,6 +5,89 @@ 
 / {
 	model = "Huawei EchoLife HG556a (version C)";
 	compatible = "huawei,hg556a-c", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		help {
+			label = "help";
+			gpios = <&gpio0 8 1>;
+			linux,code = <0x8a>;
+		};
+		wlan {
+			label = "wlan";
+			gpios = <&gpio0 9 1>;
+			linux,code = <0xee>;
+		};
+		restart {
+			label = "restart";
+			gpios = <&gpio0 10 1>;
+			linux,code = <0x198>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio0 11 1>;
+			linux,code = <0xab>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		lan1_green {
+			label = "HW556:green:lan1";
+			gpios = <&gpio0 0 1>;
+		};
+		lan2_green {
+			label = "HW556:green:lan2";
+			gpios = <&gpio0 1 1>;
+		};
+		dsl_red {
+			label = "HW556:red:dsl";
+			gpios = <&gpio0 2 1>;
+		};
+		power_red {
+			label = "HW556:red:power";
+			gpios = <&gpio0 3 1>;
+			default-state = "on";
+		};
+		message_red {
+			label = "HW556:red:message";
+			gpios = <&gpio0 12 1>;
+		};
+		lan1_red {
+			label = "HW556:red:lan1";
+			gpios = <&gpio0 13 1>;
+		};
+		hspa_red {
+			label = "HW556:red:hspa";
+			gpios = <&gpio0 15 1>;
+		};
+		lan2_red {
+			label = "HW556:red:lan2";
+			gpios = <&gpio0 22 1>;
+		};
+		lan3_green {
+			label = "HW556:green:lan3";
+			gpios = <&gpio0 23 1>;
+		};
+		lan3_red {
+			label = "HW556:red:lan3";
+			gpios = <&gpio0 26 1>;
+		};
+		lan4_green {
+			label = "HW556:green:lan4";
+			gpios = <&gpio0 27 1>;
+		};
+		lan4_red {
+			label = "HW556:red:lan4";
+			gpios = <&gpio0 28 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/nb4-fxc-r1.dts b/target/linux/brcm63xx/dts/nb4-fxc-r1.dts
index e04845f..0e9cc24 100644
--- a/target/linux/brcm63xx/dts/nb4-fxc-r1.dts
+++ b/target/linux/brcm63xx/dts/nb4-fxc-r1.dts
@@ -5,4 +5,94 @@ 
 / {
 	model = "SFR Neuf Box 4 (Foxconn)";
 	compatible = "sfr,nb4-fxc-r1", "brcm,bcm6358";
+
+	spi-gpio {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-gpio";
+
+		gpio-mosi = <&gpio0 7 0>;
+		gpio-sck = <&gpio0 6 0>;
+		num-chipselects = <0>;
+
+		hc595: gpio-spi-controller@0 {
+			compatible = "fairchild,74hc595";
+			reg = <0>;
+			registers-number = <1>;
+			spi-max-frequency = <100000>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		service {
+			label = "service";
+			gpios = <&gpio0 27 1>;
+			linux,code = <0x100>;
+		};
+		clip {
+			label = "clip";
+			gpios = <&gpio0 31 1>;
+			linux,code = <0x101>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		traffic_white {
+			label = "NB4-FXC-r1:white:traffic";
+			gpios = <&gpio0 2 0>;
+		};
+		service_blue {
+			label = "NB4-FXC-r1:blue:service";
+			gpios = <&gpio0 4 0>;
+		};
+		wifi_white {
+			label = "NB4-FXC-r1:white:wifi";
+			gpios = <&gpio0 15 0>;
+		};
+		service_red {
+			label = "NB4-FXC-r1:red:service";
+			gpios = <&gpio0 29 0>;
+		};
+		service_green {
+			label = "NB4-FXC-r1:green:service";
+			gpios = <&gpio0 30 0>;
+		};
+		alarm_white {
+			label = "NB4-FXC-r1:white:alarm";
+			gpios = <&hc595 0 1>;
+		};
+		tv_white {
+			label = "NB4-FXC-r1:white:tv";
+			gpios = <&hc595 2 1>;
+		};
+		tel_white {
+			label = "NB4-FXC-r1:white:tel";
+			gpios = <&hc595 3 1>;
+		};
+		adsl_white {
+			label = "NB4-FXC-r0:white:adsl";
+			gpios = <&hc595 4 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/nb4-ser-r0.dts b/target/linux/brcm63xx/dts/nb4-ser-r0.dts
index 9b82ccd..d7abbf1 100644
--- a/target/linux/brcm63xx/dts/nb4-ser-r0.dts
+++ b/target/linux/brcm63xx/dts/nb4-ser-r0.dts
@@ -5,4 +5,94 @@ 
 / {
 	model = "SFR Neuf Box 4 (Sercomm)";
 	compatible = "sfr,nb4-ser-r0", "brcm,bcm6358";
+
+	spi-gpio {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-gpio";
+
+		gpio-mosi = <&gpio0 7 0>;
+		gpio-sck = <&gpio0 6 0>;
+		num-chipselects = <0>;
+
+		hc595: gpio-spi-controller@0 {
+			compatible = "fairchild,74hc595";
+			reg = <0>;
+			registers-number = <1>;
+			spi-max-frequency = <100000>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		service {
+			label = "service";
+			gpios = <&gpio0 27 1>;
+			linux,code = <0x100>;
+		};
+		clip {
+			label = "clip";
+			gpios = <&gpio0 31 1>;
+			linux,code = <0x101>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		traffic_white {
+			label = "NB4-SER-r0:white:traffic";
+			gpios = <&gpio0 2 1>;
+		};
+		service_blue {
+			label = "NB4-SER-r0:blue:service";
+			gpios = <&gpio0 4 1>;
+		};
+		wifi_white {
+			label = "NB4-SER-r0:white:wifi";
+			gpios = <&gpio0 15 1>;
+		};
+		service_red {
+			label = "NB4-SER-r0:red:service";
+			gpios = <&gpio0 29 1>;
+		};
+		service_green {
+			label = "NB4-SER-r0:green:service";
+			gpios = <&gpio0 30 1>;
+		};
+		alarm_white {
+			label = "NB4-SER-r0:white:alarm";
+			gpios = <&hc595 0 1>;
+		};
+		tv_white {
+			label = "NB4-SER-r0:white:tv";
+			gpios = <&hc595 2 1>;
+		};
+		tel_white {
+			label = "NB4-SER-r0:white:tel";
+			gpios = <&hc595 3 1>;
+		};
+		adsl_white {
+			label = "NB4-SER-r0:white:adsl";
+			gpios = <&hc595 4 1>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/nb6-ser-r0.dts b/target/linux/brcm63xx/dts/nb6-ser-r0.dts
index ea3b1fa..ae16ad3 100644
--- a/target/linux/brcm63xx/dts/nb6-ser-r0.dts
+++ b/target/linux/brcm63xx/dts/nb6-ser-r0.dts
@@ -5,4 +5,33 @@ 
 / {
 	model = "SFR neufbox 6 (Sercomm)";
 	compatible = "sfr,nb6-ser-r0", "brcm,bcm6362";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		service {
+			label = "service";
+			gpios = <&gpio0 10 1>;
+			linux,code = <0x100>;
+		};
+		wlan {
+			label = "wlan";
+			gpios = <&gpio0 12 1>;
+			linux,code = <0xee>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio0 24 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio0 25 1>;
+			linux,code = <0x211>;
+		};
+	};
 };
diff --git a/target/linux/brcm63xx/dts/p870hw-51a-v2.dts b/target/linux/brcm63xx/dts/p870hw-51a-v2.dts
index 916dd4a..077e348 100644
--- a/target/linux/brcm63xx/dts/p870hw-51a-v2.dts
+++ b/target/linux/brcm63xx/dts/p870hw-51a-v2.dts
@@ -5,6 +5,51 @@ 
 / {
 	model = "Zyxel P870HW-51a v2";
 	compatible = "zyxel,p870hw-51a-v2", "brcm,bcm6368";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio1 3 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "P870HW-51a:green:power";
+			gpios = <&gpio0 0 0>;
+			default-state = "on";
+		};
+		dsl_green {
+			label = "P870HW-51a:green:dsl";
+			gpios = <&gpio0 2 1>;
+		};
+		inet_green {
+			label = "P870HW-51a:green:inet";
+			gpios = <&gpio0 22 1>;
+		};
+		wps_orange {
+			label = "P870HW-51a:orange:wps";
+			gpios = <&gpio0 24 1>;
+		};
+		inet_red {
+			label = "P870HW-51a:red:inet";
+			gpios = <&gpio1 1 0>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/rg100a.dts b/target/linux/brcm63xx/dts/rg100a.dts
index df628dc..824b5e4 100644
--- a/target/linux/brcm63xx/dts/rg100a.dts
+++ b/target/linux/brcm63xx/dts/rg100a.dts
@@ -5,6 +5,28 @@ 
 / {
 	model = "Alcatel RG100A";
 	compatible = "alcatel,rg100a", "brcm,bcm6358";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		stop_green {
+			label = "96358VW2:green:stop";
+			gpios = <&gpio0 4 1>;
+		};
+		power_green {
+			label = "96358VW2:green:power";
+			gpios = <&gpio0 5 1>;
+			default-state = "on";
+		};
+		adsl_green {
+			label = "96358VW2:green:adsl";
+			gpios = <&gpio0 22 1>;
+		};
+		ppp_fail_green {
+			label = "96358VW2:green:ppp-fail";
+			gpios = <&gpio0 23 0>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/spw303v.dts b/target/linux/brcm63xx/dts/spw303v.dts
index 664ad7b..ed3c322 100644
--- a/target/linux/brcm63xx/dts/spw303v.dts
+++ b/target/linux/brcm63xx/dts/spw303v.dts
@@ -5,6 +5,55 @@ 
 / {
 	model = "T-Com Speedport W303 V";
 	compatible = "t-com,spw303v", "brcm,bcm6358";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 11 0>;
+			linux,code = <0x198>;
+		};
+		ses {
+			label = "ses";
+			gpios = <&gpio1 5 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		ses_green {
+			label = "spw303v:green:ses";
+			gpios = <&gpio0 0 1>;
+		};
+		power_adsl_red {
+			label = "spw303v:red:power+adsl";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "spw303v:green:ppp";
+			gpios = <&gpio0 5 1>;
+		};
+		power_adsl_green {
+			label = "spw303v:green:power+adsl";
+			gpios = <&gpio0 22 1>;
+			default-state = "on";
+		};
+		voip_green {
+			label = "spw303v:green:voip";
+			gpios = <&gpio0 27 1>;
+		};
+		pots_green {
+			label = "spw303v:green:pots";
+			gpios = <&gpio0 31 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/spw500v.dts b/target/linux/brcm63xx/dts/spw500v.dts
index d9ac629..9c1feff 100644
--- a/target/linux/brcm63xx/dts/spw500v.dts
+++ b/target/linux/brcm63xx/dts/spw500v.dts
@@ -5,6 +5,46 @@ 
 / {
 	model = "T-Com Speedport W500 V";
 	compatible = "t-com,spw500v", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "SPW500V:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		power_red {
+			label = "SPW500V:red:power";
+			gpios = <&gpio0 1 1>;
+		};
+		ppp_green {
+			label = "SPW500V:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		pstn_green {
+			label = "SPW500V:green:pstn";
+			gpios = <&gpio0 28 1>;
+		};
+		voip_green {
+			label = "SPW500V:green:voip";
+			gpios = <&gpio1 0 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/td-w8900gb.dts b/target/linux/brcm63xx/dts/td-w8900gb.dts
index c8ff50c..74fef37 100644
--- a/target/linux/brcm63xx/dts/td-w8900gb.dts
+++ b/target/linux/brcm63xx/dts/td-w8900gb.dts
@@ -5,6 +5,46 @@ 
 / {
 	model = "TP-Link TD-W8900GB";
 	compatible = "tp-link,td-w8900gb", "brcm,bcm6348";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "96348GW-11:green:power";
+			gpios = <&gpio0 0 1>;
+			default-state = "on";
+		};
+		stop_green {
+			label = "96348GW-11:green:stop";
+			gpios = <&gpio0 1 1>;
+		};
+		adsl_fail_green {
+			label = "96348GW-11:green:adsl-fail";
+			gpios = <&gpio0 2 1>;
+		};
+		ppp_green {
+			label = "96348GW-11:green:ppp";
+			gpios = <&gpio0 3 1>;
+		};
+		ppp_fail_green {
+			label = "96348GW-11:green:ppp-fail";
+			gpios = <&gpio0 4 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/usr9108.dts b/target/linux/brcm63xx/dts/usr9108.dts
index 40d7e1c..b50d597 100644
--- a/target/linux/brcm63xx/dts/usr9108.dts
+++ b/target/linux/brcm63xx/dts/usr9108.dts
@@ -5,6 +5,19 @@ 
 / {
 	model = "USRobotics 9108";
 	compatible = "usr,9108", "brcm,bcm6348";
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		usb {
+			label = "96348GW-A::usb";
+			gpios = <&gpio0 0 1>;
+		};
+		dsl {
+			label = "96348GW-A::adsl";
+			gpios = <&gpio0 3 1>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/vr-3025u.dts b/target/linux/brcm63xx/dts/vr-3025u.dts
index 86fde1c..a48b8f9 100644
--- a/target/linux/brcm63xx/dts/vr-3025u.dts
+++ b/target/linux/brcm63xx/dts/vr-3025u.dts
@@ -5,6 +5,62 @@ 
 / {
 	model = "Comtrend VR-3025u";
 	compatible = "comtrend,vr-3025u", "brcm,bcm6368";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		dsl_green {
+			label = "VR-3025u:green:dsl";
+			gpios = <&gpio0 2 1>;
+		};
+		inet_green {
+			label = "VR-3025u:green:inet";
+			gpios = <&gpio0 5 0>;
+		};
+		lan1_green {
+			label = "VR-3025u:green:lan1";
+			gpios = <&gpio0 6 1>;
+		};
+		lan2_green {
+			label = "VR-3025u:green:lan2";
+			gpios = <&gpio0 7 1>;
+		};
+		lan3_green {
+			label = "VR-3025u:green:lan3";
+			gpios = <&gpio0 8 1>;
+		};
+		lan4_green {
+			label = "VR-3025u:green:lan4";
+			gpios = <&gpio0 9 1>;
+		};
+		power_green {
+			label = "VR-3025u:green:power";
+			gpios = <&gpio0 22 0>;
+			default-state = "on";
+		};
+		power_red {
+			label = "VR-3025u:red:power";
+			gpios = <&gpio0 24 0>;
+		};
+		inet_red {
+			label = "VR-3025u:red:inet";
+			gpios = <&gpio0 31 0>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/vr-3025un.dts b/target/linux/brcm63xx/dts/vr-3025un.dts
index 6fc0c2a..8dfec31 100644
--- a/target/linux/brcm63xx/dts/vr-3025un.dts
+++ b/target/linux/brcm63xx/dts/vr-3025un.dts
@@ -5,6 +5,62 @@ 
 / {
 	model = "Comtrend VR-3025un";
 	compatible = "comtrend,vr-3025un", "brcm,bcm6368";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		dsl_green {
+			label = "VR-3025un:green:dsl";
+			gpios = <&gpio0 2 1>;
+		};
+		inet_green {
+			label = "VR-3025un:green:inet";
+			gpios = <&gpio0 5 0>;
+		};
+		lan1_green {
+			label = "VR-3025un:green:lan1";
+			gpios = <&gpio0 6 1>;
+		};
+		lan2_green {
+			label = "VR-3025un:green:lan2";
+			gpios = <&gpio0 7 1>;
+		};
+		lan3_green {
+			label = "VR-3025un:green:lan3";
+			gpios = <&gpio0 8 1>;
+		};
+		iptv_green {
+			label = "VR-3025un:green:iptv";
+			gpios = <&gpio0 9 1>;
+		};
+		power_green {
+			label = "VR-3025un:green:power";
+			gpios = <&gpio0 22 0>;
+			default-state = "on";
+		};
+		power_red {
+			label = "VR-3025un:red:power";
+			gpios = <&gpio0 24 0>;
+		};
+		inet_red {
+			label = "VR-3025un:red:inet";
+			gpios = <&gpio0 31 0>;
+		};
+	};
 };
 
 &pflash {
diff --git a/target/linux/brcm63xx/dts/wap-5813n.dts b/target/linux/brcm63xx/dts/wap-5813n.dts
index 29b85a2..0d168d2 100644
--- a/target/linux/brcm63xx/dts/wap-5813n.dts
+++ b/target/linux/brcm63xx/dts/wap-5813n.dts
@@ -5,6 +5,56 @@ 
 / {
 	model = "Comtrend WAP-5813n";
 	compatible = "comtrend,wap-5813n", "brcm,bcm6368";
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+		debounce-interval = <60>;
+
+		wlan {
+			label = "wlan";
+			gpios = <&gpio1 0 1>;
+			linux,code = <0xee>;
+		};
+		reset {
+			label = "reset";
+			gpios = <&gpio1 2 1>;
+			linux,code = <0x198>;
+		};
+		wps {
+			label = "wps";
+			gpios = <&gpio1 1 1>;
+			linux,code = <0x211>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		inet_green {
+			label = "WAP-5813n:green:inet";
+			gpios = <&gpio0 5 0>;
+		};
+		power_green {
+			label = "WAP-5813n:green:power";
+			gpios = <&gpio0 22 0>;
+			default-state = "on";
+		};
+		wps_green {
+			label = "WAP-5813n:green:wps";
+			gpios = <&gpio0 23 1>;
+		};
+		power_red {
+			label = "WAP-5813n:red:power";
+			gpios = <&gpio0 24 0>;
+		};
+		inet_red {
+			label = "WAP-5813n:red:inet";
+			gpios = <&gpio0 31 0>;
+		};
+	};
 };
 
 &pflash {