From 1c23a45a8579a61e11693139122f37d0275d3426 Mon Sep 17 00:00:00 2001
From: blogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Tue, 17 Sep 2013 21:45:44 +0000
Subject: [PATCH] ralink: add pinctrl driver

Signed-off-by: John Crispin <blogic@openwrt.org>

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@38026 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 target/linux/ramips/dts/3G-6200N.dts          |   25 +-
 target/linux/ramips/dts/3G-6200NL.dts         |   25 +-
 target/linux/ramips/dts/3G300M.dts            |   29 +-
 target/linux/ramips/dts/AIR3GII.dts           |   20 +-
 target/linux/ramips/dts/ALL0239-3G.dts        |   25 +-
 target/linux/ramips/dts/ALL0256N-4M.dts       |   20 +-
 target/linux/ramips/dts/ALL0256N-8M.dts       |   20 +-
 target/linux/ramips/dts/ALL5002.dts           |   21 +-
 target/linux/ramips/dts/ALL5003.dts           |   21 +-
 target/linux/ramips/dts/ARGUS_ATP52B.dts      |   25 +-
 target/linux/ramips/dts/ASL26555-16M.dts      |   21 +-
 target/linux/ramips/dts/ASL26555-8M.dts       |   21 +-
 target/linux/ramips/dts/AWM002-4M.dtsi        |    1 -
 target/linux/ramips/dts/AWM002-8M.dtsi        |    1 -
 target/linux/ramips/dts/AWM002.dtsi           |   25 +-
 target/linux/ramips/dts/BC2.dts               |   26 +-
 target/linux/ramips/dts/BR-6425.dts           |   25 +-
 target/linux/ramips/dts/BROADWAY.dts          |   25 +-
 target/linux/ramips/dts/CARAMBOLA.dts         |   26 +-
 target/linux/ramips/dts/D105.dts              |   26 +-
 target/linux/ramips/dts/DAP-1350.dts          |   25 +-
 target/linux/ramips/dts/DIR-300-B1.dts        |   25 +-
 target/linux/ramips/dts/DIR-600-B1.dts        |   24 +-
 target/linux/ramips/dts/DIR-600-B2.dts        |   24 +-
 target/linux/ramips/dts/DIR-610-A1.dts        |   27 +-
 target/linux/ramips/dts/DIR-615-D.dts         |   25 +-
 target/linux/ramips/dts/DIR-615-H1.dts        |   32 +-
 target/linux/ramips/dts/DIR-620-A1.dts        |   25 +-
 target/linux/ramips/dts/DIR-620-D1.dts        |   33 +-
 target/linux/ramips/dts/DIR-645.dts           |   28 +-
 target/linux/ramips/dts/DIR-810L.dts          |   24 +-
 target/linux/ramips/dts/ESR-9753.dts          |   25 +-
 target/linux/ramips/dts/F5D8235_V1.dts        |   16 +-
 target/linux/ramips/dts/F5D8235_V2.dts        |   26 +-
 target/linux/ramips/dts/F7C027.dts            |   20 +-
 target/linux/ramips/dts/FONERA20N.dts         |   25 +-
 target/linux/ramips/dts/FREESTATION5.dts      |   24 +-
 target/linux/ramips/dts/HG255D.dts            |   24 +-
 target/linux/ramips/dts/HW550-3G.dts          |   26 +-
 target/linux/ramips/dts/IP2202.dts            |   27 +-
 target/linux/ramips/dts/M3.dts                |   22 +-
 target/linux/ramips/dts/M4-4M.dts             |   26 +-
 target/linux/ramips/dts/M4-8M.dts             |   21 +-
 target/linux/ramips/dts/MOFI3500-3GN.dts      |   22 +-
 target/linux/ramips/dts/MPRA1.dts             |   25 +-
 target/linux/ramips/dts/MPRA2.dts             |   25 +-
 target/linux/ramips/dts/MT7620a.dts           |   24 +-
 target/linux/ramips/dts/MT7620a_MT7610e.dts   |    7 +-
 target/linux/ramips/dts/MZK-W300NH2.dts       |   25 +-
 target/linux/ramips/dts/NBG-419N.dts          |   24 +-
 target/linux/ramips/dts/NW718.dts             |   25 +-
 target/linux/ramips/dts/OMNI-EMB-HPM.dts      |   30 +-
 target/linux/ramips/dts/OMNI-EMB.dts          |   24 +-
 target/linux/ramips/dts/PSR-680W.dts          |   25 +-
 target/linux/ramips/dts/PWH2004.dts           |   25 +-
 target/linux/ramips/dts/RP-N53.dts            |   28 +-
 target/linux/ramips/dts/RT-G32-B1.dts         |   24 +-
 target/linux/ramips/dts/RT-N10-PLUS.dts       |   21 -
 target/linux/ramips/dts/RT-N13U.dts           |   24 +-
 target/linux/ramips/dts/RT-N15.dts            |    4 -
 target/linux/ramips/dts/RTN56U.dts            |   35 +-
 target/linux/ramips/dts/SL-R7205.dts          |   24 +-
 target/linux/ramips/dts/TEW-691GR.dts         |   25 +-
 target/linux/ramips/dts/TEW-692GR.dts         |   33 +-
 target/linux/ramips/dts/UR-326N4G.dts         |   25 +-
 target/linux/ramips/dts/UR-336UN.dts          |   25 +-
 target/linux/ramips/dts/V11STFE.dts           |    4 -
 target/linux/ramips/dts/V22RW-2X2.dts         |   24 +-
 target/linux/ramips/dts/W150M.dts             |   24 +-
 target/linux/ramips/dts/W306R_V20.dts         |   24 +-
 target/linux/ramips/dts/W502U.dts             |   24 +-
 target/linux/ramips/dts/WCR150GN.dts          |   24 +-
 target/linux/ramips/dts/WHR-G300N.dts         |   24 +-
 target/linux/ramips/dts/WL-351.dts            |   26 +-
 target/linux/ramips/dts/WL341V3.dts           |   26 +-
 target/linux/ramips/dts/WLI-TX4-AG300N.dts    |    4 -
 target/linux/ramips/dts/WL_330N.dts           |   24 +-
 target/linux/ramips/dts/WL_330N3G.dts         |   24 +-
 target/linux/ramips/dts/WNCE2001.dts          |   28 +-
 target/linux/ramips/dts/WR512-3GN-4M.dts      |   25 +-
 target/linux/ramips/dts/WR512-3GN-8M.dts      |   25 +-
 target/linux/ramips/dts/WR6202.dts            |   25 +-
 target/linux/ramips/dts/X5.dts                |   22 +-
 target/linux/ramips/dts/X8.dts                |   22 +-
 target/linux/ramips/dts/XDXRN502J.dts         |   25 +-
 target/linux/ramips/dts/mt7620a.dtsi          |   74 +-
 target/linux/ramips/dts/rt3050.dtsi           |   41 +-
 target/linux/ramips/dts/rt3352.dtsi           |   37 +-
 target/linux/ramips/dts/rt3883.dtsi           |   35 +-
 target/linux/ramips/dts/rt5350.dtsi           |   52 +-
 target/linux/ramips/mt7620a/config-3.10       |    7 +-
 ...alink-add-gpio-driver-for-ralink-SoC.patch |   46 +-
 .../0101-MIPS-ralink-add-pinmux-driver.patch  |  144 --
 .../ramips/patches-3.10/0122-pinmux.patch     | 1276 +++++++++++++++++
 target/linux/ramips/rt305x/config-3.10        |    8 +-
 target/linux/ramips/rt3883/config-3.10        |    7 +-
 96 files changed, 2097 insertions(+), 1605 deletions(-)
 delete mode 100644 target/linux/ramips/patches-3.10/0101-MIPS-ralink-add-pinmux-driver.patch
 create mode 100644 target/linux/ramips/patches-3.10/0122-pinmux.patch

diff --git a/target/linux/ramips/dts/3G-6200N.dts b/target/linux/ramips/dts/3G-6200N.dts
index 9f600276e6..dc342439ce 100644
--- a/target/linux/ramips/dts/3G-6200N.dts
+++ b/target/linux/ramips/dts/3G-6200N.dts
@@ -6,17 +6,13 @@
 	compatible = "3G-6200N", "ralink,rt3050-soc";
 	model = "Edimax 3g-6200n";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -58,12 +54,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -100,10 +91,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/3G-6200NL.dts b/target/linux/ramips/dts/3G-6200NL.dts
index 0dca09874d..265806154a 100644
--- a/target/linux/ramips/dts/3G-6200NL.dts
+++ b/target/linux/ramips/dts/3G-6200NL.dts
@@ -6,17 +6,13 @@
 	compatible = "3G-6200N", "ralink,rt3050-soc";
 	model = "Edimax 3g-6200n";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -58,12 +54,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -87,10 +78,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/3G300M.dts b/target/linux/ramips/dts/3G300M.dts
index c4d6a5d7d0..62683cc16d 100644
--- a/target/linux/ramips/dts/3G300M.dts
+++ b/target/linux/ramips/dts/3G300M.dts
@@ -7,17 +7,6 @@
 	model = "Tenda 3G300M";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,6 +43,15 @@
 		};
 	};
 
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
+	};
+
 	gpio-leds {
 		compatible = "gpio-leds";
 		3grouter {
@@ -99,19 +97,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/AIR3GII.dts b/target/linux/ramips/dts/AIR3GII.dts
index f375a7450b..f9fcf075e3 100644
--- a/target/linux/ramips/dts/AIR3GII.dts
+++ b/target/linux/ramips/dts/AIR3GII.dts
@@ -7,12 +7,6 @@
 	model = "AirLive Air3GII";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -53,12 +47,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -85,8 +83,4 @@
 			linux,code = <0x211>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/ALL0239-3G.dts b/target/linux/ramips/dts/ALL0239-3G.dts
index 023ccd2fa1..335aea85b3 100644
--- a/target/linux/ramips/dts/ALL0239-3G.dts
+++ b/target/linux/ramips/dts/ALL0239-3G.dts
@@ -6,18 +6,13 @@
 	compatible = "ALL0239-3G", "ralink,rt3052-soc";
 	model = "Allnet ALL0239-3G";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -53,10 +48,6 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
 		status = "okay";
 		ralink,portmap = <0x3e>;
@@ -104,10 +95,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/ALL0256N-4M.dts b/target/linux/ramips/dts/ALL0256N-4M.dts
index 58248833cd..7351675b65 100644
--- a/target/linux/ramips/dts/ALL0256N-4M.dts
+++ b/target/linux/ramips/dts/ALL0256N-4M.dts
@@ -7,12 +7,6 @@
 	model = "Allnet ALL0256N";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -53,12 +47,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
@@ -89,8 +87,4 @@
 			linux,code = <0x198>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/ALL0256N-8M.dts b/target/linux/ramips/dts/ALL0256N-8M.dts
index 974a4bd465..8c825a9154 100644
--- a/target/linux/ramips/dts/ALL0256N-8M.dts
+++ b/target/linux/ramips/dts/ALL0256N-8M.dts
@@ -7,12 +7,6 @@
 	model = "Allnet ALL0256N";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -53,12 +47,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
@@ -89,8 +87,4 @@
 			linux,code = <0x198>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/ALL5002.dts b/target/linux/ramips/dts/ALL5002.dts
index 636b74c746..60c9c1fc44 100644
--- a/target/linux/ramips/dts/ALL5002.dts
+++ b/target/linux/ramips/dts/ALL5002.dts
@@ -7,13 +7,6 @@
 	model = "Allnet ALL5002";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "i2c";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -54,19 +47,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/ALL5003.dts b/target/linux/ramips/dts/ALL5003.dts
index b1f28ce61b..d599e71efc 100644
--- a/target/linux/ramips/dts/ALL5003.dts
+++ b/target/linux/ramips/dts/ALL5003.dts
@@ -7,13 +7,6 @@
 	model = "Allnet ALL5003";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "i2c";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -54,19 +47,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/ARGUS_ATP52B.dts b/target/linux/ramips/dts/ARGUS_ATP52B.dts
index b5c94a5f34..b8e246bb03 100644
--- a/target/linux/ramips/dts/ARGUS_ATP52B.dts
+++ b/target/linux/ramips/dts/ARGUS_ATP52B.dts
@@ -6,17 +6,13 @@
 	compatible = "ARGUS_ATP52B", "ralink,rt3052-soc";
 	model = "Argus ATP-52B";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -79,19 +75,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/ASL26555-16M.dts b/target/linux/ramips/dts/ASL26555-16M.dts
index e9477b47d0..8bc98df160 100644
--- a/target/linux/ramips/dts/ASL26555-16M.dts
+++ b/target/linux/ramips/dts/ASL26555-16M.dts
@@ -7,13 +7,6 @@
 	model = "Alpha ASL26555";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "mdio", "uartlite", "sdram", "rgmii";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -66,19 +59,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x1e>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/ASL26555-8M.dts b/target/linux/ramips/dts/ASL26555-8M.dts
index 0a403c195c..f1501ebf11 100644
--- a/target/linux/ramips/dts/ASL26555-8M.dts
+++ b/target/linux/ramips/dts/ASL26555-8M.dts
@@ -7,13 +7,6 @@
 	model = "Alpha ASL26555";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "mdio", "uartlite", "sdram", "rgmii";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
@@ -61,19 +54,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x1e>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/AWM002-4M.dtsi b/target/linux/ramips/dts/AWM002-4M.dtsi
index 614b9984d8..2f6a01728f 100644
--- a/target/linux/ramips/dts/AWM002-4M.dtsi
+++ b/target/linux/ramips/dts/AWM002-4M.dtsi
@@ -5,7 +5,6 @@
 	model = "AsiaRF AWM002";
 
 	palmbus@10000000 {
-
 		spi@b00 {
 			m25p80@0 {
 				compatible = "mx25l3205d";
diff --git a/target/linux/ramips/dts/AWM002-8M.dtsi b/target/linux/ramips/dts/AWM002-8M.dtsi
index a72ca95d07..d8e4c28690 100644
--- a/target/linux/ramips/dts/AWM002-8M.dtsi
+++ b/target/linux/ramips/dts/AWM002-8M.dtsi
@@ -5,7 +5,6 @@
 	model = "AsiaRF AWM002";
 
 	palmbus@10000000 {
-
 		spi@b00 {
 			m25p80@0 {
 				compatible = "mx25l6405d";
diff --git a/target/linux/ramips/dts/AWM002.dtsi b/target/linux/ramips/dts/AWM002.dtsi
index 671dcff05a..e1579b540a 100644
--- a/target/linux/ramips/dts/AWM002.dtsi
+++ b/target/linux/ramips/dts/AWM002.dtsi
@@ -5,17 +5,6 @@
 	model = "AsiaRF AWM002";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "i2c";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -50,19 +39,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/BC2.dts b/target/linux/ramips/dts/BC2.dts
index 8b97169ace..8877743d98 100644
--- a/target/linux/ramips/dts/BC2.dts
+++ b/target/linux/ramips/dts/BC2.dts
@@ -6,18 +6,13 @@
 	compatible = "BC2", "ralink,rt3052-soc";
 	model = "NexAira BC2";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -73,19 +68,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/BR-6425.dts b/target/linux/ramips/dts/BR-6425.dts
index 7529b6b6e5..913df051af 100644
--- a/target/linux/ramips/dts/BR-6425.dts
+++ b/target/linux/ramips/dts/BR-6425.dts
@@ -6,17 +6,13 @@
 	compatible = "BR-6425", "ralink,rt3052-soc";
 	model = "Edimax BR-6425";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -29,12 +25,7 @@
 		#size-cells = <1>;
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -66,8 +57,4 @@
 			linux,code = <0xf7>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/BROADWAY.dts b/target/linux/ramips/dts/BROADWAY.dts
index a24d829a70..3f00ad75be 100644
--- a/target/linux/ramips/dts/BROADWAY.dts
+++ b/target/linux/ramips/dts/BROADWAY.dts
@@ -6,17 +6,13 @@
 	compatible = "BROADWAY", "ralink,rt3052-soc";
 	model = "Hauppauge Broadway";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -85,10 +76,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/CARAMBOLA.dts b/target/linux/ramips/dts/CARAMBOLA.dts
index 68048edcf2..5c63e0315a 100644
--- a/target/linux/ramips/dts/CARAMBOLA.dts
+++ b/target/linux/ramips/dts/CARAMBOLA.dts
@@ -10,18 +10,13 @@
 		bootargs = "console=ttyS0,115200";
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite", "sdram", "rgmii";
-			ralink,gpiomux = "i2c", "spi", "jtag", "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -57,19 +52,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/D105.dts b/target/linux/ramips/dts/D105.dts
index 9b1df68a1b..c4171c003d 100644
--- a/target/linux/ramips/dts/D105.dts
+++ b/target/linux/ramips/dts/D105.dts
@@ -6,18 +6,13 @@
 	compatible = "D105", "ralink,rt3050-soc";
 	model = "Huawei D105";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -77,19 +72,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/DAP-1350.dts b/target/linux/ramips/dts/DAP-1350.dts
index 4eab53abe5..1fd9e9a7e5 100644
--- a/target/linux/ramips/dts/DAP-1350.dts
+++ b/target/linux/ramips/dts/DAP-1350.dts
@@ -10,17 +10,13 @@
 		bootargs = "console=ttyS0,115200";
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -62,12 +58,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -114,10 +105,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/DIR-300-B1.dts b/target/linux/ramips/dts/DIR-300-B1.dts
index 0297b8cf92..8efef3c0d9 100644
--- a/target/linux/ramips/dts/DIR-300-B1.dts
+++ b/target/linux/ramips/dts/DIR-300-B1.dts
@@ -6,17 +6,13 @@
 	compatible = "DIR-300-B1", "ralink,rt3050-soc";
 	model = "D-Link DIR-300 B1";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "spi", "jtag", "mdio", "rgmii", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -78,10 +69,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	gpio-leds {
 		compatible = "gpio-leds";
 		status {
diff --git a/target/linux/ramips/dts/DIR-600-B1.dts b/target/linux/ramips/dts/DIR-600-B1.dts
index 5d78538b05..2c75465440 100644
--- a/target/linux/ramips/dts/DIR-600-B1.dts
+++ b/target/linux/ramips/dts/DIR-600-B1.dts
@@ -6,15 +6,12 @@
 	compatible = "DIR-600-B1", "ralink,rt3050-soc";
 	model = "D-Link DIR-600 B1";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "spi", "jtag", "mdio", "rgmii", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -51,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -77,10 +69,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	gpio-leds {
 		compatible = "gpio-leds";
 		status {
diff --git a/target/linux/ramips/dts/DIR-600-B2.dts b/target/linux/ramips/dts/DIR-600-B2.dts
index ff15ac8439..f982ae0db7 100644
--- a/target/linux/ramips/dts/DIR-600-B2.dts
+++ b/target/linux/ramips/dts/DIR-600-B2.dts
@@ -6,15 +6,12 @@
 	compatible = "DIR-600-B2", "ralink,rt3050-soc";
 	model = "D-Link DIR-600 B2";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "spi", "jtag", "mdio", "rgmii", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -51,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -77,10 +69,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	gpio-leds {
 		compatible = "gpio-leds";
 		status {
diff --git a/target/linux/ramips/dts/DIR-610-A1.dts b/target/linux/ramips/dts/DIR-610-A1.dts
index ed5606af89..26caf5f67f 100644
--- a/target/linux/ramips/dts/DIR-610-A1.dts
+++ b/target/linux/ramips/dts/DIR-610-A1.dts
@@ -7,16 +7,6 @@
 	model = "D-Link DIR-610 A1";
 	
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "jtag", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,14 +43,21 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x1f>;
 		ralink,led-polarity = <0>;
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&phy_led_pins>;
 	};
 
 	gpio-leds {
@@ -93,8 +90,4 @@
 			};
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-    	};
 };
diff --git a/target/linux/ramips/dts/DIR-615-D.dts b/target/linux/ramips/dts/DIR-615-D.dts
index 21de0e8cc8..b27bca061b 100644
--- a/target/linux/ramips/dts/DIR-615-D.dts
+++ b/target/linux/ramips/dts/DIR-615-D.dts
@@ -6,17 +6,13 @@
 	compatible = "DIR-615-D", "ralink,rt3050-soc";
 	model = "D-Link DIR-615 D";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "spi", "jtag", "mdio", "rgmii", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -78,10 +69,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	gpio-leds {
 		compatible = "gpio-leds";
 		status {
diff --git a/target/linux/ramips/dts/DIR-615-H1.dts b/target/linux/ramips/dts/DIR-615-H1.dts
index 15adcfe72f..5cb2beb3e8 100644
--- a/target/linux/ramips/dts/DIR-615-H1.dts
+++ b/target/linux/ramips/dts/DIR-615-H1.dts
@@ -7,16 +7,6 @@
 	model = "D-Link DIR-615 H1";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,12 +43,24 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+			rgmii {
+				ralink,group = "rgmii";
+				ralink,function = "rgmii";
+			};
+			mdio {
+				ralink,group = "mdio";
+				ralink,function = "mdio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -102,8 +104,4 @@
 			linux,code = <0x211>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/DIR-620-A1.dts b/target/linux/ramips/dts/DIR-620-A1.dts
index 87292246e7..649b3abcc1 100644
--- a/target/linux/ramips/dts/DIR-620-A1.dts
+++ b/target/linux/ramips/dts/DIR-620-A1.dts
@@ -6,17 +6,13 @@
 	compatible = "DIR-620-A1", "ralink,rt3050-soc";
 	model = "D-Link DIR-620 A1";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -78,10 +69,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	gpio-leds {
 		compatible = "gpio-leds";
 		status {
diff --git a/target/linux/ramips/dts/DIR-620-D1.dts b/target/linux/ramips/dts/DIR-620-D1.dts
index c1df99d549..71d3ec2bfd 100644
--- a/target/linux/ramips/dts/DIR-620-D1.dts
+++ b/target/linux/ramips/dts/DIR-620-D1.dts
@@ -7,17 +7,6 @@
 	model = "D-Link DIR-620 D1";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,12 +43,24 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+			rgmii {
+				ralink,group = "rgmii";
+				ralink,function = "rgmii";
+			};
+			mdio {
+				ralink,group = "mdio";
+				ralink,function = "mdio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -87,10 +88,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/DIR-645.dts b/target/linux/ramips/dts/DIR-645.dts
index e5ccb40ec6..938055c8c9 100644
--- a/target/linux/ramips/dts/DIR-645.dts
+++ b/target/linux/ramips/dts/DIR-645.dts
@@ -7,21 +7,6 @@
 	model = "D-Link DIR-645";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite", "spi";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		timer@100 {
-			status = "okay";
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		gpio1: gpio@638 {
 			status = "okay";
 		};
@@ -68,18 +53,23 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
+	};
 
+	ethernet@10100000 {
 		mtd-mac-address = <&factory 0x28>;
 		port@0 {
 			ralink,fixed-link = <1000 1 1 0>;
 		};
-
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,5ghz = <0>;
 	};
 
diff --git a/target/linux/ramips/dts/DIR-810L.dts b/target/linux/ramips/dts/DIR-810L.dts
index 193771b5a6..6da0976c2b 100644
--- a/target/linux/ramips/dts/DIR-810L.dts
+++ b/target/linux/ramips/dts/DIR-810L.dts
@@ -7,17 +7,6 @@
 	model = "D-Link DIR-810L";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "ephy";
-			ralink,gpiomux = "jtag", "mdio", "rgmii1", "rgmii1", "i2c", "wled";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 		
@@ -79,13 +68,20 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "jtag", "mdio", "rgmii1", "rgmii1", "i2c", "wled", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	gsw@10110000 {
-		status = "okay";
 		ralink,port4 = "ephy";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&ephy_pins>;
 	};
 
 	pcie@10140000 {
diff --git a/target/linux/ramips/dts/ESR-9753.dts b/target/linux/ramips/dts/ESR-9753.dts
index 5c5f0bbbe8..755196b55b 100644
--- a/target/linux/ramips/dts/ESR-9753.dts
+++ b/target/linux/ramips/dts/ESR-9753.dts
@@ -6,17 +6,13 @@
 	compatible = "ESR-9753", "ralink,rt3052-soc";
 	model = "Senao / EnGenius ESR-9753";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -81,16 +77,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/F5D8235_V1.dts b/target/linux/ramips/dts/F5D8235_V1.dts
index 52b789b76c..36026c2326 100644
--- a/target/linux/ramips/dts/F5D8235_V1.dts
+++ b/target/linux/ramips/dts/F5D8235_V1.dts
@@ -9,18 +9,20 @@
 	model = "Belkin F5D8235 v1";
 
 	palmbus@300000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite";
-			ralink,gpiomux = "i2c";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
 		gpio0: gpio@600 {
 			status = "okay";
 		};
 	};
 
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
+	};
+
 	cfi@1f000000 {
 		compatible = "cfi-flash";
 		reg = <0x1f000000 0x800000>;
diff --git a/target/linux/ramips/dts/F5D8235_V2.dts b/target/linux/ramips/dts/F5D8235_V2.dts
index 10b8037810..237709f5e4 100644
--- a/target/linux/ramips/dts/F5D8235_V2.dts
+++ b/target/linux/ramips/dts/F5D8235_V2.dts
@@ -6,18 +6,13 @@
 	compatible = "F5D8235_V2", "ralink,rt3052-soc";
 	model = "Belkin F5D8235 v2";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "i2c", "spi", "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -51,19 +46,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/F7C027.dts b/target/linux/ramips/dts/F7C027.dts
index 91d4383812..ea716257ef 100644
--- a/target/linux/ramips/dts/F7C027.dts
+++ b/target/linux/ramips/dts/F7C027.dts
@@ -7,16 +7,6 @@
 	model = "Belkin F7C027";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "jtag", "sdram";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -78,9 +68,13 @@
 		};
 	};
 
-
-	wmac@10180000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	gpio-leds {
diff --git a/target/linux/ramips/dts/FONERA20N.dts b/target/linux/ramips/dts/FONERA20N.dts
index 38007a7bc9..31e087b5fc 100644
--- a/target/linux/ramips/dts/FONERA20N.dts
+++ b/target/linux/ramips/dts/FONERA20N.dts
@@ -6,17 +6,13 @@
 	compatible = "FONERA20N", "ralink,rt3052-soc";
 	model = "La Fonera 2.0N";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "spi", "jtag", "mdio", "rgmii", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -85,12 +81,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 
 		port@0 {
@@ -120,10 +111,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/FREESTATION5.dts b/target/linux/ramips/dts/FREESTATION5.dts
index a3cc8fc97d..0ec390c4c8 100644
--- a/target/linux/ramips/dts/FREESTATION5.dts
+++ b/target/linux/ramips/dts/FREESTATION5.dts
@@ -10,15 +10,12 @@
 		bootargs = "console=ttyS0,115200";
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -55,19 +52,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x01>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/HG255D.dts b/target/linux/ramips/dts/HG255D.dts
index 7ecb4f36df..09d7a45105 100644
--- a/target/linux/ramips/dts/HG255D.dts
+++ b/target/linux/ramips/dts/HG255D.dts
@@ -6,15 +6,12 @@
 	compatible = "HG255D", "ralink,rt3052-soc";
 	model = "HuaWei HG255D";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -107,19 +104,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/HW550-3G.dts b/target/linux/ramips/dts/HW550-3G.dts
index 80adb0af39..d107b55396 100644
--- a/target/linux/ramips/dts/HW550-3G.dts
+++ b/target/linux/ramips/dts/HW550-3G.dts
@@ -6,18 +6,13 @@
 	compatible = "HW550-3G", "ralink,rt3052-soc";
 	model = "Aztech HW550-3G";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -53,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -104,10 +94,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/IP2202.dts b/target/linux/ramips/dts/IP2202.dts
index ea9f1702e6..ea5dc780a3 100644
--- a/target/linux/ramips/dts/IP2202.dts
+++ b/target/linux/ramips/dts/IP2202.dts
@@ -6,18 +6,13 @@
 	compatible = "IP2202", "ralink,rt3052-soc";
 	model = "Poray IP2202";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -53,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -86,11 +76,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-		ralink,led-polarity = <0>;
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/M3.dts b/target/linux/ramips/dts/M3.dts
index 3e391b3d62..bae84ce4bf 100644
--- a/target/linux/ramips/dts/M3.dts
+++ b/target/linux/ramips/dts/M3.dts
@@ -7,17 +7,6 @@
 	model = "Poray M3";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 		ralink,led_polarity = <1>;
 	};
@@ -91,7 +84,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,mtd-eeprom = <&factory 0>;
 		ralink,led-polarity = <1>;
 	};
diff --git a/target/linux/ramips/dts/M4-4M.dts b/target/linux/ramips/dts/M4-4M.dts
index 86bd8327c1..4522fb8019 100644
--- a/target/linux/ramips/dts/M4-4M.dts
+++ b/target/linux/ramips/dts/M4-4M.dts
@@ -7,16 +7,6 @@
 	model = "Poray M4";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 		ralink,led_polarity = <1>;
 	};
@@ -83,12 +77,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-		ralink,mtd-eeprom = <&factory 0>;
-		ralink,led-polarity = <1>;
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/M4-8M.dts b/target/linux/ramips/dts/M4-8M.dts
index d07eb4978a..c8e7ff51ff 100644
--- a/target/linux/ramips/dts/M4-8M.dts
+++ b/target/linux/ramips/dts/M4-8M.dts
@@ -7,16 +7,6 @@
 	model = "Poray M4";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 		ralink,led_polarity = <1>;
 	};
@@ -84,7 +78,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,mtd-eeprom = <&factory 0>;
 		ralink,led-polarity = <1>;
 	};
diff --git a/target/linux/ramips/dts/MOFI3500-3GN.dts b/target/linux/ramips/dts/MOFI3500-3GN.dts
index 80cd727463..058b7a27a3 100644
--- a/target/linux/ramips/dts/MOFI3500-3GN.dts
+++ b/target/linux/ramips/dts/MOFI3500-3GN.dts
@@ -6,18 +6,13 @@
 	compatible = "MOFI3500-3GN", "ralink,rt3052-soc";
 	model = "MoFi Network MOFI3500-3GN";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -53,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
diff --git a/target/linux/ramips/dts/MPRA1.dts b/target/linux/ramips/dts/MPRA1.dts
index 44363ef616..f363a573f5 100644
--- a/target/linux/ramips/dts/MPRA1.dts
+++ b/target/linux/ramips/dts/MPRA1.dts
@@ -7,17 +7,6 @@
 	model = "HAME MPR-A1";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "sdram";
-			ralink,gpiomux = "jtag", "i2c", "mdio", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,19 +43,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/MPRA2.dts b/target/linux/ramips/dts/MPRA2.dts
index b9bfdc8d4d..00c5d112e3 100644
--- a/target/linux/ramips/dts/MPRA2.dts
+++ b/target/linux/ramips/dts/MPRA2.dts
@@ -7,17 +7,6 @@
 	model = "HAME MPR-A2";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,19 +43,19 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/MT7620a.dts b/target/linux/ramips/dts/MT7620a.dts
index 417370080d..a14d682912 100644
--- a/target/linux/ramips/dts/MT7620a.dts
+++ b/target/linux/ramips/dts/MT7620a.dts
@@ -7,17 +7,6 @@
 	model = "Ralink MT7620a + MT7610e evaluation board";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "mdio", "wled", "ephy", "rgmii1", "rgmii2";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 		
@@ -55,6 +44,15 @@
 		};
 	};
 
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "jtag", "mdio", "rgmii1", "rgmii1", "i2c", "uartf";
+				ralink,function = "gpio";
+			};
+		};
+	};
+
 	ethernet@10100000 {
 		status = "okay";
 		
@@ -88,8 +86,10 @@
 	};
 
 	gsw@10110000 {
-		status = "okay";
 		ralink,port4 = "gmac";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&ephy_pins>;
 	};
 
 	sdhci@10130000 {
diff --git a/target/linux/ramips/dts/MT7620a_MT7610e.dts b/target/linux/ramips/dts/MT7620a_MT7610e.dts
index 03b8043dd1..4ff8747562 100644
--- a/target/linux/ramips/dts/MT7620a_MT7610e.dts
+++ b/target/linux/ramips/dts/MT7620a_MT7610e.dts
@@ -6,10 +6,8 @@
 	compatible = "ralink,mt7620a-eval-board", "ralink,mt7620a-soc";
 	model = "Ralink MT7620A evaluation board";
 
-
 	palmbus@10000000 {
 		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "mdio", "wled", "ephy", "rgmii1", "rgmii2";
 			ralink,gpiomux = "i2c", "jtag";
 			ralink,uartmux = "gpio";
 			ralink,wdtmux = <1>;
@@ -28,7 +26,7 @@
 				compatible = "en25q64";
 				reg = <0 0>;
 				linux,modalias = "m25p80", "en25q64";
-				spi-max-frequency = <10000000>;
+				spi-max-frequency = <1000000>;
 
 				partition@0 {
 					label = "u-boot";
@@ -58,6 +56,9 @@
 
 	ethernet@10100000 {
 		status = "okay";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&ephy_pins>;
 	};
 
 	gsw@10110000 {
diff --git a/target/linux/ramips/dts/MZK-W300NH2.dts b/target/linux/ramips/dts/MZK-W300NH2.dts
index 29032b450f..78c120a5bf 100644
--- a/target/linux/ramips/dts/MZK-W300NH2.dts
+++ b/target/linux/ramips/dts/MZK-W300NH2.dts
@@ -6,16 +6,12 @@
 	compatible = "MZK-W300NH2", "ralink,rt3052-soc";
 	model = "Planex MZK-W300NH2";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "i2c", "spi", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -58,12 +54,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -104,8 +95,4 @@
 			linux,code = <0x100>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/NBG-419N.dts b/target/linux/ramips/dts/NBG-419N.dts
index 6948120058..c7d66c410e 100644
--- a/target/linux/ramips/dts/NBG-419N.dts
+++ b/target/linux/ramips/dts/NBG-419N.dts
@@ -6,15 +6,12 @@
 	compatible = "NBG-419N", "ralink,rt3052-soc";
 	model = "ZyXEL NBG-419N";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -51,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -88,8 +80,4 @@
 			linux,code = <0x211>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/NW718.dts b/target/linux/ramips/dts/NW718.dts
index 78ad1d63a8..d55f226785 100644
--- a/target/linux/ramips/dts/NW718.dts
+++ b/target/linux/ramips/dts/NW718.dts
@@ -7,17 +7,6 @@
 	model = "Netcore NW718";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "i2c";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -96,10 +89,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/OMNI-EMB-HPM.dts b/target/linux/ramips/dts/OMNI-EMB-HPM.dts
index 8148294893..9bceb00128 100644
--- a/target/linux/ramips/dts/OMNI-EMB-HPM.dts
+++ b/target/linux/ramips/dts/OMNI-EMB-HPM.dts
@@ -11,21 +11,6 @@
 	};
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite", "spi";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		timer@100 {
-			status = "okay";
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 
@@ -63,9 +48,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
+	};
 
+	ethernet@10100000 {
 		phy-handle = <&phy0>;
 		phy-mode = "rgmii";
 
@@ -78,10 +70,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	ehci@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/OMNI-EMB.dts b/target/linux/ramips/dts/OMNI-EMB.dts
index 704a5a1665..146e79b245 100644
--- a/target/linux/ramips/dts/OMNI-EMB.dts
+++ b/target/linux/ramips/dts/OMNI-EMB.dts
@@ -6,15 +6,12 @@
 	compatible = "OMNI-EMB", "ralink,rt3052-soc";
 	model = "Omnima MiniEMBWiFi";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -75,19 +72,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/PSR-680W.dts b/target/linux/ramips/dts/PSR-680W.dts
index f91eb2fe7f..ec06feee0c 100644
--- a/target/linux/ramips/dts/PSR-680W.dts
+++ b/target/linux/ramips/dts/PSR-680W.dts
@@ -10,16 +10,12 @@
 		bootargs = "console=ttyS0,115200";
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "uartlite", "sdram";
-			ralink,gpiomux = "spi", "jtag", "mdio", "rgmii";
-			ralink,uartmux = "i2s uartf";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -56,12 +52,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -85,10 +76,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/PWH2004.dts b/target/linux/ramips/dts/PWH2004.dts
index d526e836db..bee5e0f266 100644
--- a/target/linux/ramips/dts/PWH2004.dts
+++ b/target/linux/ramips/dts/PWH2004.dts
@@ -6,17 +6,13 @@
 	compatible = "PWH2004", "ralink,rt3052-soc";
 	model = "Prolink PWH2004";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -76,16 +72,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/RP-N53.dts b/target/linux/ramips/dts/RP-N53.dts
index c1de105423..e13c3af194 100644
--- a/target/linux/ramips/dts/RP-N53.dts
+++ b/target/linux/ramips/dts/RP-N53.dts
@@ -7,17 +7,6 @@
 	model = "Asus RP-N53";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "wled", "ephy", "i2c";
-			ralink,gpiomux = "jtag", "mdio", "rgmii1", "rgmii1";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		gpio1: gpio@638 {
 			status = "okay";
 		};
@@ -63,17 +52,24 @@
 		};
 	};
 
-	codec {
-		compatible = "ralink,mt7620-audio";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "jtag", "mdio", "rgmii1", "rgmii1", "i2c", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	codec {
+		compatible = "ralink,mt7620-audio";
 	};
 
 	gsw@10110000 {
-		status = "okay";
 		ralink,port4 = "ephy";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&ephy_pins>;
 	};
 
 	pcie@10140000 {
diff --git a/target/linux/ramips/dts/RT-G32-B1.dts b/target/linux/ramips/dts/RT-G32-B1.dts
index c03a7ba5b7..86abc9ca66 100644
--- a/target/linux/ramips/dts/RT-G32-B1.dts
+++ b/target/linux/ramips/dts/RT-G32-B1.dts
@@ -7,16 +7,6 @@
 	model = "Asus RT-G32 B1";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -78,8 +72,4 @@
 			linux,code = <0x211>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/RT-N10-PLUS.dts b/target/linux/ramips/dts/RT-N10-PLUS.dts
index 2f070b7419..0606ccb245 100644
--- a/target/linux/ramips/dts/RT-N10-PLUS.dts
+++ b/target/linux/ramips/dts/RT-N10-PLUS.dts
@@ -6,18 +6,6 @@
 	compatible = "RT-N10-PLUS", "ralink,rt3050-soc";
 	model = "Asus RT-N10+";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-	};
-
 	cfi@1f000000 {
 		compatible = "cfi-flash";
 		reg = <0x1f000000 0x800000>;
@@ -51,12 +39,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -84,8 +67,4 @@
 			linux,code = <0x211>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/RT-N13U.dts b/target/linux/ramips/dts/RT-N13U.dts
index 2e1a62cdc2..b6a649ccdb 100644
--- a/target/linux/ramips/dts/RT-N13U.dts
+++ b/target/linux/ramips/dts/RT-N13U.dts
@@ -6,15 +6,12 @@
 	compatible = "RT-N13U", "ralink,rt3052-soc";
 	model = "Asus RT-N13U";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -85,19 +82,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/RT-N15.dts b/target/linux/ramips/dts/RT-N15.dts
index 8351449ea1..0b9d0d9f54 100644
--- a/target/linux/ramips/dts/RT-N15.dts
+++ b/target/linux/ramips/dts/RT-N15.dts
@@ -59,10 +59,6 @@
 		};
 	};
 
-	wmac@480000 {
-		status = "okay";
-	};
-
 	rtl8366s {
 		compatible = "realtek,rtl8366s";
 		gpio-sda = <&gpio0 1 0>;
diff --git a/target/linux/ramips/dts/RTN56U.dts b/target/linux/ramips/dts/RTN56U.dts
index 9c36af5721..6dfe3f480d 100644
--- a/target/linux/ramips/dts/RTN56U.dts
+++ b/target/linux/ramips/dts/RTN56U.dts
@@ -7,30 +7,21 @@
 	model = "Asus RT-N56U";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,pcimux = "pci-fnc";
-			ralink,wdtmux = <0>;
-		};
-
-		timer@100 {
-			status = "okay";
-		};
-
-		gpio0: gpio@600 {
+		gpio1: gpio@638 {
 			status = "okay";
 		};
+	};
 
-		gpio1: gpio@638 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
 	ethernet@10100000 {
-		status = "okay";
-
                 port@0 {
 			ralink,fixed-link = <1000 1 1 1>;
 		};
@@ -39,6 +30,15 @@
 	pci@10140000 {
 		status = "okay";
 
+		pinctrl-names = "default";
+		pinctrl-0 = <&pci_pins>;
+		pci_pins: pci {
+			pci {
+				ralink,group = "pci";
+				ralink,function = "pci-fnc";
+			};
+		};
+
 		host-bridge {
 			pci-bridge@1 {
 				status = "okay";
@@ -47,7 +47,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,2ghz = <0>;
 	};
 
diff --git a/target/linux/ramips/dts/SL-R7205.dts b/target/linux/ramips/dts/SL-R7205.dts
index 8f1fe851f2..589fd10fa2 100644
--- a/target/linux/ramips/dts/SL-R7205.dts
+++ b/target/linux/ramips/dts/SL-R7205.dts
@@ -6,15 +6,12 @@
 	compatible = "SL-R7205", "ralink,rt3052-soc";
 	model = "Skyline SL-R7205 Wireless 3G Router";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -51,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -85,10 +77,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/TEW-691GR.dts b/target/linux/ramips/dts/TEW-691GR.dts
index 002719583b..98d45fc530 100644
--- a/target/linux/ramips/dts/TEW-691GR.dts
+++ b/target/linux/ramips/dts/TEW-691GR.dts
@@ -7,29 +7,21 @@
 	model = "TRENDnet TEW-691GR";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite";
-			ralink,gpiomux = "i2c", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,pcimux = "pci-fnc";
-			ralink,wdtmux = <1>;
-		};
-
-		timer@100 {
-			status = "okay";
-		};
-
-		gpio0: gpio@600 {
+		gpio1: gpio@638 {
 			status = "okay";
 		};
+	};
 
-		gpio1: gpio@638 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
 	ethernet@10100000 {
-		status = "okay";
 		port@0 {
 			phy-handle = <&phy0>;
 			phy-mode = "rgmii";
@@ -44,7 +36,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,5ghz = <0>;
 	};
 
diff --git a/target/linux/ramips/dts/TEW-692GR.dts b/target/linux/ramips/dts/TEW-692GR.dts
index eee4b2af2d..6c07c7760f 100644
--- a/target/linux/ramips/dts/TEW-692GR.dts
+++ b/target/linux/ramips/dts/TEW-692GR.dts
@@ -7,24 +7,17 @@
 	model = "TRENDnet TEW-692GR";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite";
-			ralink,gpiomux = "i2c", "jtag", "spi";
-			ralink,uartmux = "gpio";
-			ralink,pcimux = "pci-fnc";
-			ralink,wdtmux = <1>;
-		};
-
-		timer@100 {
-			status = "okay";
-		};
-
-		gpio0: gpio@600 {
+		gpio1: gpio@638 {
 			status = "okay";
 		};
+	};
 
-		gpio1: gpio@638 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -46,6 +39,15 @@
 	pci@10140000 {
 		status = "okay";
 
+		pinctrl-names = "default";
+		pinctrl-0 = <&pci_pins>;
+		pci_pins: pci {
+			pci {
+				ralink,group = "pci";
+				ralink,function = "pci-fnc";
+			};
+		};
+
 		host-bridge {
 			pci-bridge@1 {
 				status = "okay";
@@ -54,7 +56,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,5ghz = <0>;
 	};
 
diff --git a/target/linux/ramips/dts/UR-326N4G.dts b/target/linux/ramips/dts/UR-326N4G.dts
index 6bb360d9d7..d97ca05ef9 100644
--- a/target/linux/ramips/dts/UR-326N4G.dts
+++ b/target/linux/ramips/dts/UR-326N4G.dts
@@ -6,16 +6,12 @@
 	compatible = "UR-326N4G", "ralink,rt3052-soc";
 	model = "UR-326N4G Wireless N router";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -102,10 +93,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/UR-336UN.dts b/target/linux/ramips/dts/UR-336UN.dts
index a5c2841214..b1377036cc 100644
--- a/target/linux/ramips/dts/UR-336UN.dts
+++ b/target/linux/ramips/dts/UR-336UN.dts
@@ -6,16 +6,12 @@
 	compatible = "UR-336UN", "ralink,rt3052-soc";
 	model = "UR-336UN Wireless N router";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -29,12 +25,7 @@
 		#size-cells = <1>;
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -79,10 +70,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/V11STFE.dts b/target/linux/ramips/dts/V11STFE.dts
index 20cbaea49c..54ead081dd 100644
--- a/target/linux/ramips/dts/V11STFE.dts
+++ b/target/linux/ramips/dts/V11STFE.dts
@@ -24,10 +24,6 @@
 		status = "okay";
 	};
 
-	wmac@480000 {
-		status = "okay";
-	};
-
 	pci@10140000 {
 		status = "okay";
 
diff --git a/target/linux/ramips/dts/V22RW-2X2.dts b/target/linux/ramips/dts/V22RW-2X2.dts
index a4f8c3c77f..99e748e78d 100644
--- a/target/linux/ramips/dts/V22RW-2X2.dts
+++ b/target/linux/ramips/dts/V22RW-2X2.dts
@@ -6,15 +6,12 @@
 	compatible = "V22RW-2X2", "ralink,rt3052-soc";
 	model = "Ralink AP-RT3052-V22RW-2X2";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -51,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -89,10 +81,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/W150M.dts b/target/linux/ramips/dts/W150M.dts
index 94f1960641..76ad658437 100644
--- a/target/linux/ramips/dts/W150M.dts
+++ b/target/linux/ramips/dts/W150M.dts
@@ -6,15 +6,12 @@
 	compatible = "3G300M", "ralink,rt3050-soc";
 	model = "Tenda 3G300M";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii", "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -96,16 +93,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/W306R_V20.dts b/target/linux/ramips/dts/W306R_V20.dts
index f5b3414442..16d9ad4c3a 100644
--- a/target/linux/ramips/dts/W306R_V20.dts
+++ b/target/linux/ramips/dts/W306R_V20.dts
@@ -39,24 +39,16 @@
 		};
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-	};
-
-	ethernet@10100000 {
-		status = "okay";
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -83,8 +75,4 @@
 			linux,code = <0x198>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/W502U.dts b/target/linux/ramips/dts/W502U.dts
index 89ddc79407..54e8d58ed2 100644
--- a/target/linux/ramips/dts/W502U.dts
+++ b/target/linux/ramips/dts/W502U.dts
@@ -10,15 +10,12 @@
 		bootargs = "console=ttyS0,115200";
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -55,12 +52,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -93,10 +85,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WCR150GN.dts b/target/linux/ramips/dts/WCR150GN.dts
index 380af7d558..601883d24d 100644
--- a/target/linux/ramips/dts/WCR150GN.dts
+++ b/target/linux/ramips/dts/WCR150GN.dts
@@ -6,15 +6,12 @@
 	compatible = "WCR150GN", "ralink,rt3052-soc";
 	model = "Sparklan WCR-150GN";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -80,19 +77,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WHR-G300N.dts b/target/linux/ramips/dts/WHR-G300N.dts
index bd18f4cdfb..8cec31e033 100644
--- a/target/linux/ramips/dts/WHR-G300N.dts
+++ b/target/linux/ramips/dts/WHR-G300N.dts
@@ -6,15 +6,12 @@
 	compatible = "WHR-G300N", "ralink,rt3052-soc";
 	model = "Buffalo WHR-G300N";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -28,12 +25,7 @@
 		#size-cells = <1>;
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -79,8 +71,4 @@
 			linux,code = <0x103>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/WL-351.dts b/target/linux/ramips/dts/WL-351.dts
index f9e0595f11..bc122943d4 100644
--- a/target/linux/ramips/dts/WL-351.dts
+++ b/target/linux/ramips/dts/WL-351.dts
@@ -6,18 +6,13 @@
 	compatible = "WL-351", "ralink,rt3052-soc";
 	model = "Sitecom WL-351 v1 002";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "i2c", "spi", "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	cfi@1f000000 {
@@ -53,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3f>;
 		ralink,fct2 = <0x0002500c>;
 		/*
@@ -70,10 +60,6 @@
 		ralink,fpa2 = <0x1f003fff>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WL341V3.dts b/target/linux/ramips/dts/WL341V3.dts
index 09ef844957..70317c7eee 100644
--- a/target/linux/ramips/dts/WL341V3.dts
+++ b/target/linux/ramips/dts/WL341V3.dts
@@ -6,18 +6,6 @@
 	compatible = "WL341V3", "ralink,rt3052-soc";
 	model = "Sitecom WL-341 v3";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-	};
-
 	cfi@1f000000 {
 		compatible = "cfi-flash";
 		reg = <0x1f000000 0x800000>;
@@ -51,12 +39,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -109,10 +101,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WLI-TX4-AG300N.dts b/target/linux/ramips/dts/WLI-TX4-AG300N.dts
index 2296c3fc07..62c2a799a6 100644
--- a/target/linux/ramips/dts/WLI-TX4-AG300N.dts
+++ b/target/linux/ramips/dts/WLI-TX4-AG300N.dts
@@ -58,10 +58,6 @@
 		};
 	};
 
-	wmac@480000 {
-		status = "okay";
-	};
-
 	gpio-keys-polled {
 		compatible = "gpio-keys-polled";
 		#address-cells = <1>;
diff --git a/target/linux/ramips/dts/WL_330N.dts b/target/linux/ramips/dts/WL_330N.dts
index 1063c1eaf8..4fc4368c3f 100644
--- a/target/linux/ramips/dts/WL_330N.dts
+++ b/target/linux/ramips/dts/WL_330N.dts
@@ -7,16 +7,6 @@
 	model = "Asus WL-330N";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -90,8 +84,4 @@
 			linux,code = <0x198>;
 		};
 	};
-
-	wmac@10180000 {
-		status = "okay";
-	};
 };
diff --git a/target/linux/ramips/dts/WL_330N3G.dts b/target/linux/ramips/dts/WL_330N3G.dts
index 83e83fa214..1c88ed31aa 100644
--- a/target/linux/ramips/dts/WL_330N3G.dts
+++ b/target/linux/ramips/dts/WL_330N3G.dts
@@ -7,16 +7,6 @@
 	model = "Asus WL-330N3G";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -53,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -95,10 +89,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WNCE2001.dts b/target/linux/ramips/dts/WNCE2001.dts
index 3e467a7b04..bbf6625bf6 100644
--- a/target/linux/ramips/dts/WNCE2001.dts
+++ b/target/linux/ramips/dts/WNCE2001.dts
@@ -11,17 +11,6 @@
 	};
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "spi", "uartlite", "jtag", "sdram";
-			ralink,gpiomux = "i2c", "mdio", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -75,16 +64,13 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
-	esw@10110000 {
-		status = "okay";
-	};
-
-	wmac@10180000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	gpio-leds {
diff --git a/target/linux/ramips/dts/WR512-3GN-4M.dts b/target/linux/ramips/dts/WR512-3GN-4M.dts
index cef7464d45..fccd04aed9 100644
--- a/target/linux/ramips/dts/WR512-3GN-4M.dts
+++ b/target/linux/ramips/dts/WR512-3GN-4M.dts
@@ -6,16 +6,12 @@
 	compatible = "WR512-3GN", "ralink,rt3052-soc";
 	model = "WR512-3GN-like router";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -102,10 +93,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WR512-3GN-8M.dts b/target/linux/ramips/dts/WR512-3GN-8M.dts
index 9325dbb877..01da52340e 100644
--- a/target/linux/ramips/dts/WR512-3GN-8M.dts
+++ b/target/linux/ramips/dts/WR512-3GN-8M.dts
@@ -6,16 +6,12 @@
 	compatible = "WR512-3GN", "ralink,rt3052-soc";
 	model = "WR512-3GN-like router";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 	};
 
@@ -102,10 +93,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/WR6202.dts b/target/linux/ramips/dts/WR6202.dts
index a970849e31..ed3e70851d 100644
--- a/target/linux/ramips/dts/WR6202.dts
+++ b/target/linux/ramips/dts/WR6202.dts
@@ -10,17 +10,13 @@
 		bootargs = "console=ttyS0,115200";
 	};
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "mdio", "sdram", "rgmii";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 	};
 
 	gpio-leds {
@@ -85,19 +81,10 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/X5.dts b/target/linux/ramips/dts/X5.dts
index d9e963239f..0a4f1b3684 100644
--- a/target/linux/ramips/dts/X5.dts
+++ b/target/linux/ramips/dts/X5.dts
@@ -7,17 +7,6 @@
 	model = "Poray X5";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 		ralink,led_polarity = <1>;
 	};
@@ -118,7 +111,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,mtd-eeprom = <&factory 0>;
 		ralink,led-polarity = <1>;
 	};
diff --git a/target/linux/ramips/dts/X8.dts b/target/linux/ramips/dts/X8.dts
index e7b13ca63d..b7591dec20 100644
--- a/target/linux/ramips/dts/X8.dts
+++ b/target/linux/ramips/dts/X8.dts
@@ -7,17 +7,6 @@
 	model = "Poray X8";
 
 	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "mdio", "sdram", "rgmii";
-			ralink,gpiomux = "jtag";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
-		};
-
 		spi@b00 {
 			status = "okay";
 			m25p80@0 {
@@ -54,12 +43,16 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "i2c", "jtag", "uartf";
+				ralink,function = "gpio";
+			};
+		};
 	};
 
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x2f>;
 		ralink,led_polarity = <1>;
 	};
@@ -85,7 +78,6 @@
 	};
 
 	wmac@10180000 {
-		status = "okay";
 		ralink,mtd-eeprom = <&factory 0>;
 		ralink,led-polarity = <1>;
 	};
diff --git a/target/linux/ramips/dts/XDXRN502J.dts b/target/linux/ramips/dts/XDXRN502J.dts
index 3df097cde7..28670055fd 100644
--- a/target/linux/ramips/dts/XDXRN502J.dts
+++ b/target/linux/ramips/dts/XDXRN502J.dts
@@ -6,16 +6,12 @@
 	compatible = "XDXRN502J", "ralink,rt3052-soc";
 	model = "XDX RN502J";
 
-	palmbus@10000000 {
-		sysc@0 {
-			ralink,pinmux = "i2c", "spi", "uartlite", "jtag", "sdram", "rgmii";
-			ralink,gpiomux = "mdio";
-			ralink,uartmux = "gpio";
-			ralink,wdtmux = <1>;
-		};
-
-		gpio0: gpio@600 {
-			status = "okay";
+	pinctrl {
+		state_default: pinctrl0 {
+			gpio {
+				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
+				ralink,function = "gpio";
+			};
 		};
 	};
 
@@ -52,12 +48,7 @@
 		};
 	};
 
-	ethernet@10100000 {
-		status = "okay";
-	};
-
 	esw@10110000 {
-		status = "okay";
 		ralink,portmap = <0x3e>;
 	};
 
@@ -85,10 +76,6 @@
 		};
 	};
 
-	wmac@10180000 {
-		status = "okay";
-	};
-
 	otg@101c0000 {
 		status = "okay";
 	};
diff --git a/target/linux/ramips/dts/mt7620a.dtsi b/target/linux/ramips/dts/mt7620a.dtsi
index 506155bd6f..418258254b 100644
--- a/target/linux/ramips/dts/mt7620a.dtsi
+++ b/target/linux/ramips/dts/mt7620a.dtsi
@@ -110,8 +110,6 @@
 			ralink,register-map = [ 00 04 08 0c
 						20 24 28 2c
 						30 34 ];
-
-			status = "disabled";
 		};
 
 		gpio1: gpio@638 {
@@ -163,6 +161,9 @@
 			#size-cells = <0>;
 
 			status = "disabled";
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&i2c_pins>;
 		};
 
 		i2s@a00 {
@@ -189,6 +190,9 @@
 			#size-cells = <1>;
 
 			status = "disabled";
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&spi_pins>;
 		};
 
 		uartlite@c00 {
@@ -202,6 +206,9 @@
 			interrupts = <12>;
 
 			reg-shift = <2>;
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&uartlite_pins>;
 		};
 
 		systick@d00 {
@@ -242,6 +249,62 @@
 		};
 	};
 
+	pinctrl {
+		compatible = "ralink,rt2880-pinmux";
+		pinctrl-names = "default";
+		pinctrl-0 = <&state_default>;
+		state_default: pinctrl0 {
+		};
+		spi_pins: spi {
+			spi {
+				ralink,group = "spi";
+				ralink,function = "spi";
+			};
+		};
+		i2c_pins: i2c {
+			i2c {
+				lantiq,group = "i2c";
+				lantiq,function = "i2c";
+			};
+		};
+		uartlite_pins: uartlite {
+			uart {
+				ralink,group = "uartlite";
+				ralink,function = "uartlite";
+			};
+		};
+		mdio_pins: mdio {
+			mdio {
+				ralink,group = "mdio";
+				ralink,function = "mdio";
+			};
+		};
+		ephy_pins: ephy {
+			ephy {
+				ralink,group = "ephy";
+				ralink,function = "ephy";
+			};
+		};
+		wled_pins: wled {
+			wled {
+				ralink,group = "wled";
+				ralink,function = "wled";
+			};
+		};
+		rgmii1_pins: rgmii1 {
+			mdio {
+				ralink,group = "rgmii1";
+				ralink,function = "rgmii1";
+			};
+		};
+		rgmii2_pins: rgmii2 {
+			mdio {
+				ralink,group = "rgmii2";
+				ralink,function = "rgmii2";
+			};
+		};
+	};
+
 	rstctrl: rstctrl {
 		compatible = "ralink,mt7620a-reset", "ralink,rt2880-reset";
 		#reset-cells = <1>;
@@ -264,13 +327,14 @@
 		interrupt-parent = <&cpuintc>;
 		interrupts = <5>;
 
-		status = "disabled";
-	
 		mdio-bus {
 			#address-cells = <1>;
 			#size-cells = <0>;
 
 			status = "disabled";
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&mdio_pins>;
 		};
 	};
 
@@ -280,8 +344,6 @@
 
 		interrupt-parent = <&intc>;
 		interrupts = <17>;
-
-		status = "disabled";
 	};
 
 	sdhci@10130000 {
diff --git a/target/linux/ramips/dts/rt3050.dtsi b/target/linux/ramips/dts/rt3050.dtsi
index 1130005e78..86a4d15476 100644
--- a/target/linux/ramips/dts/rt3050.dtsi
+++ b/target/linux/ramips/dts/rt3050.dtsi
@@ -110,8 +110,6 @@
 
 			interrupt-parent = <&intc>;
 			interrupts = <6>;
-
-			status = "disabled";
 		};
 
 		gpio1: gpio@638 {
@@ -156,6 +154,9 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 
+			pinctrl-names = "default";
+			pinctrl-0 = <&spi_pins>;
+
 			status = "disabled";
 		};
 
@@ -170,8 +171,38 @@
 			interrupts = <12>;
 
 			reg-shift = <2>;
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&uartlite_pins>;
+		};
+
+	};
+
+	pinctrl {
+		compatible = "ralink,rt2880-pinmux";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&state_default>;
+
+		state_default: pinctrl0 {
+			sdram {
+				ralink,group = "sdram";
+				ralink,function = "sdram";
+			};
 		};
 
+		spi_pins: spi {
+			spi {
+				ralink,group = "spi";
+				ralink,function = "spi";
+			};
+		};
+		uartlite_pins: uartlite {
+			uart {
+				ralink,group = "uartlite";
+				ralink,function = "uartlite";
+			};
+		};
 	};
 
 	rstctrl: rstctrl {
@@ -185,8 +216,6 @@
 
 		interrupt-parent = <&cpuintc>;
 		interrupts = <5>;
-
-		status = "disabled";
 	};
 
 	esw@10110000 {
@@ -195,8 +224,6 @@
 
 		interrupt-parent = <&intc>;
 		interrupts = <17>;
-
-		status = "disabled";
 	};
 
 	wmac@10180000 {
@@ -207,8 +234,6 @@
 		interrupts = <6>;
 
 		ralink,eeprom = "soc_wmac.eeprom";
-
-		status = "disabled";
 	};
 
 	otg@101c0000 {
diff --git a/target/linux/ramips/dts/rt3352.dtsi b/target/linux/ramips/dts/rt3352.dtsi
index e4d35d87c2..db38b00e63 100644
--- a/target/linux/ramips/dts/rt3352.dtsi
+++ b/target/linux/ramips/dts/rt3352.dtsi
@@ -106,8 +106,6 @@
 
 			interrupt-parent = <&intc>;
 			interrupts = <6>;
-
-			status = "disabled";
 		};
 
 		gpio1: gpio@638 {
@@ -151,6 +149,9 @@
 			resets = <&rstctrl 18>;
 			reset-names = "spi";
 	
+			pinctrl-names = "default";
+			pinctrl-0 = <&spi_pins>;
+
 			status = "disabled";
 		};
 
@@ -165,6 +166,32 @@
 			interrupts = <12>;
 
 			reg-shift = <2>;
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&uartlite_pins>;
+		};
+	};
+
+	pinctrl {
+		compatible = "ralink,rt2880-pinmux";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&state_default>;
+
+		state_default: pinctrl0 {
+		};
+
+		spi_pins: spi {
+			spi {
+				ralink,group = "spi";
+				ralink,function = "spi";
+			};
+		};
+		uartlite_pins: uartlite {
+			uart {
+				ralink,group = "uartlite";
+				ralink,function = "uartlite";
+			};
 		};
 	};
 
@@ -179,8 +206,6 @@
 
 		interrupt-parent = <&cpuintc>;
 		interrupts = <5>;
-
-		status = "disabled";
 	};
 
 	esw@10110000 {
@@ -189,8 +214,6 @@
 
 		interrupt-parent = <&intc>;
 		interrupts = <17>;
-
-		status = "disabled";
 	};
 
 	wmac@10180000 {
@@ -201,8 +224,6 @@
 		interrupts = <6>;
 
 		ralink,eeprom = "soc_wmac.eeprom";
-
-		status = "disabled";
 	};
 
 	ehci@101c0000 {
diff --git a/target/linux/ramips/dts/rt3883.dtsi b/target/linux/ramips/dts/rt3883.dtsi
index d4387a92d0..15c35612d5 100644
--- a/target/linux/ramips/dts/rt3883.dtsi
+++ b/target/linux/ramips/dts/rt3883.dtsi
@@ -114,8 +114,6 @@
 			ralink,register-map = [ 00 04 08 0c
 						20 24 28 2c
 						30 34 ];
-
-			status = "disabled";
 		};
 
 		gpio1: gpio@638 {
@@ -175,6 +173,9 @@
 			resets = <&rstctrl 18>;
 			reset-names = "spi";
 
+			pinctrl-names = "default";
+			pinctrl-0 = <&spi_pins>;
+
 			status = "disabled";
 		};
 
@@ -189,6 +190,32 @@
 			interrupts = <12>;
 
 			reg-shift = <2>;
+
+			pinctrl-names = "default";
+			pinctrl-0 = <&uartlite_pins>;
+		};
+	};
+
+	pinctrl {
+		compatible = "ralink,rt2880-pinmux";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&state_default>;
+		state_default: pinctrl0 {
+		};
+
+		spi_pins: spi {
+			spi {
+				ralink,group = "spi";
+				ralink,function = "spi";
+			};
+		};
+
+		uartlite_pins: uartlite {
+			uart {
+				ralink,group = "uartlite";
+				ralink,function = "uartlite";
+			};
 		};
 	};
 
@@ -199,8 +226,6 @@
 		interrupt-parent = <&cpuintc>;
 		interrupts = <5>;
 
-		status = "disabled";
-
 		port@0 {
 			compatible = "ralink,rt3883-port", "ralink,eth-port";
 			reg = <0>;
@@ -320,8 +345,6 @@
 		interrupts = <6>;
 
 		ralink,eeprom = "soc_wmac.eeprom";
-
-		status = "disabled";
 	};
 
 	ehci@101c0000 {
diff --git a/target/linux/ramips/dts/rt5350.dtsi b/target/linux/ramips/dts/rt5350.dtsi
index e132699da3..cb9077f7b4 100644
--- a/target/linux/ramips/dts/rt5350.dtsi
+++ b/target/linux/ramips/dts/rt5350.dtsi
@@ -110,8 +110,6 @@
 			ralink,register-map = [ 00 04 08 0c
 						20 24 28 2c
 						30 34 ];
-
-			status = "disabled";
 		};
 
 		gpio1: gpio@638 {
@@ -162,6 +160,9 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 
+			pinctrl-names = "default";
+			pinctrl-0 = <&i2c_pins>;
+
 			status = "disabled";
 		};
 
@@ -175,6 +176,9 @@
 			#address-cells = <1>;
 			#size-cells = <1>;
 
+			pinctrl-names = "default";
+			pinctrl-0 = <&spi_pins>;
+
 			status = "disabled";
 		};
 
@@ -188,6 +192,9 @@
 			interrupt-parent = <&intc>;
 			interrupts = <12>;
 
+			pinctrl-names = "default";
+			pinctrl-0 = <&uartlite_pins>;
+
 			reg-shift = <2>;
 		};
 
@@ -200,6 +207,41 @@
 		};
 	};
 
+	pinctrl {
+		compatible = "ralink,rt2880-pinmux";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&state_default>;
+
+		state_default: pinctrl0 {
+		};
+
+		spi_pins: spi {
+			spi {
+				ralink,group = "spi";
+				ralink,function = "spi";
+			};
+		};
+		i2c_pins: i2c {
+			i2c {
+				ralink,group = "i2c";
+				ralink,function = "i2c";
+			};
+		};
+		phy_led_pins: phy_led {
+			phy_led {
+				ralink,group = "led";
+				ralink,function = "led";
+			};
+		};
+		uartlite_pins: uartlite {
+			uart {
+				ralink,group = "uartlite";
+				ralink,function = "uartlite";
+			};
+		};
+	};
+
 	rstctrl: rstctrl {
 		compatible = "ralink,rt5350-reset", "ralink,rt2880-reset";
 		#reset-cells = <1>;
@@ -218,8 +260,6 @@
 
 		interrupt-parent = <&cpuintc>;
 		interrupts = <5>;
-
-		status = "disabled";
 	};
 
 	esw@10110000 {
@@ -228,8 +268,6 @@
 
 		interrupt-parent = <&intc>;
 		interrupts = <17>;
-
-		status = "disabled";
 	};
 
 	wmac@10180000 {
@@ -240,8 +278,6 @@
 		interrupts = <6>;
 
 		ralink,eeprom = "soc_wmac.eeprom";
-
-		status = "disabled";
 	};
 
 	ehci@101c0000 {
diff --git a/target/linux/ramips/mt7620a/config-3.10 b/target/linux/ramips/mt7620a/config-3.10
index 618c27a901..47ed648fd2 100644
--- a/target/linux/ramips/mt7620a/config-3.10
+++ b/target/linux/ramips/mt7620a/config-3.10
@@ -1,7 +1,6 @@
 CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
 CONFIG_ARCH_DISCARD_MEMBLOCK=y
 CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
-CONFIG_ARCH_HAS_RESET_CONTROLLER=y
 CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
 CONFIG_ARCH_HIBERNATION_POSSIBLE=y
 CONFIG_ARCH_REQUIRE_GPIOLIB=y
@@ -30,6 +29,7 @@ CONFIG_CPU_R4K_FPU=y
 CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
 CONFIG_CPU_SUPPORTS_HIGHMEM=y
 CONFIG_CSRC_R4K=y
+CONFIG_DEBUG_PINCTRL=y
 CONFIG_DMA_NONCOHERENT=y
 # CONFIG_DTB_MT7620A_EVAL is not set
 CONFIG_DTB_RT_NONE=y
@@ -135,6 +135,11 @@ CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PERF_USE_VMALLOC=y
 CONFIG_PHYLIB=y
+# CONFIG_PINCONF is not set
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_RT2880=y
+# CONFIG_PINCTRL_SINGLE is not set
+CONFIG_PINMUX=y
 # CONFIG_PREEMPT_RCU is not set
 CONFIG_RALINK=y
 CONFIG_RALINK_USBPHY=y
diff --git a/target/linux/ramips/patches-3.10/0006-GPIO-MIPS-ralink-add-gpio-driver-for-ralink-SoC.patch b/target/linux/ramips/patches-3.10/0006-GPIO-MIPS-ralink-add-gpio-driver-for-ralink-SoC.patch
index cd4f38f925..19d592bde2 100644
--- a/target/linux/ramips/patches-3.10/0006-GPIO-MIPS-ralink-add-gpio-driver-for-ralink-SoC.patch
+++ b/target/linux/ramips/patches-3.10/0006-GPIO-MIPS-ralink-add-gpio-driver-for-ralink-SoC.patch
@@ -19,9 +19,11 @@ Cc: linux-gpio@vger.kernel.org
  create mode 100644 arch/mips/include/asm/mach-ralink/gpio.h
  create mode 100644 drivers/gpio/gpio-ralink.c
 
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -444,6 +444,7 @@ config RALINK
+Index: linux-3.10.9/arch/mips/Kconfig
+===================================================================
+--- linux-3.10.9.orig/arch/mips/Kconfig	2013-08-26 17:48:27.481164281 +0200
++++ linux-3.10.9/arch/mips/Kconfig	2013-08-27 23:15:40.751965869 +0200
+@@ -444,6 +444,7 @@
  	select SYS_HAS_EARLY_PRINTK
  	select HAVE_MACH_CLKDEV
  	select CLKDEV_LOOKUP
@@ -29,8 +31,10 @@ Cc: linux-gpio@vger.kernel.org
  
  config SGI_IP22
  	bool "SGI IP22 (Indy/Indigo2)"
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ralink/gpio.h
+Index: linux-3.10.9/arch/mips/include/asm/mach-ralink/gpio.h
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux-3.10.9/arch/mips/include/asm/mach-ralink/gpio.h	2013-08-26 17:48:30.941164428 +0200
 @@ -0,0 +1,24 @@
 +/*
 + *  Ralink SoC GPIO API support
@@ -56,9 +60,11 @@ Cc: linux-gpio@vger.kernel.org
 +#define gpio_to_irq	__gpio_to_irq
 +
 +#endif /* __ASM_MACH_RALINK_GPIO_H */
---- a/drivers/gpio/Kconfig
-+++ b/drivers/gpio/Kconfig
-@@ -209,6 +209,12 @@ config GPIO_RCAR
+Index: linux-3.10.9/drivers/gpio/Kconfig
+===================================================================
+--- linux-3.10.9.orig/drivers/gpio/Kconfig	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/drivers/gpio/Kconfig	2013-08-26 17:48:30.941164428 +0200
+@@ -209,6 +209,12 @@
  	help
  	  Say yes here to support GPIO on Renesas R-Car SoCs.
  
@@ -71,9 +77,11 @@ Cc: linux-gpio@vger.kernel.org
  config GPIO_SPEAR_SPICS
  	bool "ST SPEAr13xx SPI Chip Select as GPIO support"
  	depends on PLAT_SPEAR
---- a/drivers/gpio/Makefile
-+++ b/drivers/gpio/Makefile
-@@ -56,6 +56,7 @@ obj-$(CONFIG_GPIO_PCF857X)	+= gpio-pcf85
+Index: linux-3.10.9/drivers/gpio/Makefile
+===================================================================
+--- linux-3.10.9.orig/drivers/gpio/Makefile	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/drivers/gpio/Makefile	2013-08-26 17:48:30.941164428 +0200
+@@ -56,6 +56,7 @@
  obj-$(CONFIG_GPIO_PCH)		+= gpio-pch.o
  obj-$(CONFIG_GPIO_PL061)	+= gpio-pl061.o
  obj-$(CONFIG_GPIO_PXA)		+= gpio-pxa.o
@@ -81,9 +89,11 @@ Cc: linux-gpio@vger.kernel.org
  obj-$(CONFIG_GPIO_RC5T583)	+= gpio-rc5t583.o
  obj-$(CONFIG_GPIO_RDC321X)	+= gpio-rdc321x.o
  obj-$(CONFIG_GPIO_RCAR)		+= gpio-rcar.o
---- /dev/null
-+++ b/drivers/gpio/gpio-ralink.c
-@@ -0,0 +1,337 @@
+Index: linux-3.10.9/drivers/gpio/gpio-ralink.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux-3.10.9/drivers/gpio/gpio-ralink.c	2013-08-27 22:37:34.999868257 +0200
+@@ -0,0 +1,345 @@
 +/*
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms of the GNU General Public License version 2 as published
@@ -337,6 +347,13 @@ Cc: linux-gpio@vger.kernel.org
 +	dev_info(rg->chip.dev, "registering %d irq handlers\n", rg->chip.ngpio);
 +}
 +
++static int ralink_gpio_request(struct gpio_chip *chip, unsigned offset)
++{
++	int gpio = chip->base + offset;
++
++	return pinctrl_request_gpio(gpio);
++}
++
 +static int ralink_gpio_probe(struct platform_device *pdev)
 +{
 +	struct device_node *np = pdev->dev.of_node;
@@ -388,6 +405,7 @@ Cc: linux-gpio@vger.kernel.org
 +	rg->chip.direction_output = ralink_gpio_direction_output;
 +	rg->chip.get = ralink_gpio_get;
 +	rg->chip.set = ralink_gpio_set;
++	rg->chip.request = ralink_gpio_request;
 +	rg->chip.to_irq = ralink_gpio_to_irq;
 +
 +	/* set polarity to low for all lines */
diff --git a/target/linux/ramips/patches-3.10/0101-MIPS-ralink-add-pinmux-driver.patch b/target/linux/ramips/patches-3.10/0101-MIPS-ralink-add-pinmux-driver.patch
deleted file mode 100644
index 3fd0ddf739..0000000000
--- a/target/linux/ramips/patches-3.10/0101-MIPS-ralink-add-pinmux-driver.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From 9a3055dad80db43aeb22b247512e18e8f06bf54c Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Mon, 22 Apr 2013 23:11:42 +0200
-Subject: [PATCH 02/33] MIPS: ralink: add pinmux driver
-
-Add code to setup the pinmux on ralonk SoC. The SoC has a single 32 bit register
-for this functionality with simple on/off bits. Building a full featured pinctrl
-driver would be overkill.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/Makefile |    2 +-
- arch/mips/ralink/common.h |    2 ++
- arch/mips/ralink/of.c     |    2 ++
- arch/mips/ralink/pinmux.c |   77 +++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 82 insertions(+), 1 deletion(-)
- create mode 100644 arch/mips/ralink/pinmux.c
-
---- a/arch/mips/ralink/Makefile
-+++ b/arch/mips/ralink/Makefile
-@@ -6,7 +6,7 @@
- # Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
- # Copyright (C) 2013 John Crispin <blogic@openwrt.org>
- 
--obj-y := prom.o of.o reset.o clk.o irq.o timer.o
-+obj-y := prom.o of.o reset.o clk.o irq.o timer.o pinmux.o
- 
- obj-$(CONFIG_CLKEVT_RT3352) += cevt-rt3352.o
- 
---- a/arch/mips/ralink/common.h
-+++ b/arch/mips/ralink/common.h
-@@ -52,4 +52,6 @@ extern void prom_soc_init(struct ralink_
- 
- __iomem void *plat_of_remap_node(const char *node);
- 
-+void ralink_pinmux(void);
-+
- #endif /* _RALINK_COMMON_H__ */
---- a/arch/mips/ralink/of.c
-+++ b/arch/mips/ralink/of.c
-@@ -113,6 +113,8 @@ static int __init plat_of_setup(void)
- 	/* make sure ithat the reset controller is setup early */
- 	ralink_rst_init();
- 
-+	ralink_pinmux();
-+
- 	return 0;
- }
- 
---- /dev/null
-+++ b/arch/mips/ralink/pinmux.c
-@@ -0,0 +1,92 @@
-+/*
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ *
-+ *  Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/of.h>
-+
-+#include <asm/mach-ralink/ralink_regs.h>
-+
-+#include "common.h"
-+
-+#define SYSC_REG_GPIO_MODE	0x60
-+
-+static int ralink_mux_mask(const char *name, struct ralink_pinmux_grp *grps, u32* mask)
-+{
-+	for (; grps && grps->name; grps++)
-+		if (!strcmp(grps->name, name)) {
-+			*mask = grps->mask;
-+			return 0;
-+		}
-+
-+	return -1;
-+}
-+
-+void ralink_pinmux(void)
-+{
-+	const __be32 *wdt;
-+	struct device_node *np;
-+	struct property *prop;
-+	const char *uart, *pci, *pin;
-+	u32 mode = 0;
-+	int m;
-+
-+	np = of_find_compatible_node(NULL, NULL, "ralink,rt3050-sysc");
-+	if (!np)
-+		return;
-+
-+	of_property_for_each_string(np, "ralink,gpiomux", prop, pin) {
-+		if (!ralink_mux_mask(pin, rt_gpio_pinmux.mode, &m)) {
-+			mode |= m;
-+			pr_debug("pinmux: registered gpiomux \"%s\"\n", pin);
-+		} else {
-+			pr_err("pinmux: failed to load \"%s\"\n", pin);
-+		}
-+	}
-+
-+	of_property_for_each_string(np, "ralink,pinmux", prop, pin) {
-+		if (!ralink_mux_mask(pin, rt_gpio_pinmux.mode, &m)) {
-+			mode &= ~m;
-+			pr_debug("pinmux: registered pinmux \"%s\"\n", pin);
-+		} else {
-+			pr_err("pinmux: failed to load group \"%s\"\n", pin);
-+		}
-+	}
-+
-+	of_property_read_string(np, "ralink,uartmux", &uart);
-+	if (uart) {
-+		mode &= ~(rt_gpio_pinmux.uart_mask << rt_gpio_pinmux.uart_shift);
-+		if (ralink_mux_mask(uart, rt_gpio_pinmux.uart, &m)) {
-+			pr_err("pinmux: failed to load uartmux \"%s\"\n", uart);
-+			mode |= rt_gpio_pinmux.uart_mask << rt_gpio_pinmux.uart_shift;
-+		} else {
-+			mode |= m << rt_gpio_pinmux.uart_shift;
-+			pr_debug("pinmux: registered uartmux \"%s\"\n", uart);
-+		}
-+	}
-+
-+	wdt = of_get_property(np, "ralink,wdtmux", NULL);
-+	if (wdt && *wdt && rt_gpio_pinmux.wdt_reset)
-+		rt_gpio_pinmux.wdt_reset();
-+
-+	pci = NULL;
-+	if (rt_gpio_pinmux.pci)
-+		of_property_read_string(np, "ralink,pcimux", &pci);
-+
-+	if (pci) {
-+		mode &= ~(rt_gpio_pinmux.pci_mask << rt_gpio_pinmux.pci_shift);
-+		if (ralink_mux_mask(pci, rt_gpio_pinmux.pci, &m)) {
-+			mode |= rt_gpio_pinmux.pci_mask << rt_gpio_pinmux.pci_shift;
-+			pr_debug("pinmux: failed to load pcimux \"%s\"\n", pci);
-+		} else {
-+			mode |= m << rt_gpio_pinmux.pci_shift;
-+			pr_debug("pinmux: registered pcimux \"%s\"\n", pci);
-+		}
-+	}
-+
-+	rt_sysc_w32(mode, SYSC_REG_GPIO_MODE);
-+}
diff --git a/target/linux/ramips/patches-3.10/0122-pinmux.patch b/target/linux/ramips/patches-3.10/0122-pinmux.patch
new file mode 100644
index 0000000000..fa0dd05226
--- /dev/null
+++ b/target/linux/ramips/patches-3.10/0122-pinmux.patch
@@ -0,0 +1,1276 @@
+From d59fe652e3674e98caa688b4ddc9308007267adc Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Mon, 19 Aug 2013 13:49:52 +0200
+Subject: [PATCH] pinctrl: ralink; add pinctrl driver
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+---
+ arch/mips/Kconfig                 |    2 +
+ arch/mips/ralink/common.h         |   21 +--
+ arch/mips/ralink/dts/mt7620a.dtsi |    7 +
+ drivers/pinctrl/Kconfig           |    5 +
+ drivers/pinctrl/Makefile          |    1 +
+ drivers/pinctrl/pinctrl-rt2880.c  |  368 +++++++++++++++++++++++++++++++++++++
+ 6 files changed, 385 insertions(+), 19 deletions(-)
+ create mode 100644 drivers/pinctrl/pinctrl-rt2880.c
+
+Index: linux-3.10.9/arch/mips/Kconfig
+===================================================================
+--- linux-3.10.9.orig/arch/mips/Kconfig	2013-08-28 16:34:42.449951676 +0200
++++ linux-3.10.9/arch/mips/Kconfig	2013-08-28 16:34:43.361951711 +0200
+@@ -446,6 +446,8 @@
+ 	select HAVE_MACH_CLKDEV
+ 	select CLKDEV_LOOKUP
+ 	select ARCH_REQUIRE_GPIOLIB
++	select PINCTRL
++	select PINCTRL_RT2880
+ 
+ config SGI_IP22
+ 	bool "SGI IP22 (Indy/Indigo2)"
+Index: linux-3.10.9/drivers/pinctrl/Kconfig
+===================================================================
+--- linux-3.10.9.orig/drivers/pinctrl/Kconfig	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/drivers/pinctrl/Kconfig	2013-08-28 16:34:43.361951711 +0200
+@@ -114,6 +114,11 @@
+ 	select PINMUX
+ 	select PINCONF
+ 
++config PINCTRL_RT2880
++	bool
++	depends on RALINK
++	select PINMUX
++
+ config PINCTRL_FALCON
+ 	bool
+ 	depends on SOC_FALCON
+Index: linux-3.10.9/drivers/pinctrl/Makefile
+===================================================================
+--- linux-3.10.9.orig/drivers/pinctrl/Makefile	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/drivers/pinctrl/Makefile	2013-08-28 16:34:43.361951711 +0200
+@@ -45,6 +45,7 @@
+ obj-$(CONFIG_PINCTRL_S3C64XX)	+= pinctrl-s3c64xx.o
+ obj-$(CONFIG_PINCTRL_XWAY)	+= pinctrl-xway.o
+ obj-$(CONFIG_PINCTRL_LANTIQ)	+= pinctrl-lantiq.o
++obj-$(CONFIG_PINCTRL_RT2880)	+= pinctrl-rt2880.o
+ 
+ obj-$(CONFIG_PLAT_ORION)        += mvebu/
+ obj-$(CONFIG_ARCH_SHMOBILE)	+= sh-pfc/
+Index: linux-3.10.9/drivers/pinctrl/pinctrl-rt2880.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux-3.10.9/drivers/pinctrl/pinctrl-rt2880.c	2013-08-28 16:34:43.361951711 +0200
+@@ -0,0 +1,456 @@
++/*
++ *  linux/drivers/pinctrl/pinctrl-rt2880.c
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License version 2 as
++ *  publishhed by the Free Software Foundation.
++ *
++ *  Copyright (C) 2013 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/io.h>
++#include <linux/platform_device.h>
++#include <linux/slab.h>
++#include <linux/of.h>
++#include <linux/pinctrl/pinctrl.h>
++#include <linux/pinctrl/pinconf.h>
++#include <linux/pinctrl/pinmux.h>
++#include <linux/pinctrl/consumer.h>
++#include <linux/pinctrl/machine.h>
++
++#include <asm/mach-ralink/ralink_regs.h>
++#include <asm/mach-ralink/pinmux.h>
++#include <asm/mach-ralink/mt7620.h>
++
++#include "core.h"
++
++#define SYSC_REG_GPIO_MODE	0x60
++
++struct rt2880_priv {
++	struct device *dev;
++
++	struct pinctrl_pin_desc *pads;
++	struct pinctrl_desc *desc;
++
++	struct rt2880_pmx_func **func;
++	int func_count;
++
++	struct rt2880_pmx_group *groups;
++	const char **group_names;
++	int group_count;
++
++	uint8_t *gpio;
++	int max_pins;
++};
++
++struct rt2880_pmx_group *rt2880_pinmux_data = NULL;
++
++static int rt2880_get_group_count(struct pinctrl_dev *pctrldev)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	return p->group_count;
++}
++
++static const char *rt2880_get_group_name(struct pinctrl_dev *pctrldev,
++					 unsigned group)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	if (group >= p->group_count)
++		return NULL;
++
++	return p->group_names[group];
++}
++
++static int rt2880_get_group_pins(struct pinctrl_dev *pctrldev,
++				 unsigned group,
++				 const unsigned **pins,
++				 unsigned *num_pins)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	if (group >= p->group_count)
++		return -EINVAL;
++
++	*pins = p->groups[group].func[0].pins;
++	*num_pins = p->groups[group].func[0].pin_count;
++
++	return 0;
++}
++
++static void rt2880_pinctrl_dt_free_map(struct pinctrl_dev *pctrldev,
++				    struct pinctrl_map *map, unsigned num_maps)
++{
++	int i;
++
++	for (i = 0; i < num_maps; i++)
++		if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN ||
++		    map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP)
++			kfree(map[i].data.configs.configs);
++	kfree(map);
++}
++
++static void rt2880_pinctrl_pin_dbg_show(struct pinctrl_dev *pctrldev,
++					struct seq_file *s,
++					unsigned offset)
++{
++	seq_printf(s, "ralink pio");
++}
++
++static void rt2880_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctrldev,
++				struct device_node *np,
++				struct pinctrl_map **map)
++{
++        const char *function;
++	int func = of_property_read_string(np, "ralink,function", &function);
++	int grps = of_property_count_strings(np, "ralink,group");
++	int i;
++
++	if (func || !grps)
++		return;
++
++	for (i = 0; i < grps; i++) {
++	        const char *group;
++
++		of_property_read_string_index(np, "ralink,group", i, &group);
++
++		(*map)->type = PIN_MAP_TYPE_MUX_GROUP;
++		(*map)->name = function;
++		(*map)->data.mux.group = group;
++		(*map)->data.mux.function = function;
++		(*map)++;
++	}
++}
++
++static int rt2880_pinctrl_dt_node_to_map(struct pinctrl_dev *pctrldev,
++				struct device_node *np_config,
++				struct pinctrl_map **map,
++				unsigned *num_maps)
++{
++	int max_maps = 0;
++	struct pinctrl_map *tmp;
++	struct device_node *np;
++
++	for_each_child_of_node(np_config, np) {
++		int ret = of_property_count_strings(np, "ralink,group");
++
++		if (ret >= 0)
++			max_maps += ret;
++	}
++
++	if (!max_maps)
++		return max_maps;
++
++	*map = kzalloc(max_maps * sizeof(struct pinctrl_map), GFP_KERNEL);
++	if (!*map)
++		return -ENOMEM;
++
++	tmp = *map;
++
++	for_each_child_of_node(np_config, np)
++		rt2880_pinctrl_dt_subnode_to_map(pctrldev, np, &tmp);
++	*num_maps = max_maps;
++
++	return 0;
++}
++
++static const struct pinctrl_ops rt2880_pctrl_ops = {
++	.get_groups_count	= rt2880_get_group_count,
++	.get_group_name		= rt2880_get_group_name,
++	.get_group_pins		= rt2880_get_group_pins,
++	.pin_dbg_show		= rt2880_pinctrl_pin_dbg_show,
++	.dt_node_to_map		= rt2880_pinctrl_dt_node_to_map,
++	.dt_free_map		= rt2880_pinctrl_dt_free_map,
++};
++
++static int rt2880_pmx_func_count(struct pinctrl_dev *pctrldev)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	return p->func_count;
++}
++
++static const char *rt2880_pmx_func_name(struct pinctrl_dev *pctrldev,
++					 unsigned func)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	return p->func[func]->name;
++}
++
++static int rt2880_pmx_group_get_groups(struct pinctrl_dev *pctrldev,
++				unsigned func,
++				const char * const **groups,
++				unsigned * const num_groups)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	if (p->func[func]->group_count == 1)
++		*groups = &p->group_names[p->func[func]->groups[0]];
++	else
++		*groups = p->group_names;
++
++	*num_groups = p->func[func]->group_count;
++
++	return 0;
++}
++
++static int rt2880_pmx_group_enable(struct pinctrl_dev *pctrldev,
++				unsigned func,
++				unsigned group)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++        u32 mode = 0;
++
++	/* dont allow double use */
++	if (p->groups[group].enabled) {
++		dev_err(p->dev, "%s is already enabled\n", p->groups[group].name);
++		return -EBUSY;
++	}
++
++	p->groups[group].enabled = 1;
++	p->func[func]->enabled = 1;
++
++	mode = rt_sysc_r32(SYSC_REG_GPIO_MODE);
++	mode &= ~(p->groups[group].mask << p->groups[group].shift);
++
++	/* function 0 is gpio and needs special handling */
++	if (func == 0) {
++		int i;
++
++		mode |= p->groups[group].mask << p->groups[group].shift;
++		/* mark the pins as gpio */
++		for (i = 0; i < p->groups[group].func[0].pin_count; i++)
++			p->gpio[p->groups[group].func[0].pins[i]] = 1;
++	} else {
++		mode |= p->func[func]->value << p->groups[group].shift;
++	}
++	rt_sysc_w32(mode, SYSC_REG_GPIO_MODE);
++
++	return 0;
++}
++
++static int rt2880_pmx_group_gpio_request_enable(struct pinctrl_dev *pctrldev,
++				struct pinctrl_gpio_range *range,
++				unsigned pin)
++{
++	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
++
++	if (!p->gpio[pin]) {
++		dev_err(p->dev, "pin %d is not set to gpio mux\n", pin);
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++static const struct pinmux_ops rt2880_pmx_group_ops = {
++	.get_functions_count	= rt2880_pmx_func_count,
++	.get_function_name	= rt2880_pmx_func_name,
++	.get_function_groups	= rt2880_pmx_group_get_groups,
++	.enable			= rt2880_pmx_group_enable,
++	.gpio_request_enable	= rt2880_pmx_group_gpio_request_enable,
++};
++
++static struct pinctrl_desc rt2880_pctrl_desc = {
++	.owner		= THIS_MODULE,
++	.name		= "rt2880-pinmux",
++	.pctlops	= &rt2880_pctrl_ops,
++	.pmxops		= &rt2880_pmx_group_ops,
++};
++
++static struct rt2880_pmx_func gpio_func = {
++	.name = "gpio",
++};
++
++static int rt2880_pinmux_index(struct rt2880_priv *p)
++{
++	struct rt2880_pmx_func **f;
++	struct rt2880_pmx_group *mux = p->groups;
++	int i, j, c = 0;
++
++	/* count the mux functions */
++	while (mux->name) {
++		p->group_count++;
++		mux++;
++	}
++
++	/* allocate the group names array needed by the gpio function */
++	p->group_names = devm_kzalloc(p->dev, sizeof(char *) * p->group_count, GFP_KERNEL);
++	if (!p->group_names)
++		return -1;
++
++	for (i = 0; i < p->group_count; i++) {
++		p->group_names[i] = p->groups[i].name;
++		p->func_count += p->groups[i].func_count;
++	}
++
++	/* we have a dummy function[0] for gpio */
++	p->func_count++;
++
++	/* allocate our function and group mapping index buffers */
++	f = p->func = devm_kzalloc(p->dev, sizeof(struct rt2880_pmx_func) * p->func_count, GFP_KERNEL);
++	gpio_func.groups = devm_kzalloc(p->dev, sizeof(int) * p->group_count, GFP_KERNEL);
++	if (!f || !gpio_func.groups)
++		return -1;
++
++	/* add a backpointer to the function so it knows its group */
++	gpio_func.group_count = p->group_count;
++	for (i = 0; i < gpio_func.group_count; i++)
++		gpio_func.groups[i] = i;
++
++	f[c] = &gpio_func;
++	c++;
++
++	/* add remaining functions */
++	for (i = 0; i < p->group_count; i++) {
++		for (j = 0; j < p->groups[i].func_count; j++) {
++			int k;
++
++			f[c] = &p->groups[i].func[j];
++			f[c]->groups = devm_kzalloc(p->dev, sizeof(int), GFP_KERNEL);
++			f[c]->groups[0] = i;
++			f[c]->group_count = 1;
++			c++;
++		}
++	}
++	return 0;
++}
++
++static int rt2880_pinmux_pins(struct rt2880_priv *p)
++{
++	int i, j;
++
++	/* loop over the functions and initialize the pins array. also work out the highest pin used */
++	for (i = 0; i < p->func_count; i++) {
++		int pin;
++
++		if (!p->func[i]->pin_count)
++			continue;
++
++		p->func[i]->pins = devm_kzalloc(p->dev, sizeof(int) * p->func[i]->pin_count, GFP_KERNEL);
++		for (j = 0; j < p->func[i]->pin_count; j++)
++			p->func[i]->pins[j] = p->func[i]->pin_first + j;
++
++		pin = p->func[i]->pin_first + p->func[i]->pin_count;
++		if (pin > p->max_pins)
++			p->max_pins = pin;
++	}
++
++	/* the buffer that tells us which pins are gpio */
++	p->gpio = devm_kzalloc(p->dev,sizeof(uint8_t) * p->max_pins,
++		GFP_KERNEL);
++	/* the pads needed to tell pinctrl about our pins */
++	p->pads = devm_kzalloc(p->dev,
++		sizeof(struct pinctrl_pin_desc) * p->max_pins,
++		GFP_KERNEL);
++	if (!p->pads || !p->gpio ) {
++		dev_err(p->dev, "Failed to allocate gpio data\n");
++		return -ENOMEM;
++	}
++
++	/* pin 0 is always a gpio */
++	p->gpio[0] = 1;
++
++	/* set the pads */
++	for (i = 0; i < p->max_pins; i++) {
++		/* strlen("ioXY") + 1 = 5 */
++		char *name = devm_kzalloc(p->dev, 5, GFP_KERNEL);
++
++		if (!name) {
++			dev_err(p->dev, "Failed to allocate pad name\n");
++			return -ENOMEM;
++		}
++		snprintf(name, 5, "io%d", i);
++		p->pads[i].number = i;
++		p->pads[i].name = name;
++	}
++	p->desc->pins = p->pads;
++	p->desc->npins = p->max_pins;
++
++	return 0;
++}
++
++static int rt2880_pinmux_probe(struct platform_device *pdev)
++{
++	struct rt2880_priv *p;
++	struct pinctrl_dev *dev;
++	struct device_node *np;
++
++	if (!rt2880_pinmux_data)
++		return -ENOSYS;
++
++	/* setup the private data */
++	p = devm_kzalloc(&pdev->dev, sizeof(struct rt2880_priv), GFP_KERNEL);
++	if (!p)
++		return -ENOMEM;
++
++	p->dev = &pdev->dev;
++	p->desc = &rt2880_pctrl_desc;
++	p->groups = rt2880_pinmux_data;
++	platform_set_drvdata(pdev, p);
++
++	/* init the device */
++	if (rt2880_pinmux_index(p)) {
++		dev_err(&pdev->dev, "failed to load index\n");
++		return -EINVAL;
++	}
++	if (rt2880_pinmux_pins(p)) {
++		dev_err(&pdev->dev, "failed to load pins\n");
++		return -EINVAL;
++	}
++	dev = pinctrl_register(p->desc, &pdev->dev, p);
++	if (IS_ERR(dev))
++		return PTR_ERR(dev);
++
++	/* finalize by adding gpio ranges for enables gpio controllers */
++	for_each_compatible_node(np, NULL, "ralink,rt2880-gpio") {
++		const __be32 *ngpio, *gpiobase;
++		struct pinctrl_gpio_range *range;
++		char *name;
++
++		if (!of_device_is_available(np))
++			continue;
++
++		ngpio = of_get_property(np, "ralink,num-gpios", NULL);
++		gpiobase = of_get_property(np, "ralink,gpio-base", NULL);
++		if (!ngpio || !gpiobase) {
++			dev_err(&pdev->dev, "failed to load chip info\n");
++			return -EINVAL;
++		}
++
++		range = devm_kzalloc(p->dev, sizeof(struct pinctrl_gpio_range) + 4, GFP_KERNEL);
++		range->name = name = (char *) &range[1];
++		sprintf(name, "pio");
++		range->npins = __be32_to_cpu(*ngpio);
++		range->base = __be32_to_cpu(*gpiobase);
++		pinctrl_add_gpio_range(dev, range);
++	}
++
++	return 0;
++}
++
++static const struct of_device_id rt2880_pinmux_match[] = {
++	{ .compatible = "ralink,rt2880-pinmux" },
++	{},
++};
++MODULE_DEVICE_TABLE(of, rt2880_pinmux_match);
++
++static struct platform_driver rt2880_pinmux_driver = {
++	.probe = rt2880_pinmux_probe,
++	.driver = {
++		.name = "rt2880-pinmux",
++		.owner = THIS_MODULE,
++		.of_match_table = rt2880_pinmux_match,
++	},
++};
++
++int __init rt2880_pinmux_init(void)
++{
++	return platform_driver_register(&rt2880_pinmux_driver);
++}
++
++core_initcall_sync(rt2880_pinmux_init);
+Index: linux-3.10.9/arch/mips/include/asm/mach-ralink/pinmux.h
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux-3.10.9/arch/mips/include/asm/mach-ralink/pinmux.h	2013-08-28 16:34:43.361951711 +0200
+@@ -0,0 +1,47 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License version 2 as
++ *  publishhed by the Free Software Foundation.
++ *
++ *  Copyright (C) 2012 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _RT288X_PINMUX_H__
++#define _RT288X_PINMUX_H__
++
++#define FUNC(name, value, pin_first, pin_count) { name, value, pin_first, pin_count }
++#define GRP(_name, _func, _mask, _shift) \
++	{ .name = _name, .mask = _mask, .shift = _shift, \
++	  .func = _func, \
++	  .func_count = ARRAY_SIZE(_func) }
++
++struct rt2880_pmx_group;
++
++struct rt2880_pmx_func {
++	const char *name;
++	const char value;
++
++	int pin_first;
++	int pin_count;
++	int *pins;
++
++	int *groups;
++	int group_count;
++
++	int enabled;
++};
++
++struct rt2880_pmx_group {
++	const char *name;
++	int enabled;
++
++	const u32 shift;
++	const char mask;
++
++	struct rt2880_pmx_func *func;
++	int func_count;
++};
++
++extern struct rt2880_pmx_group *rt2880_pinmux_data;
++
++#endif
+Index: linux-3.10.9/arch/mips/ralink/mt7620.c
+===================================================================
+--- linux-3.10.9.orig/arch/mips/ralink/mt7620.c	2013-08-28 16:34:42.829951688 +0200
++++ linux-3.10.9/arch/mips/ralink/mt7620.c	2013-08-28 16:34:43.361951711 +0200
+@@ -17,6 +17,7 @@
+ #include <asm/mipsregs.h>
+ #include <asm/mach-ralink/ralink_regs.h>
+ #include <asm/mach-ralink/mt7620.h>
++#include <asm/mach-ralink/pinmux.h>
+ 
+ #include "common.h"
+ 
+@@ -48,118 +49,40 @@
+ /* the pll dividers */
+ static u32 mt7620_clk_divider[] = { 2, 3, 4, 8 };
+ 
+-static struct ralink_pinmux_grp mode_mux[] = {
+-	{
+-		.name = "i2c",
+-		.mask = MT7620_GPIO_MODE_I2C,
+-		.gpio_first = 1,
+-		.gpio_last = 2,
+-	}, {
+-		.name = "spi",
+-		.mask = MT7620_GPIO_MODE_SPI,
+-		.gpio_first = 3,
+-		.gpio_last = 6,
+-	}, {
+-		.name = "uartlite",
+-		.mask = MT7620_GPIO_MODE_UART1,
+-		.gpio_first = 15,
+-		.gpio_last = 16,
+-	}, {
+-		.name = "wdt",
+-		.mask = MT7620_GPIO_MODE_WDT,
+-		.gpio_first = 17,
+-		.gpio_last = 17,
+-	}, {
+-		.name = "mdio",
+-		.mask = MT7620_GPIO_MODE_MDIO,
+-		.gpio_first = 22,
+-		.gpio_last = 23,
+-	}, {
+-		.name = "rgmii1",
+-		.mask = MT7620_GPIO_MODE_RGMII1,
+-		.gpio_first = 24,
+-		.gpio_last = 35,
+-	}, {
+-		.name = "spi refclk",
+-		.mask = MT7620_GPIO_MODE_SPI_REF_CLK,
+-		.gpio_first = 37,
+-		.gpio_last = 39,
+-	}, {
+-		.name = "jtag",
+-		.mask = MT7620_GPIO_MODE_JTAG,
+-		.gpio_first = 40,
+-		.gpio_last = 44,
+-	}, {
+-		/* shared lines with jtag */
+-		.name = "ephy",
+-		.mask = MT7620_GPIO_MODE_EPHY,
+-		.gpio_first = 40,
+-		.gpio_last = 44,
+-	}, {
+-		.name = "nand",
+-		.mask = MT7620_GPIO_MODE_JTAG,
+-		.gpio_first = 45,
+-		.gpio_last = 59,
+-	}, {
+-		.name = "rgmii2",
+-		.mask = MT7620_GPIO_MODE_RGMII2,
+-		.gpio_first = 60,
+-		.gpio_last = 71,
+-	}, {
+-		.name = "wled",
+-		.mask = MT7620_GPIO_MODE_WLED,
+-		.gpio_first = 72,
+-		.gpio_last = 72,
+-	}, {0}
++static struct rt2880_pmx_func i2c_grp[] =  { FUNC("i2c", 1, 1, 2) };
++static struct rt2880_pmx_func spi_grp[] = { FUNC("spi", 1, 3, 4) };
++static struct rt2880_pmx_func uartf_grp[] = {
++	FUNC("uartf", MT7620_GPIO_MODE_UARTF, 7, 8),
++	FUNC("pcm uartf", MT7620_GPIO_MODE_PCM_UARTF, 7, 8),
++	FUNC("pcm i2s", MT7620_GPIO_MODE_PCM_I2S, 7, 8),
++	FUNC("i2s uartf", MT7620_GPIO_MODE_I2S_UARTF, 7, 8),
++	FUNC("pcm gpio", MT7620_GPIO_MODE_PCM_GPIO, 11, 4),
++	FUNC("gpio uartf", MT7620_GPIO_MODE_GPIO_UARTF, 7, 4),
++	FUNC("gpio i2s", MT7620_GPIO_MODE_GPIO_I2S, 7, 4),
+ };
+-
+-static struct ralink_pinmux_grp uart_mux[] = {
+-	{
+-		.name = "uartf",
+-		.mask = MT7620_GPIO_MODE_UARTF,
+-		.gpio_first = 7,
+-		.gpio_last = 14,
+-	}, {
+-		.name = "pcm uartf",
+-		.mask = MT7620_GPIO_MODE_PCM_UARTF,
+-		.gpio_first = 7,
+-		.gpio_last = 14,
+-	}, {
+-		.name = "pcm i2s",
+-		.mask = MT7620_GPIO_MODE_PCM_I2S,
+-		.gpio_first = 7,
+-		.gpio_last = 14,
+-	}, {
+-		.name = "i2s uartf",
+-		.mask = MT7620_GPIO_MODE_I2S_UARTF,
+-		.gpio_first = 7,
+-		.gpio_last = 14,
+-	}, {
+-		.name = "pcm gpio",
+-		.mask = MT7620_GPIO_MODE_PCM_GPIO,
+-		.gpio_first = 11,
+-		.gpio_last = 14,
+-	}, {
+-		.name = "gpio uartf",
+-		.mask = MT7620_GPIO_MODE_GPIO_UARTF,
+-		.gpio_first = 7,
+-		.gpio_last = 10,
+-	}, {
+-		.name = "gpio i2s",
+-		.mask = MT7620_GPIO_MODE_GPIO_I2S,
+-		.gpio_first = 7,
+-		.gpio_last = 10,
+-	}, {
+-		.name = "gpio",
+-		.mask = MT7620_GPIO_MODE_GPIO,
+-	}, {0}
+-};
+-
+-struct ralink_pinmux rt_gpio_pinmux = {
+-	.mode = mode_mux,
+-	.uart = uart_mux,
+-	.uart_shift = MT7620_GPIO_MODE_UART0_SHIFT,
+-	.uart_mask = MT7620_GPIO_MODE_UART0_MASK,
++static struct rt2880_pmx_func uartlite_grp[] = { FUNC("uartlite", 1, 15, 2) };
++static struct rt2880_pmx_func wdt_grp[] = { FUNC("wdt", 1, 17, 1) };
++static struct rt2880_pmx_func mdio_grp[] = { FUNC("mdio", 1, 22, 2) };
++static struct rt2880_pmx_func rgmii1_grp[] = { FUNC("rgmii1", 1, 24, 12) };
++static struct rt2880_pmx_func refclk_grp[] = { FUNC("spi refclk", 1, 37, 3) };
++static struct rt2880_pmx_func ephy_grp[] = { FUNC("ephy", 1, 40, 5) };
++static struct rt2880_pmx_func rgmii2_grp[] = { FUNC("rgmii2", 1, 60, 12) };
++static struct rt2880_pmx_func wled_grp[] = { FUNC("wled", 1, 72, 1) };
++
++static struct rt2880_pmx_group mt7620a_pinmux_data[] = {
++	GRP("i2c", i2c_grp, 1, MT7620_GPIO_MODE_I2C),
++	GRP("spi", spi_grp, 1, MT7620_GPIO_MODE_SPI),
++	GRP("uartlite", uartlite_grp, 1, MT7620_GPIO_MODE_UART1),
++	GRP("wdt", wdt_grp, 1, MT7620_GPIO_MODE_WDT),
++	GRP("mdio", mdio_grp, 1, MT7620_GPIO_MODE_MDIO),
++	GRP("rgmii1", rgmii1_grp, 1, MT7620_GPIO_MODE_RGMII1),
++	GRP("spi refclk", refclk_grp, 1, MT7620_GPIO_MODE_SPI_REF_CLK),
++	GRP("rgmii2", rgmii2_grp, 1, MT7620_GPIO_MODE_RGMII2),
++	GRP("ephy", ephy_grp, 1, MT7620_GPIO_MODE_EPHY),
++	GRP("wled", wled_grp, 1, MT7620_GPIO_MODE_WLED),
++	GRP("uartf", uartf_grp, MT7620_GPIO_MODE_UART0_MASK,
++		MT7620_GPIO_MODE_UART0_SHIFT),
++	{ 0 }
+ };
+ 
+ void __init ralink_clk_init(void)
+@@ -281,4 +204,6 @@
+ 		(pmu0 & PMU_SW_SET) ? ("sw") : ("hw"));
+ 	pr_info("Digital PMU set to %s control\n",
+ 		(pmu1 & DIG_SW_SEL) ? ("sw") : ("hw"));
++
++	rt2880_pinmux_data = mt7620a_pinmux_data;
+ }
+Index: linux-3.10.9/arch/mips/ralink/rt305x.c
+===================================================================
+--- linux-3.10.9.orig/arch/mips/ralink/rt305x.c	2013-08-28 16:34:43.061951698 +0200
++++ linux-3.10.9/arch/mips/ralink/rt305x.c	2013-08-28 16:34:43.365951713 +0200
+@@ -17,90 +17,71 @@
+ #include <asm/mipsregs.h>
+ #include <asm/mach-ralink/ralink_regs.h>
+ #include <asm/mach-ralink/rt305x.h>
++#include <asm/mach-ralink/pinmux.h>
+ 
+ #include "common.h"
+ 
+ enum rt305x_soc_type rt305x_soc;
+ 
+-static struct ralink_pinmux_grp mode_mux[] = {
+-	{
+-		.name = "i2c",
+-		.mask = RT305X_GPIO_MODE_I2C,
+-		.gpio_first = RT305X_GPIO_I2C_SD,
+-		.gpio_last = RT305X_GPIO_I2C_SCLK,
+-	}, {
+-		.name = "spi",
+-		.mask = RT305X_GPIO_MODE_SPI,
+-		.gpio_first = RT305X_GPIO_SPI_EN,
+-		.gpio_last = RT305X_GPIO_SPI_CLK,
+-	}, {
+-		.name = "uartlite",
+-		.mask = RT305X_GPIO_MODE_UART1,
+-		.gpio_first = RT305X_GPIO_UART1_TXD,
+-		.gpio_last = RT305X_GPIO_UART1_RXD,
+-	}, {
+-		.name = "jtag",
+-		.mask = RT305X_GPIO_MODE_JTAG,
+-		.gpio_first = RT305X_GPIO_JTAG_TDO,
+-		.gpio_last = RT305X_GPIO_JTAG_TDI,
+-	}, {
+-		.name = "mdio",
+-		.mask = RT305X_GPIO_MODE_MDIO,
+-		.gpio_first = RT305X_GPIO_MDIO_MDC,
+-		.gpio_last = RT305X_GPIO_MDIO_MDIO,
+-	}, {
+-		.name = "sdram",
+-		.mask = RT305X_GPIO_MODE_SDRAM,
+-		.gpio_first = RT305X_GPIO_SDRAM_MD16,
+-		.gpio_last = RT305X_GPIO_SDRAM_MD31,
+-	}, {
+-		.name = "rgmii",
+-		.mask = RT305X_GPIO_MODE_RGMII,
+-		.gpio_first = RT305X_GPIO_GE0_TXD0,
+-		.gpio_last = RT305X_GPIO_GE0_RXCLK,
+-	}, {0}
++static struct rt2880_pmx_func i2c_func[] =  { FUNC("i2c", 0, 1, 2) };
++static struct rt2880_pmx_func spi_func[] = { FUNC("spi", 0, 3, 4) };
++static struct rt2880_pmx_func uartf_func[] = {
++	FUNC("uartf", RT305X_GPIO_MODE_UARTF, 7, 8),
++	FUNC("pcm uartf", RT305X_GPIO_MODE_PCM_UARTF, 7, 8),
++	FUNC("pcm i2s", RT305X_GPIO_MODE_PCM_I2S, 7, 8),
++	FUNC("i2s uartf", RT305X_GPIO_MODE_I2S_UARTF, 7, 8),
++	FUNC("pcm gpio", RT305X_GPIO_MODE_PCM_GPIO, 11, 4),
++	FUNC("gpio uartf", RT305X_GPIO_MODE_GPIO_UARTF, 7, 4),
++	FUNC("gpio i2s", RT305X_GPIO_MODE_GPIO_I2S, 7, 4),
++};
++static struct rt2880_pmx_func uartlite_func[] = { FUNC("uartlite", 0, 15, 2) };
++static struct rt2880_pmx_func jtag_func[] = { FUNC("jtag", 0, 17, 25) };
++static struct rt2880_pmx_func mdio_func[] = { FUNC("mdio", 0, 22, 2) };
++static struct rt2880_pmx_func rt5350_led_func[] = { FUNC("led", 0, 22, 5) };
++static struct rt2880_pmx_func sdram_func[] = { FUNC("sdram", 0, 24, 16) };
++static struct rt2880_pmx_func rt3352_rgmii_func[] = { FUNC("rgmii", 0, 24, 12) };
++static struct rt2880_pmx_func rgmii_func[] = { FUNC("rgmii", 0, 40, 12) };
++static struct rt2880_pmx_func rt3352_lna_func[] = { FUNC("lna", 0, 36, 2) };
++static struct rt2880_pmx_func rt3352_pa_func[] = { FUNC("pa", 0, 38, 2) };
++static struct rt2880_pmx_func rt3352_led_func[] = { FUNC("led", 0, 40, 5) };
++
++static struct rt2880_pmx_group rt3050_pinmux_data[] = {
++	GRP("i2c", i2c_func, 1, RT305X_GPIO_MODE_I2C),
++	GRP("spi", spi_func, 1, RT305X_GPIO_MODE_SPI),
++	GRP("uartf", uartf_func, RT305X_GPIO_MODE_UART0_MASK,
++		RT305X_GPIO_MODE_UART0_SHIFT),
++	GRP("uartlite", uartlite_func, 1, RT305X_GPIO_MODE_UART1),
++	GRP("jtag", jtag_func, 1, RT305X_GPIO_MODE_JTAG),
++	GRP("mdio", mdio_func, 1, RT305X_GPIO_MODE_MDIO),
++	GRP("rgmii", rgmii_func, 1, RT305X_GPIO_MODE_RGMII),
++	GRP("sdram", sdram_func, 1, RT305X_GPIO_MODE_SDRAM),
++	{ 0 }
++};
++
++static struct rt2880_pmx_group rt3352_pinmux_data[] = {
++	GRP("i2c", i2c_func, 1, RT305X_GPIO_MODE_I2C),
++	GRP("spi", spi_func, 1, RT305X_GPIO_MODE_SPI),
++	GRP("uartf", uartf_func, RT305X_GPIO_MODE_UART0_MASK,
++		RT305X_GPIO_MODE_UART0_SHIFT),
++	GRP("uartlite", uartlite_func, 1, RT305X_GPIO_MODE_UART1),
++	GRP("jtag", jtag_func, 1, RT305X_GPIO_MODE_JTAG),
++	GRP("mdio", mdio_func, 1, RT305X_GPIO_MODE_MDIO),
++	GRP("rgmii", rt3352_rgmii_func, 1, RT305X_GPIO_MODE_RGMII),
++	GRP("lna", rt3352_lna_func, 1, RT3352_GPIO_MODE_LNA),
++	GRP("pa", rt3352_pa_func, 1, RT3352_GPIO_MODE_PA),
++	GRP("led", rt3352_led_func, 1, RT5350_GPIO_MODE_PHY_LED),
++	{ 0 }
+ };
+ 
+-static struct ralink_pinmux_grp uart_mux[] = {
+-	{
+-		.name = "uartf",
+-		.mask = RT305X_GPIO_MODE_UARTF,
+-		.gpio_first = RT305X_GPIO_7,
+-		.gpio_last = RT305X_GPIO_14,
+-	}, {
+-		.name = "pcm uartf",
+-		.mask = RT305X_GPIO_MODE_PCM_UARTF,
+-		.gpio_first = RT305X_GPIO_7,
+-		.gpio_last = RT305X_GPIO_14,
+-	}, {
+-		.name = "pcm i2s",
+-		.mask = RT305X_GPIO_MODE_PCM_I2S,
+-		.gpio_first = RT305X_GPIO_7,
+-		.gpio_last = RT305X_GPIO_14,
+-	}, {
+-		.name = "i2s uartf",
+-		.mask = RT305X_GPIO_MODE_I2S_UARTF,
+-		.gpio_first = RT305X_GPIO_7,
+-		.gpio_last = RT305X_GPIO_14,
+-	}, {
+-		.name = "pcm gpio",
+-		.mask = RT305X_GPIO_MODE_PCM_GPIO,
+-		.gpio_first = RT305X_GPIO_10,
+-		.gpio_last = RT305X_GPIO_14,
+-	}, {
+-		.name = "gpio uartf",
+-		.mask = RT305X_GPIO_MODE_GPIO_UARTF,
+-		.gpio_first = RT305X_GPIO_7,
+-		.gpio_last = RT305X_GPIO_10,
+-	}, {
+-		.name = "gpio i2s",
+-		.mask = RT305X_GPIO_MODE_GPIO_I2S,
+-		.gpio_first = RT305X_GPIO_7,
+-		.gpio_last = RT305X_GPIO_10,
+-	}, {
+-		.name = "gpio",
+-		.mask = RT305X_GPIO_MODE_GPIO,
+-	}, {0}
++static struct rt2880_pmx_group rt5350_pinmux_data[] = {
++	GRP("i2c", i2c_func, 1, RT305X_GPIO_MODE_I2C),
++	GRP("spi", spi_func, 1, RT305X_GPIO_MODE_SPI),
++	GRP("uartf", uartf_func, RT305X_GPIO_MODE_UART0_MASK,
++		RT305X_GPIO_MODE_UART0_SHIFT),
++	GRP("uartlite", uartlite_func, 1, RT305X_GPIO_MODE_UART1),
++	GRP("jtag", jtag_func, 1, RT305X_GPIO_MODE_JTAG),
++	GRP("led", rt5350_led_func, 1, RT5350_GPIO_MODE_PHY_LED),
++	{ 0 }
+ };
+ 
+ static void rt305x_wdt_reset(void)
+@@ -114,14 +95,6 @@
+ 	rt_sysc_w32(t, SYSC_REG_SYSTEM_CONFIG);
+ }
+ 
+-struct ralink_pinmux rt_gpio_pinmux = {
+-	.mode = mode_mux,
+-	.uart = uart_mux,
+-	.uart_shift = RT305X_GPIO_MODE_UART0_SHIFT,
+-	.uart_mask = RT305X_GPIO_MODE_UART0_MASK,
+-	.wdt_reset = rt305x_wdt_reset,
+-};
+-
+ static unsigned long rt5350_get_mem_size(void)
+ {
+ 	void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT305X_SYSC_BASE);
+@@ -291,11 +264,14 @@
+ 	soc_info->mem_base = RT305X_SDRAM_BASE;
+ 	if (soc_is_rt5350()) {
+ 		soc_info->mem_size = rt5350_get_mem_size();
++		rt2880_pinmux_data = rt5350_pinmux_data;
+ 	} else if (soc_is_rt305x() || soc_is_rt3350()) {
+ 		soc_info->mem_size_min = RT305X_MEM_SIZE_MIN;
+ 		soc_info->mem_size_max = RT305X_MEM_SIZE_MAX;
++		rt2880_pinmux_data = rt3050_pinmux_data;
+ 	} else if (soc_is_rt3352()) {
+ 		soc_info->mem_size_min = RT3352_MEM_SIZE_MIN;
+ 		soc_info->mem_size_max = RT3352_MEM_SIZE_MAX;
++		rt2880_pinmux_data = rt3352_pinmux_data;
+ 	}
+ }
+Index: linux-3.10.9/arch/mips/include/asm/mach-ralink/rt305x.h
+===================================================================
+--- linux-3.10.9.orig/arch/mips/include/asm/mach-ralink/rt305x.h	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/arch/mips/include/asm/mach-ralink/rt305x.h	2013-08-28 16:34:43.365951713 +0200
+@@ -125,24 +125,28 @@
+ #define RT305X_GPIO_GE0_TXD0		40
+ #define RT305X_GPIO_GE0_RXCLK		51
+ 
+-#define RT305X_GPIO_MODE_I2C		BIT(0)
+-#define RT305X_GPIO_MODE_SPI		BIT(1)
+ #define RT305X_GPIO_MODE_UART0_SHIFT	2
+ #define RT305X_GPIO_MODE_UART0_MASK	0x7
+ #define RT305X_GPIO_MODE_UART0(x)	((x) << RT305X_GPIO_MODE_UART0_SHIFT)
+-#define RT305X_GPIO_MODE_UARTF		0x0
+-#define RT305X_GPIO_MODE_PCM_UARTF	0x1
+-#define RT305X_GPIO_MODE_PCM_I2S	0x2
+-#define RT305X_GPIO_MODE_I2S_UARTF	0x3
+-#define RT305X_GPIO_MODE_PCM_GPIO	0x4
+-#define RT305X_GPIO_MODE_GPIO_UARTF	0x5
+-#define RT305X_GPIO_MODE_GPIO_I2S	0x6
+-#define RT305X_GPIO_MODE_GPIO		0x7
+-#define RT305X_GPIO_MODE_UART1		BIT(5)
+-#define RT305X_GPIO_MODE_JTAG		BIT(6)
+-#define RT305X_GPIO_MODE_MDIO		BIT(7)
+-#define RT305X_GPIO_MODE_SDRAM		BIT(8)
+-#define RT305X_GPIO_MODE_RGMII		BIT(9)
++#define RT305X_GPIO_MODE_UARTF		0
++#define RT305X_GPIO_MODE_PCM_UARTF	1
++#define RT305X_GPIO_MODE_PCM_I2S	2
++#define RT305X_GPIO_MODE_I2S_UARTF	3
++#define RT305X_GPIO_MODE_PCM_GPIO	4
++#define RT305X_GPIO_MODE_GPIO_UARTF	5
++#define RT305X_GPIO_MODE_GPIO_I2S	6
++#define RT305X_GPIO_MODE_GPIO		7
++
++#define RT305X_GPIO_MODE_I2C		0
++#define RT305X_GPIO_MODE_SPI		1
++#define RT305X_GPIO_MODE_UART1		5
++#define RT305X_GPIO_MODE_JTAG		6
++#define RT305X_GPIO_MODE_MDIO		7
++#define RT305X_GPIO_MODE_SDRAM		8
++#define RT305X_GPIO_MODE_RGMII		9
++#define RT5350_GPIO_MODE_PHY_LED	14
++#define RT3352_GPIO_MODE_LNA		18
++#define RT3352_GPIO_MODE_PA		20
+ 
+ #define RT3352_SYSC_REG_SYSCFG0		0x010
+ #define RT3352_SYSC_REG_SYSCFG1         0x014
+Index: linux-3.10.9/arch/mips/include/asm/mach-ralink/mt7620.h
+===================================================================
+--- linux-3.10.9.orig/arch/mips/include/asm/mach-ralink/mt7620.h	2013-08-28 16:34:42.625951682 +0200
++++ linux-3.10.9/arch/mips/include/asm/mach-ralink/mt7620.h	2013-08-28 18:32:38.370254386 +0200
+@@ -59,7 +59,6 @@
+ #define MT7620_DDR2_SIZE_MIN		32
+ #define MT7620_DDR2_SIZE_MAX		256
+ 
+-#define MT7620_GPIO_MODE_I2C		BIT(0)
+ #define MT7620_GPIO_MODE_UART0_SHIFT	2
+ #define MT7620_GPIO_MODE_UART0_MASK	0x7
+ #define MT7620_GPIO_MODE_UART0(x)	((x) << MT7620_GPIO_MODE_UART0_SHIFT)
+@@ -71,15 +70,17 @@
+ #define MT7620_GPIO_MODE_GPIO_UARTF	0x5
+ #define MT7620_GPIO_MODE_GPIO_I2S	0x6
+ #define MT7620_GPIO_MODE_GPIO		0x7
+-#define MT7620_GPIO_MODE_UART1		BIT(5)
+-#define MT7620_GPIO_MODE_MDIO		BIT(8)
+-#define MT7620_GPIO_MODE_RGMII1		BIT(9)
+-#define MT7620_GPIO_MODE_RGMII2		BIT(10)
+-#define MT7620_GPIO_MODE_SPI		BIT(11)
+-#define MT7620_GPIO_MODE_SPI_REF_CLK	BIT(12)
+-#define MT7620_GPIO_MODE_WLED		BIT(13)
+-#define MT7620_GPIO_MODE_JTAG		BIT(15)
+-#define MT7620_GPIO_MODE_EPHY		BIT(15)
+-#define MT7620_GPIO_MODE_WDT		BIT(22)
++
++#define MT7620_GPIO_MODE_I2C		0
++#define MT7620_GPIO_MODE_UART1		5
++#define MT7620_GPIO_MODE_MDIO		8
++#define MT7620_GPIO_MODE_RGMII1		9
++#define MT7620_GPIO_MODE_RGMII2		10
++#define MT7620_GPIO_MODE_SPI		11
++#define MT7620_GPIO_MODE_SPI_REF_CLK	12
++#define MT7620_GPIO_MODE_WLED		13
++#define MT7620_GPIO_MODE_JTAG		15
++#define MT7620_GPIO_MODE_EPHY		15
++#define MT7620_GPIO_MODE_WDT		22
+ 
+ #endif
+Index: linux-3.10.9/arch/mips/include/asm/mach-ralink/rt3883.h
+===================================================================
+--- linux-3.10.9.orig/arch/mips/include/asm/mach-ralink/rt3883.h	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/arch/mips/include/asm/mach-ralink/rt3883.h	2013-08-28 18:33:57.554258201 +0200
+@@ -112,8 +112,6 @@
+ #define RT3883_CLKCFG1_PCI_CLK_EN	BIT(19)
+ #define RT3883_CLKCFG1_UPHY0_CLK_EN	BIT(18)
+ 
+-#define RT3883_GPIO_MODE_I2C		BIT(0)
+-#define RT3883_GPIO_MODE_SPI		BIT(1)
+ #define RT3883_GPIO_MODE_UART0_SHIFT	2
+ #define RT3883_GPIO_MODE_UART0_MASK	0x7
+ #define RT3883_GPIO_MODE_UART0(x)	((x) << RT3883_GPIO_MODE_UART0_SHIFT)
+@@ -125,11 +123,15 @@
+ #define RT3883_GPIO_MODE_GPIO_UARTF	0x5
+ #define RT3883_GPIO_MODE_GPIO_I2S	0x6
+ #define RT3883_GPIO_MODE_GPIO		0x7
+-#define RT3883_GPIO_MODE_UART1		BIT(5)
+-#define RT3883_GPIO_MODE_JTAG		BIT(6)
+-#define RT3883_GPIO_MODE_MDIO		BIT(7)
+-#define RT3883_GPIO_MODE_GE1		BIT(9)
+-#define RT3883_GPIO_MODE_GE2		BIT(10)
++
++#define RT3883_GPIO_MODE_I2C		0
++#define RT3883_GPIO_MODE_SPI		1
++#define RT3883_GPIO_MODE_UART1		5
++#define RT3883_GPIO_MODE_JTAG		6
++#define RT3883_GPIO_MODE_MDIO		7
++#define RT3883_GPIO_MODE_GE1		9
++#define RT3883_GPIO_MODE_GE2		10
++
+ #define RT3883_GPIO_MODE_PCI_SHIFT	11
+ #define RT3883_GPIO_MODE_PCI_MASK	0x7
+ #define RT3883_GPIO_MODE_PCI		(RT3883_GPIO_MODE_PCI_MASK << RT3883_GPIO_MODE_PCI_SHIFT)
+Index: linux-3.10.9/arch/mips/ralink/common.h
+===================================================================
+--- linux-3.10.9.orig/arch/mips/ralink/common.h	2013-08-28 16:34:42.453951675 +0200
++++ linux-3.10.9/arch/mips/ralink/common.h	2013-08-28 18:10:55.014197854 +0200
+@@ -11,25 +11,6 @@
+ 
+ #define RAMIPS_SYS_TYPE_LEN	32
+ 
+-struct ralink_pinmux_grp {
+-	const char *name;
+-	u32 mask;
+-	int gpio_first;
+-	int gpio_last;
+-};
+-
+-struct ralink_pinmux {
+-	struct ralink_pinmux_grp *mode;
+-	struct ralink_pinmux_grp *uart;
+-	int uart_shift;
+-	u32 uart_mask;
+-	void (*wdt_reset)(void);
+-	struct ralink_pinmux_grp *pci;
+-	int pci_shift;
+-	u32 pci_mask;
+-};
+-extern struct ralink_pinmux rt_gpio_pinmux;
+-
+ struct ralink_soc_info {
+ 	unsigned char sys_type[RAMIPS_SYS_TYPE_LEN];
+ 	unsigned char *compatible;
+Index: linux-3.10.9/arch/mips/ralink/rt3883.c
+===================================================================
+--- linux-3.10.9.orig/arch/mips/ralink/rt3883.c	2013-08-21 00:40:47.000000000 +0200
++++ linux-3.10.9/arch/mips/ralink/rt3883.c	2013-08-28 18:47:07.442290690 +0200
+@@ -17,132 +17,50 @@
+ #include <asm/mipsregs.h>
+ #include <asm/mach-ralink/ralink_regs.h>
+ #include <asm/mach-ralink/rt3883.h>
++#include <asm/mach-ralink/pinmux.h>
+ 
+ #include "common.h"
+ 
+-static struct ralink_pinmux_grp mode_mux[] = {
+-	{
+-		.name = "i2c",
+-		.mask = RT3883_GPIO_MODE_I2C,
+-		.gpio_first = RT3883_GPIO_I2C_SD,
+-		.gpio_last = RT3883_GPIO_I2C_SCLK,
+-	}, {
+-		.name = "spi",
+-		.mask = RT3883_GPIO_MODE_SPI,
+-		.gpio_first = RT3883_GPIO_SPI_CS0,
+-		.gpio_last = RT3883_GPIO_SPI_MISO,
+-	}, {
+-		.name = "uartlite",
+-		.mask = RT3883_GPIO_MODE_UART1,
+-		.gpio_first = RT3883_GPIO_UART1_TXD,
+-		.gpio_last = RT3883_GPIO_UART1_RXD,
+-	}, {
+-		.name = "jtag",
+-		.mask = RT3883_GPIO_MODE_JTAG,
+-		.gpio_first = RT3883_GPIO_JTAG_TDO,
+-		.gpio_last = RT3883_GPIO_JTAG_TCLK,
+-	}, {
+-		.name = "mdio",
+-		.mask = RT3883_GPIO_MODE_MDIO,
+-		.gpio_first = RT3883_GPIO_MDIO_MDC,
+-		.gpio_last = RT3883_GPIO_MDIO_MDIO,
+-	}, {
+-		.name = "ge1",
+-		.mask = RT3883_GPIO_MODE_GE1,
+-		.gpio_first = RT3883_GPIO_GE1_TXD0,
+-		.gpio_last = RT3883_GPIO_GE1_RXCLK,
+-	}, {
+-		.name = "ge2",
+-		.mask = RT3883_GPIO_MODE_GE2,
+-		.gpio_first = RT3883_GPIO_GE2_TXD0,
+-		.gpio_last = RT3883_GPIO_GE2_RXCLK,
+-	}, {
+-		.name = "pci",
+-		.mask = RT3883_GPIO_MODE_PCI,
+-		.gpio_first = RT3883_GPIO_PCI_AD0,
+-		.gpio_last = RT3883_GPIO_PCI_AD31,
+-	}, {
+-		.name = "lna a",
+-		.mask = RT3883_GPIO_MODE_LNA_A,
+-		.gpio_first = RT3883_GPIO_LNA_PE_A0,
+-		.gpio_last = RT3883_GPIO_LNA_PE_A2,
+-	}, {
+-		.name = "lna g",
+-		.mask = RT3883_GPIO_MODE_LNA_G,
+-		.gpio_first = RT3883_GPIO_LNA_PE_G0,
+-		.gpio_last = RT3883_GPIO_LNA_PE_G2,
+-	}, {0}
++static struct rt2880_pmx_func i2c_func[] =  { FUNC("i2c", 0, 1, 2) };
++static struct rt2880_pmx_func spi_func[] = { FUNC("spi", 0, 3, 4) };
++static struct rt2880_pmx_func uartf_func[] = {
++	FUNC("uartf", RT3883_GPIO_MODE_UARTF, 7, 8),
++	FUNC("pcm uartf", RT3883_GPIO_MODE_PCM_UARTF, 7, 8),
++	FUNC("pcm i2s", RT3883_GPIO_MODE_PCM_I2S, 7, 8),
++	FUNC("i2s uartf", RT3883_GPIO_MODE_I2S_UARTF, 7, 8),
++	FUNC("pcm gpio", RT3883_GPIO_MODE_PCM_GPIO, 11, 4),
++	FUNC("gpio uartf", RT3883_GPIO_MODE_GPIO_UARTF, 7, 4),
++	FUNC("gpio i2s", RT3883_GPIO_MODE_GPIO_I2S, 7, 4),
+ };
+-
+-static struct ralink_pinmux_grp uart_mux[] = {
+-	{
+-		.name = "uartf",
+-		.mask = RT3883_GPIO_MODE_UARTF,
+-		.gpio_first = RT3883_GPIO_7,
+-		.gpio_last = RT3883_GPIO_14,
+-	}, {
+-		.name = "pcm uartf",
+-		.mask = RT3883_GPIO_MODE_PCM_UARTF,
+-		.gpio_first = RT3883_GPIO_7,
+-		.gpio_last = RT3883_GPIO_14,
+-	}, {
+-		.name = "pcm i2s",
+-		.mask = RT3883_GPIO_MODE_PCM_I2S,
+-		.gpio_first = RT3883_GPIO_7,
+-		.gpio_last = RT3883_GPIO_14,
+-	}, {
+-		.name = "i2s uartf",
+-		.mask = RT3883_GPIO_MODE_I2S_UARTF,
+-		.gpio_first = RT3883_GPIO_7,
+-		.gpio_last = RT3883_GPIO_14,
+-	}, {
+-		.name = "pcm gpio",
+-		.mask = RT3883_GPIO_MODE_PCM_GPIO,
+-		.gpio_first = RT3883_GPIO_11,
+-		.gpio_last = RT3883_GPIO_14,
+-	}, {
+-		.name = "gpio uartf",
+-		.mask = RT3883_GPIO_MODE_GPIO_UARTF,
+-		.gpio_first = RT3883_GPIO_7,
+-		.gpio_last = RT3883_GPIO_10,
+-	}, {
+-		.name = "gpio i2s",
+-		.mask = RT3883_GPIO_MODE_GPIO_I2S,
+-		.gpio_first = RT3883_GPIO_7,
+-		.gpio_last = RT3883_GPIO_10,
+-	}, {
+-		.name = "gpio",
+-		.mask = RT3883_GPIO_MODE_GPIO,
+-	}, {0}
++static struct rt2880_pmx_func uartlite_func[] = { FUNC("uartlite", 0, 15, 2) };
++static struct rt2880_pmx_func jtag_func[] = { FUNC("jtag", 0, 17, 25) };
++static struct rt2880_pmx_func mdio_func[] = { FUNC("mdio", 0, 22, 2) };
++static struct rt2880_pmx_func lna_a_func[] = { FUNC("lna a", 0, 32, 3) };
++static struct rt2880_pmx_func lna_g_func[] = { FUNC("lna a", 0, 35, 3) };
++static struct rt2880_pmx_func pci_func[] = {
++	FUNC("pci-dev", 0, 40, 32),
++	FUNC("pci-host2", 1, 40, 32),
++	FUNC("pci-host1", 2, 40, 32),
++	FUNC("pci-fnc", 3, 40, 32)
+ };
++static struct rt2880_pmx_func ge1_func[] = { FUNC("ge1", 0, 72, 12) };
++static struct rt2880_pmx_func ge2_func[] = { FUNC("ge1", 0, 84, 12) };
+ 
+-static struct ralink_pinmux_grp pci_mux[] = {
+-	{
+-		.name = "pci-dev",
+-		.mask = 0,
+-		.gpio_first = RT3883_GPIO_PCI_AD0,
+-		.gpio_last = RT3883_GPIO_PCI_AD31,
+-	}, {
+-		.name = "pci-host2",
+-		.mask = 1,
+-		.gpio_first = RT3883_GPIO_PCI_AD0,
+-		.gpio_last = RT3883_GPIO_PCI_AD31,
+-	}, {
+-		.name = "pci-host1",
+-		.mask = 2,
+-		.gpio_first = RT3883_GPIO_PCI_AD0,
+-		.gpio_last = RT3883_GPIO_PCI_AD31,
+-	}, {
+-		.name = "pci-fnc",
+-		.mask = 3,
+-		.gpio_first = RT3883_GPIO_PCI_AD0,
+-		.gpio_last = RT3883_GPIO_PCI_AD31,
+-	}, {
+-		.name = "pci-gpio",
+-		.mask = 7,
+-		.gpio_first = RT3883_GPIO_PCI_AD0,
+-		.gpio_last = RT3883_GPIO_PCI_AD31,
+-	}, {0}
++static struct rt2880_pmx_group rt3883_pinmux_data[] = {
++	GRP("i2c", i2c_func, 1, RT3883_GPIO_MODE_I2C),
++	GRP("spi", spi_func, 1, RT3883_GPIO_MODE_SPI),
++	GRP("uartf", uartf_func, RT3883_GPIO_MODE_UART0_MASK,
++		RT3883_GPIO_MODE_UART0_SHIFT),
++	GRP("uartlite", uartlite_func, 1, RT3883_GPIO_MODE_UART1),
++	GRP("jtag", jtag_func, 1, RT3883_GPIO_MODE_JTAG),
++	GRP("mdio", mdio_func, 1, RT3883_GPIO_MODE_MDIO),
++	GRP("lna a", lna_a_func, 1, RT3883_GPIO_MODE_LNA_A),
++	GRP("lna g", lna_g_func, 1, RT3883_GPIO_MODE_LNA_G),
++	GRP("pci", pci_func, RT3883_GPIO_MODE_PCI_MASK,
++		RT3883_GPIO_MODE_PCI_SHIFT),
++	GRP("ge1", ge1_func, 1, RT3883_GPIO_MODE_GE1),
++	GRP("ge2", ge2_func, 1, RT3883_GPIO_MODE_GE2),
++	{ 0 }
+ };
+ 
+ static void rt3883_wdt_reset(void)
+@@ -155,17 +73,6 @@
+ 	rt_sysc_w32(t, RT3883_SYSC_REG_SYSCFG1);
+ }
+ 
+-struct ralink_pinmux rt_gpio_pinmux = {
+-	.mode = mode_mux,
+-	.uart = uart_mux,
+-	.uart_shift = RT3883_GPIO_MODE_UART0_SHIFT,
+-	.uart_mask = RT3883_GPIO_MODE_UART0_MASK,
+-	.wdt_reset = rt3883_wdt_reset,
+-	.pci = pci_mux,
+-	.pci_shift = RT3883_GPIO_MODE_PCI_SHIFT,
+-	.pci_mask = RT3883_GPIO_MODE_PCI_MASK,
+-};
+-
+ void __init ralink_clk_init(void)
+ {
+ 	unsigned long cpu_rate, sys_rate;
+@@ -243,4 +150,6 @@
+ 	soc_info->mem_base = RT3883_SDRAM_BASE;
+ 	soc_info->mem_size_min = RT3883_MEM_SIZE_MIN;
+ 	soc_info->mem_size_max = RT3883_MEM_SIZE_MAX;
++
++	rt2880_pinmux_data = rt3883_pinmux_data;
+ }
diff --git a/target/linux/ramips/rt305x/config-3.10 b/target/linux/ramips/rt305x/config-3.10
index 47d6d18060..93222447c8 100644
--- a/target/linux/ramips/rt305x/config-3.10
+++ b/target/linux/ramips/rt305x/config-3.10
@@ -1,7 +1,6 @@
 CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
 CONFIG_ARCH_DISCARD_MEMBLOCK=y
 CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
-CONFIG_ARCH_HAS_RESET_CONTROLLER=y
 CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
 CONFIG_ARCH_HIBERNATION_POSSIBLE=y
 CONFIG_ARCH_REQUIRE_GPIOLIB=y
@@ -30,11 +29,11 @@ CONFIG_CPU_R4K_FPU=y
 CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
 CONFIG_CPU_SUPPORTS_HIGHMEM=y
 CONFIG_CSRC_R4K=y
+CONFIG_DEBUG_PINCTRL=y
 CONFIG_DMA_NONCOHERENT=y
 # CONFIG_DTB_RT305X_EVAL is not set
 CONFIG_DTB_RT_NONE=y
 CONFIG_DTC=y
-# CONFIG_DWC_OTG is not set
 CONFIG_EARLY_PRINTK=y
 CONFIG_GENERIC_ATOMIC64=y
 CONFIG_GENERIC_CLOCKEVENTS=y
@@ -120,6 +119,11 @@ CONFIG_OF_NET=y
 CONFIG_PAGEFLAGS_EXTENDED=y
 CONFIG_PERF_USE_VMALLOC=y
 CONFIG_PHYLIB=y
+# CONFIG_PINCONF is not set
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_RALINK=y
+# CONFIG_PINCTRL_SINGLE is not set
+CONFIG_PINMUX=y
 # CONFIG_PREEMPT_RCU is not set
 CONFIG_RALINK=y
 CONFIG_RALINK_USBPHY=y
diff --git a/target/linux/ramips/rt3883/config-3.10 b/target/linux/ramips/rt3883/config-3.10
index 509af454fb..c01a1e793b 100644
--- a/target/linux/ramips/rt3883/config-3.10
+++ b/target/linux/ramips/rt3883/config-3.10
@@ -2,7 +2,6 @@ CONFIG_AR8216_PHY=y
 CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
 CONFIG_ARCH_DISCARD_MEMBLOCK=y
 CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
-CONFIG_ARCH_HAS_RESET_CONTROLLER=y
 CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
 CONFIG_ARCH_HIBERNATION_POSSIBLE=y
 CONFIG_ARCH_REQUIRE_GPIOLIB=y
@@ -28,6 +27,7 @@ CONFIG_CPU_R4K_FPU=y
 CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
 CONFIG_CPU_SUPPORTS_HIGHMEM=y
 CONFIG_CSRC_R4K=y
+CONFIG_DEBUG_PINCTRL=y
 CONFIG_DMA_NONCOHERENT=y
 # CONFIG_DTB_RT3883_EVAL is not set
 CONFIG_DTB_RT_NONE=y
@@ -126,6 +126,11 @@ CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PERF_USE_VMALLOC=y
 CONFIG_PHYLIB=y
+# CONFIG_PINCONF is not set
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_RALINK=y
+# CONFIG_PINCTRL_SINGLE is not set
+CONFIG_PINMUX=y
 # CONFIG_PREEMPT_RCU is not set
 CONFIG_RALINK=y
 CONFIG_RALINK_USBPHY=y
-- 
GitLab