diff mbox series

[OpenWrt-Devel] ramips: use gpio_hog instead of gpio-export

Message ID 2f56d90d-39bf-7f63-0676-e0856e6d9f15@birger-koblitz.de
State Changes Requested
Delegated to: Mathias Kresin
Headers show
Series [OpenWrt-Devel] ramips: use gpio_hog instead of gpio-export | expand

Commit Message

Birger Koblitz Aug. 2, 2019, 9:58 a.m. UTC
ramips: use gpio_hog instead of gpio-export

The `gpio-export` functionality is a hack for
missing kernel functionality, which was rejected in upstream kernel long
time
ago, for details see this email
http://lists.infradead.org/pipermail/openwrt-devel/2019-February/015772.html,
discussion in PR#1366 or
https://github.com/openwrt/openwrt/pull/1814#issuecomment-462942022.

This patch converts all remaining ramips .dts(i) files which were
using export-gpio and not making use of the change-direction functionality
to using gpio_hog instead

Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>

---

Comments

Mathias Kresin Aug. 11, 2019, 9:36 a.m. UTC | #1
02/08/2019 11:58, Birger Koblitz:
> ramips: use gpio_hog instead of gpio-export
> 
> The `gpio-export` functionality is a hack for
> missing kernel functionality, which was rejected in upstream kernel long
> time
> ago, for details see this email
> http://lists.infradead.org/pipermail/openwrt-devel/2019-February/015772.html,
> discussion in PR#1366 or
> https://github.com/openwrt/openwrt/pull/1814#issuecomment-462942022.
> 
> This patch converts all remaining ramips .dts(i) files which were
> using export-gpio and not making use of the change-direction functionality
> to using gpio_hog instead
> 
> Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>
> 
> ---
> 
> diff --git a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
> b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
> index 4097dc6140..ea0d9801c1 100644
> --- a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
> +++ b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
> @@ -21,39 +21,6 @@
>           bootargs = "console=ttyS0,115200";
>       };
>   
> -    gpio-export {
> -        compatible = "gpio-export";
> -        #size-cells = <0>;
> -
> -        modem-enable {
> -            gpio-export,name = "modem-enable";
> -            gpio-export,output = <1>;
> -            gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
> -        };
> -
> -        modem-rf-enable {
> -            gpio-export,name = "modem-rf-enable";
> -            gpio-export,output = <1>;
> -            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
> -        };
> -
> -        sim-select {
> -            gpio-export,name = "sim-select";
> -            gpio-export,output = <0>;
> -            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
> -        };
> -
> -        sim1-detect {
> -            gpio-export,name = "sim1-detect";
> -            gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
> -        };
> -
> -        sim2-detect {
> -            gpio-export,name = "sim2-detect";
> -            gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
> -        };
> -    };
> -

Hey Birger,

similar to my comment for the lantiq version, this doesn't work as well.

AFAIR, the Tube e4g has two sim card slots and the "sim-select" gpio is 
supposed to be used from the userspace, to select which sim card slot 
should be used.

If we hog the gpio, it can't be manipulated from the userspace anymore.

I haven't had a closer look at the patch. There might be similar issues 
for other boards.

@Piotr can confirm what I might to remember?

Regards
Mathias
Piotr Dymacz Aug. 11, 2019, 10:06 a.m. UTC | #2
Hi Mathias, Birger,

On 11.08.2019 11:36, Mathias Kresin wrote:
> 02/08/2019 11:58, Birger Koblitz:
>> ramips: use gpio_hog instead of gpio-export
>> 
>> The `gpio-export` functionality is a hack for
>> missing kernel functionality, which was rejected in upstream kernel long
>> time
>> ago, for details see this email
>> http://lists.infradead.org/pipermail/openwrt-devel/2019-February/015772.html,
>> discussion in PR#1366 or
>> https://github.com/openwrt/openwrt/pull/1814#issuecomment-462942022.
>> 
>> This patch converts all remaining ramips .dts(i) files which were
>> using export-gpio and not making use of the change-direction functionality
>> to using gpio_hog instead
>> 
>> Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>
>> 
>> ---
>> 
>> diff --git a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>> b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>> index 4097dc6140..ea0d9801c1 100644
>> --- a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>> +++ b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>> @@ -21,39 +21,6 @@
>>           bootargs = "console=ttyS0,115200";
>>       };
>>   
>> -    gpio-export {
>> -        compatible = "gpio-export";
>> -        #size-cells = <0>;
>> -
>> -        modem-enable {
>> -            gpio-export,name = "modem-enable";
>> -            gpio-export,output = <1>;
>> -            gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
>> -        };
>> -
>> -        modem-rf-enable {
>> -            gpio-export,name = "modem-rf-enable";
>> -            gpio-export,output = <1>;
>> -            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
>> -        };
>> -
>> -        sim-select {
>> -            gpio-export,name = "sim-select";
>> -            gpio-export,output = <0>;
>> -            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
>> -        };
>> -
>> -        sim1-detect {
>> -            gpio-export,name = "sim1-detect";
>> -            gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
>> -        };
>> -
>> -        sim2-detect {
>> -            gpio-export,name = "sim2-detect";
>> -            gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
>> -        };
>> -    };
>> -
> 
> Hey Birger,
> 
> similar to my comment for the lantiq version, this doesn't work as well.
> 
> AFAIR, the Tube e4g has two sim card slots and the "sim-select" gpio is
> supposed to be used from the userspace, to select which sim card slot
> should be used.
> 
> If we hog the gpio, it can't be manipulated from the userspace anymore.
> 
> I haven't had a closer look at the patch. There might be similar issues
> for other boards.
> 
> @Piotr can confirm what I might to remember?

Yes, you're correct.

Also, the "modem-enable" should be available in user space as in case of 
some modems (without "SIM power down" feature support), only this 
approach works when changing SIM cards/slots:

put the modem in reset -> switch SIM slot -> enable modem

(still, there is a way to perform modem reset using AT command but IMHO 
it's not as convenient as toggling PERST# pin)
Birger Koblitz Aug. 11, 2019, 10:59 a.m. UTC | #3
Dear Mathias and Piotr,

thank you for your comments. I had incorrectly assumed that a gpio_hog
could still be switched on/off from user space and that the only thing
not possible was changing the direction.

I'll go through the patches and remove anything that sounds like it
might need user space configuration (i.e. not power the USB bus or the
like).

Is anyone working on converting the use-cases which require user space
switching to libgpiod or any other solution?

Cheers,

  Birger


On 11.08.19 12:06, Piotr Dymacz wrote:
> Hi Mathias, Birger,
>
> On 11.08.2019 11:36, Mathias Kresin wrote:
>> 02/08/2019 11:58, Birger Koblitz:
>>> ramips: use gpio_hog instead of gpio-export
>>>
>>> The `gpio-export` functionality is a hack for
>>> missing kernel functionality, which was rejected in upstream kernel
>>> long
>>> time
>>> ago, for details see this email
>>> http://lists.infradead.org/pipermail/openwrt-devel/2019-February/015772.html,
>>>
>>> discussion in PR#1366 or
>>> https://github.com/openwrt/openwrt/pull/1814#issuecomment-462942022.
>>>
>>> This patch converts all remaining ramips .dts(i) files which were
>>> using export-gpio and not making use of the change-direction
>>> functionality
>>> to using gpio_hog instead
>>>
>>> Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>
>>>
>>> ---
>>>
>>> diff --git a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>>> b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>>> index 4097dc6140..ea0d9801c1 100644
>>> --- a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>>> +++ b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
>>> @@ -21,39 +21,6 @@
>>>           bootargs = "console=ttyS0,115200";
>>>       };
>>>   -    gpio-export {
>>> -        compatible = "gpio-export";
>>> -        #size-cells = <0>;
>>> -
>>> -        modem-enable {
>>> -            gpio-export,name = "modem-enable";
>>> -            gpio-export,output = <1>;
>>> -            gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
>>> -        };
>>> -
>>> -        modem-rf-enable {
>>> -            gpio-export,name = "modem-rf-enable";
>>> -            gpio-export,output = <1>;
>>> -            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
>>> -        };
>>> -
>>> -        sim-select {
>>> -            gpio-export,name = "sim-select";
>>> -            gpio-export,output = <0>;
>>> -            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
>>> -        };
>>> -
>>> -        sim1-detect {
>>> -            gpio-export,name = "sim1-detect";
>>> -            gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
>>> -        };
>>> -
>>> -        sim2-detect {
>>> -            gpio-export,name = "sim2-detect";
>>> -            gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
>>> -        };
>>> -    };
>>> -
>>
>> Hey Birger,
>>
>> similar to my comment for the lantiq version, this doesn't work as well.
>>
>> AFAIR, the Tube e4g has two sim card slots and the "sim-select" gpio is
>> supposed to be used from the userspace, to select which sim card slot
>> should be used.
>>
>> If we hog the gpio, it can't be manipulated from the userspace anymore.
>>
>> I haven't had a closer look at the patch. There might be similar issues
>> for other boards.
>>
>> @Piotr can confirm what I might to remember?
>
> Yes, you're correct.
>
> Also, the "modem-enable" should be available in user space as in case
> of some modems (without "SIM power down" feature support), only this
> approach works when changing SIM cards/slots:
>
> put the modem in reset -> switch SIM slot -> enable modem
>
> (still, there is a way to perform modem reset using AT command but
> IMHO it's not as convenient as toggling PERST# pin)
>
gio--- via openwrt-devel Aug. 11, 2019, 11:38 a.m. UTC | #4
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.
On Sun, Aug 11, 2019 at 1:00 PM Birger Koblitz <mail@birger-koblitz.de> wrote:
> I'll go through the patches and remove anything that sounds like it
> might need user space configuration (i.e. not power the USB bus or the
> like).
upstream GPIO maintainers prefer dedicated properties instead of a GPIO hog.

some USB controller drivers support a "vbus-supply" property, which
can be used together with a GPIO regulator
in case of the VBUS supply it means the GPIO will be turned off if the
USB port is "disabled" (for example by unloading the kernel USB
controller driver).

I'm not saying that you have to switch over to something other than GPIO hogs.
switching to an upstream solution is a good starting point!
just be aware that this may not be the final solution

> Is anyone working on converting the use-cases which require user space
> switching to libgpiod or any other solution?
how do you identify the "use-cases which require use space switching"?


Martin
Enrico Mioso Aug. 11, 2019, 5:15 p.m. UTC | #5
Fully agree. And BTW, AT commands may not be a viable option in some cases. We need to be able to manipulate gpios from user space sometime.
Thanks,
Enrico
Birger Koblitz Aug. 11, 2019, 7:29 p.m. UTC | #6
Dear Martin and Enrico,

thanks for your comments.

On 11.08.19 13:38, Martin Blumenstingl wrote:
> On Sun, Aug 11, 2019 at 1:00 PM Birger Koblitz <mail@birger-koblitz.de> wrote:
>> I'll go through the patches and remove anything that sounds like it
>> might need user space configuration (i.e. not power the USB bus or the
>> like).
> upstream GPIO maintainers prefer dedicated properties instead of a GPIO hog.
>
> some USB controller drivers support a "vbus-supply" property, which
> can be used together with a GPIO regulator
> in case of the VBUS supply it means the GPIO will be turned off if the
> USB port is "disabled" (for example by unloading the kernel USB
> controller driver).
>
> I'm not saying that you have to switch over to something other than GPIO hogs.
> switching to an upstream solution is a good starting point!
> just be aware that this may not be the final solution

this is understood. gpio-hog is only the second best solution, where
gpio-export is only the third best solution for the general case but in
some cases at the moment the only reasonable one.


>
>> Is anyone working on converting the use-cases which require user space
>> switching to libgpiod or any other solution?
> how do you identify the "use-cases which require use space switching"?

I believe this discussion has happened already, e.g. here:

https://github.com/openwrt/openwrt/pull/1366

and I don't think you need a final answer to this question in order to
start migrating to gpio_hog where it is easily possible.

@Enrico: It is clear that in some cases definitely we need to have a
possibility to manipulate gpios from user-space.


Cheers

   Birger
diff mbox series

Patch

diff --git a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
index 4097dc6140..ea0d9801c1 100644
--- a/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
+++ b/target/linux/ramips/dts/mt7620a_alfa-network_tube-e4g.dts
@@ -21,39 +21,6 @@ 
         bootargs = "console=ttyS0,115200";
     };
 
-    gpio-export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        modem-enable {
-            gpio-export,name = "modem-enable";
-            gpio-export,output = <1>;
-            gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
-        };
-
-        modem-rf-enable {
-            gpio-export,name = "modem-rf-enable";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
-
-        sim-select {
-            gpio-export,name = "sim-select";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
-        };
-
-        sim1-detect {
-            gpio-export,name = "sim1-detect";
-            gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
-        };
-
-        sim2-detect {
-            gpio-export,name = "sim2-detect";
-            gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     keys {
         compatible = "gpio-keys";
 
@@ -98,26 +65,61 @@ 
     };
 };
 
-&ehci {
+&gpio1 {
     status = "okay";
-};
 
-&ethernet {
-    mtd-mac-address = <&factory 0x28>;
+    modem-enable {
+        gpio-hog;
+        line-name = "modem-enable";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
 &gpio0 {
     status = "okay";
+
+    modem-rf-enable {
+        gpio-hog;
+        line-name = "modem-rf-enable";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    sim-select {
+        gpio-hog;
+        line-name = "sim-select";
+        gpios = <13 GPIO_ACTIVE_HIGH>;
+        output-low;
+    };
+
+    sim1-detect {
+        gpio-hog;
+        line-name = "sim1-detect";
+        gpios = <9 GPIO_ACTIVE_HIGH>;
+        input;
+    };
 };
 
-&gpio1 {
+&gpio2 {
     status = "okay";
+
+    sim2-detect {
+        gpio-hog;
+        line-name = "sim2-detect";
+        gpios = <1 GPIO_ACTIVE_HIGH>;
+        input;
+    };
 };
 
-&gpio2 {
+&ehci {
     status = "okay";
 };
 
+&ethernet {
+    mtd-mac-address = <&factory 0x28>;
+};
+
 &gsw {
     mediatek,port4 = "ephy";
 };
diff --git a/target/linux/ramips/dts/mt7620a_asus_rt-ac51u.dts
b/target/linux/ramips/dts/mt7620a_asus_rt-ac51u.dts
index 3e54ffdad2..c573b38284 100644
--- a/target/linux/ramips/dts/mt7620a_asus_rt-ac51u.dts
+++ b/target/linux/ramips/dts/mt7620a_asus_rt-ac51u.dts
@@ -53,16 +53,16 @@ 
             linux,code = <KEY_WPS_BUTTON>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        enable-leds {
-            gpio-export,name = "enable-leds";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
-        };
+    enable-leds {
+        gpio-hog;
+        line-name = "enable-leds";
+        gpios = <10 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a1.dts
b/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a1.dts
index 707bc1c3d3..7af90c6908 100644
--- a/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a1.dts
+++ b/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a1.dts
@@ -63,21 +63,17 @@ 
             linux,default-trigger = "usbport";
         };
     };
-
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <0>;
-            gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
-        };
-    };
 };
 
 &gpio1 {
     status = "okay";
+
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <14 GPIO_ACTIVE_LOW>;
+        output-low;
+    };
 };
 
 &gpio2 {
diff --git a/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a2.dts
b/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a2.dts
index 26b23aa6d1..17ec47b9d5 100644
--- a/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a2.dts
+++ b/target/linux/ramips/dts/mt7620a_dlink_dwr-118-a2.dts
@@ -61,21 +61,17 @@ 
             linux,default-trigger = "usbport";
         };
     };
-
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
-        };
-    };
 };
 
 &gpio1 {
     status = "okay";
+
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <14 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
 &gpio2 {
diff --git a/target/linux/ramips/dts/mt7620a_dovado_tiny-ac.dts
b/target/linux/ramips/dts/mt7620a_dovado_tiny-ac.dts
index e36af1dc7f..acb3524e3d 100644
--- a/target/linux/ramips/dts/mt7620a_dovado_tiny-ac.dts
+++ b/target/linux/ramips/dts/mt7620a_dovado_tiny-ac.dts
@@ -39,16 +39,16 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio2 {
+    status = "okay";
 
-        usbpower {
-            gpio-export,name = "usbpower";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;
-        };
+    usbpower {
+        gpio-hog;
+        line-name = "usbpower";
+        gpios = <5 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
@@ -56,10 +56,6 @@ 
     status = "okay";
 };
 
-&gpio2 {
-    status = "okay";
-};
-
 &gpio3 {
     status = "okay";
 };
diff --git a/target/linux/ramips/dts/mt7620a_edimax_br-6478ac-v2.dts
b/target/linux/ramips/dts/mt7620a_edimax_br-6478ac-v2.dts
index 5c90aa1549..d329c3380c 100644
--- a/target/linux/ramips/dts/mt7620a_edimax_br-6478ac-v2.dts
+++ b/target/linux/ramips/dts/mt7620a_edimax_br-6478ac-v2.dts
@@ -66,22 +66,17 @@ 
             linux,default-trigger = "usbport";
         };
     };
-
-
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-        usb-power {
-            gpio-export,name="usb-power";
-            gpio-export,output=<1>;
-            gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;
-        };
-    };
 };
 
-
 &gpio2 {
     status = "okay";
+
+    usb-power {
+        gpio-hog;
+        line-name = "usb-power";
+        gpios = <5 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
 &spi0 {
diff --git a/target/linux/ramips/dts/mt7620a_hiwifi_hc5861.dts
b/target/linux/ramips/dts/mt7620a_hiwifi_hc5861.dts
index 73f1a4079a..b3af562e5d 100644
--- a/target/linux/ramips/dts/mt7620a_hiwifi_hc5861.dts
+++ b/target/linux/ramips/dts/mt7620a_hiwifi_hc5861.dts
@@ -41,22 +41,23 @@ 
             gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usbpower {
-            gpio-export,name = "usbpower";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
-        };
+    usbpower {
+        gpio-hog;
+        line-name = "usbpower";
+        gpios = <13 GPIO_ACTIVE_LOW>;
+        output-low;
+    };
 
-        sdpower {
-            gpio-export,name = "sdpower";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
-        };
+    sdpower {
+        gpio-hog;
+        line-name = "sdpower";
+        gpios = <8 GPIO_ACTIVE_LOW>;
+        output-low;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_hiwifi_hc5x61.dtsi
b/target/linux/ramips/dts/mt7620a_hiwifi_hc5x61.dtsi
index 09b303fd33..85dc521722 100644
--- a/target/linux/ramips/dts/mt7620a_hiwifi_hc5x61.dtsi
+++ b/target/linux/ramips/dts/mt7620a_hiwifi_hc5x61.dtsi
@@ -20,16 +20,16 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usbpower {
-            gpio-export,name = "usbpower";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
-        };
+    usbpower {
+        gpio-hog;
+        line-name = "usbpower";
+        gpios = <13 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
@@ -39,10 +39,6 @@ 
     ralink,wdtmux = <1>;
 };
 
-&gpio0 {
-    status = "okay";
-};
-
 &gpio2 {
     status = "okay";
 };
diff --git a/target/linux/ramips/dts/mt7620a_hnet_c108.dts
b/target/linux/ramips/dts/mt7620a_hnet_c108.dts
index 2d89d34ad5..3da128e8e8 100644
--- a/target/linux/ramips/dts/mt7620a_hnet_c108.dts
+++ b/target/linux/ramips/dts/mt7620a_hnet_c108.dts
@@ -53,17 +53,6 @@ 
         bootargs = "console=ttyS0,115200";
     };
 
-    gpio-export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        power_modem {
-            gpio-export,name = "power_modem";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     leds {
         compatible = "gpio-leds";
 
@@ -105,11 +94,18 @@ 
     };
 };
 
-&gpio1 {
+&gpio2 {
     status = "okay";
+
+    power_modem {
+        gpio-hog;
+        line-name = "power_modem";
+        gpios = <2 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
-&gpio2 {
+&gpio1 {
     status = "okay";
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_lava_lr-25g001.dts
b/target/linux/ramips/dts/mt7620a_lava_lr-25g001.dts
index 20974c93e2..261103d307 100644
--- a/target/linux/ramips/dts/mt7620a_lava_lr-25g001.dts
+++ b/target/linux/ramips/dts/mt7620a_lava_lr-25g001.dts
@@ -51,21 +51,17 @@ 
             gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
         };
     };
-
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usbpower {
-            gpio-export,name = "usbpower";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
-    };
 };
 
 &gpio0 {
     status = "okay";
+
+    usbpower {
+        gpio-hog;
+        line-name = "usbpower";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
 &spi0 {
diff --git a/target/linux/ramips/dts/mt7620a_lenovo_newifi-y1s.dts
b/target/linux/ramips/dts/mt7620a_lenovo_newifi-y1s.dts
index ccb0d18ead..20dcfcf8b0 100644
--- a/target/linux/ramips/dts/mt7620a_lenovo_newifi-y1s.dts
+++ b/target/linux/ramips/dts/mt7620a_lenovo_newifi-y1s.dts
@@ -13,27 +13,6 @@ 
         led-upgrade = &led_power_blue;
     };
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usb0 {
-            gpio-export,name = "usb0";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 14 GPIO_ACTIVE_HIGH>;
-        };
-        usb1 {
-            gpio-export,name = "usb1";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
-        };
-        usb2 {
-            gpio-export,name = "usb2";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 16 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     leds {
         compatible = "gpio-leds";
 
@@ -76,6 +55,31 @@ 
     };
 };
 
+&gpio2 {
+    status = "okay";
+
+    usb0 {
+        gpio-hog;
+        line-name = "usb0";
+        gpios = <14 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    usb1 {
+        gpio-hog;
+        line-name = "usb1";
+        gpios = <15 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    usb2 {
+        gpio-hog;
+        line-name = "usb2";
+        gpios = <16 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+};
+
 &ethernet {
     status = "okay";
     mtd-mac-address = <&factory 0x4>;
diff --git a/target/linux/ramips/dts/mt7620a_sanlinking_d240.dts
b/target/linux/ramips/dts/mt7620a_sanlinking_d240.dts
index 2110959ee8..1a45803b8e 100644
--- a/target/linux/ramips/dts/mt7620a_sanlinking_d240.dts
+++ b/target/linux/ramips/dts/mt7620a_sanlinking_d240.dts
@@ -53,23 +53,6 @@ 
         bootargs = "console=ttyS0,115200";
     };
 
-    gpio-export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        power_mpcie2 {
-            gpio-export,name = "power_mpcie2";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;
-        };
-
-        power_mpcie1 {
-            gpio-export,name = "power_mpcie1";
-            gpio-export,output = <1>;
-            gpios = <&gpio2 6 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     leds {
         compatible = "gpio-leds";
 
@@ -103,11 +86,25 @@ 
     };
 };
 
-&gpio1 {
+&gpio2 {
     status = "okay";
+
+    power_mpcie2 {
+        gpio-hog;
+        line-name = "power_mpcie2";
+        gpios = <5 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    power_mpcie1 {
+        gpio-hog;
+        line-name = "power_mpcie1";
+        gpios = <6 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
-&gpio2 {
+&gpio1 {
     status = "okay";
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_sercomm_na930.dts
b/target/linux/ramips/dts/mt7620a_sercomm_na930.dts
index 6d85914265..95f49c24a3 100644
--- a/target/linux/ramips/dts/mt7620a_sercomm_na930.dts
+++ b/target/linux/ramips/dts/mt7620a_sercomm_na930.dts
@@ -102,16 +102,16 @@ 
             gpios = <&gpio2 29 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        telit {
-            gpio-export,name = "telit";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
-        };
+    telit {
+        gpio-hog;
+        line-name = "telit";
+        gpios = <13 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_tplink_archer-mr200.dts
b/target/linux/ramips/dts/mt7620a_tplink_archer-mr200.dts
index 566b2431fc..6657def5fd 100644
--- a/target/linux/ramips/dts/mt7620a_tplink_archer-mr200.dts
+++ b/target/linux/ramips/dts/mt7620a_tplink_archer-mr200.dts
@@ -89,16 +89,16 @@ 
             linux,code = <KEY_RFKILL>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        power_usb {
-            gpio-export,name = "power_usb1";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
-        };
+    power_usb1 {
+        gpio-hog;
+        line-name = "power_usb1";
+        gpios = <11 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_yukai_bocco.dts
b/target/linux/ramips/dts/mt7620a_yukai_bocco.dts
index cc9c6688dc..0e8bc49688 100644
--- a/target/linux/ramips/dts/mt7620a_yukai_bocco.dts
+++ b/target/linux/ramips/dts/mt7620a_yukai_bocco.dts
@@ -20,20 +20,6 @@ 
         };
     };
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        s1 {
-            gpio-export,name = "rec";
-            gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;
-        };
-        s2 {
-            gpio-export,name = "play";
-            gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     sound {
         compatible = "simple-audio-card";
         simple-audio-card,name = "Audio-I2S";
@@ -57,11 +43,25 @@ 
     };
 };
 
-&gpio0 {
+&gpio1 {
     status = "okay";
+
+    rec {
+        gpio-hog;
+        line-name = "rec";
+        gpios = <8 GPIO_ACTIVE_HIGH>;
+        input;
+    };
+
+    play {
+        gpio-hog;
+        line-name = "play";
+        gpios = <9 GPIO_ACTIVE_HIGH>;
+        input;
+    };
 };
 
-&gpio1 {
+&gpio0 {
     status = "okay";
 };
 
diff --git a/target/linux/ramips/dts/mt7620a_zyxel_keenetic-viva.dts
b/target/linux/ramips/dts/mt7620a_zyxel_keenetic-viva.dts
index 3d6d2c6f06..4a47cbade8 100644
--- a/target/linux/ramips/dts/mt7620a_zyxel_keenetic-viva.dts
+++ b/target/linux/ramips/dts/mt7620a_zyxel_keenetic-viva.dts
@@ -70,17 +70,6 @@ 
         };
     };
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usb_power {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     rtl8367rb {
         compatible = "realtek,rtl8367b";
         cpu_port = <7>;
@@ -89,6 +78,17 @@ 
     };
 };
 
+&gpio0 {
+    status = "okay";
+
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+};
+
 &spi0 {
     status = "okay";
 
diff --git a/target/linux/ramips/dts/mt7620n_dlink_dwr-921-c1.dts
b/target/linux/ramips/dts/mt7620n_dlink_dwr-921-c1.dts
index 92bcd54a42..3a96e51e70 100644
--- a/target/linux/ramips/dts/mt7620n_dlink_dwr-921-c1.dts
+++ b/target/linux/ramips/dts/mt7620n_dlink_dwr-921-c1.dts
@@ -69,16 +69,16 @@ 
             gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        lte_modem_enable {
-            gpio-export,name = "lte_modem_enable";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
-        };
+    lte_modem_enable {
+        gpio-hog;
+        line-name = "lte_modem_enable";
+        gpios = <0 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620n_dlink_dwr-922-e2.dts
b/target/linux/ramips/dts/mt7620n_dlink_dwr-922-e2.dts
index c2dd26a09d..d17345d620 100644
--- a/target/linux/ramips/dts/mt7620n_dlink_dwr-922-e2.dts
+++ b/target/linux/ramips/dts/mt7620n_dlink_dwr-922-e2.dts
@@ -71,16 +71,16 @@ 
             gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        lte_modem_enable {
-            gpio-export,name = "lte_modem_enable";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
-        };
+    lte_modem_enable {
+        gpio-hog;
+        line-name = "lte_modem_enable";
+        gpios = <0 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni-ii.dts
b/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni-ii.dts
index 765629548c..dc60d0ad18 100644
--- a/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni-ii.dts
+++ b/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni-ii.dts
@@ -64,16 +64,16 @@ 
             linux,code = <BTN_0>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb_power {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <21 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni.dts
b/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni.dts
index 74396d1fc2..2ac47804d9 100644
--- a/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni.dts
+++ b/target/linux/ramips/dts/mt7620n_zyxel_keenetic-omni.dts
@@ -64,16 +64,16 @@ 
             linux,code = <BTN_0>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb_power {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <21 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7621_d-team_newifi-d2.dts
b/target/linux/ramips/dts/mt7621_d-team_newifi-d2.dts
index d51eb29600..95db962ae4 100644
--- a/target/linux/ramips/dts/mt7621_d-team_newifi-d2.dts
+++ b/target/linux/ramips/dts/mt7621_d-team_newifi-d2.dts
@@ -77,16 +77,16 @@ 
             linux,code = <KEY_WPS_BUTTON>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        power_usb3 {
-            gpio-export,name = "power_usb3";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
-        };
+    power_usb3 {
+        gpio-hog;
+        line-name = "power_usb3";
+        gpios = <11 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7621_d-team_pbr-m1.dts
b/target/linux/ramips/dts/mt7621_d-team_pbr-m1.dts
index 3eb0fac46e..2c1b050240 100644
--- a/target/linux/ramips/dts/mt7621_d-team_pbr-m1.dts
+++ b/target/linux/ramips/dts/mt7621_d-team_pbr-m1.dts
@@ -73,32 +73,34 @@ 
         };
     };
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        power_usb2 {
-            gpio-export,name = "power_usb2";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>;
-        };
+    beeper: beeper {
+        compatible = "gpio-beeper";
+        gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
+    };
+};
 
-        power_usb3 {
-            gpio-export,name = "power_usb3";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
-        };
+&gpio0 {
+    status = "okay";
 
-        power_sata {
-            gpio-export,name = "power_sata";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>;
-        };
+    power_usb2 {
+        gpio-hog;
+        line-name = "power_usb2";
+        gpios = <22 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 
-    beeper: beeper {
-        compatible = "gpio-beeper";
-        gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
+    power_usb3 {
+        gpio-hog;
+        line-name = "power_usb3";
+        gpios = <25 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    power_sata {
+        gpio-hog;
+        line-name = "power_sata";
+        gpios = <27 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7621_lenovo_newifi-d1.dts
b/target/linux/ramips/dts/mt7621_lenovo_newifi-d1.dts
index e681e1a0c9..45963b7333 100644
--- a/target/linux/ramips/dts/mt7621_lenovo_newifi-d1.dts
+++ b/target/linux/ramips/dts/mt7621_lenovo_newifi-d1.dts
@@ -50,22 +50,23 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb2power {
-            gpio-export,name = "usb2power";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
-        };
+    usb2power {
+        gpio-hog;
+        line-name = "usb2power";
+        gpios = <9 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        usb3power {
-            gpio-export,name = "usb3power";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
-        };
+    usb3power {
+        gpio-hog;
+        line-name = "usb3power";
+        gpios = <11 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7621_mikrotik_rb750gr3.dts
b/target/linux/ramips/dts/mt7621_mikrotik_rb750gr3.dts
index 0b39fa240a..80d3864205 100644
--- a/target/linux/ramips/dts/mt7621_mikrotik_rb750gr3.dts
+++ b/target/linux/ramips/dts/mt7621_mikrotik_rb750gr3.dts
@@ -57,16 +57,16 @@ 
         compatible = "gpio-beeper";
         gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>;
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb_power {
-            gpio-export,name = "usb_power";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    usb_power {
+        gpio-hog;
+        line-name = "usb_power";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7621_netgear_r6350.dts
b/target/linux/ramips/dts/mt7621_netgear_r6350.dts
index 403fc91d54..8cfd161248 100644
--- a/target/linux/ramips/dts/mt7621_netgear_r6350.dts
+++ b/target/linux/ramips/dts/mt7621_netgear_r6350.dts
@@ -63,16 +63,16 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usbpower {
-            gpio-export,name = "usbpower";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
-        };
+    usbpower {
+        gpio-hog;
+        line-name = "usbpower";
+        gpios = <10 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7621_unielec_u7621-06.dtsi
b/target/linux/ramips/dts/mt7621_unielec_u7621-06.dtsi
index 301edfe680..02ba003dd3 100644
--- a/target/linux/ramips/dts/mt7621_unielec_u7621-06.dtsi
+++ b/target/linux/ramips/dts/mt7621_unielec_u7621-06.dtsi
@@ -51,17 +51,6 @@ 
         bootargs = "console=ttyS0,115200";
     };
 
-    gpio-export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        modem_reset {
-            gpio-export,name = "modem_reset";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 16 GPIO_ACTIVE_LOW>;
-        };
-    };
-
     keys {
         compatible = "gpio-keys-polled";
         poll-interval = <20>;
@@ -95,6 +84,13 @@ 
 
 &gpio0 {
     status = "okay";
+
+    modem_reset {
+        gpio-hog;
+        line-name = "modem_reset";
+        gpios = <16 GPIO_ACTIVE_LOW>;
+        output-high;
+    };
 };
 
 &sdhci {
diff --git a/target/linux/ramips/dts/mt7621_xzwifi_creativebox-v1.dts
b/target/linux/ramips/dts/mt7621_xzwifi_creativebox-v1.dts
index 73bfd6a4f0..4b61f631c7 100644
--- a/target/linux/ramips/dts/mt7621_xzwifi_creativebox-v1.dts
+++ b/target/linux/ramips/dts/mt7621_xzwifi_creativebox-v1.dts
@@ -63,28 +63,30 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        power_usb2 {
-            gpio-export,name = "power_usb2";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>;
-        };
+    power_usb2 {
+        gpio-hog;
+        line-name = "power_usb2";
+        gpios = <22 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        power_usb3 {
-            gpio-export,name = "power_usb3";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
-        };
+    power_usb3 {
+        gpio-hog;
+        line-name = "power_usb3";
+        gpios = <25 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        power_sata {
-            gpio-export,name = "power_sata";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>;
-        };
+    power_sata {
+        gpio-hog;
+        line-name = "power_sata";
+        gpios = <27 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts
b/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts
index 6222cfe345..0944ee5221 100644
--- a/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts
+++ b/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts
@@ -62,16 +62,16 @@ 
             linux,code = <BTN_1>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <11 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git
a/target/linux/ramips/dts/mt7628an_zyxel_keenetic-extra-ii.dts
b/target/linux/ramips/dts/mt7628an_zyxel_keenetic-extra-ii.dts
index 1d083ed8bb..2893466409 100644
--- a/target/linux/ramips/dts/mt7628an_zyxel_keenetic-extra-ii.dts
+++ b/target/linux/ramips/dts/mt7628an_zyxel_keenetic-extra-ii.dts
@@ -69,16 +69,16 @@ 
             linux,default-trigger = "usbport";
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usbpower {
-            gpio-export,name = "usbpower";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
-        };
+    usbpower {
+        gpio-hog;
+        line-name = "usbpower";
+        gpios = <6 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt3050_arcwireless_freestation5.dts
b/target/linux/ramips/dts/rt3050_arcwireless_freestation5.dts
index b924229a7e..6fb3a96991 100644
--- a/target/linux/ramips/dts/rt3050_arcwireless_freestation5.dts
+++ b/target/linux/ramips/dts/rt3050_arcwireless_freestation5.dts
@@ -49,20 +49,10 @@ 
             };
         };
     };
-
-    gpio-export {
-        compatible = "gpio-export";
-
         /*
          * Used to enable power-over-ethernet passthrough from port0 to
port1.
          * Disable passthrough by default to prevent accidental
equipment damage.
          */
-        poe {
-            gpio-export,name = "poe-passthrough";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
-        };
-    };
 
     leds {
         compatible = "gpio-leds";
@@ -88,6 +78,17 @@ 
     };
 };
 
+&gpio0 {
+    status = "okay";
+
+    poe-passthrough {
+        gpio-hog;
+        line-name = "poe-passthrough";
+        gpios = <11 GPIO_ACTIVE_LOW>;
+        output-high;
+    };
+};
+
 &pinctrl {
     state_default: pinctrl0 {
         gpio {
diff --git a/target/linux/ramips/dts/rt3052_accton_wr6202.dts
b/target/linux/ramips/dts/rt3052_accton_wr6202.dts
index 1caec41a4b..d30c028be9 100644
--- a/target/linux/ramips/dts/rt3052_accton_wr6202.dts
+++ b/target/linux/ramips/dts/rt3052_accton_wr6202.dts
@@ -80,16 +80,16 @@ 
             };
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <11 GPIO_ACTIVE_LOW>;
+        output-low;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt3052_jcg_jhr-n926r.dts
b/target/linux/ramips/dts/rt3052_jcg_jhr-n926r.dts
index 9414828594..6512501c48 100644
--- a/target/linux/ramips/dts/rt3052_jcg_jhr-n926r.dts
+++ b/target/linux/ramips/dts/rt3052_jcg_jhr-n926r.dts
@@ -77,29 +77,6 @@ 
         };
     };
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        display_data {
-            gpio-export,name = "display_data";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        };
-
-        display_clock {
-            gpio-export,name = "display_clock";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
-        };
-
-        display_blank {
-            gpio-export,name = "display_blank";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
-        };
-    };
-
     keys {
         compatible = "gpio-keys-polled";
         poll-interval = <20>;
@@ -118,6 +95,31 @@ 
     };
 };
 
+&gpio0 {
+    status = "okay";
+
+    display_data {
+        gpio-hog;
+        line-name = "display_data";
+        gpios = <7 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    display_clock {
+        gpio-hog;
+        line-name = "display_clock";
+        gpios = <8 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+
+    display_blank {
+        gpio-hog;
+        line-name = "display_blank";
+        gpios = <11 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
+};
+
 &pinctrl {
     state_default: pinctrl0 {
         gpio {
diff --git a/target/linux/ramips/dts/rt3052_planex_mzk-wdpr.dts
b/target/linux/ramips/dts/rt3052_planex_mzk-wdpr.dts
index 17591268b6..ed4ddd20db 100644
--- a/target/linux/ramips/dts/rt3052_planex_mzk-wdpr.dts
+++ b/target/linux/ramips/dts/rt3052_planex_mzk-wdpr.dts
@@ -55,15 +55,16 @@ 
             };
         };
     };
+};
 
-    gpio-export {
-        compatible = "gpio-export";
+&gpio0 {
+    status = "okay";
 
-        lcd_ctrl1 {
-            gpio-export,name = "lcd_ctrl1";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
-        };
+    lcd_ctrl1 {
+        gpio-hog;
+        line-name = "lcd_ctrl1";
+        gpios = <1 GPIO_ACTIVE_HIGH>;
+        output-low;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt3883_dlink_dir-645.dts
b/target/linux/ramips/dts/rt3883_dlink_dir-645.dts
index 35d011ebba..7e5e079cd2 100644
--- a/target/linux/ramips/dts/rt3883_dlink_dir-645.dts
+++ b/target/linux/ramips/dts/rt3883_dlink_dir-645.dts
@@ -53,21 +53,17 @@ 
             gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
         };
     };
-
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
-        };
-    };
 };
 
 &gpio1 {
     status = "okay";
+
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <6 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 };
 
 &spi0 {
diff --git a/target/linux/ramips/dts/rt3883_edimax_br-6475nd.dts
b/target/linux/ramips/dts/rt3883_edimax_br-6475nd.dts
index f7fb8b5c40..6950535edd 100644
--- a/target/linux/ramips/dts/rt3883_edimax_br-6475nd.dts
+++ b/target/linux/ramips/dts/rt3883_edimax_br-6475nd.dts
@@ -108,19 +108,20 @@ 
      * and the headers are there.
      */
     /*
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-
-        usb {
-            gpio-export,name="usb";
-            gpio-export,output=<0>;
-            gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
-        };
-    };
     */
 };
 
+&gpio0 {
+    status = "okay";
+
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <19 GPIO_ACTIVE_LOW>;
+        output-low;
+    };
+};
+
 &pinctrl {
     state_default: pinctrl0 {
         gpio {
diff --git a/target/linux/ramips/dts/rt3883_omnima_hpm.dts
b/target/linux/ramips/dts/rt3883_omnima_hpm.dts
index 7ccd078144..bcc0b1ba82 100644
--- a/target/linux/ramips/dts/rt3883_omnima_hpm.dts
+++ b/target/linux/ramips/dts/rt3883_omnima_hpm.dts
@@ -66,23 +66,23 @@ 
             gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
-        /* gpio 12 and 13 handle the OC input */
+&gpio0 {
+    status = "okay";
 
-        usb0 {
-            gpio-export,name = "usb0";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
-        };
+    usb0 {
+        gpio-hog;
+        line-name = "usb0";
+        gpios = <2 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        usb1 {
-            gpio-export,name = "usb1";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
-        };
+    usb1 {
+        gpio-hog;
+        line-name = "usb1";
+        gpios = <1 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt3883_sitecom_wlr-6000.dts
b/target/linux/ramips/dts/rt3883_sitecom_wlr-6000.dts
index 2b1f707658..22634e8819 100644
--- a/target/linux/ramips/dts/rt3883_sitecom_wlr-6000.dts
+++ b/target/linux/ramips/dts/rt3883_sitecom_wlr-6000.dts
@@ -40,16 +40,16 @@ 
             gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <9 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_dlink_dir-320-b1.dts
b/target/linux/ramips/dts/rt5350_dlink_dir-320-b1.dts
index 040a223986..abbcf6392d 100644
--- a/target/linux/ramips/dts/rt5350_dlink_dir-320-b1.dts
+++ b/target/linux/ramips/dts/rt5350_dlink_dir-320-b1.dts
@@ -51,22 +51,23 @@ 
             linux,code = <KEY_WPS_BUTTON>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <7 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        root_hub {
-            gpio-export,name = "root_hub";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    root_hub {
+        gpio-hog;
+        line-name = "root_hub";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_dlink_dwr-512-b.dts
b/target/linux/ramips/dts/rt5350_dlink_dwr-512-b.dts
index a08ea5d03c..666219aca4 100644
--- a/target/linux/ramips/dts/rt5350_dlink_dwr-512-b.dts
+++ b/target/linux/ramips/dts/rt5350_dlink_dwr-512-b.dts
@@ -61,20 +61,23 @@ 
             gpios = <&gpio0 21 GPIO_ACTIVE_LOW>;
         };
     };
+};
 
-    gpio-export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        slic_int {
-            gpio-export,name = "slic_int";
-            gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
-        };
-        modem3g_enable {
-            gpio-export,name = "modem3g_enable";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
-        };
+    slic_int {
+        gpio-hog;
+        line-name = "slic_int";
+        gpios = <1 GPIO_ACTIVE_LOW>;
+        input;
+    };
+
+    modem3g_enable {
+        gpio-hog;
+        line-name = "modem3g_enable";
+        gpios = <18 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_hame_mpr-a1.dts
b/target/linux/ramips/dts/rt5350_hame_mpr-a1.dts
index 328351a550..c15de48f5e 100644
--- a/target/linux/ramips/dts/rt5350_hame_mpr-a1.dts
+++ b/target/linux/ramips/dts/rt5350_hame_mpr-a1.dts
@@ -40,22 +40,23 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <7 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        root_hub {
-            gpio-export,name = "root_hub";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    root_hub {
+        gpio-hog;
+        line-name = "root_hub";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_hame_mpr-a2.dts
b/target/linux/ramips/dts/rt5350_hame_mpr-a2.dts
index fedb5b061e..5481d6d6ab 100644
--- a/target/linux/ramips/dts/rt5350_hame_mpr-a2.dts
+++ b/target/linux/ramips/dts/rt5350_hame_mpr-a2.dts
@@ -40,22 +40,23 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <7 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        root_hub {
-            gpio-export,name = "root_hub";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    root_hub {
+        gpio-hog;
+        line-name = "root_hub";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git
a/target/linux/ramips/dts/rt5350_olimex_rt5350f-olinuxino-evb.dts
b/target/linux/ramips/dts/rt5350_olimex_rt5350f-olinuxino-evb.dts
index 57164ea8ac..a22c961773 100644
--- a/target/linux/ramips/dts/rt5350_olimex_rt5350f-olinuxino-evb.dts
+++ b/target/linux/ramips/dts/rt5350_olimex_rt5350f-olinuxino-evb.dts
@@ -7,26 +7,29 @@ 
 / {
     compatible = "olimex,rt5350f-olinuxino-evb", "ralink,rt5350-soc";
     model = "Olimex RT5350F-OLinuXino-EVB";
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        relay1 {
-            gpio-export,name = "relay1";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
-        };
+    relay1 {
+        gpio-hog;
+        line-name = "relay1";
+        gpios = <14 GPIO_ACTIVE_HIGH>;
+        output-low;
+    };
 
-        relay2 {
-            gpio-export,name = "relay2";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    relay2 {
+        gpio-hog;
+        line-name = "relay2";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-low;
+    };
 
-        button {
-            gpio-export,name = "button";
-            gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
-        };
+    button {
+        gpio-hog;
+        line-name = "button";
+        gpios = <0 GPIO_ACTIVE_LOW>;
+        input;
     };
 };
diff --git a/target/linux/ramips/dts/rt5350_poray_x5.dts
b/target/linux/ramips/dts/rt5350_poray_x5.dts
index 7e3d8b6f03..811a61534f 100644
--- a/target/linux/ramips/dts/rt5350_poray_x5.dts
+++ b/target/linux/ramips/dts/rt5350_poray_x5.dts
@@ -63,16 +63,16 @@ 
             linux,input-type = <EV_SW>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb-mode {
-            gpio-export,name = "usb-mode";
-            gpio-export,output = <0>;
-            gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
-        };
+    usb-mode {
+        gpio-hog;
+        line-name = "usb-mode";
+        gpios = <18 GPIO_ACTIVE_LOW>;
+        output-low;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_tenda_3g150b.dts
b/target/linux/ramips/dts/rt5350_tenda_3g150b.dts
index 9d13625516..c924b7e5d1 100644
--- a/target/linux/ramips/dts/rt5350_tenda_3g150b.dts
+++ b/target/linux/ramips/dts/rt5350_tenda_3g150b.dts
@@ -42,16 +42,16 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <13 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_trendnet_tew-714tru.dts
b/target/linux/ramips/dts/rt5350_trendnet_tew-714tru.dts
index 00e3d2df12..56b2083feb 100644
--- a/target/linux/ramips/dts/rt5350_trendnet_tew-714tru.dts
+++ b/target/linux/ramips/dts/rt5350_trendnet_tew-714tru.dts
@@ -41,20 +41,23 @@ 
             linux,code = <KEY_WPS_BUTTON>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        repeater {
-            gpio-export,name = "repeater_switch";
-            gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        };
+    repeater_switch {
+        gpio-hog;
+        line-name = "repeater_switch";
+        gpios = <7 GPIO_ACTIVE_HIGH>;
+        input;
+    };
 
-        wisp {
-            gpio-export,name = "wisp_switch";
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    wisp_switch {
+        gpio-hog;
+        line-name = "wisp_switch";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        input;
     };
 };
 
diff --git a/target/linux/ramips/dts/rt5350_unbranded_a5-v11.dts
b/target/linux/ramips/dts/rt5350_unbranded_a5-v11.dts
index 707963d691..2192e7fba8 100644
--- a/target/linux/ramips/dts/rt5350_unbranded_a5-v11.dts
+++ b/target/linux/ramips/dts/rt5350_unbranded_a5-v11.dts
@@ -40,22 +40,23 @@ 
             linux,code = <KEY_RESTART>;
         };
     };
+};
 
-    gpio_export {
-        compatible = "gpio-export";
-        #size-cells = <0>;
+&gpio0 {
+    status = "okay";
 
-        usb {
-            gpio-export,name = "usb";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        };
+    usb {
+        gpio-hog;
+        line-name = "usb";
+        gpios = <7 GPIO_ACTIVE_HIGH>;
+        output-high;
+    };
 
-        root_hub {
-            gpio-export,name = "root_hub";
-            gpio-export,output = <1>;
-            gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
-        };
+    root_hub {
+        gpio-hog;
+        line-name = "root_hub";
+        gpios = <12 GPIO_ACTIVE_HIGH>;
+        output-high;
     };
 };