drivers/gpio: Add GPIO driver of it51xxx

Add GPIO driver for ITE it51xxx series.

Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com>
This commit is contained in:
Tim Lin 2024-12-07 14:38:04 +08:00 committed by Benjamin Cabé
commit f67c2a3d33
6 changed files with 931 additions and 0 deletions

View file

@ -36,6 +36,7 @@ zephyr_library_sources_ifdef(CONFIG_GPIO_IMX gpio_imx.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_INFINEON_CAT1 gpio_ifx_cat1.c) zephyr_library_sources_ifdef(CONFIG_GPIO_INFINEON_CAT1 gpio_ifx_cat1.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_INTEL gpio_intel.c) zephyr_library_sources_ifdef(CONFIG_GPIO_INTEL gpio_intel.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_IPROC gpio_iproc.c) zephyr_library_sources_ifdef(CONFIG_GPIO_IPROC gpio_iproc.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT51XXX gpio_ite_it51xxx.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT8801 gpio_ite_it8801.c) zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT8801 gpio_ite_it8801.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT8XXX2 gpio_ite_it8xxx2.c) zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT8XXX2 gpio_ite_it8xxx2.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT8XXX2_V2 gpio_ite_it8xxx2_v2.c) zephyr_library_sources_ifdef(CONFIG_GPIO_ITE_IT8XXX2_V2 gpio_ite_it8xxx2_v2.c)

View file

@ -128,6 +128,7 @@ source "drivers/gpio/Kconfig.ifx_cat1"
source "drivers/gpio/Kconfig.imx" source "drivers/gpio/Kconfig.imx"
source "drivers/gpio/Kconfig.intel" source "drivers/gpio/Kconfig.intel"
source "drivers/gpio/Kconfig.iproc" source "drivers/gpio/Kconfig.iproc"
source "drivers/gpio/Kconfig.it51xxx"
source "drivers/gpio/Kconfig.it8801" source "drivers/gpio/Kconfig.it8801"
source "drivers/gpio/Kconfig.it8xxx2" source "drivers/gpio/Kconfig.it8xxx2"
source "drivers/gpio/Kconfig.litex" source "drivers/gpio/Kconfig.litex"

View file

@ -0,0 +1,9 @@
# Copyright (c) 2025 ITE Corporation. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
config GPIO_ITE_IT51XXX
bool "ITE IT51XXX GPIO driver"
default y
depends on DT_HAS_ITE_IT51XXX_GPIO_ENABLED
help
Enable driver for the IT51XXX series GPIO controller.

View file

@ -0,0 +1,465 @@
/*
* Copyright (c) 2025 ITE Corporation. All Rights Reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
*/
#define DT_DRV_COMPAT ite_it51xxx_gpio
#include <chip_chipregs.h>
#include <soc.h>
#include <soc_dt.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/gpio/gpio_utils.h>
#include <zephyr/drivers/interrupt_controller/wuc_ite_it51xxx.h>
#include <zephyr/dt-bindings/gpio/ite-it8xxx2-gpio.h>
#include <zephyr/dt-bindings/interrupt-controller/ite-intc.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(gpio_ite_it51xxx, LOG_LEVEL_ERR);
#define IT515XX_GPIO_MAX_PINS 8
struct it51xxx_gpio_wuc_map_cfg {
/* WUC control device structure */
const struct device *wucs;
/* WUC pin mask */
uint8_t mask;
};
/*
* Structure gpio_ite_cfg is about the setting of GPIO
* this config will be used at initial time
*/
struct gpio_ite_cfg {
/* gpio_driver_config needs to be first */
struct gpio_driver_config common;
/* gpio wake-up input source configuration list */
const struct it51xxx_gpio_wuc_map_cfg *wuc_map_list;
/* GPIO port data register (bit mapping to pin) */
uintptr_t reg_gpdr;
/* GPIO port data mirror register (bit mapping to pin) */
uintptr_t reg_gpdmr;
/* GPIO port output type register (bit mapping to pin) */
uintptr_t reg_gpotr;
/* GPIO port 1.8V select register (bit mapping to pin) */
uintptr_t reg_p18scr;
/* GPIO port control register (byte mapping to pin) */
uintptr_t reg_gpcr;
/* GPIO/KBS function selection register (bit mapping to pin) */
uintptr_t reg_ksfselr;
/* GPIO's irq */
uint8_t gpio_irq[8];
/* Support input voltage selection */
uint8_t has_volt_sel[8];
/* Number of pins per group of GPIO */
uint8_t num_pins;
};
/* Structure gpio_ite_data is about callback function */
struct gpio_ite_data {
struct gpio_driver_data common;
struct k_spinlock lock;
sys_slist_t callbacks;
uint8_t volt_default_set;
uint8_t level_isr_high;
uint8_t level_isr_low;
};
/**
* Driver functions
*/
static int gpio_ite_configure(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags)
{
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
uint8_t mask = BIT(pin);
int rc = 0;
/* Don't support "open source" mode */
if (((flags & GPIO_SINGLE_ENDED) != 0) && ((flags & GPIO_LINE_OPEN_DRAIN) == 0)) {
return -ENOTSUP;
}
k_spinlock_key_t key = k_spin_lock(&data->lock);
if (flags == GPIO_DISCONNECTED) {
sys_write8(GPCR_PORT_PIN_MODE_TRISTATE, config->reg_gpcr + pin);
/*
* Since not all GPIOs can be to configured as tri-state,
* prompt error if pin doesn't support the flag.
*/
if (sys_read8(config->reg_gpcr + pin) != GPCR_PORT_PIN_MODE_TRISTATE) {
/* Go back to default setting (input) */
sys_write8(GPCR_PORT_PIN_MODE_INPUT, config->reg_gpcr + pin);
LOG_ERR("Cannot config the node-gpio@%x, pin=%d as tri-state",
(uint32_t)config->reg_gpdr, pin);
rc = -ENOTSUP;
goto unlock_and_return;
}
/*
* The following configuration isn't necessary because the pin
* was configured as disconnected.
*/
rc = 0;
goto unlock_and_return;
}
/*
* Select open drain first, so that we don't glitch the signal
* when changing the line to an output.
*/
if ((uint8_t *)config->reg_gpotr != NULL) {
if (flags & GPIO_OPEN_DRAIN) {
sys_write8(sys_read8(config->reg_gpotr) | mask, config->reg_gpotr);
} else {
sys_write8(sys_read8(config->reg_gpotr) & ~mask, config->reg_gpotr);
}
}
/* 1.8V or 3.3V */
if (config->has_volt_sel[pin]) {
gpio_flags_t volt = flags & IT8XXX2_GPIO_VOLTAGE_MASK;
if (volt == IT8XXX2_GPIO_VOLTAGE_1P8) {
__ASSERT(!(flags & GPIO_PULL_UP),
"Don't enable internal pullup if 1.8V voltage is used");
sys_write8(sys_read8(config->reg_p18scr) | mask, config->reg_p18scr);
data->volt_default_set &= ~mask;
} else if (volt == IT8XXX2_GPIO_VOLTAGE_3P3) {
sys_write8(sys_read8(config->reg_p18scr) & ~mask, config->reg_p18scr);
/*
* A variable is needed to store the difference between
* 3.3V and default so that the flag can be distinguished
* between the two in gpio_ite_get_config.
*/
data->volt_default_set &= ~mask;
} else if (volt == IT8XXX2_GPIO_VOLTAGE_DEFAULT) {
sys_write8(sys_read8(config->reg_p18scr) & ~mask, config->reg_p18scr);
data->volt_default_set |= mask;
} else {
rc = -EINVAL;
goto unlock_and_return;
}
}
/* GPIOK, L N group have to set this register */
if ((uint8_t *)config->reg_ksfselr) {
sys_write8(sys_read8(config->reg_ksfselr) | mask, config->reg_ksfselr);
}
/* If output, set level before changing type to an output. */
if (flags & GPIO_OUTPUT) {
if (flags & GPIO_OUTPUT_INIT_HIGH) {
sys_write8(sys_read8(config->reg_gpdr) | mask, config->reg_gpdr);
} else if (flags & GPIO_OUTPUT_INIT_LOW) {
sys_write8(sys_read8(config->reg_gpdr) & ~mask, config->reg_gpdr);
}
}
uint8_t reg_gpcr = sys_read8(config->reg_gpcr + pin);
/* Set input or output. */
/* Handle regular GPIO controller */
if (flags & GPIO_OUTPUT) {
reg_gpcr = (reg_gpcr | GPCR_PORT_PIN_MODE_OUTPUT) & ~GPCR_PORT_PIN_MODE_INPUT;
} else {
reg_gpcr = (reg_gpcr | GPCR_PORT_PIN_MODE_INPUT) & ~GPCR_PORT_PIN_MODE_OUTPUT;
}
/* Handle pullup / pulldown */
/* Handle regular GPIO controller */
if (flags & GPIO_PULL_UP) {
reg_gpcr = (reg_gpcr | GPCR_PORT_PIN_MODE_PULLUP) & ~GPCR_PORT_PIN_MODE_PULLDOWN;
} else if (flags & GPIO_PULL_DOWN) {
reg_gpcr = (reg_gpcr | GPCR_PORT_PIN_MODE_PULLDOWN) & ~GPCR_PORT_PIN_MODE_PULLUP;
} else {
/* No pull up/down */
reg_gpcr &= ~(GPCR_PORT_PIN_MODE_PULLDOWN | GPCR_PORT_PIN_MODE_PULLUP);
}
sys_write8(reg_gpcr, config->reg_gpcr + pin);
unlock_and_return:
k_spin_unlock(&data->lock, key);
return rc;
}
#ifdef CONFIG_GPIO_GET_CONFIG
static int gpio_ite_get_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t *out_flags)
{
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
uint8_t mask = BIT(pin);
gpio_flags_t flags = 0;
k_spinlock_key_t key = k_spin_lock(&data->lock);
/* push-pull or open-drain */
if (sys_read8(config->reg_gpotr) & mask) {
flags |= GPIO_OPEN_DRAIN;
}
/* 1.8V or 3.3V */
if (config->has_volt_sel[pin]) {
if (data->volt_default_set & mask) {
flags |= IT8XXX2_GPIO_VOLTAGE_DEFAULT;
} else {
if (sys_read8(config->reg_p18scr) & mask) {
flags |= IT8XXX2_GPIO_VOLTAGE_1P8;
} else {
flags |= IT8XXX2_GPIO_VOLTAGE_3P3;
}
}
}
/* set input or output. */
if (sys_read8(config->reg_gpcr + pin) & GPCR_PORT_PIN_MODE_OUTPUT) {
flags |= GPIO_OUTPUT;
/* set level */
if (sys_read8(config->reg_gpdr) & mask) {
flags |= GPIO_OUTPUT_HIGH;
} else {
flags |= GPIO_OUTPUT_LOW;
}
}
if (sys_read8(config->reg_gpcr + pin) & GPCR_PORT_PIN_MODE_INPUT) {
flags |= GPIO_INPUT;
/* pullup / pulldown */
if (sys_read8(config->reg_gpcr + pin) & GPCR_PORT_PIN_MODE_PULLUP) {
flags |= GPIO_PULL_UP;
}
if (sys_read8(config->reg_gpcr + pin) & GPCR_PORT_PIN_MODE_PULLDOWN) {
flags |= GPIO_PULL_DOWN;
}
}
*out_flags = flags;
k_spin_unlock(&data->lock, key);
return 0;
}
#endif
static int gpio_ite_port_get_raw(const struct device *dev, gpio_port_value_t *value)
{
const struct gpio_ite_cfg *config = dev->config;
/* Get raw bits of GPIO mirror register */
*value = sys_read8(config->reg_gpdmr);
return 0;
}
static int gpio_ite_port_set_masked_raw(const struct device *dev, gpio_port_pins_t mask,
gpio_port_value_t value)
{
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
uint8_t masked_value = value & mask;
k_spinlock_key_t key = k_spin_lock(&data->lock);
uint8_t out = sys_read8(config->reg_gpdr);
sys_write8(((out & ~mask) | masked_value), config->reg_gpdr);
k_spin_unlock(&data->lock, key);
return 0;
}
static int gpio_ite_port_set_bits_raw(const struct device *dev, gpio_port_pins_t pins)
{
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
k_spinlock_key_t key = k_spin_lock(&data->lock);
/* Set raw bits of GPIO data register */
sys_write8(sys_read8(config->reg_gpdr) | pins, config->reg_gpdr);
k_spin_unlock(&data->lock, key);
return 0;
}
static int gpio_ite_port_clear_bits_raw(const struct device *dev, gpio_port_pins_t pins)
{
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
k_spinlock_key_t key = k_spin_lock(&data->lock);
/* Clear raw bits of GPIO data register */
sys_write8(sys_read8(config->reg_gpdr) & ~pins, config->reg_gpdr);
k_spin_unlock(&data->lock, key);
return 0;
}
static int gpio_ite_port_toggle_bits(const struct device *dev, gpio_port_pins_t pins)
{
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
k_spinlock_key_t key = k_spin_lock(&data->lock);
/* Toggle raw bits of GPIO data register */
sys_write8(sys_read8(config->reg_gpdr) ^ pins, config->reg_gpdr);
k_spin_unlock(&data->lock, key);
return 0;
}
static int gpio_ite_manage_callback(const struct device *dev, struct gpio_callback *callback,
bool set)
{
struct gpio_ite_data *data = dev->data;
k_spinlock_key_t key = k_spin_lock(&data->lock);
int rc = gpio_manage_callback(&data->callbacks, callback, set);
k_spin_unlock(&data->lock, key);
return rc;
}
static void gpio_ite_isr(const void *arg)
{
const struct device *dev = arg;
const struct gpio_ite_cfg *config = dev->config;
struct gpio_ite_data *data = dev->data;
uint8_t irq = ite_intc_get_irq_num();
uint8_t num_pins = config->num_pins;
uint8_t pin;
for (pin = 0; pin < num_pins; pin++) {
if (irq == config->gpio_irq[pin]) {
/* Should be safe even without spinlock. */
/* Clear the WUC status register. */
it51xxx_wuc_clear_status(config->wuc_map_list[pin].wucs,
config->wuc_map_list[pin].mask);
/* The callbacks are user code, and therefore should
* not hold the lock.
*/
gpio_fire_callbacks(&data->callbacks, dev, BIT(pin));
break;
}
}
}
static int gpio_ite_pin_interrupt_configure(const struct device *dev, gpio_pin_t pin,
enum gpio_int_mode mode, enum gpio_int_trig trig)
{
const struct gpio_ite_cfg *config = dev->config;
uint32_t flags;
uint8_t gpio_irq = config->gpio_irq[pin];
struct gpio_ite_data *data = dev->data;
if (!gpio_irq) {
LOG_ERR("Unsupport interrupt pin");
return -ENOTSUP;
}
#ifdef CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT
if (mode == GPIO_INT_MODE_DISABLED || mode == GPIO_INT_MODE_DISABLE_ONLY) {
#else
if (mode == GPIO_INT_MODE_DISABLED) {
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT */
/* Disable GPIO interrupt */
irq_disable(gpio_irq);
return 0;
#ifdef CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT
} else if (mode == GPIO_INT_MODE_ENABLE_ONLY) {
/* Only enable GPIO interrupt */
irq_enable(gpio_irq);
return 0;
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT */
}
/* Disable irq before configuring it */
irq_disable(gpio_irq);
k_spinlock_key_t key = k_spin_lock(&data->lock);
if (mode == GPIO_INT_MODE_LEVEL) {
flags = WUC_TYPE_LEVEL_TRIG;
if (trig & GPIO_INT_TRIG_HIGH) {
flags |= WUC_TYPE_LEVEL_HIGH;
} else {
flags |= WUC_TYPE_LEVEL_LOW;
}
} else {
switch (trig) {
case GPIO_INT_TRIG_LOW:
flags = WUC_TYPE_EDGE_FALLING;
break;
case GPIO_INT_TRIG_HIGH:
flags = WUC_TYPE_EDGE_RISING;
break;
case GPIO_INT_TRIG_BOTH:
flags = WUC_TYPE_EDGE_BOTH;
break;
default:
k_spin_unlock(&data->lock, key);
return -EINVAL;
}
}
/* Select wakeup interrupt edge triggered type of GPIO pins */
it51xxx_wuc_set_polarity(config->wuc_map_list[pin].wucs, config->wuc_map_list[pin].mask,
flags);
/*
* Always write 1 to clear the WUC status register after
* modifying edge mode selection register (WUBEMR and WUEMR).
*/
it51xxx_wuc_clear_status(config->wuc_map_list[pin].wucs, config->wuc_map_list[pin].mask);
/* Enable wakeup interrupt of GPIO pins */
it51xxx_wuc_enable(config->wuc_map_list[pin].wucs, config->wuc_map_list[pin].mask);
k_spin_unlock(&data->lock, key);
/* Enable GPIO interrupt */
irq_connect_dynamic(gpio_irq, 0, gpio_ite_isr, dev, 0);
irq_enable(gpio_irq);
return 0;
}
static DEVICE_API(gpio, gpio_ite_driver_api) = {
.pin_configure = gpio_ite_configure,
#ifdef CONFIG_GPIO_GET_CONFIG
.pin_get_config = gpio_ite_get_config,
#endif
.port_get_raw = gpio_ite_port_get_raw,
.port_set_masked_raw = gpio_ite_port_set_masked_raw,
.port_set_bits_raw = gpio_ite_port_set_bits_raw,
.port_clear_bits_raw = gpio_ite_port_clear_bits_raw,
.port_toggle_bits = gpio_ite_port_toggle_bits,
.pin_interrupt_configure = gpio_ite_pin_interrupt_configure,
.manage_callback = gpio_ite_manage_callback,
};
#define GPIO_ITE_DEV_CFG_DATA(inst) \
BUILD_ASSERT(DT_INST_PROP(inst, ngpios) <= IT515XX_GPIO_MAX_PINS, \
"The maximum number of pins per port is 8."); \
static const struct it51xxx_gpio_wuc_map_cfg \
it51xxx_gpio_wuc_##inst[IT8XXX2_DT_INST_WUCCTRL_LEN(inst)] = \
IT8XXX2_DT_WUC_ITEMS_LIST(inst); \
static struct gpio_ite_data gpio_ite_data_##inst; \
static const struct gpio_ite_cfg gpio_ite_cfg_##inst = { \
.common = {.port_pin_mask = GPIO_PORT_PIN_MASK_FROM_DT_INST(inst)}, \
.wuc_map_list = it51xxx_gpio_wuc_##inst, \
.reg_gpdr = DT_INST_REG_ADDR_BY_IDX(inst, 0), \
.reg_gpdmr = DT_INST_REG_ADDR_BY_IDX(inst, 1), \
.reg_gpotr = DT_INST_REG_ADDR_BY_IDX(inst, 2), \
.reg_p18scr = DT_INST_REG_ADDR_BY_IDX(inst, 3), \
.reg_gpcr = DT_INST_REG_ADDR_BY_IDX(inst, 4), \
.reg_ksfselr = DT_INST_REG_ADDR_BY_IDX(inst, 5), \
.gpio_irq = IT8XXX2_DT_GPIO_IRQ_LIST(inst), \
.has_volt_sel = DT_INST_PROP_OR(inst, has_volt_sel, {0}), \
.num_pins = DT_INST_PROP(inst, ngpios), \
}; \
DEVICE_DT_INST_DEFINE(inst, NULL, NULL, &gpio_ite_data_##inst, &gpio_ite_cfg_##inst, \
PRE_KERNEL_1, CONFIG_GPIO_INIT_PRIORITY, &gpio_ite_driver_api);
DT_INST_FOREACH_STATUS_OKAY(GPIO_ITE_DEV_CFG_DATA)

View file

@ -0,0 +1,28 @@
# Copyright (c) 2025 ITE Corporation. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
description: This binding gives a base representation of the it51xxx series gpio
compatible: "ite,it51xxx-gpio"
include: [gpio-controller.yaml, base.yaml]
properties:
reg:
required: true
has-volt-sel:
type: array
description: |
Selection of support input voltage 3.3V or 1.8V.
wucctrl:
type: phandles
description: |
WUC groups internal and external inputs, and asserts wake-up
signals to INTC that allows the CPU to exit a Doze/Deep
Doze/Sleep mode.
gpio-cells:
- pin
- flags

View file

@ -7,6 +7,7 @@
#include <ite/it51xxx-wuc-map.dtsi> #include <ite/it51xxx-wuc-map.dtsi>
#include <mem.h> #include <mem.h>
#include <zephyr/dt-bindings/dt-util.h> #include <zephyr/dt-bindings/dt-util.h>
#include <zephyr/dt-bindings/gpio/gpio.h>
#include <zephyr/dt-bindings/interrupt-controller/ite-it51xxx-intc.h> #include <zephyr/dt-bindings/interrupt-controller/ite-it51xxx-intc.h>
#include <zephyr/dt-bindings/interrupt-controller/ite-it51xxx-wuc.h> #include <zephyr/dt-bindings/interrupt-controller/ite-it51xxx-wuc.h>
#include <zephyr/dt-bindings/pinctrl/it8xxx2-pinctrl.h> #include <zephyr/dt-bindings/pinctrl/it8xxx2-pinctrl.h>
@ -71,6 +72,432 @@
reg = <0x00f01600 0x100>; reg = <0x00f01600 0x100>;
}; };
gpioa: gpio@f01601 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01601 1 /* GPDR (set) */
0x00f01661 1 /* GPDMR (get) */
0x00f01671 1 /* GPOTR */
0x00f016d4 1 /* P18SCR */
0x00f01610 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU91 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU92 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU93 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU80 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU81 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU82 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU83 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU100 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu91 /* GPA0 */
&wuc_wu92 /* GPA1 */
&wuc_wu93 /* GPA2 */
&wuc_wu80 /* GPA3 */
&wuc_wu81 /* GPA4 */
&wuc_wu82 /* GPA5 */
&wuc_wu83 /* GPA6 */
&wuc_wu100>; /* GPA7 */
has-volt-sel = <1 1 1 1 0 0 1 1>;
#gpio-cells = <2>;
};
gpiob: gpio@f01602 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01602 1 /* GPDR (set) */
0x00f01662 1 /* GPDMR (get) */
0x00f01672 1 /* GPOTR */
0x00f016d5 1 /* P18SCR */
0x00f01618 7 /* GPCR */
NO_FUNC 1>;
ngpios = <7>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU101 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU102 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU84 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU103 IRQ_TYPE_LEVEL_HIGH
NO_FUNC 0
IT51XXX_IRQ_WU104 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU105 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu101 /* GPB0 */
&wuc_wu102 /* GPB1 */
&wuc_wu84 /* GPB2 */
&wuc_wu103 /* GPB3 */
&wuc_no_func /* NO_FUNC */
&wuc_wu104 /* GPB5 */
&wuc_wu105>; /* GPB6 */
has-volt-sel = <0 0 1 0 0 0 0 0>;
#gpio-cells = <2>;
};
gpioc: gpio@f01603 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01603 1 /* GPDR (set) */
0x00f01663 1 /* GPDMR (get) */
0x00f01673 1 /* GPOTR */
0x00f016d6 1 /* P18SCR */
0x00f01620 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU85 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU107 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU95 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU108 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU22 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU109 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU23 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU86 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu85 /* GPC0 */
&wuc_wu107 /* GPC1 */
&wuc_wu95 /* GPC2 */
&wuc_wu108 /* GPC3 */
&wuc_wu22 /* GPC4 */
&wuc_wu109 /* GPC5 */
&wuc_wu23 /* GPC6 */
&wuc_wu86>; /* GPC7 */
has-volt-sel = <1 0 0 1 1 1 1 0>;
#gpio-cells = <2>;
};
gpiod: gpio@f01604 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01604 1 /* GPDR (set) */
0x00f01664 1 /* GPDMR (get) */
0x00f01674 1 /* GPOTR */
0x00f016d7 1 /* P18SCR */
0x00f01628 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU20 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU21 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU24 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU110 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU111 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU112 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU113 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU87 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu20 /* GPD0 */
&wuc_wu21 /* GPD1 */
&wuc_wu24 /* GPD2 */
&wuc_wu110 /* GPD3 */
&wuc_wu111 /* GPD4 */
&wuc_wu112 /* GPD5 */
&wuc_wu113 /* GPD6 */
&wuc_wu87>; /* GPD7 */
has-volt-sel = <0 0 0 0 0 1 1 1>;
#gpio-cells = <2>;
};
gpioe: gpio@f01605 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01605 1 /* GPDR (set) */
0x00f01665 1 /* GPDMR (get) */
0x00f01675 1 /* GPOTR */
0x00f016d8 1 /* P18SCR */
0x00f01630 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU70 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU71 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU72 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU73 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU114 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU40 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU45 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU46 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu70 /* GPE0 */
&wuc_wu71 /* GPE1 */
&wuc_wu72 /* GPE2 */
&wuc_wu73 /* GPE3 */
&wuc_wu114 /* GPE4 */
&wuc_wu40 /* GPE5 */
&wuc_wu45 /* GPE6 */
&wuc_wu46>; /* GPE7 */
has-volt-sel = <0 1 1 1 0 1 0 0>;
#gpio-cells = <2>;
};
gpiof: gpio@f01606 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01606 1 /* GPDR (set) */
0x00f01666 1 /* GPDMR (get) */
0x00f01676 1 /* GPOTR */
0x00f016d9 1 /* P18SCR */
0x00f01638 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU96 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU97 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU98 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU99 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU64 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU65 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU66 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU67 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu96 /* GPF0 */
&wuc_wu97 /* GPF1 */
&wuc_wu98 /* GPF2 */
&wuc_wu99 /* GPF3 */
&wuc_wu64 /* GPF4 */
&wuc_wu65 /* GPF5 */
&wuc_wu66 /* GPF6 */
&wuc_wu67>; /* GPF7 */
has-volt-sel = <1 1 0 0 0 0 0 0>;
#gpio-cells = <2>;
};
gpiog: gpio@f01607 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01607 1 /* GPDR (set) */
0x00f01667 1 /* GPDMR (get) */
0x00f01677 1 /* GPOTR */
0x00f016da 1 /* P18SCR */
0x00f01640 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU115 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU116 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU117 IRQ_TYPE_LEVEL_HIGH
NO_FUNC 0
NO_FUNC 0
NO_FUNC 0
IT51XXX_IRQ_WU118 IRQ_TYPE_LEVEL_HIGH
NO_FUNC 0>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu115 /* GPG0 */
&wuc_wu116 /* GPG1 */
&wuc_wu117 /* GPG2 */
&wuc_no_func /* NO_FUNC */
&wuc_no_func /* NO_FUNC */
&wuc_no_func /* NO_FUNC */
&wuc_wu118 /* GPG6 */
&wuc_no_func>; /* NO_FUNC */
has-volt-sel = <1 0 1 0 0 0 0 0>;
#gpio-cells = <2>;
};
gpioh: gpio@f01608 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01608 1 /* GPDR (set) */
0x00f01668 1 /* GPDMR (get) */
0x00f01678 1 /* GPOTR */
0x00f016db 1 /* P18SCR */
0x00f01648 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU60 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU61 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU62 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU63 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU88 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU89 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU90 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU127 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu60 /* GPH0 */
&wuc_wu61 /* GPH1 */
&wuc_wu62 /* GPH2 */
&wuc_wu63 /* GPH3 */
&wuc_wu88 /* GPH4 */
&wuc_wu89 /* GPH5 */
&wuc_wu90 /* GPH6 */
&wuc_wu127>; /* GPH7 */
has-volt-sel = <0 0 0 1 1 1 1 1>;
#gpio-cells = <2>;
};
gpioi: gpio@f01609 {
compatible = "ite,it51xxx-gpio";
reg = <0x00f01609 1 /* GPDR (set) */
0x00f01669 1 /* GPDMR (get) */
0x00f01679 1 /* GPOTR */
0x00f016dc 1 /* P18SCR */
0x00f01650 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU119 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU120 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU121 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU122 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU74 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU75 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU76 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU77 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu119 /* GPI0 */
&wuc_wu120 /* GPI1 */
&wuc_wu121 /* GPI2 */
&wuc_wu122 /* GPI3 */
&wuc_wu74 /* GPI4 */
&wuc_wu75 /* GPI5 */
&wuc_wu76 /* GPI6 */
&wuc_wu77>; /* GPI7 */
has-volt-sel = <1 1 1 1 1 1 1 1>;
#gpio-cells = <2>;
};
gpioj: gpio@f0160a {
compatible = "ite,it51xxx-gpio";
reg = <0x00f0160a 1 /* GPDR (set) */
0x00f0166a 1 /* GPDMR (get) */
0x00f0167a 1 /* GPOTR */
0x00f016dd 1 /* P18SCR */
0x00f01658 8 /* GPCR */
NO_FUNC 1>;
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU128 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU129 IRQ_TYPE_LEVEL_HIGH
NO_FUNC 0
IT51XXX_IRQ_WU131 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU132 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU133 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU134 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU135 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu128 /* GPJ0 */
&wuc_wu129 /* GPJ1 */
&wuc_no_func /* NO_FUNC */
&wuc_wu131 /* GPJ3 */
&wuc_wu132 /* GPJ4 */
&wuc_wu133 /* GPJ5 */
&wuc_wu134 /* GPJ6 */
&wuc_wu135>; /* GPJ7 */
has-volt-sel = <1 1 0 1 1 1 1 1>;
#gpio-cells = <2>;
};
gpiok: gpio@f0160b {
compatible = "ite,it51xxx-gpio";
reg = <0x00f0160b 1 /* GPDR (set) */
0x00f0166b 1 /* GPDMR (get) */
0x00f0167b 1 /* GPOTR */
NO_FUNC 1 /* P18SCR */
0x00f01690 8 /* GPCR */
0x00f01d2d 1>; /* KSOLFSELR */
ngpios = <8>;
gpio-controller;
interrupts = <NO_FUNC 0
NO_FUNC 0
NO_FUNC 0
NO_FUNC 0
NO_FUNC 0
NO_FUNC 0
NO_FUNC 0
NO_FUNC 0>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_no_func /* NO_FUNC */
&wuc_no_func
&wuc_no_func
&wuc_no_func
&wuc_no_func
&wuc_no_func
&wuc_no_func
&wuc_no_func>;
#gpio-cells = <2>;
};
gpiol: gpio@f0160c {
compatible = "ite,it51xxx-gpio";
reg = <0x00f0160c 1 /* GPDR (set) */
0x00f0166c 1 /* GPDMR (get) */
0x00f0167c 1 /* GPOTR */
NO_FUNC 1 /* P18SCR */
0x00f01698 8 /* GPCR */
0x00f01d2e 1>; /* KSOHFSELR */
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU136 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU137 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU138 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU139 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU140 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU141 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU142 IRQ_TYPE_LEVEL_HIGH
NO_FUNC 0>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu136 /* GPL0 */
&wuc_wu137 /* GPL1 */
&wuc_wu138 /* GPL2 */
&wuc_wu139 /* GPL3 */
&wuc_wu140 /* GPL4 */
&wuc_wu141 /* GPL5 */
&wuc_wu142 /* GPL6 */
&wuc_no_func>; /* NO_FUNC */
#gpio-cells = <2>;
};
gpiom: gpio@f0160d {
compatible = "ite,it51xxx-gpio";
reg = <0x00f0160d 1 /* GPDR (set) */
0x00f0166d 1 /* GPDMR (get) */
NO_FUNC 1 /* GPOTR */
NO_FUNC 1 /* P18SCR */
0x00f016a0 7 /* GPCR */
NO_FUNC 1>;
ngpios = <7>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WU144 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU145 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU146 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU147 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU148 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU149 IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WU150 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu144 /* GPM0 */
&wuc_wu145 /* GPM1 */
&wuc_wu146 /* GPM2 */
&wuc_wu147 /* GPM3 */
&wuc_wu148 /* GPM4 */
&wuc_wu149 /* GPM5 */
&wuc_wu150>; /* GPM6 */
#gpio-cells = <2>;
};
gpion: gpio@f0160e {
compatible = "ite,it51xxx-gpio";
reg = <0x00f0160e 1 /* GPDR (set) */
0x00f0166e 1 /* GPDMR (get) */
0x00f0167e 1 /* GPOTR */
NO_FUNC 1 /* P18SCR */
0x00f016a8 8 /* GPCR */
0x00f01d2c 1>; /* KSIFSELR */
ngpios = <8>;
gpio-controller;
interrupts = <IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH
IT51XXX_IRQ_WKINTC IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
wucctrl = <&wuc_wu30 /* GPN0 */
&wuc_wu31 /* GPN1 */
&wuc_wu32 /* GPN2 */
&wuc_wu33 /* GPN3 */
&wuc_wu34 /* GPN4 */
&wuc_wu35 /* GPN5 */
&wuc_wu36 /* GPN6 */
&wuc_wu37>; /* GPN7 */
#gpio-cells = <2>;
};
pinctrl: pin-controller { pinctrl: pin-controller {
compatible = "ite,it8xxx2-pinctrl"; compatible = "ite,it8xxx2-pinctrl";
#address-cells = <1>; #address-cells = <1>;