On Wed, May 20, 2020 at 07:37:39AM -0700, Tim Harvey wrote:
> Add Gateworks System Controller support to Gateworks Ventana boards:
> - add dt bindings for GSC mfd driver and hwmon driver for ADC's and
>   fan controllers.
> - add dt bindings for gpio-keys driver for push-button and interrupt events
>   from the GSC.
> 
> Signed-off-by: Tim Harvey <[email protected]>
> ---
>  arch/arm/boot/dts/imx6qdl-gw51xx.dtsi | 152 +++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw52xx.dtsi | 158 ++++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw53xx.dtsi | 164 +++++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw54xx.dtsi | 166 
> ++++++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw551x.dtsi | 146 ++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw552x.dtsi | 152 +++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw553x.dtsi | 140 +++++++++++++++++++++++++++-
>  arch/arm/boot/dts/imx6qdl-gw560x.dtsi | 164 +++++++++++++++++++++++++++++++--
>  arch/arm/boot/dts/imx6qdl-gw5903.dtsi | 139 +++++++++++++++++++++++++++-
>  arch/arm/boot/dts/imx6qdl-gw5904.dtsi | 140 +++++++++++++++++++++++++++-
>  arch/arm/boot/dts/imx6qdl-gw5907.dtsi | 141 ++++++++++++++++++++++++++++-
>  arch/arm/boot/dts/imx6qdl-gw5910.dtsi | 159 +++++++++++++++++++++++++++++++-
>  arch/arm/boot/dts/imx6qdl-gw5912.dtsi | 146 +++++++++++++++++++++++++++++-
>  arch/arm/boot/dts/imx6qdl-gw5913.dtsi | 152 ++++++++++++++++++++++++++++++-
>  14 files changed, 2062 insertions(+), 57 deletions(-)
> 
> diff --git a/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
> index 419a7cd..5fbf7d1 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
> @@ -19,6 +19,53 @@
>               bootargs = "console=ttymxc1,115200";
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {

We recommend to use hyphen than underscore in name name.

> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */

Use defines from include/dt-bindings/input/linux-event-codes.h, you can
drop the comments then.

Shawn

> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -102,6 +149,103 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_an1";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -126,13 +270,6 @@
>               pagesize = <16>;
>       };
>  
> -     gpio: pca9555@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       rtc: ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -387,6 +524,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0x0001b0b0 /* 
> GSC_IRQ# */
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
> index 60563ff..9f7436d 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
> @@ -28,6 +28,53 @@
>               default-brightness-level = <7>;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -165,6 +212,109 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +
> +                     channel@29 {
> +                             gw,mode = <1>;
> +                             reg = <0x29>;
> +                             label = "vdd_an1";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -189,13 +339,6 @@
>               pagesize = <16>;
>       };
>  
> -     gpio: pca9555@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       rtc: ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -504,6 +647,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
> index 8942bec..2a5f484 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
> @@ -28,6 +28,53 @@
>               default-brightness-level = <7>;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -158,6 +205,115 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +
> +                     channel@26 {
> +                             gw,mode = <1>;
> +                             reg = <0x26>;
> +                             label = "vdd_gps";
> +                     };
> +
> +                     channel@29 {
> +                             gw,mode = <1>;
> +                             reg = <0x29>;
> +                             label = "vdd_an1";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -182,13 +338,6 @@
>               pagesize = <16>;
>       };
>  
> -     gpio: pca9555@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       rtc: ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -486,6 +635,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
> index c40583d..d25d73d 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
> @@ -29,6 +29,53 @@
>               default-brightness-level = <7>;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -195,6 +242,117 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +
> +                     channel@26 {
> +                             gw,mode = <1>;
> +                             reg = <0x26>;
> +                             label = "vdd_gps";
> +                     };
> +             };
> +
> +             fan-controller@2c {
> +                     compatible = "gw,gsc-fan";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +                     reg = <0x2c>;
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -219,13 +377,6 @@
>               pagesize = <16>;
>       };
>  
> -     gpio: pca9555@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       rtc: ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -571,6 +722,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw551x.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw551x.dtsi
> index c38e86e..90c6d0d 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw551x.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw551x.dtsi
> @@ -63,6 +63,53 @@
>               bootargs = "console=ttymxc1,115200";
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -167,6 +214,97 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8a";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0b";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -191,13 +329,6 @@
>               pagesize = <16>;
>       };
>  
> -     gpio: pca9555@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       rtc: ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -464,6 +595,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw552x.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw552x.dtsi
> index bb35971..0d563be 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw552x.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw552x.dtsi
> @@ -20,6 +20,53 @@
>               bootargs = "console=ttymxc1,115200";
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -92,6 +139,103 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -116,13 +260,6 @@
>               pagesize = <16>;
>       };
>  
> -     gpio: pca9555@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       rtc: ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -305,6 +442,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw553x.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw553x.dtsi
> index ee85031..7f67180 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw553x.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw553x.dtsi
> @@ -61,6 +61,53 @@
>               stdout-path = &uart2;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -130,11 +177,101 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     gpio: pca9555@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8a";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0b";
> +                     };
> +
> +                     channel@26 {
> +                             gw,mode = <1>;
> +                             reg = <0x26>;
> +                             label = "vdd_an1";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom1: eeprom@50 {
> @@ -428,6 +565,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw560x.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw560x.dtsi
> index 69ca70d..cb20301 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw560x.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw560x.dtsi
> @@ -88,6 +88,53 @@
>               default-on;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -243,6 +290,115 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_an1";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +
> +                     channel@26 {
> +                             gw,mode = <1>;
> +                             reg = <0x26>;
> +                             label = "vdd_gps";
> +                     };
> +
> +                     channel@29 {
> +                             gw,mode = <1>;
> +                             reg = <0x29>;
> +                             label = "vdd_an2";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
> +             compatible = "nxp,pca9555";
> +             reg = <0x23>;
> +             gpio-controller;
> +             #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
> +     };
> +
>       eeprom1: eeprom@50 {
>               compatible = "atmel,24c02";
>               reg = <0x50>;
> @@ -267,13 +423,6 @@
>               pagesize = <16>;
>       };
>  
> -     pca9555: gpio@23 {
> -             compatible = "nxp,pca9555";
> -             reg = <0x23>;
> -             gpio-controller;
> -             #gpio-cells = <2>;
> -     };
> -
>       ds1672: rtc@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
> @@ -608,6 +757,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0xb0b1
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw5903.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw5903.dtsi
> index aee9221..e1bf19e 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw5903.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw5903.dtsi
> @@ -71,6 +71,53 @@
>               default-brightness-level = <100>;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -183,11 +230,101 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     pca9555: gpio@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_an1";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom1: eeprom@50 {
> diff --git a/arch/arm/boot/dts/imx6qdl-gw5904.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw5904.dtsi
> index 76d6cf5..1535ef6 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw5904.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw5904.dtsi
> @@ -68,6 +68,53 @@
>               default-brightness-level = <7>;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -205,11 +252,101 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     pca9555: gpio@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_an1";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom1: eeprom@50 {
> @@ -503,6 +640,7 @@
>               fsl,pins = <
>                       MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
>                       MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
> +                     MX6QDL_PAD_GPIO_4__GPIO1_IO04           0x0001b0b0 /* 
> GSC_IRQ# */
>               >;
>       };
>  
> diff --git a/arch/arm/boot/dts/imx6qdl-gw5907.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw5907.dtsi
> index 0bdebdd..81853b5 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw5907.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw5907.dtsi
> @@ -19,6 +19,53 @@
>               stdout-path = &uart2;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -102,11 +149,101 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     gpio@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_an1";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom@50 {
> @@ -133,7 +270,7 @@
>               pagesize = <16>;
>       };
>  
> -     rtc@68 {
> +     ds1672@68 {
>               compatible = "dallas,ds1672";
>               reg = <0x68>;
>       };
> diff --git a/arch/arm/boot/dts/imx6qdl-gw5910.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw5910.dtsi
> index 0857de5..2f34623 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw5910.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw5910.dtsi
> @@ -22,6 +22,53 @@
>               reg = <0x10000000 0x20000000>;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -111,11 +158,121 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     gpio@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@6 {
> +                             gw,mode = <0>;
> +                             reg = <0x06>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@82 {
> +                             gw,mode = <2>;
> +                             reg = <0x82>;
> +                             label = "vdd_vin";
> +                             gw,voltage-divider-ohms = <22100 1000>;
> +                             gw,voltage-offset-microvolt = <800000>;
> +                     };
> +
> +                     channel@84 {
> +                             gw,mode = <2>;
> +                             reg = <0x84>;
> +                             label = "vdd_5p0";
> +                             gw,voltage-divider-ohms = <22100 10000>;
> +                     };
> +
> +                     channel@86 {
> +                             gw,mode = <2>;
> +                             reg = <0x86>;
> +                             label = "vdd_3p3";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@88 {
> +                             gw,mode = <2>;
> +                             reg = <0x88>;
> +                             label = "vdd_2p5";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@8c {
> +                             gw,mode = <2>;
> +                             reg = <0x8c>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@8e {
> +                             gw,mode = <2>;
> +                             reg = <0x8e>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@90 {
> +                             gw,mode = <2>;
> +                             reg = <0x90>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@92 {
> +                             gw,mode = <2>;
> +                             reg = <0x92>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@98 {
> +                             gw,mode = <2>;
> +                             reg = <0x98>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@9a {
> +                             gw,mode = <2>;
> +                             reg = <0x9a>;
> +                             label = "vdd_1p0";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@9c {
> +                             gw,mode = <2>;
> +                             reg = <0x9c>;
> +                             label = "vdd_an1";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@a2 {
> +                             gw,mode = <2>;
> +                             reg = <0xa2>;
> +                             label = "vdd_gsc";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom@50 {
> diff --git a/arch/arm/boot/dts/imx6qdl-gw5912.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw5912.dtsi
> index 8c57fd2..0e2dbc8 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw5912.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw5912.dtsi
> @@ -20,6 +20,53 @@
>               stdout-path = &uart2;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -106,11 +153,108 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     gpio@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@0 {
> +                             gw,mode = <0>;
> +                             reg = <0x00>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@2 {
> +                             gw,mode = <1>;
> +                             reg = <0x02>;
> +                             label = "vdd_vin";
> +                     };
> +
> +                     channel@5 {
> +                             gw,mode = <1>;
> +                             reg = <0x05>;
> +                             label = "vdd_3p3";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@b {
> +                             gw,mode = <1>;
> +                             reg = <0x0b>;
> +                             label = "vdd_5p0";
> +                     };
> +
> +                     channel@e {
> +                             gw,mode = <1>;
> +                             reg = <0xe>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@11 {
> +                             gw,mode = <1>;
> +                             reg = <0x11>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@14 {
> +                             gw,mode = <1>;
> +                             reg = <0x14>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@17 {
> +                             gw,mode = <1>;
> +                             reg = <0x17>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@1d {
> +                             gw,mode = <1>;
> +                             reg = <0x1d>;
> +                             label = "vdd_1p8";
> +                     };
> +
> +                     channel@20 {
> +                             gw,mode = <1>;
> +                             reg = <0x20>;
> +                             label = "vdd_1p0";
> +                     };
> +
> +                     channel@23 {
> +                             gw,mode = <1>;
> +                             reg = <0x23>;
> +                             label = "vdd_2p5";
> +                     };
> +             };
> +
> +             fan-controller@a {
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +                     compatible = "gw,gsc-fan";
> +                     reg = <0x0a>;
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom@50 {
> diff --git a/arch/arm/boot/dts/imx6qdl-gw5913.dtsi 
> b/arch/arm/boot/dts/imx6qdl-gw5913.dtsi
> index 635c203..5fa79c9 100644
> --- a/arch/arm/boot/dts/imx6qdl-gw5913.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-gw5913.dtsi
> @@ -19,6 +19,53 @@
>               stdout-path = &uart2;
>       };
>  
> +     gpio_keys {
> +             compatible = "gpio-keys";
> +             #address-cells = <1>;
> +             #size-cells = <0>;
> +
> +             user_pb {
> +                     label = "user_pb";
> +                     gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
> +                     linux,code = <256>; /* BTN_0 */
> +             };
> +
> +             user_pb1x {
> +                     label = "user_pb1x";
> +                     linux,code = <257>; /* BTN_1 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <0>;
> +             };
> +
> +             key_erased {
> +                     label = "key-erased";
> +                     linux,code = <258>; /* BTN_2 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <1>;
> +             };
> +
> +             eeprom_wp {
> +                     label = "eeprom_wp";
> +                     linux,code = <259>; /* BTN_3 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <2>;
> +             };
> +
> +             tamper {
> +                     label = "tamper";
> +                     linux,code = <260>; /* BTN_4 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <5>;
> +             };
> +
> +             switch_hold {
> +                     label = "switch_hold";
> +                     linux,code = <261>; /* BTN_5 */
> +                     interrupt-parent = <&gsc>;
> +                     interrupts = <7>;
> +             };
> +     };
> +
>       leds {
>               compatible = "gpio-leds";
>               pinctrl-names = "default";
> @@ -87,11 +134,114 @@
>       pinctrl-0 = <&pinctrl_i2c1>;
>       status = "okay";
>  
> -     gpio@23 {
> +     gsc: gsc@20 {
> +             compatible = "gw,gsc";
> +             reg = <0x20>;
> +             interrupt-parent = <&gpio1>;
> +             interrupts = <4 GPIO_ACTIVE_LOW>;
> +             interrupt-controller;
> +             #interrupt-cells = <1>;
> +             #size-cells = <0>;
> +
> +             adc {
> +                     compatible = "gw,gsc-adc";
> +                     #address-cells = <1>;
> +                     #size-cells = <0>;
> +
> +                     channel@6 {
> +                             gw,mode = <0>;
> +                             reg = <0x06>;
> +                             label = "temp";
> +                     };
> +
> +                     channel@8 {
> +                             gw,mode = <1>;
> +                             reg = <0x08>;
> +                             label = "vdd_bat";
> +                     };
> +
> +                     channel@82 {
> +                             gw,mode = <2>;
> +                             reg = <0x82>;
> +                             label = "vdd_vin";
> +                             gw,voltage-divider-ohms = <22100 1000>;
> +                             gw,voltage-offset-microvolt = <800000>;
> +                     };
> +
> +                     channel@84 {
> +                             gw,mode = <2>;
> +                             reg = <0x84>;
> +                             label = "vdd_5p0";
> +                             gw,voltage-divider-ohms = <22100 10000>;
> +                     };
> +
> +                     channel@86 {
> +                             gw,mode = <2>;
> +                             reg = <0x86>;
> +                             label = "vdd_3p3";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@88 {
> +                             gw,mode = <2>;
> +                             reg = <0x88>;
> +                             label = "vdd_2p5";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@8c {
> +                             gw,mode = <2>;
> +                             reg = <0x8c>;
> +                             label = "vdd_arm";
> +                     };
> +
> +                     channel@8e {
> +                             gw,mode = <2>;
> +                             reg = <0x8e>;
> +                             label = "vdd_soc";
> +                     };
> +
> +                     channel@90 {
> +                             gw,mode = <2>;
> +                             reg = <0x90>;
> +                             label = "vdd_1p5";
> +                     };
> +
> +                     channel@92 {
> +                             gw,mode = <2>;
> +                             reg = <0x92>;
> +                             label = "vdd_1p0";
> +                     };
> +
> +                     channel@98 {
> +                             gw,mode = <2>;
> +                             reg = <0x98>;
> +                             label = "vdd_3p0";
> +                     };
> +
> +                     channel@9a {
> +                             gw,mode = <2>;
> +                             reg = <0x9a>;
> +                             label = "vdd_an1";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +
> +                     channel@a2 {
> +                             gw,mode = <2>;
> +                             reg = <0xa2>;
> +                             label = "vdd_gsc";
> +                             gw,voltage-divider-ohms = <10000 10000>;
> +                     };
> +             };
> +     };
> +
> +     gsc_gpio: pca9555@23 {
>               compatible = "nxp,pca9555";
>               reg = <0x23>;
>               gpio-controller;
>               #gpio-cells = <2>;
> +             interrupt-parent = <&gsc>;
> +             interrupts = <4>;
>       };
>  
>       eeprom@50 {
> -- 
> 2.7.4
> 

Reply via email to