drivers: gpio: ite_it8xxx2: enable more gpio groups

This change enables A, C, D, E, G, H, I, J, K, and L groups,
and fix gpio interrupt function.

This change also pull (and rename) dt-bindings/irq.h to
dt-bindings/interrupt-controller/ite-intc.h, because it is
chip-specific.

Signed-off-by: Dino Li <Dino.Li@ite.com.tw>
Change-Id: Ifee039981c2cc4cf5980e663702a9921e629fc1e
This commit is contained in:
Dino Li 2021-04-21 16:35:17 +08:00 committed by Anas Nashif
commit 0ab51ff657
10 changed files with 783 additions and 687 deletions

View file

@ -23,12 +23,6 @@
&adc0 {
status = "okay";
};
&gpiob {
status = "okay";
};
&gpiof {
status = "okay";
};
&i2c0 {
status = "okay";
clock-frequency = <I2C_BITRATE_STANDARD>;

View file

@ -7,112 +7,42 @@
#include <errno.h>
#include <device.h>
#include <drivers/gpio.h>
#include <dt-bindings/interrupt-controller/ite-intc.h>
#include <zephyr/types.h>
#include <sys/util.h>
#include <string.h>
#include <logging/log.h>
#include "gpio_utils.h"
#define DT_DRV_COMPAT ite_it8xxx2_gpio
#define GPIO_LOW 0
#define GPIO_HIGH 1
#define NUM_IO_MAX 8
#define CURR_SUPP_GPIO_SET 2
#define DT_DRV_COMPAT ite_it8xxx2_gpio
/*
* this two function be used to enable/disable specific irq interrupt
*/
extern void ite_intc_irq_enable(unsigned int irq);
extern void ite_intc_irq_disable(unsigned int irq);
#define GPIO_GPDRB (DT_REG_ADDR_BY_IDX(DT_NODELABEL(gpiob), 0))
#define GPIO_GPDRF (DT_REG_ADDR_BY_IDX(DT_NODELABEL(gpiof), 0))
#define GPIO_GPDRM (DT_REG_ADDR_BY_IDX(DT_NODELABEL(gpiom), 0))
#define GPCR_OFFSET 0x10
#define GPIO_DIR_INPUT 0x80
#define GPIO_DIR_OUTPUT 0x40
struct gpio_ite_wui {
volatile uint8_t *reg_addr;
volatile uint8_t *clear_addr;
volatile uint8_t *bothedge_addr;
uint32_t pin;
uint32_t irq;
};
static const struct gpio_ite_wui GPIO_GPDRB_wui[NUM_IO_MAX] = {
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(5), 106 }, /* gpb0, */
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(6), 107 }, /* gpb1, */
{ &WUEMR8, &WUESR8, &WUBEMR8, BIT(4), 92 }, /* gpb2, */
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(7), 108 }, /* gpb3, */
{ &WUEMR9, &WUESR9, &WUBEMR9, BIT(6), 99 }, /* gpb4, */
{ &WUEMR11, &WUESR11, &WUBEMR11, BIT(0), 109 }, /* gpb5, */
{ &WUEMR11, &WUESR11, &WUBEMR11, BIT(1), 110 }, /* gpb6, */
{ &WUEMR11, &WUESR11, &WUBEMR11, BIT(2), 111 }, /* gpb7, */
};
static const struct gpio_ite_wui GPIO_GPDRF_wui[NUM_IO_MAX] = {
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(0), 101 }, /* gpf0, */
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(1), 102 }, /* gpf1, */
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(2), 103 }, /* gpf2, */
{ &WUEMR10, &WUESR10, &WUBEMR10, BIT(3), 104 }, /* gpf3, */
{ &WUEMR6, &WUESR6, &WUBEMR6, BIT(4), 52 }, /* gpf4, */
{ &WUEMR6, &WUESR6, &WUBEMR6, BIT(5), 53 }, /* gpf5, */
{ &WUEMR6, &WUESR6, &WUBEMR6, BIT(6), 54 }, /* gpf6, */
{ &WUEMR6, &WUESR6, &WUBEMR6, BIT(7), 55 }, /* gpf7, */
};
/* struct gpio_ite_reg_table is record different gpio port's register set
* base_addr: base address of gpio set
* wui[]: wui register group
*/
struct gpio_ite_reg_table {
uint32_t base_addr;
const struct gpio_ite_wui *wui;
};
struct gpio_ite_reg_table gpiox_reg[CURR_SUPP_GPIO_SET] = {
{GPIO_GPDRB, GPIO_GPDRB_wui}, /* GPIO GROPU B */
{GPIO_GPDRF, GPIO_GPDRF_wui}, /* GPIO GROPU F */
};
/* edge/level trigger register */
static volatile uint8_t *const reg_ielmr[] = {
&IELMR0, &IELMR1, &IELMR2, &IELMR3,
&IELMR4, &IELMR5, &IELMR6, &IELMR7,
&IELMR8, &IELMR9, &IELMR10, &IELMR11,
&IELMR12, &IELMR13, &IELMR14, &IELMR15,
&IELMR16, &IELMR17, &IELMR18, &IELMR19,
&IELMR20
};
/* high/low trigger register */
static volatile uint8_t *const reg_ipolr[] = {
&IPOLR0, &IPOLR1, &IPOLR2, &IPOLR3,
&IPOLR4, &IPOLR5, &IPOLR6, &IPOLR7,
&IPOLR8, &IPOLR9, &IPOLR10, &IPOLR11,
&IPOLR12, &IPOLR13, &IPOLR14, &IPOLR15,
&IPOLR16, &IPOLR17, &IPOLR18, &IPOLR19,
&IPOLR20
};
#define GPCR_PORT_PIN_MODE_INPUT BIT(7)
#define GPCR_PORT_PIN_MODE_OUTPUT BIT(6)
#define GPCR_PORT_PIN_MODE_PULLUP BIT(2)
#define GPCR_PORT_PIN_MODE_PULLDOWN BIT(1)
/*
* Strcture gpio_ite_cfg is about the setting of gpio
* this config will be used at initial time
*/
struct gpio_ite_cfg {
uint32_t reg_addr; /* gpio register base address */
uint8_t gpio_irq[8]; /* gpio's irq */
/* gpio port data register (bit mapping to pin) */
uintptr_t reg_gpdr;
/* gpio port control register (byte mapping to pin) */
uintptr_t reg_gpcr;
/* 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;
uint8_t ngpios;
/* gpio's irq */
uint8_t gpio_irq[8];
};
/*
* Strcture gpio_ite_data is about callback function
*/
/* Strcture gpio_ite_data is about callback function */
struct gpio_ite_data {
struct gpio_driver_data common;
sys_slist_t callbacks;
uint32_t pin_callback_enables;
};
/* dev macros for GPIO */
@ -123,139 +53,308 @@ struct gpio_ite_data {
((const struct gpio_ite_cfg *)(dev)->config)
/**
* functions for bit / port access
* Convert wake-up controller (WUC) group to the corresponding wake-up edge
* sense register (WUESR). Return pointer to the register.
*
* @param grp WUC group.
*
* @return Pointer to corresponding WUESR register.
*/
static inline void set_bit(const struct gpio_ite_cfg *config,
uint8_t bit, bool val)
static volatile uint8_t *wuesr(uint8_t grp)
{
uint8_t regv, new_regv;
regv = ite_read(config->reg_addr, 1);
new_regv = (regv & ~BIT(bit)) | (val << bit);
ite_write(config->reg_addr, 1, new_regv);
/*
* From WUESR1-WUESR4, the address increases by ones. From WUESR5 on
* the address increases by fours.
*/
return (grp <= 4) ?
(volatile uint8_t *)(IT8XXX2_WUC_WUESR1 + grp-1) :
(volatile uint8_t *)(IT8XXX2_WUC_WUESR5 + 4*(grp-5));
}
static inline uint8_t get_bit(const struct gpio_ite_cfg *config, uint8_t bit)
/**
* Convert wake-up controller (WUC) group to the corresponding wake-up edge
* mode register (WUEMR). Return pointer to the register.
*
* @param grp WUC group.
*
* @return Pointer to corresponding WUEMR register.
*/
static volatile uint8_t *wuemr(uint8_t grp)
{
uint8_t regv = ite_read(config->reg_addr, 1);
return !!(regv & BIT(bit));
/*
* From WUEMR1-WUEMR4, the address increases by ones. From WUEMR5 on
* the address increases by fours.
*/
return (grp <= 4) ?
(volatile uint8_t *)(IT8XXX2_WUC_WUEMR1 + grp-1) :
(volatile uint8_t *)(IT8XXX2_WUC_WUEMR5 + 4*(grp-5));
}
static inline void set_port(const struct gpio_ite_cfg *config, uint8_t value)
/**
* Convert wake-up controller (WUC) group to the corresponding wake-up both edge
* mode register (WUBEMR). Return pointer to the register.
*
* @param grp WUC group.
*
* @return Pointer to corresponding WUBEMR register.
*/
static volatile uint8_t *wubemr(uint8_t grp)
{
ite_write(config->reg_addr, 1, value);
/*
* From WUBEMR1-WUBEMR4, the address increases by ones. From WUBEMR5 on
* the address increases by fours.
*/
return (grp <= 4) ?
(volatile uint8_t *)(IT8XXX2_WUC_WUBEMR1 + grp-1) :
(volatile uint8_t *)(IT8XXX2_WUC_WUBEMR5 + 4*(grp-5));
}
static inline uint8_t get_port(const struct gpio_ite_cfg *config)
{
uint8_t regv = ite_read(config->reg_addr, 1);
return regv;
}
/*
* Array to store the corresponding GPIO WUC group and mask
* for each WUC interrupt. This allows GPIO interrupts coming in through WUC
* to easily identify which pin caused the interrupt.
*/
static const struct {
uint8_t gpio_mask;
uint8_t wuc_group;
uint8_t wuc_mask;
} gpio_irqs[] = {
/* irq gpio_mask, wuc_group, wuc_mask */
[IT8XXX2_IRQ_WU20] = {BIT(0), 2, BIT(0)},
[IT8XXX2_IRQ_WU21] = {BIT(1), 2, BIT(1)},
[IT8XXX2_IRQ_WU22] = {BIT(4), 2, BIT(2)},
[IT8XXX2_IRQ_WU23] = {BIT(6), 2, BIT(3)},
[IT8XXX2_IRQ_WU24] = {BIT(2), 2, BIT(4)},
[IT8XXX2_IRQ_WU40] = {BIT(5), 4, BIT(0)},
[IT8XXX2_IRQ_WU45] = {BIT(6), 4, BIT(5)},
[IT8XXX2_IRQ_WU46] = {BIT(7), 4, BIT(6)},
[IT8XXX2_IRQ_WU50] = {BIT(0), 5, BIT(0)},
[IT8XXX2_IRQ_WU51] = {BIT(1), 5, BIT(1)},
[IT8XXX2_IRQ_WU52] = {BIT(2), 5, BIT(2)},
[IT8XXX2_IRQ_WU53] = {BIT(3), 5, BIT(3)},
[IT8XXX2_IRQ_WU54] = {BIT(4), 5, BIT(4)},
[IT8XXX2_IRQ_WU55] = {BIT(5), 5, BIT(5)},
[IT8XXX2_IRQ_WU56] = {BIT(6), 5, BIT(6)},
[IT8XXX2_IRQ_WU57] = {BIT(7), 5, BIT(7)},
[IT8XXX2_IRQ_WU60] = {BIT(0), 6, BIT(0)},
[IT8XXX2_IRQ_WU61] = {BIT(1), 6, BIT(1)},
[IT8XXX2_IRQ_WU62] = {BIT(2), 6, BIT(2)},
[IT8XXX2_IRQ_WU63] = {BIT(3), 6, BIT(3)},
[IT8XXX2_IRQ_WU64] = {BIT(4), 6, BIT(4)},
[IT8XXX2_IRQ_WU65] = {BIT(5), 6, BIT(5)},
[IT8XXX2_IRQ_WU65] = {BIT(6), 6, BIT(6)},
[IT8XXX2_IRQ_WU67] = {BIT(7), 6, BIT(7)},
[IT8XXX2_IRQ_WU70] = {BIT(0), 7, BIT(0)},
[IT8XXX2_IRQ_WU71] = {BIT(1), 7, BIT(1)},
[IT8XXX2_IRQ_WU72] = {BIT(2), 7, BIT(2)},
[IT8XXX2_IRQ_WU73] = {BIT(3), 7, BIT(3)},
[IT8XXX2_IRQ_WU74] = {BIT(4), 7, BIT(4)},
[IT8XXX2_IRQ_WU75] = {BIT(5), 7, BIT(5)},
[IT8XXX2_IRQ_WU76] = {BIT(6), 7, BIT(6)},
[IT8XXX2_IRQ_WU77] = {BIT(7), 7, BIT(7)},
[IT8XXX2_IRQ_WU80] = {BIT(3), 8, BIT(0)},
[IT8XXX2_IRQ_WU81] = {BIT(4), 8, BIT(1)},
[IT8XXX2_IRQ_WU82] = {BIT(5), 8, BIT(2)},
[IT8XXX2_IRQ_WU83] = {BIT(6), 8, BIT(3)},
[IT8XXX2_IRQ_WU84] = {BIT(2), 8, BIT(4)},
[IT8XXX2_IRQ_WU85] = {BIT(0), 8, BIT(5)},
[IT8XXX2_IRQ_WU86] = {BIT(7), 8, BIT(6)},
[IT8XXX2_IRQ_WU87] = {BIT(7), 8, BIT(7)},
[IT8XXX2_IRQ_WU88] = {BIT(4), 9, BIT(0)},
[IT8XXX2_IRQ_WU89] = {BIT(5), 9, BIT(1)},
[IT8XXX2_IRQ_WU90] = {BIT(6), 9, BIT(2)},
[IT8XXX2_IRQ_WU91] = {BIT(0), 9, BIT(3)},
[IT8XXX2_IRQ_WU92] = {BIT(1), 9, BIT(4)},
[IT8XXX2_IRQ_WU93] = {BIT(2), 9, BIT(5)},
[IT8XXX2_IRQ_WU94] = {BIT(4), 9, BIT(6)},
[IT8XXX2_IRQ_WU95] = {BIT(2), 9, BIT(7)},
[IT8XXX2_IRQ_WU96] = {BIT(0), 10, BIT(0)},
[IT8XXX2_IRQ_WU97] = {BIT(1), 10, BIT(1)},
[IT8XXX2_IRQ_WU98] = {BIT(2), 10, BIT(2)},
[IT8XXX2_IRQ_WU99] = {BIT(3), 10, BIT(3)},
[IT8XXX2_IRQ_WU100] = {BIT(7), 10, BIT(4)},
[IT8XXX2_IRQ_WU101] = {BIT(0), 10, BIT(5)},
[IT8XXX2_IRQ_WU102] = {BIT(1), 10, BIT(6)},
[IT8XXX2_IRQ_WU103] = {BIT(3), 10, BIT(7)},
[IT8XXX2_IRQ_WU104] = {BIT(5), 11, BIT(0)},
[IT8XXX2_IRQ_WU105] = {BIT(6), 11, BIT(1)},
[IT8XXX2_IRQ_WU106] = {BIT(7), 11, BIT(2)},
[IT8XXX2_IRQ_WU107] = {BIT(1), 11, BIT(3)},
[IT8XXX2_IRQ_WU108] = {BIT(3), 11, BIT(4)},
[IT8XXX2_IRQ_WU109] = {BIT(5), 11, BIT(5)},
[IT8XXX2_IRQ_WU110] = {BIT(3), 11, BIT(6)},
[IT8XXX2_IRQ_WU111] = {BIT(4), 11, BIT(7)},
[IT8XXX2_IRQ_WU112] = {BIT(5), 12, BIT(0)},
[IT8XXX2_IRQ_WU113] = {BIT(6), 12, BIT(1)},
[IT8XXX2_IRQ_WU114] = {BIT(4), 12, BIT(2)},
[IT8XXX2_IRQ_WU115] = {BIT(0), 12, BIT(3)},
[IT8XXX2_IRQ_WU116] = {BIT(1), 12, BIT(4)},
[IT8XXX2_IRQ_WU117] = {BIT(2), 12, BIT(5)},
[IT8XXX2_IRQ_WU118] = {BIT(6), 12, BIT(6)},
[IT8XXX2_IRQ_WU119] = {BIT(0), 12, BIT(7)},
[IT8XXX2_IRQ_WU120] = {BIT(1), 13, BIT(0)},
[IT8XXX2_IRQ_WU121] = {BIT(2), 13, BIT(1)},
[IT8XXX2_IRQ_WU122] = {BIT(3), 13, BIT(2)},
[IT8XXX2_IRQ_WU123] = {BIT(3), 13, BIT(3)},
[IT8XXX2_IRQ_WU124] = {BIT(4), 13, BIT(4)},
[IT8XXX2_IRQ_WU125] = {BIT(5), 13, BIT(5)},
[IT8XXX2_IRQ_WU126] = {BIT(7), 13, BIT(6)},
[IT8XXX2_IRQ_WU128] = {BIT(0), 14, BIT(0)},
[IT8XXX2_IRQ_WU129] = {BIT(1), 14, BIT(1)},
[IT8XXX2_IRQ_WU130] = {BIT(2), 14, BIT(2)},
[IT8XXX2_IRQ_WU131] = {BIT(3), 14, BIT(3)},
[IT8XXX2_IRQ_WU132] = {BIT(4), 14, BIT(4)},
[IT8XXX2_IRQ_WU133] = {BIT(5), 14, BIT(5)},
[IT8XXX2_IRQ_WU134] = {BIT(6), 14, BIT(6)},
[IT8XXX2_IRQ_WU135] = {BIT(7), 14, BIT(7)},
[IT8XXX2_IRQ_WU136] = {BIT(0), 15, BIT(0)},
[IT8XXX2_IRQ_WU137] = {BIT(1), 15, BIT(1)},
[IT8XXX2_IRQ_WU138] = {BIT(2), 15, BIT(2)},
[IT8XXX2_IRQ_WU139] = {BIT(3), 15, BIT(3)},
[IT8XXX2_IRQ_WU140] = {BIT(4), 15, BIT(4)},
[IT8XXX2_IRQ_WU141] = {BIT(5), 15, BIT(5)},
[IT8XXX2_IRQ_WU142] = {BIT(6), 15, BIT(6)},
[IT8XXX2_IRQ_WU143] = {BIT(7), 15, BIT(7)},
[IT8XXX2_IRQ_WU144] = {BIT(0), 16, BIT(0)},
[IT8XXX2_IRQ_WU145] = {BIT(1), 16, BIT(1)},
[IT8XXX2_IRQ_WU146] = {BIT(2), 16, BIT(2)},
[IT8XXX2_IRQ_WU147] = {BIT(3), 16, BIT(3)},
[IT8XXX2_IRQ_WU148] = {BIT(4), 16, BIT(4)},
[IT8XXX2_IRQ_WU149] = {BIT(5), 16, BIT(5)},
[IT8XXX2_IRQ_WU150] = {BIT(6), 16, BIT(6)},
[IT8XXX2_IRQ_COUNT] = { 0, 0, 0},
};
BUILD_ASSERT(ARRAY_SIZE(gpio_irqs) == IT8XXX2_IRQ_COUNT + 1);
/**
* Driver functions
*/
static int gpio_ite_configure(const struct device *dev,
gpio_pin_t pin, gpio_flags_t flags)
gpio_pin_t pin,
gpio_flags_t flags)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
unsigned int gpcr_offset = GPCR_OFFSET;
uint32_t gpcr_reg;
uint32_t gpcr_reg_addr;
/* counting the gpio control register's base address */
gpcr_reg = ((gpio_config->reg_addr & 0xff) - 1) * NUM_IO_MAX
+ gpcr_offset;
gpcr_reg_addr = gpcr_reg | (gpio_config->reg_addr & 0xffffff00);
if (!(flags & GPIO_SINGLE_ENDED)) {
/* Pin open-source/open-drain is not supported */
return -ENOTSUP;
}
if ((flags & GPIO_OUTPUT) && (flags & GPIO_INPUT)) {
/* Pin cannot be configured as input and output */
return -ENOTSUP;
} else if (!(flags & (GPIO_INPUT | GPIO_OUTPUT))) {
/* Pin has to be configuread as input or output */
return -ENOTSUP;
volatile uint8_t *reg_gpdr = (uint8_t *)gpio_config->reg_gpdr;
volatile uint8_t *reg_gpcr = (uint8_t *)(gpio_config->reg_gpcr + pin);
volatile uint8_t *reg_gpotr = (uint8_t *)gpio_config->reg_gpotr;
uint8_t mask = BIT(pin);
if (pin >= gpio_config->ngpios) {
printk("Invalid GPIO pin! (%s%d)\n", dev->name, pin);
return -EINVAL;
}
/*
* Select open drain first, so that we don't glitch the signal
* when changing the line to an output.
*/
if (flags & GPIO_OPEN_DRAIN)
*reg_gpotr |= mask;
else
*reg_gpotr &= ~mask;
/* If output, set level before changing type to an output. */
if (flags & GPIO_OUTPUT) {
if (flags & GPIO_OUTPUT_INIT_HIGH) {
set_bit(gpio_config, pin, GPIO_HIGH);
} else if (flags & GPIO_OUTPUT_INIT_LOW) {
set_bit(gpio_config, pin, GPIO_LOW);
}
ite_write(gpcr_reg_addr + pin, 1, GPIO_DIR_OUTPUT);
} else {
if ((flags & GPIO_PULL_DOWN) || (flags & GPIO_PULL_UP)) {
return -ENOTSUP;
}
ite_write(gpcr_reg_addr + pin, 1, GPIO_DIR_INPUT);
if (flags & GPIO_OUTPUT_INIT_HIGH)
*reg_gpdr |= mask;
else if (flags & GPIO_OUTPUT_INIT_LOW)
*reg_gpdr &= ~mask;
}
/* Set input or output. */
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 */
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_PULLUP |
GPCR_PORT_PIN_MODE_PULLDOWN);
}
/*
* TODO: There are some gpios are 1.8v input at default.
* Is there a configuration flag for 1.8/3.3v selection.
*/
return 0;
}
static int gpio_ite_port_get_raw(const struct device *dev,
gpio_port_value_t *value)
gpio_port_value_t *value)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
volatile uint8_t *reg_gpdmr = (uint8_t *)gpio_config->reg_gpdmr;
/* Get raw bits of GPIO mirror register */
*value = *reg_gpdmr;
*value = ite_read(gpio_config->reg_addr, 1);
return 0;
}
static int gpio_ite_port_set_masked_raw(const struct device *dev,
gpio_port_pins_t mask, gpio_port_value_t value)
gpio_port_pins_t mask,
gpio_port_value_t value)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
uint32_t port_val;
volatile uint8_t *reg_gpdr = (uint8_t *)gpio_config->reg_gpdr;
uint8_t out = *reg_gpdr;
*reg_gpdr = ((out & ~mask) | (value & mask));
port_val = get_port(gpio_config);
port_val = (port_val & ~mask) | (value & mask);
set_port(gpio_config, port_val);
return 0;
}
static int gpio_ite_port_set_bits_raw(const struct device *dev,
gpio_port_pins_t pins)
gpio_port_pins_t pins)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
uint32_t port_val;
volatile uint8_t *reg_gpdr = (uint8_t *)gpio_config->reg_gpdr;
/* Set raw bits of GPIO data register */
*reg_gpdr |= pins;
port_val = get_port(gpio_config);
port_val |= pins;
set_port(gpio_config, port_val);
return 0;
}
static int gpio_ite_port_clear_bits_raw(const struct device *dev,
gpio_port_pins_t pins)
gpio_port_pins_t pins)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
uint32_t port_val;
volatile uint8_t *reg_gpdr = (uint8_t *)gpio_config->reg_gpdr;
/* Clear raw bits of GPIO data register */
*reg_gpdr &= ~pins;
port_val = get_port(gpio_config);
port_val &= ~pins;
set_port(gpio_config, port_val);
return 0;
}
static int gpio_ite_port_toggle_bits(const struct device *dev,
gpio_port_pins_t pins)
gpio_port_pins_t pins)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
uint32_t port_val;
volatile uint8_t *reg_gpdr = (uint8_t *)gpio_config->reg_gpdr;
/* Toggle raw bits of GPIO data register */
*reg_gpdr ^= pins;
port_val = get_port(gpio_config);
port_val ^= pins;
set_port(gpio_config, port_val);
return 0;
}
static int gpio_ite_manage_callback(const struct device *dev,
struct gpio_callback *callback,
bool set)
struct gpio_callback *callback,
bool set)
{
struct gpio_ite_data *data = DEV_GPIO_DATA(dev);
@ -264,89 +363,63 @@ static int gpio_ite_manage_callback(const struct device *dev,
static void gpio_ite_isr(const void *arg)
{
int irq_index = 0;
int gpio_index = 0;
uint8_t irq = ite_intc_get_irq_num();
const struct device *dev = arg;
struct gpio_ite_wui *wui_local;
struct gpio_ite_reg_table *gpio_tab_local = NULL;
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
struct gpio_ite_data *data = DEV_GPIO_DATA(dev);
uint8_t gpio_mask = gpio_irqs[irq].gpio_mask;
for (gpio_index = 0; gpio_index < CURR_SUPP_GPIO_SET; gpio_index++) {
if (gpio_config->reg_addr == gpiox_reg[gpio_index].base_addr) {
gpio_tab_local = &gpiox_reg[gpio_index];
}
}
for (irq_index = 0; irq_index < NUM_IO_MAX; irq_index++) {
wui_local = (struct gpio_ite_wui *)&
gpio_tab_local->wui[irq_index];
if ((*wui_local->clear_addr)&wui_local->pin) {
SET_MASK(*wui_local->clear_addr, wui_local->pin);
gpio_fire_callbacks(&data->callbacks, dev,
BIT(wui_local->pin));
}
if (gpio_irqs[irq].wuc_group) {
/* Clear the WUC status register. */
*(wuesr(gpio_irqs[irq].wuc_group)) = gpio_irqs[irq].wuc_mask;
gpio_fire_callbacks(&data->callbacks, dev, gpio_mask);
}
}
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)
gpio_pin_t pin,
enum gpio_int_mode mode,
enum gpio_int_trig trig)
{
int ret = 0;
int gpio_index = 0;
uint32_t g, i;
uint8_t both_tri_en = 0;
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
struct gpio_ite_wui *wui_local;
volatile uint8_t *trig_mode;
volatile uint8_t *hl_trig;
uint8_t gpio_irq = gpio_config->gpio_irq[pin];
g = gpio_config->gpio_irq[pin] / NUM_IO_MAX;
i = gpio_config->gpio_irq[pin] % NUM_IO_MAX;
trig_mode = reg_ielmr[g];
hl_trig = reg_ipolr[g];
if (mode & GPIO_INT_MODE_DISABLED) {
/* Disables interrupt for a pin. */
ite_intc_irq_disable(gpio_config->gpio_irq[pin]);
return ret;
} else if (mode & GPIO_INT_MODE_EDGE) {
/* edge trigger */
SET_MASK(*trig_mode, BIT(i));
} else {
/* level trigger */
CLEAR_MASK(*trig_mode, BIT(i));
}
/* both */
if ((trig & GPIO_INT_TRIG_LOW) && (trig & GPIO_INT_TRIG_HIGH)) {
both_tri_en = 1;
} else {
if (trig & GPIO_INT_TRIG_LOW) {
SET_MASK(*hl_trig, BIT(i));
} else if (trig & GPIO_INT_TRIG_HIGH) {
CLEAR_MASK(*hl_trig, BIT(i));
}
if (mode == GPIO_INT_MODE_DISABLED) {
/* Disable GPIO interrupt */
irq_disable(gpio_irq);
return 0;
}
/* set wui , only gpiob gpiof, currently */
for (gpio_index = 0; gpio_index < CURR_SUPP_GPIO_SET; gpio_index++) {
if (gpio_config->reg_addr ==
gpiox_reg[gpio_index].base_addr) {
wui_local = (struct gpio_ite_wui *)
&(gpiox_reg[gpio_index].wui[pin]);
SET_MASK(*wui_local->reg_addr, wui_local->pin);
SET_MASK(*wui_local->clear_addr, wui_local->pin);
if (both_tri_en == 1) {
SET_MASK(*wui_local->reg_addr, wui_local->pin);
}
}
if (mode == GPIO_INT_MODE_LEVEL) {
printk("Level trigger mode not supported.\r\n");
return -ENOTSUP;
}
/* Enable IRQ */
ret = irq_connect_dynamic(
gpio_config->gpio_irq[pin], 0, gpio_ite_isr, dev, 0);
ite_intc_irq_enable(gpio_config->gpio_irq[pin]);
return ret;
if (trig & GPIO_INT_TRIG_BOTH) {
uint8_t wuc_group = gpio_irqs[gpio_irq].wuc_group;
uint8_t wuc_mask = gpio_irqs[gpio_irq].wuc_mask;
/* Set both edges interrupt. */
if ((trig & GPIO_INT_TRIG_BOTH) == GPIO_INT_TRIG_BOTH)
*(wubemr(wuc_group)) |= wuc_mask;
else
*(wubemr(wuc_group)) &= ~wuc_mask;
if (trig & GPIO_INT_TRIG_LOW)
*(wuemr(wuc_group)) |= wuc_mask;
else
*(wuemr(wuc_group)) &= ~wuc_mask;
/*
* Always write 1 to clear the WUC status register after
* modifying edge mode selection register (WUBEMR and WUEMR).
*/
*(wuesr(wuc_group)) = wuc_mask;
}
/* Enable GPIO interrupt */
irq_connect_dynamic(gpio_irq, 0, gpio_ite_isr, dev, 0);
irq_enable(gpio_irq);
return 0;
}
static const struct gpio_driver_api gpio_ite_driver_api = {
@ -362,34 +435,33 @@ static const struct gpio_driver_api gpio_ite_driver_api = {
static int gpio_ite_init(const struct device *dev)
{
const struct gpio_ite_cfg *gpio_config = DEV_GPIO_CFG(dev);
int i;
for (i = 0; i < NUM_IO_MAX; i++) {
/* init disable intc */
ite_intc_irq_disable(gpio_config->gpio_irq[i]);
}
return 0;
}
#define GPIO_ITE_DEV_CFG_DATA(n, idx) \
static struct gpio_ite_data gpio_ite_data_##n##_##idx; \
static const struct gpio_ite_cfg gpio_ite_cfg_##n##_##idx = { \
.reg_addr = DT_INST_REG_ADDR(idx),\
.gpio_irq[0] = DT_INST_IRQ_BY_IDX(idx, 0, irq), \
}; \
DEVICE_DT_DEFINE(DT_NODELABEL(n), \
gpio_ite_init, \
device_pm_control_nop, \
&gpio_ite_data_##n##_##idx, \
&gpio_ite_cfg_##n##_##idx, \
POST_KERNEL, \
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
&gpio_ite_driver_api)
#if DT_NODE_HAS_STATUS(DT_NODELABEL(gpiob), okay)
GPIO_ITE_DEV_CFG_DATA(gpiob, 0);
#endif /* gpiob */
#if DT_NODE_HAS_STATUS(DT_NODELABEL(gpiof), okay)
GPIO_ITE_DEV_CFG_DATA(gpiof, 1);
#endif /* gpiof */
#define GPIO_ITE_DEV_CFG_DATA(inst) \
static struct gpio_ite_data gpio_ite_data_##inst; \
static const struct gpio_ite_cfg gpio_ite_cfg_##inst = { \
.reg_gpdr = DT_INST_REG_ADDR_BY_IDX(inst, 0), \
.reg_gpcr = DT_INST_REG_ADDR_BY_IDX(inst, 1), \
.reg_gpdmr = DT_INST_REG_ADDR_BY_IDX(inst, 2), \
.reg_gpotr = DT_INST_REG_ADDR_BY_IDX(inst, 3), \
.ngpios = DT_PROP(DT_INST(inst, ite_it8xxx2_gpio), ngpios),\
.gpio_irq[0] = DT_INST_IRQ_BY_IDX(inst, 0, irq), \
.gpio_irq[1] = DT_INST_IRQ_BY_IDX(inst, 1, irq), \
.gpio_irq[2] = DT_INST_IRQ_BY_IDX(inst, 2, irq), \
.gpio_irq[3] = DT_INST_IRQ_BY_IDX(inst, 3, irq), \
.gpio_irq[4] = DT_INST_IRQ_BY_IDX(inst, 4, irq), \
.gpio_irq[5] = DT_INST_IRQ_BY_IDX(inst, 5, irq), \
.gpio_irq[6] = DT_INST_IRQ_BY_IDX(inst, 6, irq), \
.gpio_irq[7] = DT_INST_IRQ_BY_IDX(inst, 7, irq), \
}; \
DEVICE_DT_INST_DEFINE(inst, \
gpio_ite_init, \
device_pm_control_nop, \
&gpio_ite_data_##inst, \
&gpio_ite_cfg_##inst, \
POST_KERNEL, \
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
&gpio_ite_driver_api);
DT_INST_FOREACH_STATUS_OKAY(GPIO_ITE_DEV_CFG_DATA)

View file

@ -15,22 +15,25 @@
#define IVECT_OFFSET_WITH_IRQ 0x10
#define SOFT_INTC_IRQ 161 /* software interrupt */
static volatile uint8_t *const reg_status[MAX_ISR_REG_NUM] = {
/* Interrupt number of INTC module */
static uint8_t intc_irq;
static volatile uint8_t *const reg_status[] = {
&ISR0, &ISR1, &ISR2, &ISR3,
&ISR4, &ISR5, &ISR6, &ISR7,
&ISR8, &ISR9, &ISR10, &ISR11,
&ISR12, &ISR13, &ISR14, &ISR15,
&ISR16, &ISR17, &ISR18, &ISR19,
&ISR20
&ISR20, &ISR21, &ISR22, &ISR23
};
static volatile uint8_t *const reg_enable[MAX_ISR_REG_NUM] = {
static volatile uint8_t *const reg_enable[] = {
&IER0, &IER1, &IER2, &IER3,
&IER4, &IER5, &IER6, &IER7,
&IER8, &IER9, &IER10, &IER11,
&IER12, &IER13, &IER14, &IER15,
&IER16, &IER17, &IER18, &IER19,
&IER20
&IER20, &IER21, &IER22, &IER23
};
/* edge/level trigger register */
@ -40,7 +43,7 @@ static volatile uint8_t *const reg_ielmr[] = {
&IELMR8, &IELMR9, &IELMR10, &IELMR11,
&IELMR12, &IELMR13, &IELMR14, &IELMR15,
&IELMR16, &IELMR17, &IELMR18, &IELMR19,
&IELMR20
&IELMR20, &IELMR21, &IELMR22, &IELMR23,
};
/* high/low trigger register */
@ -50,7 +53,7 @@ static volatile uint8_t *const reg_ipolr[] = {
&IPOLR8, &IPOLR9, &IPOLR10, &IPOLR11,
&IPOLR12, &IPOLR13, &IPOLR14, &IPOLR15,
&IPOLR16, &IPOLR17, &IPOLR18, &IPOLR19,
&IPOLR20
&IPOLR20, &IPOLR21, &IPOLR22, &IPOLR23
};
inline void set_csr(unsigned long bit)
@ -147,16 +150,20 @@ int ite_intc_irq_is_enable(unsigned int irq)
return IS_MASK_SET(*en, BIT(i));
}
uint8_t ite_intc_get_irq_num(void)
{
return intc_irq;
}
void ite_intc_irq_handler(const void *arg)
{
ARG_UNUSED(arg);
uint8_t irq = IVECT1 - IVECT_OFFSET_WITH_IRQ;
struct _isr_table_entry *ite;
struct _isr_table_entry *ite;
/* software interrupt isr*/
if ((irq < CONFIG_NUM_IRQS) && (irq > 0)) {
ite = (struct _isr_table_entry *)&_sw_isr_table[irq];
ite_intc_isr_clear(irq);
if ((intc_irq < CONFIG_NUM_IRQS) && (intc_irq > 0)) {
ite = (struct _isr_table_entry *)&_sw_isr_table[intc_irq];
ite_intc_isr_clear(intc_irq);
ite->isr(ite->arg);
} else {
z_irq_spurious(NULL);
@ -166,10 +173,10 @@ void ite_intc_irq_handler(const void *arg)
uint8_t get_irq(void *arg)
{
ARG_UNUSED(arg);
uint8_t irq = IVECT1 - IVECT_OFFSET_WITH_IRQ;
intc_irq = IVECT - IVECT_OFFSET_WITH_IRQ;
ite_intc_isr_clear(irq);
return irq;
ite_intc_isr_clear(intc_irq);
return intc_irq;
}
static int ite_intc_init(const struct device *dev)
@ -178,6 +185,10 @@ static int ite_intc_init(const struct device *dev)
ite_intc_irq_enable(SOFT_INTC_IRQ);
irq_unlock(0);
/* Ensure interrupts of soc are disabled at default */
for (int i = 0; i < ARRAY_SIZE(reg_enable); i++)
*reg_enable[i] = 0;
/* GIE enable */
set_csr(MIP_MEIP);
return 0;

View file

@ -3,10 +3,10 @@
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef INTC_ITE_IT8XXX2
#define INTC_ITE_IT8XXX2
#ifndef ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_ITE_IT8XXX2_H_
#define ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_ITE_IT8XXX2_H_
#include <dt-bindings/irq.h>
#include <dt-bindings/interrupt-controller/ite-intc.h>
#include <soc.h>
#endif /* INTC_ITE_IT8XXX2 */
#endif /* ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_ITE_IT8XXX2_H_ */

View file

@ -6,7 +6,7 @@
*/
#include <mem.h>
#include <dt-bindings/irq.h>
#include <dt-bindings/interrupt-controller/ite-intc.h>
#include <dt-bindings/i2c/i2c.h>
/ {
@ -89,52 +89,280 @@
80 IRQ_TYPE_EDGE_RISING>;
interrupt-parent = <&intc>;
};
gpioa: gpio@f01601 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01601 1 /* GPDR (set) */
0x00f01610 8 /* GPCR */
0x00f01661 1 /* GPDMR (get) */
0x00f01671 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_A";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU91 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU92 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU93 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU80 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU81 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU82 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU83 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU100 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiob: gpio@f01602 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01602 0x0001>;
reg = <0x00f01602 1 /* GPDR (set) */
0x00f01618 8 /* GPCR */
0x00f01662 1 /* GPDMR (get) */
0x00f01672 1>; /* GPOTR */
ngpios = <8>;
label = "GPDRB";
status = "disabled";
label = "GPIO_B";
gpio-controller;
interrupts = <106 IRQ_TYPE_LEVEL_HIGH
107 IRQ_TYPE_LEVEL_HIGH
92 IRQ_TYPE_LEVEL_HIGH
108 IRQ_TYPE_LEVEL_HIGH
99 IRQ_TYPE_LEVEL_HIGH
109 IRQ_TYPE_LEVEL_HIGH
110 IRQ_TYPE_LEVEL_HIGH
111 IRQ_TYPE_LEVEL_HIGH>;
interrupts = <IT8XXX2_IRQ_WU101 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU102 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU84 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU103 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU94 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU104 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU105 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU106 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpioc: gpio@f01603 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01603 1 /* GPDR (set) */
0x00f01620 8 /* GPCR */
0x00f01663 1 /* GPDMR (get) */
0x00f01673 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_C";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU85 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU107 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU95 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU108 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU22 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU109 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU23 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU86 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiod: gpio@f01604 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01604 1 /* GPDR (set) */
0x00f01628 8 /* GPCR */
0x00f01664 1 /* GPDMR (get) */
0x00f01674 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_D";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU20 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU21 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU24 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU110 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU111 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU112 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU113 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU87 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpioe: gpio@f01605 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01605 1 /* GPDR (set) */
0x00f01630 8 /* GPCR */
0x00f01665 1 /* GPDMR (get) */
0x00f01675 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_E";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU70 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU71 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU72 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU73 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU114 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU40 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU45 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU46 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiof: gpio@f01606 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01606 0x0001>;
reg = <0x00f01606 1 /* GPDR (set) */
0x00f01638 8 /* GPCR */
0x00f01666 1 /* GPDMR (get) */
0x00f01676 1>; /* GPOTR */
ngpios = <8>;
label = "GPDRF";
status = "disabled";
label = "GPIO_F";
gpio-controller;
interrupts = <101 IRQ_TYPE_LEVEL_HIGH
102 IRQ_TYPE_LEVEL_HIGH
103 IRQ_TYPE_LEVEL_HIGH
104 IRQ_TYPE_LEVEL_HIGH
52 IRQ_TYPE_LEVEL_HIGH
53 IRQ_TYPE_LEVEL_HIGH
54 IRQ_TYPE_LEVEL_HIGH
55 IRQ_TYPE_LEVEL_HIGH>;
interrupts = <IT8XXX2_IRQ_WU96 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU97 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU98 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU99 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU64 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU65 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU66 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU67 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiom: gpio@f0160D {
gpiog: gpio@f01607 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f0160D 0x0001>;
reg = <0x00f01607 1 /* GPDR (set) */
0x00f01640 8 /* GPCR */
0x00f01667 1 /* GPDMR (get) */
0x00f01677 1>; /* GPOTR */
ngpios = <8>;
label = "GPDRM";
status = "disabled";
label = "GPIO_G";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU115 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU116 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU117 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU123 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU124 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU125 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU118 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU126 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpioh: gpio@f01608 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01608 1 /* GPDR (set) */
0x00f01648 8 /* GPCR */
0x00f01668 1 /* GPDMR (get) */
0x00f01678 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_H";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU60 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU61 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU62 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU63 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU88 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU89 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU90 IRQ_TYPE_LEVEL_HIGH
0 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpioi: gpio@f01609 {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f01609 1 /* GPDR (set) */
0x00f01650 8 /* GPCR */
0x00f01669 1 /* GPDMR (get) */
0x00f01679 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_I";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU119 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU120 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU121 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU122 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU74 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU75 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU76 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU77 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpioj: gpio@f0160a {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f0160a 1 /* GPDR (set) */
0x00f01658 8 /* GPCR */
0x00f0166a 1 /* GPDMR (get) */
0x00f0167a 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_J";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU128 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU129 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU130 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU131 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU132 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU133 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU134 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU135 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiok: gpio@f0160b {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f0160b 1 /* GPDR (set) */
0x00f01690 8 /* GPCR */
0x00f0166b 1 /* GPDMR (get) */
0x00f0167b 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_K";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU50 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU51 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU52 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU53 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU54 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU55 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU56 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU57 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiol: gpio@f0160c {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f0160c 1 /* GPDR (set) */
0x00f01698 8 /* GPCR */
0x00f0166c 1 /* GPDMR (get) */
0x00f0167c 1>; /* GPOTR */
ngpios = <8>;
label = "GPIO_L";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU136 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU137 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU138 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU139 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU140 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU141 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU142 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU143 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
gpiom: gpio@f0160d {
compatible = "ite,it8xxx2-gpio";
reg = <0x00f0160d 1 /* GPDR (set) */
0x00f016a0 8 /* GPCR */
0x00f0166d 1 /* GPDMR (get) */
0x00f0167d 1>; /* GPOTR */
ngpios = <7>;
label = "GPIO_M";
gpio-controller;
interrupts = <IT8XXX2_IRQ_WU144 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU145 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU146 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU147 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU148 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU149 IRQ_TYPE_LEVEL_HIGH
IT8XXX2_IRQ_WU150 IRQ_TYPE_LEVEL_HIGH
0 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
#gpio-cells = <2>;
};
spi0:spi@f02600 {
#address-cells = <1>;
#size-cells = <0>;

View file

@ -0,0 +1,142 @@
/*
* Copyright (c) 2020 ITE Corporation. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_INTERRUPT_CONTROLLER_ITE_INTC_H_
#define ZEPHYR_INCLUDE_DT_BINDINGS_INTERRUPT_CONTROLLER_ITE_INTC_H_
#define IRQ_TYPE_NONE 0
#define IRQ_TYPE_EDGE_RISING 1
#define IRQ_TYPE_EDGE_FALLING 2
#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
#define IRQ_TYPE_LEVEL_HIGH 4
#define IRQ_TYPE_LEVEL_LOW 8
/* IRQ numbers of WUC */
/* Group 0 of INTC */
#define IT8XXX2_IRQ_WU20 1
#define IT8XXX2_IRQ_WU23 6
/* Group 1 */
#define IT8XXX2_IRQ_WU26 12
#define IT8XXX2_IRQ_WU25 14
/* Group 2 */
#define IT8XXX2_IRQ_WU24 17
#define IT8XXX2_IRQ_WU22 21
/* Group 3 */
#define IT8XXX2_IRQ_WU21 31
/* Group 5 */
#define IT8XXX2_IRQ_WU50 40
#define IT8XXX2_IRQ_WU51 41
#define IT8XXX2_IRQ_WU52 42
#define IT8XXX2_IRQ_WU53 43
#define IT8XXX2_IRQ_WU54 44
#define IT8XXX2_IRQ_WU55 45
#define IT8XXX2_IRQ_WU56 46
#define IT8XXX2_IRQ_WU57 47
/* Group 6 */
#define IT8XXX2_IRQ_WU60 48
#define IT8XXX2_IRQ_WU61 49
#define IT8XXX2_IRQ_WU62 50
#define IT8XXX2_IRQ_WU63 51
#define IT8XXX2_IRQ_WU64 52
#define IT8XXX2_IRQ_WU65 53
#define IT8XXX2_IRQ_WU66 54
#define IT8XXX2_IRQ_WU67 55
/* Group 9 */
#define IT8XXX2_IRQ_WU70 72
#define IT8XXX2_IRQ_WU71 73
#define IT8XXX2_IRQ_WU72 74
#define IT8XXX2_IRQ_WU73 75
#define IT8XXX2_IRQ_WU74 76
#define IT8XXX2_IRQ_WU75 77
#define IT8XXX2_IRQ_WU76 78
#define IT8XXX2_IRQ_WU77 79
/* Group 10 */
#define IT8XXX2_IRQ_WU88 85
#define IT8XXX2_IRQ_WU89 86
#define IT8XXX2_IRQ_WU90 87
/* Group 11 */
#define IT8XXX2_IRQ_WU80 88
#define IT8XXX2_IRQ_WU81 89
#define IT8XXX2_IRQ_WU82 90
#define IT8XXX2_IRQ_WU83 91
#define IT8XXX2_IRQ_WU84 92
#define IT8XXX2_IRQ_WU85 93
#define IT8XXX2_IRQ_WU86 94
#define IT8XXX2_IRQ_WU87 95
/* Group 12 */
#define IT8XXX2_IRQ_WU91 96
#define IT8XXX2_IRQ_WU92 97
#define IT8XXX2_IRQ_WU93 98
#define IT8XXX2_IRQ_WU94 99
#define IT8XXX2_IRQ_WU95 100
#define IT8XXX2_IRQ_WU96 101
#define IT8XXX2_IRQ_WU97 102
#define IT8XXX2_IRQ_WU98 103
/* Group 13 */
#define IT8XXX2_IRQ_WU99 104
#define IT8XXX2_IRQ_WU100 105
#define IT8XXX2_IRQ_WU101 106
#define IT8XXX2_IRQ_WU102 107
#define IT8XXX2_IRQ_WU103 108
#define IT8XXX2_IRQ_WU104 109
#define IT8XXX2_IRQ_WU105 110
#define IT8XXX2_IRQ_WU106 111
/* Group 14 */
#define IT8XXX2_IRQ_WU107 112
#define IT8XXX2_IRQ_WU108 113
#define IT8XXX2_IRQ_WU109 114
#define IT8XXX2_IRQ_WU110 115
#define IT8XXX2_IRQ_WU111 116
#define IT8XXX2_IRQ_WU112 117
#define IT8XXX2_IRQ_WU113 118
#define IT8XXX2_IRQ_WU114 119
/* Group 15 */
#define IT8XXX2_IRQ_WU115 120
#define IT8XXX2_IRQ_WU116 121
#define IT8XXX2_IRQ_WU117 122
#define IT8XXX2_IRQ_WU118 123
#define IT8XXX2_IRQ_WU119 124
#define IT8XXX2_IRQ_WU120 125
#define IT8XXX2_IRQ_WU121 126
#define IT8XXX2_IRQ_WU122 127
/* Group 16 */
#define IT8XXX2_IRQ_WU128 128
#define IT8XXX2_IRQ_WU129 129
#define IT8XXX2_IRQ_WU130 130
#define IT8XXX2_IRQ_WU131 131
#define IT8XXX2_IRQ_WU132 132
#define IT8XXX2_IRQ_WU133 133
#define IT8XXX2_IRQ_WU134 134
#define IT8XXX2_IRQ_WU135 135
/* Group 17 */
#define IT8XXX2_IRQ_WU136 136
#define IT8XXX2_IRQ_WU137 137
#define IT8XXX2_IRQ_WU138 138
#define IT8XXX2_IRQ_WU139 139
#define IT8XXX2_IRQ_WU140 140
#define IT8XXX2_IRQ_WU141 141
#define IT8XXX2_IRQ_WU142 142
#define IT8XXX2_IRQ_WU143 143
/* Group 18 */
#define IT8XXX2_IRQ_WU123 144
#define IT8XXX2_IRQ_WU124 145
#define IT8XXX2_IRQ_WU125 146
#define IT8XXX2_IRQ_WU126 147
/* Group 22 */
#define IT8XXX2_IRQ_WU40 176
#define IT8XXX2_IRQ_WU45 177
#define IT8XXX2_IRQ_WU46 178
#define IT8XXX2_IRQ_WU144 179
#define IT8XXX2_IRQ_WU145 180
#define IT8XXX2_IRQ_WU146 181
#define IT8XXX2_IRQ_WU147 182
#define IT8XXX2_IRQ_WU148 183
/* Group 23 */
#define IT8XXX2_IRQ_WU149 184
#define IT8XXX2_IRQ_WU150 185
#define IT8XXX2_IRQ_COUNT (CONFIG_NUM_IRQS + 1)
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_INTERRUPT_CONTROLLER_ITE_INTC_H_ */

View file

@ -1,16 +0,0 @@
/*
* Copyright (c) 2020 ITE Corporation. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __DT_BINDING_IRQ_H
#define __DT_BINDING_IRQ_H
#define IRQ_TYPE_NONE 0
#define IRQ_TYPE_EDGE_RISING 1
#define IRQ_TYPE_EDGE_FALLING 2
#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
#define IRQ_TYPE_LEVEL_HIGH 4
#define IRQ_TYPE_LEVEL_LOW 8
#endif

View file

@ -1,4 +1,4 @@
/*
/*
* Copyright (c) 2020 ITE Corporation. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
@ -297,7 +297,6 @@
* (11xxh) Interrupt controller (INTC)
*
*/
#define MAX_ISR_REG_NUM 24
#define ISR0 ECREG(EC_REG_BASE_ADDR + 0x3F00)
#define ISR1 ECREG(EC_REG_BASE_ADDR + 0x3F01)
#define ISR2 ECREG(EC_REG_BASE_ADDR + 0x3F02)
@ -319,6 +318,9 @@
#define ISR18 ECREG(EC_REG_BASE_ADDR + 0x3F4C)
#define ISR19 ECREG(EC_REG_BASE_ADDR + 0x3F50)
#define ISR20 ECREG(EC_REG_BASE_ADDR + 0x3F54)
#define ISR21 ECREG(EC_REG_BASE_ADDR + 0x3F58)
#define ISR22 ECREG(EC_REG_BASE_ADDR + 0x3F5C)
#define ISR23 ECREG(EC_REG_BASE_ADDR + 0x3F90)
#define IER0 ECREG(EC_REG_BASE_ADDR + 0x3F04)
#define IER1 ECREG(EC_REG_BASE_ADDR + 0x3F05)
@ -341,6 +343,9 @@
#define IER18 ECREG(EC_REG_BASE_ADDR + 0x3F4D)
#define IER19 ECREG(EC_REG_BASE_ADDR + 0x3F51)
#define IER20 ECREG(EC_REG_BASE_ADDR + 0x3F55)
#define IER21 ECREG(EC_REG_BASE_ADDR + 0x3F59)
#define IER22 ECREG(EC_REG_BASE_ADDR + 0x3F5D)
#define IER23 ECREG(EC_REG_BASE_ADDR + 0x3F91)
#define IELMR0 ECREG(EC_REG_BASE_ADDR + 0x3F08)
#define IELMR1 ECREG(EC_REG_BASE_ADDR + 0x3F09)
@ -363,6 +368,9 @@
#define IELMR18 ECREG(EC_REG_BASE_ADDR + 0x3F4E)
#define IELMR19 ECREG(EC_REG_BASE_ADDR + 0x3F52)
#define IELMR20 ECREG(EC_REG_BASE_ADDR + 0x3F56)
#define IELMR21 ECREG(EC_REG_BASE_ADDR + 0x3F5A)
#define IELMR22 ECREG(EC_REG_BASE_ADDR + 0x3F5E)
#define IELMR23 ECREG(EC_REG_BASE_ADDR + 0x3F92)
#define IPOLR0 ECREG(EC_REG_BASE_ADDR + 0x3F0C)
#define IPOLR1 ECREG(EC_REG_BASE_ADDR + 0x3F0D)
@ -385,217 +393,11 @@
#define IPOLR18 ECREG(EC_REG_BASE_ADDR + 0x3F4F)
#define IPOLR19 ECREG(EC_REG_BASE_ADDR + 0x3F53)
#define IPOLR20 ECREG(EC_REG_BASE_ADDR + 0x3F57)
#define IPOLR21 ECREG(EC_REG_BASE_ADDR + 0x3F5B)
#define IPOLR22 ECREG(EC_REG_BASE_ADDR + 0x3F5F)
#define IPOLR23 ECREG(EC_REG_BASE_ADDR + 0x3F93)
#define IVECT0 ECREG(EC_REG_BASE_ADDR + 0x3F80)
#define IVECT1 ECREG(EC_REG_BASE_ADDR + 0x3F81)
#define IVECT2 ECREG(EC_REG_BASE_ADDR + 0x3F82)
#define IVECT3 ECREG(EC_REG_BASE_ADDR + 0x3F83)
#define IVECT4 ECREG(EC_REG_BASE_ADDR + 0x3F84)
#define IVECT5 ECREG(EC_REG_BASE_ADDR + 0x3F85)
#define IVECT6 ECREG(EC_REG_BASE_ADDR + 0x3F86)
#define IVECT7 ECREG(EC_REG_BASE_ADDR + 0x3F87)
#define IVECT8 ECREG(EC_REG_BASE_ADDR + 0x3F88)
#define IVECT9 ECREG(EC_REG_BASE_ADDR + 0x3F89)
#define IVECT10 ECREG(EC_REG_BASE_ADDR + 0x3F8A)
#define IVECT11 ECREG(EC_REG_BASE_ADDR + 0x3F8B)
#define IVECT12 ECREG(EC_REG_BASE_ADDR + 0x3F8C)
#define IVECT13 ECREG(EC_REG_BASE_ADDR + 0x3F8D)
#define IVECT14 ECREG(EC_REG_BASE_ADDR + 0x3F8E)
#define IVECT15 ECREG(EC_REG_BASE_ADDR + 0x3F8F)
#define IVECT ECREG(EC_REG_BASE_ADDR + 0x3F10)
#define INT0ST ECREG(EC_REG_BASE_ADDR + 0x3F11)
#define PFAILR ECREG(EC_REG_BASE_ADDR + 0x3F12)
#define IGER0 ECREG(EC_REG_BASE_ADDR + 0x3F60)
#define IGER1 ECREG(EC_REG_BASE_ADDR + 0x3F61)
#define IGER2 ECREG(EC_REG_BASE_ADDR + 0x3F62)
#define IGER3 ECREG(EC_REG_BASE_ADDR + 0x3F63)
#define IGER4 ECREG(EC_REG_BASE_ADDR + 0x3F64)
#define IGER5 ECREG(EC_REG_BASE_ADDR + 0x3F65)
#define IGER6 ECREG(EC_REG_BASE_ADDR + 0x3F66)
#define IGER7 ECREG(EC_REG_BASE_ADDR + 0x3F67)
#define IGER8 ECREG(EC_REG_BASE_ADDR + 0x3F68)
#define IGER9 ECREG(EC_REG_BASE_ADDR + 0x3F69)
#define IGER10 ECREG(EC_REG_BASE_ADDR + 0x3F6A)
#define IGER11 ECREG(EC_REG_BASE_ADDR + 0x3F6B)
#define IGER12 ECREG(EC_REG_BASE_ADDR + 0x3F6C)
#define IGER13 ECREG(EC_REG_BASE_ADDR + 0x3F6D)
#define IGER14 ECREG(EC_REG_BASE_ADDR + 0x3F6E)
#define IGER15 ECREG(EC_REG_BASE_ADDR + 0x3F6F)
#define IGER16 ECREG(EC_REG_BASE_ADDR + 0x3F70)
#define IGER17 ECREG(EC_REG_BASE_ADDR + 0x3F71)
#define IGER18 ECREG(EC_REG_BASE_ADDR + 0x3F72)
#define IGER19 ECREG(EC_REG_BASE_ADDR + 0x3F73)
#define IGER20 ECREG(EC_REG_BASE_ADDR + 0x3F74)
/* IER0 */
#define INT_WKO20 BIT(1)
#define INT_KBCOBFE BIT(2)
#define INT_PMCOBFE BIT(3)
#define INT_SMBUS3 BIT(4)
#define INT_WKINTAD BIT(5)
#define INT_WKO23 BIT(6)
#define INT_PWM BIT(7)
/* IER1 */
#define INT_ADC BIT(0)
#define INT_SMBUS0 BIT(1)
#define INT_SMBUS1 BIT(2)
#define INT_KB BIT(3)
#define INT_WKO26 BIT(4)
#define INT_WKINTC BIT(5)
#define INT_WKO25 BIT(6)
#define INT_CIR BIT(7)
/* IER2 */
#define INT_SMBUS2 BIT(0)
#define INT_WKO24 BIT(1)
#define INT_PS2_2 BIT(2)
#define INT_PS2_1 BIT(3)
#define INT_PS2_0 BIT(4)
#define INT_WKO22 BIT(5)
#define SMFIS BIT(6)
/* IER3 */
#define INT_KBCIBF BIT(0)
#define INT_PMCIBF BIT(1)
#define INT_PMC2OBE BIT(2)
#define INT_PMC2IBF BIT(3)
#define INT_GINT BIT(4)
#define INT_EGPC BIT(5)
#define INT_EXTIMER BIT(6)
#define INT_WKO21 BIT(7)
/* IER4 */
#define INT_GPINT0 BIT(0)
#define INT_GPINT1 BIT(1)
#define INT_GPINT2 BIT(2)
#define INT_GPINT3 BIT(3)
#define INT_CIRGPINT BIT(4)
#define INT_SSPI BIT(5)
#define INT_UART1 BIT(6)
#define INT_UART2 BIT(7)
/* IER6 */
#define INT_WKO60 BIT(0)
#define INT_WKO61 BIT(1)
#define INT_WKO62 BIT(2)
#define INT_WKO63 BIT(3)
#define INT_WKO64 BIT(4)
#define INT_WKO65 BIT(5)
#define INT_WKO66 BIT(6)
#define INT_WKO67 BIT(7)
/* IER7 */
#define INT_RTCTALARM1 BIT(0)
#define INT_RTCTALARM2 BIT(1)
#define INT_ET2INTR BIT(2)
#define INT_TMRINTA0 BIT(4)
#define INT_TMRINTA1 BIT(5)
#define INT_TMRINTB0 BIT(6)
#define INT_TMRINTB1 BIT(7)
/* IER8 */
#define INT_PMC2EXOBE BIT(0)
#define INT_PMC2EXIBF BIT(1)
#define INT_PMC3OBE BIT(2)
#define INT_PMC3IBF BIT(3)
#define INT_PMC4OBE BIT(4)
#define INT_PMC4IBF BIT(5)
#define INT_I2BRAM BIT(7)
/* IER9 */
#define INT_WKO70 BIT(0)
#define INT_WKO71 BIT(1)
#define INT_WKO72 BIT(2)
#define INT_WKO73 BIT(3)
#define INT_WKO74 BIT(4)
#define INT_WKO75 BIT(5)
#define INT_WKO76 BIT(6)
#define INT_WKO77 BIT(7)
/* IER10 */
#define INT_ET8INTR BIT(0)
#define INT_SMBUSCHINER BIT(1)
#define INT_CEC BIT(2)
#define INT_H2RAMLPC BIT(3)
#define INT_KBSDVINTR BIT(4)
#define INT_WKO88 BIT(5)
#define INT_WKO89 BIT(6)
#define INT_WKO90 BIT(7)
/* IER11 */
#define INT_WKO80 BIT(0)
#define INT_WKO81 BIT(1)
#define INT_WKO82 BIT(2)
#define INT_WKO83 BIT(3)
#define INT_WKO84 BIT(4)
#define INT_WKO85 BIT(5)
#define INT_WKO86 BIT(6)
#define INT_WKO87 BIT(7)
/* IER12 */
#define INT_WKO91 BIT(0)
#define INT_WKO92 BIT(1)
#define INT_WKO93 BIT(2)
#define INT_WKO94 BIT(3)
#define INT_WKO95 BIT(4)
#define INT_WKO96 BIT(5)
#define INT_WKO97 BIT(6)
#define INT_WKO98 BIT(7)
/* IER13 */
#define INT_WKO99 BIT(0)
#define INT_WKO100 BIT(1)
#define INT_WKO101 BIT(2)
#define INT_WKO102 BIT(3)
#define INT_WKO103 BIT(4)
#define INT_WKO104 BIT(5)
#define INT_WKO105 BIT(6)
#define INT_WKO106 BIT(7)
/* IER14 */
#define INT_WKO107 BIT(0)
#define INT_WKO108 BIT(1)
#define INT_WKO109 BIT(2)
#define INT_WKO110 BIT(3)
#define INT_WKO111 BIT(4)
#define INT_WKO112 BIT(5)
#define INT_WKO113 BIT(6)
#define INT_WKO114 BIT(7)
/* IER15 */
#define INT_WKO115 BIT(0)
#define INT_WKO116 BIT(1)
#define INT_WKO117 BIT(2)
#define INT_WKO118 BIT(3)
#define INT_WKO119 BIT(4)
#define INT_WKO120 BIT(5)
#define INT_WKO121 BIT(6)
#define INT_WKO122 BIT(7)
/* IER16 */
#define INT_WKO128 BIT(0)
#define INT_WKO129 BIT(1)
#define INT_WKO130 BIT(2)
#define INT_WKO131 BIT(3)
#define INT_WKO132 BIT(4)
#define INT_WKO133 BIT(5)
#define INT_WKO134 BIT(6)
/* IER18 */
#define INT_PMC5OBE BIT(5)
#define INT_PMC5IBE BIT(6)
#define INT_VCI BIT(7)
/* IER19 */
#define INT_SMBUSE BIT(0)
#define INT_SMBUSF BIT(1)
#define INT_OSCDMAINTER BIT(2)
#define INT_ET3INTR BIT(3)
#define INT_ET4INTR BIT(4)
#define INT_ET5INTR BIT(5)
#define INT_ET6INTR BIT(6)
#define INT_ET7INTR BIT(7)
/**
*
@ -855,105 +657,20 @@
#define GCR19 ECREG(EC_REG_BASE_ADDR + 0x16E4)
#define GCR20 ECREG(EC_REG_BASE_ADDR + 0x16E5)
#define GCR21 ECREG(EC_REG_BASE_ADDR + 0x16E6)
#define GPDRA ECREG(EC_REG_BASE_ADDR + 0x1601)
#define GPDRB ECREG(EC_REG_BASE_ADDR + 0x1602)
#define GPDRC ECREG(EC_REG_BASE_ADDR + 0x1603)
#define GPDRD ECREG(EC_REG_BASE_ADDR + 0x1604)
#define GPDRE ECREG(EC_REG_BASE_ADDR + 0x1605)
#define GPDRF ECREG(EC_REG_BASE_ADDR + 0x1606)
#define GPDRG ECREG(EC_REG_BASE_ADDR + 0x1607)
#define GPDRH ECREG(EC_REG_BASE_ADDR + 0x1608)
#define GPDRI ECREG(EC_REG_BASE_ADDR + 0x1609)
#define GPDRJ ECREG(EC_REG_BASE_ADDR + 0x160A)
#define GPDRM ECREG(EC_REG_BASE_ADDR + 0x160D)
/*
* TODO: use pinmux driver to enable uart function so we can remove these
* registers' declaration.
*/
/* GPIO control register */
#define GPCRA0 ECREG(EC_REG_BASE_ADDR + 0x1610)
#define GPCRA1 ECREG(EC_REG_BASE_ADDR + 0x1611)
#define GPCRA2 ECREG(EC_REG_BASE_ADDR + 0x1612)
#define GPCRA3 ECREG(EC_REG_BASE_ADDR + 0x1613)
#define GPCRA4 ECREG(EC_REG_BASE_ADDR + 0x1614)
#define GPCRA5 ECREG(EC_REG_BASE_ADDR + 0x1615)
#define GPCRA6 ECREG(EC_REG_BASE_ADDR + 0x1616)
#define GPCRA7 ECREG(EC_REG_BASE_ADDR + 0x1617)
#define GPCRB0 ECREG(EC_REG_BASE_ADDR + 0x1618)
#define GPCRB1 ECREG(EC_REG_BASE_ADDR + 0x1619)
#define GPCRB2 ECREG(EC_REG_BASE_ADDR + 0x161A)
#define GPCRB3 ECREG(EC_REG_BASE_ADDR + 0x161B)
#define GPCRB4 ECREG(EC_REG_BASE_ADDR + 0x161C)
#define GPCRB5 ECREG(EC_REG_BASE_ADDR + 0x161D)
#define GPCRB6 ECREG(EC_REG_BASE_ADDR + 0x161E)
#define GPCRB7 ECREG(EC_REG_BASE_ADDR + 0x161F)
#define GPCRC0 ECREG(EC_REG_BASE_ADDR + 0x1620)
#define GPCRC1 ECREG(EC_REG_BASE_ADDR + 0x1621)
#define GPCRC2 ECREG(EC_REG_BASE_ADDR + 0x1622)
#define GPCRC3 ECREG(EC_REG_BASE_ADDR + 0x1623)
#define GPCRC4 ECREG(EC_REG_BASE_ADDR + 0x1624)
#define GPCRC5 ECREG(EC_REG_BASE_ADDR + 0x1625)
#define GPCRC6 ECREG(EC_REG_BASE_ADDR + 0x1626)
#define GPCRC7 ECREG(EC_REG_BASE_ADDR + 0x1627)
#define GPCRD0 ECREG(EC_REG_BASE_ADDR + 0x1628)
#define GPCRD1 ECREG(EC_REG_BASE_ADDR + 0x1629)
#define GPCRD2 ECREG(EC_REG_BASE_ADDR + 0x162A)
#define GPCRD3 ECREG(EC_REG_BASE_ADDR + 0x162B)
#define GPCRD4 ECREG(EC_REG_BASE_ADDR + 0x162C)
#define GPCRD5 ECREG(EC_REG_BASE_ADDR + 0x162D)
#define GPCRD6 ECREG(EC_REG_BASE_ADDR + 0x162E)
#define GPCRD7 ECREG(EC_REG_BASE_ADDR + 0x162F)
#define GPCRE0 ECREG(EC_REG_BASE_ADDR + 0x1630)
#define GPCRE1 ECREG(EC_REG_BASE_ADDR + 0x1631)
#define GPCRE2 ECREG(EC_REG_BASE_ADDR + 0x1632)
#define GPCRE3 ECREG(EC_REG_BASE_ADDR + 0x1633)
#define GPCRE4 ECREG(EC_REG_BASE_ADDR + 0x1634)
#define GPCRE5 ECREG(EC_REG_BASE_ADDR + 0x1635)
#define GPCRE6 ECREG(EC_REG_BASE_ADDR + 0x1636)
#define GPCRE7 ECREG(EC_REG_BASE_ADDR + 0x1637)
#define GPCRF0 ECREG(EC_REG_BASE_ADDR + 0x1638)
#define GPCRF1 ECREG(EC_REG_BASE_ADDR + 0x1639)
#define GPCRF2 ECREG(EC_REG_BASE_ADDR + 0x163A)
#define GPCRF3 ECREG(EC_REG_BASE_ADDR + 0x163B)
#define GPCRF4 ECREG(EC_REG_BASE_ADDR + 0x163C)
#define GPCRF5 ECREG(EC_REG_BASE_ADDR + 0x163D)
#define GPCRF6 ECREG(EC_REG_BASE_ADDR + 0x163E)
#define GPCRF7 ECREG(EC_REG_BASE_ADDR + 0x163F)
#define GPCRG0 ECREG(EC_REG_BASE_ADDR + 0x1640)
#define GPCRG1 ECREG(EC_REG_BASE_ADDR + 0x1641)
#define GPCRG2 ECREG(EC_REG_BASE_ADDR + 0x1642)
#define GPCRG3 ECREG(EC_REG_BASE_ADDR + 0x1643)
#define GPCRG4 ECREG(EC_REG_BASE_ADDR + 0x1644)
#define GPCRG5 ECREG(EC_REG_BASE_ADDR + 0x1645)
#define GPCRG6 ECREG(EC_REG_BASE_ADDR + 0x1646)
#define GPCRG7 ECREG(EC_REG_BASE_ADDR + 0x1647)
#define GPCRH0 ECREG(EC_REG_BASE_ADDR + 0x1648)
#define GPCRH1 ECREG(EC_REG_BASE_ADDR + 0x1649)
#define GPCRH2 ECREG(EC_REG_BASE_ADDR + 0x164A)
#define GPCRH3 ECREG(EC_REG_BASE_ADDR + 0x164B)
#define GPCRH4 ECREG(EC_REG_BASE_ADDR + 0x164C)
#define GPCRH5 ECREG(EC_REG_BASE_ADDR + 0x164D)
#define GPCRH6 ECREG(EC_REG_BASE_ADDR + 0x164E)
#define GPCRI0 ECREG(EC_REG_BASE_ADDR + 0x1650)
#define GPCRI1 ECREG(EC_REG_BASE_ADDR + 0x1651)
#define GPCRI2 ECREG(EC_REG_BASE_ADDR + 0x1652)
#define GPCRI3 ECREG(EC_REG_BASE_ADDR + 0x1653)
#define GPCRI4 ECREG(EC_REG_BASE_ADDR + 0x1654)
#define GPCRI5 ECREG(EC_REG_BASE_ADDR + 0x1655)
#define GPCRI6 ECREG(EC_REG_BASE_ADDR + 0x1656)
#define GPCRI7 ECREG(EC_REG_BASE_ADDR + 0x1657)
#define GPCRJ0 ECREG(EC_REG_BASE_ADDR + 0x1658)
#define GPCRJ1 ECREG(EC_REG_BASE_ADDR + 0x1659)
#define GPCRJ2 ECREG(EC_REG_BASE_ADDR + 0x165A)
#define GPCRJ3 ECREG(EC_REG_BASE_ADDR + 0x165B)
#define GPCRJ4 ECREG(EC_REG_BASE_ADDR + 0x165C)
#define GPCRJ5 ECREG(EC_REG_BASE_ADDR + 0x165D)
#define GPCRJ6 ECREG(EC_REG_BASE_ADDR + 0x165E)
#define GPCRJ7 ECREG(EC_REG_BASE_ADDR + 0x165F)
#define GPCRM0 ECREG(EC_REG_BASE_ADDR + 0x16A0)
#define GPCRM1 ECREG(EC_REG_BASE_ADDR + 0x16A1)
#define GPCRM2 ECREG(EC_REG_BASE_ADDR + 0x16A2)
#define GPCRM3 ECREG(EC_REG_BASE_ADDR + 0x16A3)
#define GPCRM4 ECREG(EC_REG_BASE_ADDR + 0x16A4)
#define GPCRM5 ECREG(EC_REG_BASE_ADDR + 0x16A5)
#define GPCRM6 ECREG(EC_REG_BASE_ADDR + 0x16A6)
/* Port Data Mirror Register */
#define GPDMRA ECREG(EC_REG_BASE_ADDR + 0x1661)
@ -967,13 +684,6 @@
#define GPDMRI ECREG(EC_REG_BASE_ADDR + 0x1669)
#define GPDMRJ ECREG(EC_REG_BASE_ADDR + 0x166A)
#define GPDMRM ECREG(EC_REG_BASE_ADDR + 0x166D)
#define GPOTA ECREG(EC_REG_BASE_ADDR + 0x1671)
#define GPOTB ECREG(EC_REG_BASE_ADDR + 0x1672)
#define GPOTD ECREG(EC_REG_BASE_ADDR + 0x1674)
#define GPOTE ECREG(EC_REG_BASE_ADDR + 0x1675)
#define GPOTF ECREG(EC_REG_BASE_ADDR + 0x1676)
#define GPOTH ECREG(EC_REG_BASE_ADDR + 0x1678)
#define GPOTJ ECREG(EC_REG_BASE_ADDR + 0x167A)
/**
*
@ -1137,61 +847,15 @@
#define PORSREGA ECREG(EC_REG_BASE_ADDR + 0x1A14)
#define PORSREGB ECREG(EC_REG_BASE_ADDR + 0x1A15)
/**
*
* (1Bxxh) Wack-Up control (WUC)
*
*/
#define WUEMR1 ECREG(EC_REG_BASE_ADDR + 0x1B00)
#define WUEMR2 ECREG(EC_REG_BASE_ADDR + 0x1B01)
#define WUEMR3 ECREG(EC_REG_BASE_ADDR + 0x1B02)
#define WUEMR4 ECREG(EC_REG_BASE_ADDR + 0x1B03)
#define WUEMR6 ECREG(EC_REG_BASE_ADDR + 0x1B10)
#define WUEMR7 ECREG(EC_REG_BASE_ADDR + 0x1B14)
#define WUEMR8 ECREG(EC_REG_BASE_ADDR + 0x1B18)
#define WUEMR9 ECREG(EC_REG_BASE_ADDR + 0x1B1C)
#define WUEMR10 ECREG(EC_REG_BASE_ADDR + 0x1B20)
#define WUEMR11 ECREG(EC_REG_BASE_ADDR + 0x1B24)
#define WUEMR12 ECREG(EC_REG_BASE_ADDR + 0x1B28)
#define WUEMR13 ECREG(EC_REG_BASE_ADDR + 0x1B2C)
#define WUEMR14 ECREG(EC_REG_BASE_ADDR + 0x1B30)
#define WUESR1 ECREG(EC_REG_BASE_ADDR + 0x1B04)
#define WUESR2 ECREG(EC_REG_BASE_ADDR + 0x1B05)
#define WUESR3 ECREG(EC_REG_BASE_ADDR + 0x1B06)
#define WUESR4 ECREG(EC_REG_BASE_ADDR + 0x1B07)
#define WUESR6 ECREG(EC_REG_BASE_ADDR + 0x1B11)
#define WUESR7 ECREG(EC_REG_BASE_ADDR + 0x1B15)
#define WUESR8 ECREG(EC_REG_BASE_ADDR + 0x1B19)
#define WUESR9 ECREG(EC_REG_BASE_ADDR + 0x1B1D)
#define WUESR10 ECREG(EC_REG_BASE_ADDR + 0x1B21)
#define WUESR11 ECREG(EC_REG_BASE_ADDR + 0x1B25)
#define WUESR12 ECREG(EC_REG_BASE_ADDR + 0x1B29)
#define WUESR13 ECREG(EC_REG_BASE_ADDR + 0x1B2D)
#define WUESR14 ECREG(EC_REG_BASE_ADDR + 0x1B31)
#define WUENR1 ECREG(EC_REG_BASE_ADDR + 0x1B08)
#define WUENR2 ECREG(EC_REG_BASE_ADDR + 0x1B09)
#define WUENR3 ECREG(EC_REG_BASE_ADDR + 0x1B0A)
#define WUENR4 ECREG(EC_REG_BASE_ADDR + 0x1B0B)
#define WUENR6 ECREG(EC_REG_BASE_ADDR + 0x1B12)
#define WUENR7 ECREG(EC_REG_BASE_ADDR + 0x1B16)
#define WUENR8 ECREG(EC_REG_BASE_ADDR + 0x1B1A)
#define WUENR9 ECREG(EC_REG_BASE_ADDR + 0x1B1E)
/* --- Wake-Up Control (WUC) --- */
#define IT8XXX2_WUC_BASE 0x00F01B00
#define WUEMR6_BASE (EC_REG_BASE_ADDR + 0x1B10)
#define WUESR6_BASE (EC_REG_BASE_ADDR + 0x1B11)
#define WUBEMR6 ECREG(EC_REG_BASE_ADDR + 0x1B13)
#define WUEMR8_BASE (EC_REG_BASE_ADDR + 0x1B18)
#define WUESR8_BASE (EC_REG_BASE_ADDR + 0x1B19)
#define WUBEMR8 ECREG(EC_REG_BASE_ADDR + 0x1B1B)
#define WUEMR9_BASE (EC_REG_BASE_ADDR + 0x1B1C)
#define WUESR9_BASE (EC_REG_BASE_ADDR + 0x1B1D)
#define WUBEMR9 ECREG(EC_REG_BASE_ADDR + 0x1B1F)
#define WUEMR10_BASE (EC_REG_BASE_ADDR + 0x1B20)
#define WUESR10_BASE (EC_REG_BASE_ADDR + 0x1B21)
#define WUBEMR10 ECREG(EC_REG_BASE_ADDR + 0x1B23)
#define WUEMR11_BASE (EC_REG_BASE_ADDR + 0x1B24)
#define WUESR11_BASE (EC_REG_BASE_ADDR + 0x1B25)
#define WUBEMR11 ECREG(EC_REG_BASE_ADDR + 0x1B27)
#define IT8XXX2_WUC_WUEMR1 (IT8XXX2_WUC_BASE + 0x00)
#define IT8XXX2_WUC_WUEMR5 (IT8XXX2_WUC_BASE + 0x0c)
#define IT8XXX2_WUC_WUESR1 (IT8XXX2_WUC_BASE + 0x04)
#define IT8XXX2_WUC_WUESR5 (IT8XXX2_WUC_BASE + 0x0d)
#define IT8XXX2_WUC_WUBEMR1 (IT8XXX2_WUC_BASE + 0x3c)
#define IT8XXX2_WUC_WUBEMR5 (IT8XXX2_WUC_BASE + 0x0f)
/**
*

View file

@ -73,6 +73,7 @@ int riscv_plic_get_irq(void);
#if CONFIG_ITE_IT8XXX2_INTC
extern void ite_intc_irq_enable(unsigned int irq);
extern void ite_intc_irq_disable(unsigned int irq);
extern uint8_t ite_intc_get_irq_num(void);
extern int ite_intc_irq_is_enable(unsigned int irq);
extern void ite_intc_irq_priority_set(unsigned int irq,
unsigned int prio, unsigned int flags);

View file

@ -18,7 +18,7 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
if ITE_IT8XXX2_INTC
config NUM_IRQS
default 162
default 185
config DYNAMIC_INTERRUPTS
default y