diff mbox

[linux,dev-4.7,v3,2/2] ARM: dts: Enable checkstop and cooling gpio keys

Message ID 1492575497-1419-3-git-send-email-bradleyb@fuzziesquirrel.com
State Superseded, archived
Headers show

Commit Message

Brad Bishop April 19, 2017, 4:18 a.m. UTC
Enable gpio-keys events for the checkstop and water/air cooled
gpios for use by applications on the Witherspoon system.

Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
---
 arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

Andrew Jeffery April 19, 2017, 2:29 p.m. UTC | #1
Hi Brad,

If you do future revisions of these patches, can you please Cc me?

On Wed, 2017-04-19 at 00:18 -0400, Brad Bishop wrote:
> Enable gpio-keys events for the checkstop and water/air cooled
> gpios for use by applications on the Witherspoon system.
> 
> > Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
> ---
>  arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> index e3a7b77..aa1708e 100644
> --- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> +++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> @@ -31,6 +31,26 @@
> >  		};
> >  	};
>  
> +	gpio-keys@0 {

does the @0 give us a stable device name for userspace to open?

Do we really want to go this way? We now have useful unique codes for
the "key"s, why not use the one node? Or is your concern we've now tied
the function to a value that might vary across platforms? If so, are
you relying on always specifying "air-water" in @0? If you are, I think
I'd prefer the arbitrary codes, rather than this.

Andrew

> +		compatible = "gpio-keys";
> +
> > +		air-water {
> > +			label = "air-water";
> > +			gpios = <&gpio ASPEED_GPIO(B, 5) GPIO_ACTIVE_LOW>;
> > +			linux,code = <ASPEED_GPIO(B, 5)>;
> > +		};
> > +	};
> +
> > +	gpio-keys@1 {
> > +		compatible = "gpio-keys";
> +
> > +		checkstop {
> > +			label = "checkstop";
> > +			gpios = <&gpio ASPEED_GPIO(J, 2) GPIO_ACTIVE_LOW>;
> > +			linux,code = <ASPEED_GPIO(J, 2)>;
> > +		};
> > +	};
> +
> >  	leds {
> >  		compatible = "gpio-leds";
>
Brad Bishop April 19, 2017, 2:38 p.m. UTC | #2
> On Apr 19, 2017, at 10:29 AM, Andrew Jeffery <andrew@aj.id.au> wrote:
> 
> Hi Brad,
> 
> If you do future revisions of these patches, can you please Cc me?

will do.

> 
> On Wed, 2017-04-19 at 00:18 -0400, Brad Bishop wrote:
>> Enable gpio-keys events for the checkstop and water/air cooled
>> gpios for use by applications on the Witherspoon system.
>> 
>>> Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
>> ---
>>  arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 20 ++++++++++++++++++++
>>  1 file changed, 20 insertions(+)
>> 
>> diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
>> index e3a7b77..aa1708e 100644
>> --- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
>> +++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
>> @@ -31,6 +31,26 @@
>>>  		};
>>>  	};
>>  
>> +	gpio-keys@0 {
> 
> does the @0 give us a stable device name for userspace to open?

No it doesn’t.  This is my lack of DT skillz showing.  I was looking
into how we can give userspace a stable device name.  I was going
down the udev path but I can’t find any any of the information from
these DT nodes in the udev event.

> 
> Do we really want to go this way? We now have useful unique codes for
> the "key"s, why not use the one node? Or is your concern we've now tied

Each gpio will have an application waiting for its state to change.  My
concern was waking up x number of applications every time any gpio changes
state.  Is that a valid concern?

> the function to a value that might vary across platforms? If so, are

No, not worried about this.  Applications will be getting their gpio number
on the command line anyway.

> you relying on always specifying "air-water" in @0? If you are, I think
> I'd prefer the arbitrary codes, rather than this.
> 
> Andrew
> 
>> +		compatible = "gpio-keys";
>> +
>>> +		air-water {
>>> +			label = "air-water";
>>> +			gpios = <&gpio ASPEED_GPIO(B, 5) GPIO_ACTIVE_LOW>;
>>> +			linux,code = <ASPEED_GPIO(B, 5)>;
>>> +		};
>>> +	};
>> +
>>> +	gpio-keys@1 {
>>> +		compatible = "gpio-keys";
>> +
>>> +		checkstop {
>>> +			label = "checkstop";
>>> +			gpios = <&gpio ASPEED_GPIO(J, 2) GPIO_ACTIVE_LOW>;
>>> +			linux,code = <ASPEED_GPIO(J, 2)>;
>>> +		};
>>> +	};
>> +
>>>  	leds {
>>>  		compatible = "gpio-leds";
Andrew Jeffery April 20, 2017, 4:34 a.m. UTC | #3
On Wed, 2017-04-19 at 10:38 -0400, Brad Bishop wrote:
> > > > On Apr 19, 2017, at 10:29 AM, Andrew Jeffery <andrew@aj.id.au> wrote:
> > 
> > Hi Brad,
> > 
> > If you do future revisions of these patches, can you please Cc me?
> 
> will do.
> 
> > 
> > On Wed, 2017-04-19 at 00:18 -0400, Brad Bishop wrote:
> > > Enable gpio-keys events for the checkstop and water/air cooled
> > > gpios for use by applications on the Witherspoon system.
> > > 
> > > > Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
> > > 
> > > ---
> > >  arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 20 ++++++++++++++++++++
> > >  1 file changed, 20 insertions(+)
> > > 
> > > diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> > > index e3a7b77..aa1708e 100644
> > > --- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> > > +++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> > > @@ -31,6 +31,26 @@
> > > > > > > >  		};
> > > >  	};
> > > 
> > >  
> > > +	gpio-keys@0 {
> > 
> > does the @0 give us a stable device name for userspace to open?
> 
> No it doesn’t.  This is my lack of DT skillz showing.  I was looking
> into how we can give userspace a stable device name.  I was going
> down the udev path but I can’t find any any of the information from
> these DT nodes in the udev event.
> 
> > 
> > Do we really want to go this way? We now have useful unique codes for
> > the "key"s, why not use the one node? Or is your concern we've now tied
> 
> Each gpio will have an application waiting for its state to change.  My
> concern was waking up x number of applications every time any gpio changes
> state.  Is that a valid concern?

How many applications do we expect to be reading the evdev? What are
our expected interrupt rates? What are the worst expected cases?

It's hard to judge without knowing the numbers, but considering the
chips we run on I agree we should generally favour performance if
design is getting in the way. But to make that trade off we should be
clear on the performance numbers.

Andrew
Brad Bishop April 20, 2017, 2:24 p.m. UTC | #4
> On Apr 20, 2017, at 12:34 AM, Andrew Jeffery <andrew@aj.id.au> wrote:
> 
> On Wed, 2017-04-19 at 10:38 -0400, Brad Bishop wrote:
>>>>> On Apr 19, 2017, at 10:29 AM, Andrew Jeffery <andrew@aj.id.au> wrote:
>>> 
>>> Hi Brad,
>>> 
>>> If you do future revisions of these patches, can you please Cc me?
>> 
>> will do.
>> 
>>> 
>>> On Wed, 2017-04-19 at 00:18 -0400, Brad Bishop wrote:
>>>> Enable gpio-keys events for the checkstop and water/air cooled
>>>> gpios for use by applications on the Witherspoon system.
>>>> 
>>>>> Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
>>>> 
>>>> ---
>>>>  arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 20 ++++++++++++++++++++
>>>>  1 file changed, 20 insertions(+)
>>>> 
>>>> diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
>>>> index e3a7b77..aa1708e 100644
>>>> --- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
>>>> +++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
>>>> @@ -31,6 +31,26 @@
>>>>>>>>>  		};
>>>>>  	};
>>>> 
>>>>  
>>>> +	gpio-keys@0 {
>>> 
>>> does the @0 give us a stable device name for userspace to open?
>> 
>> No it doesn’t.  This is my lack of DT skillz showing.  I was looking
>> into how we can give userspace a stable device name.  I was going
>> down the udev path but I can’t find any any of the information from
>> these DT nodes in the udev event.
>> 
>>> 
>>> Do we really want to go this way? We now have useful unique codes for
>>> the "key"s, why not use the one node? Or is your concern we've now tied
>> 
>> Each gpio will have an application waiting for its state to change.  My
>> concern was waking up x number of applications every time any gpio changes
>> state.  Is that a valid concern?
> 
> How many applications do we expect to be reading the evdev? What are
> our expected interrupt rates? What are the worst expected cases?

For Witherspoon/Zaius or any OpenBMC platform?  I obviously can’t say for the
latter case.  On a bigger/enterprise systems I can see on the order of 10 to 100
applications looking at these.  I don’t have a good sense of how often.

On Witherspoon/Zaius, sure, we only have a handful of applications and the
interrupt rate should be very infrequent.

I think you typically see all the gpio keys mapped to a single device because
the usual thing to do is have a single application (Xorg) treat it like a keyboard.

We aren’t structured that way so rethinking the usual approach seems reasonable.  
Another reason I went for per gpio devices because it prevents applications from
reacting to each others events without any special library code.  

I’m not saying there aren’t disadvantages to this approach - I just don’t know what
they are?

> 
> It's hard to judge without knowing the numbers, but considering the
> chips we run on I agree we should generally favour performance if
> design is getting in the way. But to make that trade off we should be

Again, what exactly is being traded-off ?

> clear on the performance numbers.
> 
> Andrew
Andrew Jeffery April 21, 2017, 12:35 a.m. UTC | #5
On Thu, 2017-04-20 at 10:24 -0400, Brad Bishop wrote:
> > > > On Apr 20, 2017, at 12:34 AM, Andrew Jeffery <andrew@aj.id.au> wrote:
> > 
> > On Wed, 2017-04-19 at 10:38 -0400, Brad Bishop wrote:
> > > > > > On Apr 19, 2017, at 10:29 AM, Andrew Jeffery <andrew@aj.id.au> wrote:
> > > > 
> > > > Hi Brad,
> > > > 
> > > > If you do future revisions of these patches, can you please Cc me?
> > > 
> > > will do.
> > > 
> > > > 
> > > > On Wed, 2017-04-19 at 00:18 -0400, Brad Bishop wrote:
> > > > > Enable gpio-keys events for the checkstop and water/air cooled
> > > > > gpios for use by applications on the Witherspoon system.
> > > > > 
> > > > > > Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
> > > > > 
> > > > > ---
> > > > >  arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 20 ++++++++++++++++++++
> > > > >  1 file changed, 20 insertions(+)
> > > > > 
> > > > > diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> > > > > index e3a7b77..aa1708e 100644
> > > > > --- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> > > > > +++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> > > > > @@ -31,6 +31,26 @@
> > > > > > > > > >  		};
> > > > > > 
> > > > > >  	};
> > > > > 
> > > > >  
> > > > > +	gpio-keys@0 {
> > > > 
> > > > does the @0 give us a stable device name for userspace to open?
> > > 
> > > No it doesn’t.  This is my lack of DT skillz showing.  I was looking
> > > into how we can give userspace a stable device name.  I was going
> > > down the udev path but I can’t find any any of the information from
> > > these DT nodes in the udev event.
> > > 
> > > > 
> > > > Do we really want to go this way? We now have useful unique codes for
> > > > the "key"s, why not use the one node? Or is your concern we've now tied
> > > 
> > > Each gpio will have an application waiting for its state to change.  My
> > > concern was waking up x number of applications every time any gpio changes
> > > state.  Is that a valid concern?
> > 
> > How many applications do we expect to be reading the evdev? What are
> > our expected interrupt rates? What are the worst expected cases?
> 
> For Witherspoon/Zaius or any OpenBMC platform? 

Yes, this is what I was asking about, given they are concrete systems.

>  I obviously can’t say for the
> latter case. 

Yep.

>  On a bigger/enterprise systems I can see on the order of 10 to 100
> applications looking at these. 

Okay; having 10-100 processes woken is something we'd want to avoid.

>  I don’t have a good sense of how often.
> 
> On Witherspoon/Zaius, sure, we only have a handful of applications and the
> interrupt rate should be very infrequent.

That was my thought, which was why I wanted to check. While it might be
low, if we're waking up to 100 applications it's not ideal.

> 
> I think you typically see all the gpio keys mapped to a single device because
> the usual thing to do is have a single application (Xorg) treat it like a keyboard.
> 
> We aren’t structured that way so rethinking the usual approach seems reasonable. 

Sure; I was never against rethinking it. I just wanted a clear
explanation of why we would choose this route.

>  
> Another reason I went for per gpio devices because it prevents applications from
> reacting to each others events without any special library code.  
> 
> I’m not saying there aren’t disadvantages to this approach - I just don’t know what
> they are?

It's a bit strange from a design perspective as we now have two unique
identifiers for an event; the input device *and* the keycode emitted by
the event on the input device, which is the *only* keycode emitted by
the device.

For someone new to the system I expect this would seem a strange
redundancy if they weren't aware of the performance implications
inherent to the distributed nature of the application design.

> 
> > 
> > It's hard to judge without knowing the numbers, but considering the
> > chips we run on I agree we should generally favour performance if
> > design is getting in the way. But to make that trade off we should be
> 
> Again, what exactly is being traded-off ?

The "oddity" in the design with respect to the "redundancy" I described
above.

Anyway, I think what you have outlined is reasonable.

Cheers,

Andrew
Joel Stanley April 21, 2017, 2:14 a.m. UTC | #6
Hi Brad,

On Thu, Apr 20, 2017 at 11:54 PM, Brad Bishop
<bradleyb@fuzziesquirrel.com> wrote:
>>> Each gpio will have an application waiting for its state to change.  My
>>> concern was waking up x number of applications every time any gpio changes
>>> state.  Is that a valid concern?
>>
>> How many applications do we expect to be reading the evdev? What are
>> our expected interrupt rates? What are the worst expected cases?
>
> For Witherspoon/Zaius or any OpenBMC platform?  I obviously can’t say for the
> latter case.  On a bigger/enterprise systems I can see on the order of 10 to 100
> applications looking at these.  I don’t have a good sense of how often.
>
> On Witherspoon/Zaius, sure, we only have a handful of applications and the
> interrupt rate should be very infrequent.
>
> I think you typically see all the gpio keys mapped to a single device because
> the usual thing to do is have a single application (Xorg) treat it like a keyboard.

I've been following the discussion you've been having. I went to merge
the patches today, but first decided to satisfy myself that this was
the right way to go. I didn't arrive at the same conclusion as you and
Andrew.

The userspace use cases you've presented would be served well by a
single node. We have the flexibility to revisit this decision when
someone builds a machine that has 100 GPIOs they want to monitor; in
addition I think we would revisit the decision to have 100 userspace
programs.

By having separate nodes, you're creating a new instance of the kernel
driver for each node.

The driver, and the binding, is designed to support your use case -
multiple key events generated by the hardware.

Finally, I looked at the other machines in the tree. None of them have
separate gpio-keys nodes

arch/arm/boot/dts/armada-xp-netgear-rn2120.dts:

        gpio-keys {
                compatible = "gpio-keys";
                pinctrl-0 = <&power_button_pin &reset_button_pin>;
                pinctrl-names = "default";

                power-button {
                        label = "Power Button";
                        linux,code = <KEY_POWER>;
                        gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>;
                };

                reset-button {
                        label = "Reset Button";
                        linux,code = <KEY_RESTART>;
                        gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
                };
        };

arch/arm/boot/dts/at91sam9261ek.dts
        gpio_keys {
                compatible = "gpio-keys";

                button_0 {
                        label = "button_0";
                        gpios = <&pioA 27 GPIO_ACTIVE_LOW>;
                        linux,code = <256>;
                        wakeup-source;
                };

                button_1 {
                        label = "button_1";
                        gpios = <&pioA 26 GPIO_ACTIVE_LOW>;
                        linux,code = <257>;
                        wakeup-source;
                };

                button_2 {
                        label = "button_2";
                        gpios = <&pioA 25 GPIO_ACTIVE_LOW>;
                        linux,code = <258>;
                        wakeup-source;
                };

                button_3 {
                        label = "button_3";
                        gpios = <&pioA 24 GPIO_ACTIVE_LOW>;
                        linux,code = <259>;
                        wakeup-source;
                };
        };

Cheers,

Joel



>
> We aren’t structured that way so rethinking the usual approach seems reasonable.
> Another reason I went for per gpio devices because it prevents applications from
> reacting to each others events without any special library code.
>
> I’m not saying there aren’t disadvantages to this approach - I just don’t know what
> they are?
>
>>
>> It's hard to judge without knowing the numbers, but considering the
>> chips we run on I agree we should generally favour performance if
>> design is getting in the way. But to make that trade off we should be
>
> Again, what exactly is being traded-off ?
>
>> clear on the performance numbers.
>>
>> Andrew
Brad Bishop April 21, 2017, 3:32 a.m. UTC | #7
> On Apr 20, 2017, at 10:14 PM, Joel Stanley <joel@jms.id.au> wrote:
> 
> Hi Brad,
> 
> On Thu, Apr 20, 2017 at 11:54 PM, Brad Bishop
> <bradleyb@fuzziesquirrel.com> wrote:
>>>> Each gpio will have an application waiting for its state to change.  My
>>>> concern was waking up x number of applications every time any gpio changes
>>>> state.  Is that a valid concern?
>>> 
>>> How many applications do we expect to be reading the evdev? What are
>>> our expected interrupt rates? What are the worst expected cases?
>> 
>> For Witherspoon/Zaius or any OpenBMC platform?  I obviously can’t say for the
>> latter case.  On a bigger/enterprise systems I can see on the order of 10 to 100
>> applications looking at these.  I don’t have a good sense of how often.
>> 
>> On Witherspoon/Zaius, sure, we only have a handful of applications and the
>> interrupt rate should be very infrequent.
>> 
>> I think you typically see all the gpio keys mapped to a single device because
>> the usual thing to do is have a single application (Xorg) treat it like a keyboard.
> 
> I've been following the discussion you've been having. I went to merge
> the patches today, but first decided to satisfy myself that this was
> the right way to go. I didn't arrive at the same conclusion as you and
> Andrew.
> 
> The userspace use cases you've presented would be served well by a
> single node. We have the flexibility to revisit this decision when
> someone builds a machine that has 100 GPIOs they want to monitor; in
> addition I think we would revisit the decision to have 100 userspace
> programs.
> 
> By having separate nodes, you're creating a new instance of the kernel
> driver for each node.
> 
> The driver, and the binding, is designed to support your use case -
> multiple key events generated by the hardware.

Honestly I’m OK with either approach.  I think we will have userspace configurable
enough that switching back and forth would be pretty trivial, if this would need
to be revisited.  v5 en-route.

> 
> Finally, I looked at the other machines in the tree. None of them have
> separate gpio-keys nodes

Yeah I noticed this too.  I chalked it up to my previously mentioned
user-is-probably-Xorg logic, but standard practices are not usually a
hard sell for me….

> 
> arch/arm/boot/dts/armada-xp-netgear-rn2120.dts:
> 
>        gpio-keys {
>                compatible = "gpio-keys";
>                pinctrl-0 = <&power_button_pin &reset_button_pin>;
>                pinctrl-names = "default";
> 
>                power-button {
>                        label = "Power Button";
>                        linux,code = <KEY_POWER>;
>                        gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>;
>                };
> 
>                reset-button {
>                        label = "Reset Button";
>                        linux,code = <KEY_RESTART>;
>                        gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
>                };
>        };
> 
> arch/arm/boot/dts/at91sam9261ek.dts
>        gpio_keys {
>                compatible = "gpio-keys";
> 
>                button_0 {
>                        label = "button_0";
>                        gpios = <&pioA 27 GPIO_ACTIVE_LOW>;
>                        linux,code = <256>;
>                        wakeup-source;
>                };
> 
>                button_1 {
>                        label = "button_1";
>                        gpios = <&pioA 26 GPIO_ACTIVE_LOW>;
>                        linux,code = <257>;
>                        wakeup-source;
>                };
> 
>                button_2 {
>                        label = "button_2";
>                        gpios = <&pioA 25 GPIO_ACTIVE_LOW>;
>                        linux,code = <258>;
>                        wakeup-source;
>                };
> 
>                button_3 {
>                        label = "button_3";
>                        gpios = <&pioA 24 GPIO_ACTIVE_LOW>;
>                        linux,code = <259>;
>                        wakeup-source;
>                };
>        };
> 
> Cheers,
> 
> Joel
> 
> 
> 
>> 
>> We aren’t structured that way so rethinking the usual approach seems reasonable.
>> Another reason I went for per gpio devices because it prevents applications from
>> reacting to each others events without any special library code.
>> 
>> I’m not saying there aren’t disadvantages to this approach - I just don’t know what
>> they are?
>> 
>>> 
>>> It's hard to judge without knowing the numbers, but considering the
>>> chips we run on I agree we should generally favour performance if
>>> design is getting in the way. But to make that trade off we should be
>> 
>> Again, what exactly is being traded-off ?
>> 
>>> clear on the performance numbers.
>>> 
>>> Andrew
diff mbox

Patch

diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
index e3a7b77..aa1708e 100644
--- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
+++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
@@ -31,6 +31,26 @@ 
 		};
 	};
 
+	gpio-keys@0 {
+		compatible = "gpio-keys";
+
+		air-water {
+			label = "air-water";
+			gpios = <&gpio ASPEED_GPIO(B, 5) GPIO_ACTIVE_LOW>;
+			linux,code = <ASPEED_GPIO(B, 5)>;
+		};
+	};
+
+	gpio-keys@1 {
+		compatible = "gpio-keys";
+
+		checkstop {
+			label = "checkstop";
+			gpios = <&gpio ASPEED_GPIO(J, 2) GPIO_ACTIVE_LOW>;
+			linux,code = <ASPEED_GPIO(J, 2)>;
+		};
+	};
+
 	leds {
 		compatible = "gpio-leds";