ite: drivers/pinmux: modify pinmux driver
Modify the pinmux control method and add support the fun3 & fun4 alternation function. Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com>
This commit is contained in:
parent
05a68b1604
commit
caa3328cc7
9 changed files with 412 additions and 78 deletions
|
@ -13,20 +13,35 @@ static int it8xxx2_evb_pinmux_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
ARG_UNUSED(dev);
|
ARG_UNUSED(dev);
|
||||||
|
|
||||||
const struct device *p = DEVICE_DT_GET(DT_NODELABEL(pinmux));
|
#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmuxb), okay)
|
||||||
|
const struct device *portb = DEVICE_DT_GET(DT_NODELABEL(pinmuxb));
|
||||||
|
|
||||||
__ASSERT_NO_MSG(device_is_ready(p));
|
__ASSERT_NO_MSG(device_is_ready(portb));
|
||||||
|
#endif
|
||||||
|
#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmuxh), okay)
|
||||||
|
const struct device *porth = DEVICE_DT_GET(DT_NODELABEL(pinmuxh));
|
||||||
|
|
||||||
|
__ASSERT_NO_MSG(device_is_ready(porth));
|
||||||
|
#endif
|
||||||
|
|
||||||
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay)
|
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay)
|
||||||
pinmux_pin_set(p, 0, IT8XXX2_PINMUX_IOF1);
|
/* SIN0 */
|
||||||
pinmux_pin_set(p, 56, IT8XXX2_PINMUX_IOF1);
|
pinmux_pin_set(portb, 0, IT8XXX2_PINMUX_FUNC_3);
|
||||||
|
/* SOUT0 */
|
||||||
|
pinmux_pin_set(portb, 1, IT8XXX2_PINMUX_FUNC_3);
|
||||||
|
/* Pullup SIN0 to received data */
|
||||||
|
pinmux_pin_pullup(portb, 0, PINMUX_PULLUP_ENABLE);
|
||||||
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay) */
|
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay) */
|
||||||
|
|
||||||
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay)
|
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay)
|
||||||
pinmux_pin_set(p, 3, IT8XXX2_PINMUX_IOF1);
|
/* SIN1 */
|
||||||
pinmux_pin_set(p, 59, IT8XXX2_PINMUX_IOF1);
|
pinmux_pin_set(porth, 1, IT8XXX2_PINMUX_FUNC_4);
|
||||||
|
/* SOUT1 */
|
||||||
|
pinmux_pin_set(porth, 2, IT8XXX2_PINMUX_FUNC_4);
|
||||||
|
/* Pullup SIN1 to received data */
|
||||||
|
pinmux_pin_pullup(porth, 1, PINMUX_PULLUP_ENABLE);
|
||||||
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay) */
|
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay) */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SYS_INIT(it8xxx2_evb_pinmux_init, PRE_KERNEL_1, CONFIG_PINMUX_INIT_PRIORITY);
|
SYS_INIT(it8xxx2_evb_pinmux_init, PRE_KERNEL_1, CONFIG_PINMUX_INIT_PRIORITY);
|
||||||
|
|
|
@ -16,11 +16,6 @@
|
||||||
|
|
||||||
#define DT_DRV_COMPAT ite_it8xxx2_gpio
|
#define DT_DRV_COMPAT ite_it8xxx2_gpio
|
||||||
|
|
||||||
#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
|
* Strcture gpio_ite_cfg is about the setting of gpio
|
||||||
* this config will be used at initial time
|
* this config will be used at initial time
|
||||||
|
|
|
@ -14,10 +14,21 @@
|
||||||
#include <soc.h>
|
#include <soc.h>
|
||||||
|
|
||||||
#define DT_DRV_COMPAT ite_it8xxx2_pinmux
|
#define DT_DRV_COMPAT ite_it8xxx2_pinmux
|
||||||
#define PIN_REG_OFFSET 8
|
|
||||||
|
#include <logging/log.h>
|
||||||
|
LOG_MODULE_REGISTER(pinmux_ite_it8xxx2, LOG_LEVEL_ERR);
|
||||||
|
|
||||||
struct pinmux_it8xxx2_config {
|
struct pinmux_it8xxx2_config {
|
||||||
uintptr_t base;
|
/* gpio port control register (byte mapping to pin) */
|
||||||
|
uintptr_t reg_gpcr;
|
||||||
|
/* function 3 general control register */
|
||||||
|
uintptr_t func3_gcr[8];
|
||||||
|
/* function 4 general control register */
|
||||||
|
uintptr_t func4_gcr[8];
|
||||||
|
/* function 3 enable mask */
|
||||||
|
uint8_t func3_en_mask[8];
|
||||||
|
/* function 4 enable mask */
|
||||||
|
uint8_t func4_en_mask[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEV_CFG(dev) \
|
#define DEV_CFG(dev) \
|
||||||
|
@ -27,22 +38,48 @@ struct pinmux_it8xxx2_config {
|
||||||
static int pinmux_it8xxx2_set(const struct device *dev,
|
static int pinmux_it8xxx2_set(const struct device *dev,
|
||||||
uint32_t pin, uint32_t func)
|
uint32_t pin, uint32_t func)
|
||||||
{
|
{
|
||||||
const struct pinmux_it8xxx2_config *config = DEV_CFG(dev);
|
const struct pinmux_it8xxx2_config *pinmux_config = DEV_CFG(dev);
|
||||||
uint32_t reg;
|
|
||||||
uint8_t val;
|
|
||||||
int g, i;
|
|
||||||
|
|
||||||
if (func > IT8XXX2_PINMUX_IOF1 || pin >= IT8XXX2_PINMUX_PINS) {
|
volatile uint8_t *reg_gpcr =
|
||||||
|
(uint8_t *)(pinmux_config->reg_gpcr + pin);
|
||||||
|
volatile uint8_t *reg_func3_gcr =
|
||||||
|
(uint8_t *)(pinmux_config->func3_gcr[pin]);
|
||||||
|
volatile uint8_t *reg_func4_gcr =
|
||||||
|
(uint8_t *)(pinmux_config->func4_gcr[pin]);
|
||||||
|
|
||||||
|
if (pin >= IT8XXX2_PINMUX_PINS) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
g = pin / PIN_REG_OFFSET;
|
|
||||||
i = pin % PIN_REG_OFFSET;
|
/* Common settings for alternate function. */
|
||||||
reg = config->base + g;
|
*reg_gpcr &= ~(GPCR_PORT_PIN_MODE_INPUT |
|
||||||
val = sys_read8(reg);
|
GPCR_PORT_PIN_MODE_OUTPUT);
|
||||||
if (func == IT8XXX2_PINMUX_IOF1) {
|
|
||||||
sys_write8((val | IT8XXX2_PINMUX_IOF1 << i), reg);
|
switch (func) {
|
||||||
} else {
|
case IT8XXX2_PINMUX_FUNC_1:
|
||||||
sys_write8((val & ~(IT8XXX2_PINMUX_IOF1 << i)), reg);
|
/* Func1: Alternate function has been set above. */
|
||||||
|
break;
|
||||||
|
case IT8XXX2_PINMUX_FUNC_2:
|
||||||
|
/* Func2: WUI function: turn the pin into an input */
|
||||||
|
*reg_gpcr |= GPCR_PORT_PIN_MODE_INPUT;
|
||||||
|
break;
|
||||||
|
case IT8XXX2_PINMUX_FUNC_3:
|
||||||
|
/*
|
||||||
|
* Func3: In addition to the alternate setting above,
|
||||||
|
* Func3 also need to set the general control.
|
||||||
|
*/
|
||||||
|
*reg_func3_gcr |= pinmux_config->func3_en_mask[pin];
|
||||||
|
break;
|
||||||
|
case IT8XXX2_PINMUX_FUNC_4:
|
||||||
|
/*
|
||||||
|
* Func4: In addition to the alternate setting above,
|
||||||
|
* Func4 also need to set the general control.
|
||||||
|
*/
|
||||||
|
*reg_func4_gcr |= pinmux_config->func4_en_mask[pin];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_ERR("This function is not supported");
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -51,20 +88,20 @@ static int pinmux_it8xxx2_set(const struct device *dev,
|
||||||
static int pinmux_it8xxx2_get(const struct device *dev,
|
static int pinmux_it8xxx2_get(const struct device *dev,
|
||||||
uint32_t pin, uint32_t *func)
|
uint32_t pin, uint32_t *func)
|
||||||
{
|
{
|
||||||
const struct pinmux_it8xxx2_config *config = DEV_CFG(dev);
|
const struct pinmux_it8xxx2_config *pinmux_config = DEV_CFG(dev);
|
||||||
uint32_t reg;
|
|
||||||
uint8_t val;
|
volatile uint8_t *reg_gpcr =
|
||||||
int g, i;
|
(uint8_t *)(pinmux_config->reg_gpcr + pin);
|
||||||
|
|
||||||
if (pin >= IT8XXX2_PINMUX_PINS || func == NULL) {
|
if (pin >= IT8XXX2_PINMUX_PINS || func == NULL) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
g = pin / PIN_REG_OFFSET;
|
|
||||||
i = pin % PIN_REG_OFFSET;
|
*func = (*reg_gpcr & (GPCR_PORT_PIN_MODE_INPUT |
|
||||||
reg = config->base + g;
|
GPCR_PORT_PIN_MODE_OUTPUT)) == GPCR_PORT_PIN_MODE_INPUT ?
|
||||||
val = sys_read8(reg);
|
IT8XXX2_PINMUX_FUNC_2 : IT8XXX2_PINMUX_FUNC_1;
|
||||||
*func = (val & (IT8XXX2_PINMUX_IOF1 << pin)) ?
|
|
||||||
IT8XXX2_PINMUX_IOF1 : IT8XXX2_PINMUX_IOF0;
|
/* TODO: IT8XXX2_PINMUX_FUNC_3 & IT8XXX2_PINMUX_FUNC_4 */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -72,17 +109,67 @@ static int pinmux_it8xxx2_get(const struct device *dev,
|
||||||
static int pinmux_it8xxx2_pullup(const struct device *dev,
|
static int pinmux_it8xxx2_pullup(const struct device *dev,
|
||||||
uint32_t pin, uint8_t func)
|
uint32_t pin, uint8_t func)
|
||||||
{
|
{
|
||||||
return -ENOTSUP;
|
const struct pinmux_it8xxx2_config *pinmux_config = DEV_CFG(dev);
|
||||||
|
|
||||||
|
volatile uint8_t *reg_gpcr =
|
||||||
|
(uint8_t *)(pinmux_config->reg_gpcr + pin);
|
||||||
|
|
||||||
|
if (func == PINMUX_PULLUP_ENABLE) {
|
||||||
|
*reg_gpcr = (*reg_gpcr | GPCR_PORT_PIN_MODE_PULLUP) &
|
||||||
|
~GPCR_PORT_PIN_MODE_PULLDOWN;
|
||||||
|
} else if (func == PINMUX_PULLUP_DISABLE) {
|
||||||
|
*reg_gpcr &= ~(GPCR_PORT_PIN_MODE_PULLUP |
|
||||||
|
GPCR_PORT_PIN_MODE_PULLDOWN);
|
||||||
|
} else {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pinmux_it8xxx2_input(const struct device *dev,
|
static int pinmux_it8xxx2_input(const struct device *dev,
|
||||||
uint32_t pin, uint8_t func)
|
uint32_t pin, uint8_t func)
|
||||||
{
|
{
|
||||||
return -ENOTSUP;
|
const struct pinmux_it8xxx2_config *pinmux_config = DEV_CFG(dev);
|
||||||
|
|
||||||
|
volatile uint8_t *reg_gpcr =
|
||||||
|
(uint8_t *)(pinmux_config->reg_gpcr + pin);
|
||||||
|
|
||||||
|
*reg_gpcr &= ~(GPCR_PORT_PIN_MODE_INPUT |
|
||||||
|
GPCR_PORT_PIN_MODE_OUTPUT);
|
||||||
|
|
||||||
|
if (func == PINMUX_INPUT_ENABLED) {
|
||||||
|
*reg_gpcr |= GPCR_PORT_PIN_MODE_INPUT;
|
||||||
|
} else if (func == PINMUX_OUTPUT_ENABLED) {
|
||||||
|
*reg_gpcr |= GPCR_PORT_PIN_MODE_OUTPUT;
|
||||||
|
} else {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pinmux_it8xxx2_init(const struct device *dev)
|
static int pinmux_it8xxx2_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
|
ARG_UNUSED(dev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The default value of LPCRSTEN is bit2:1 = 10b(GPD2) in GCR.
|
||||||
|
* If LPC reset is enabled on GPB7, we have to clear bit2:1
|
||||||
|
* to 00b.
|
||||||
|
*/
|
||||||
|
IT8XXX2_GPIO_GCR &= ~(BIT(1) | BIT(2));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: If SMBUS3 swaps from H group to F group, we have to
|
||||||
|
* set SMB3PSEL = 1 in PMER3 register.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: If UART2 swaps from bit2:1 to bit6:5 in H group, we
|
||||||
|
* have to set UART1PSEL = 1 in UART1PMR register.
|
||||||
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,11 +180,20 @@ static const struct pinmux_driver_api pinmux_it8xxx2_driver_api = {
|
||||||
.input = pinmux_it8xxx2_input,
|
.input = pinmux_it8xxx2_input,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pinmux_it8xxx2_config pinmux_it8xxx2_0_config = {
|
#define PINMUX_ITE_INIT(inst) \
|
||||||
.base = DT_INST_REG_ADDR(0),
|
static const struct pinmux_it8xxx2_config pinmux_it8xxx2_cfg_##inst = { \
|
||||||
};
|
.reg_gpcr = DT_INST_REG_ADDR(inst), \
|
||||||
|
.func3_gcr = DT_INST_PROP(inst, func3_gcr), \
|
||||||
DEVICE_DT_INST_DEFINE(0, &pinmux_it8xxx2_init, NULL,
|
.func3_en_mask = DT_INST_PROP(inst, func3_en_mask), \
|
||||||
NULL, &pinmux_it8xxx2_0_config,
|
.func4_gcr = DT_INST_PROP(inst, func4_gcr), \
|
||||||
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
|
.func4_en_mask = DT_INST_PROP(inst, func4_en_mask), \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
DEVICE_DT_INST_DEFINE(inst, \
|
||||||
|
&pinmux_it8xxx2_init, \
|
||||||
|
NULL, NULL, &pinmux_it8xxx2_cfg_##inst, \
|
||||||
|
PRE_KERNEL_1, \
|
||||||
|
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
|
||||||
&pinmux_it8xxx2_driver_api);
|
&pinmux_it8xxx2_driver_api);
|
||||||
|
|
||||||
|
DT_INST_FOREACH_STATUS_OKAY(PINMUX_ITE_INIT)
|
||||||
|
|
|
@ -10,3 +10,19 @@ include: base.yaml
|
||||||
properties:
|
properties:
|
||||||
reg:
|
reg:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
func3_gcr:
|
||||||
|
type: array
|
||||||
|
required: true
|
||||||
|
|
||||||
|
func3_en_mask:
|
||||||
|
type: array
|
||||||
|
required: true
|
||||||
|
|
||||||
|
func4_gcr:
|
||||||
|
type: array
|
||||||
|
required: true
|
||||||
|
|
||||||
|
func4_en_mask:
|
||||||
|
type: array
|
||||||
|
required: true
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <mem.h>
|
#include <mem.h>
|
||||||
#include <dt-bindings/interrupt-controller/ite-intc.h>
|
#include <dt-bindings/interrupt-controller/ite-intc.h>
|
||||||
#include <dt-bindings/i2c/i2c.h>
|
#include <dt-bindings/i2c/i2c.h>
|
||||||
|
#include <dt-bindings/pinctrl/it8xxx2-pinctrl.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -42,9 +43,174 @@
|
||||||
write-block-size = <4>;
|
write-block-size = <4>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
pinmux: pinmux@f016f0 {
|
pinmuxa: pinmux@f01610 {
|
||||||
compatible = "ite,it8xxx2-pinmux";
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
reg = <0x00f016f0 0x0010>;
|
reg = <0x00f01610 0x0008>;
|
||||||
|
label = "PINMUXA";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
0xf02032 0xf02032 0xf016f0 0xf016f0>;
|
||||||
|
func3_en_mask = <0 0 0 0
|
||||||
|
0x02 0x02 0x10 0x0C >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC >;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxb: pinmux@f01618 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01618 0x0008>;
|
||||||
|
label = "PINMUXB";
|
||||||
|
func3_gcr = <0xf016f5 0xf016f5 NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC 0xf01600>;
|
||||||
|
func3_en_mask = <0x01 0x02 0 0
|
||||||
|
0 0 0 0x02 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC 0xf016f1>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0x40 >;
|
||||||
|
};
|
||||||
|
pinmuxc: pinmux@f01620 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01620 0x0008>;
|
||||||
|
label = "PINMUXC";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC 0xf016f0
|
||||||
|
NO_FUNC 0xf016f0 NO_FUNC 0xf016f3>;
|
||||||
|
func3_en_mask = <0 0 0 0x10
|
||||||
|
0 0x10 0 0x02 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC 0xf016f6>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0x80 >;
|
||||||
|
};
|
||||||
|
pinmuxd: pinmux@f01628 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01628 0x0008>;
|
||||||
|
label = "PINMUXD";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC 0xf016f0 NO_FUNC NO_FUNC>;
|
||||||
|
func3_en_mask = <0 0 0 0
|
||||||
|
0 0x02 0 0 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxe: pinmux@f01630 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01630 0x0008>;
|
||||||
|
label = "PINMUXE";
|
||||||
|
func3_gcr = <0xf02032 NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC 0xf016f0 NO_FUNC 0xf02032>;
|
||||||
|
func3_en_mask = <0x01 0 0 0
|
||||||
|
0 0x08 0 0x01 >;
|
||||||
|
func4_gcr = <0xf016f3 NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC >;
|
||||||
|
func4_en_mask = <0x01 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxf: pinmux@f01638 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01638 0x0008>;
|
||||||
|
label = "PINMUXF";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC 0xf016f0 0xf016f0
|
||||||
|
NO_FUNC NO_FUNC 0xf016f1 0xf016f1>;
|
||||||
|
func3_en_mask = <0 0 0x02 0x02
|
||||||
|
0 0 0x10 0x10 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC 0xf016f1 0xf016f1
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC >;
|
||||||
|
func4_en_mask = <0 0 0x20 0x20
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxg: pinmux@f01640 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01640 0x0008>;
|
||||||
|
label = "PINMUXG";
|
||||||
|
func3_gcr = <0xf016f0 0xf016f0 0xf016f0 NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC 0xf016f0 NO_FUNC>;
|
||||||
|
func3_en_mask = <0x20 0x08 0x10 0
|
||||||
|
0 0 0x02 0 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxh: pinmux@f01648 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01648 0x0008>;
|
||||||
|
label = "PINMUXH";
|
||||||
|
func3_gcr = <NO_FUNC 0xf016f1 0xf016f1 NO_FUNC
|
||||||
|
NO_FUNC 0xf016f5 0xf016f5 NO_FUNC>;
|
||||||
|
func3_en_mask = <0 0x20 0x20 0
|
||||||
|
0 0x04 0x08 0 >;
|
||||||
|
func4_gcr = <NO_FUNC 0xf016f5 0xf016f5 NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0x04 0x08 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxi: pinmux@f01650 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01650 0x0008>;
|
||||||
|
label = "PINMUXI";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC 0xf016f0 0xf016f0 0xf016f0>;
|
||||||
|
func3_en_mask = <0 0 0 0
|
||||||
|
0 0x08 0x08 0x08 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC >;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxj: pinmux@f01658 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01658 0x0008>;
|
||||||
|
label = "PINMUXJ";
|
||||||
|
func3_gcr = <0xf016f4 NO_FUNC 0xf016f4 0xf016f4
|
||||||
|
0xf016f0 0xf016f0 NO_FUNC NO_FUNC>;
|
||||||
|
func3_en_mask = <0x01 0 0x01 0x02
|
||||||
|
0x02 0x03 0 0 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxk: pinmux@f01690 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01690 0x0008>;
|
||||||
|
label = "PINMUXK";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func3_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxl: pinmux@f01698 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f01698 0x0008>;
|
||||||
|
label = "PINMUXL";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func3_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
};
|
||||||
|
pinmuxm: pinmux@f016a0 {
|
||||||
|
compatible = "ite,it8xxx2-pinmux";
|
||||||
|
reg = <0x00f016a0 0x0008>;
|
||||||
|
label = "PINMUXM";
|
||||||
|
func3_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func3_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
|
func4_gcr = <NO_FUNC NO_FUNC NO_FUNC NO_FUNC
|
||||||
|
NO_FUNC NO_FUNC NO_FUNC NO_FUNC>;
|
||||||
|
func4_en_mask = <0 0 0 0
|
||||||
|
0 0 0 0 >;
|
||||||
};
|
};
|
||||||
sram0: memory@80100000 {
|
sram0: memory@80100000 {
|
||||||
compatible = "mmio-sram";
|
compatible = "mmio-sram";
|
||||||
|
|
11
include/dt-bindings/pinctrl/it8xxx2-pinctrl.h
Normal file
11
include/dt-bindings/pinctrl/it8xxx2-pinctrl.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 ITE Technology Corporation.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_IT8XXX2_PINCTRL_H_
|
||||||
|
#define ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_IT8XXX2_PINCTRL_H_
|
||||||
|
|
||||||
|
#define NO_FUNC 0
|
||||||
|
|
||||||
|
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_IT8XXX2_PINCTRL_H_ */
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020 ITE Corporation. All Rights Reserved.
|
* Copyright (c) 2020 ITE Corporation. All Rights Reserved.
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
@ -689,6 +689,11 @@
|
||||||
#define GPDMRJ ECREG(EC_REG_BASE_ADDR + 0x166A)
|
#define GPDMRJ ECREG(EC_REG_BASE_ADDR + 0x166A)
|
||||||
#define GPDMRM ECREG(EC_REG_BASE_ADDR + 0x166D)
|
#define GPDMRM ECREG(EC_REG_BASE_ADDR + 0x166D)
|
||||||
|
|
||||||
|
#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)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* (17XXh) PS/2 Interface Register
|
* (17XXh) PS/2 Interface Register
|
||||||
|
@ -1610,6 +1615,14 @@
|
||||||
#define CE_RNG ECREG(EC_REG_BASE_ADDR + 0x3C20)
|
#define CE_RNG ECREG(EC_REG_BASE_ADDR + 0x3C20)
|
||||||
|
|
||||||
|
|
||||||
|
/* --- GPIO --- */
|
||||||
|
#define IT8XXX2_GPIO_BASE 0x00F01600
|
||||||
|
#define IT8XXX2_GPIO2_BASE 0x00F03E00
|
||||||
|
|
||||||
|
#define IT8XXX2_GPIO_GCR ECREG(IT8XXX2_GPIO_BASE + 0x00)
|
||||||
|
|
||||||
|
#define IT8XXX2_GPIO_GRC1 ECREG(IT8XXX2_GPIO_BASE + 0xF0)
|
||||||
|
#define IT8XXX2_GPIO_GRC21 ECREG(IT8XXX2_GPIO_BASE + 0xE6)
|
||||||
|
|
||||||
/* Analog to Digital Converter (ADC) */
|
/* Analog to Digital Converter (ADC) */
|
||||||
#define IT83XX_ADC_BASE 0x00f01900
|
#define IT83XX_ADC_BASE 0x00f01900
|
||||||
|
@ -1676,6 +1689,16 @@
|
||||||
#define CGC_OFFSET_SMBB ((IT83XX_ECPM_CGCTRL4R_OFF << 8) | 0x08)
|
#define CGC_OFFSET_SMBB ((IT83XX_ECPM_CGCTRL4R_OFF << 8) | 0x08)
|
||||||
#define CGC_OFFSET_SMBA ((IT83XX_ECPM_CGCTRL4R_OFF << 8) | 0x04)
|
#define CGC_OFFSET_SMBA ((IT83XX_ECPM_CGCTRL4R_OFF << 8) | 0x04)
|
||||||
|
|
||||||
|
#define IT8XXX2_ECPM_AUTOCG ECREG(IT83XX_ECPM_BASE + 0x04)
|
||||||
|
#define IT8XXX2_ECPM_CGCTRL3R ECREG(IT83XX_ECPM_BASE + 0x05)
|
||||||
|
#define IT8XXX2_ECPM_PLLFREQR ECREG(IT83XX_ECPM_BASE + 0x06)
|
||||||
|
#define IT8XXX2_ECPM_PLLCSS ECREG(IT83XX_ECPM_BASE + 0x08)
|
||||||
|
#define IT8XXX2_ECPM_SCDCR0 ECREG(IT83XX_ECPM_BASE + 0x0c)
|
||||||
|
#define IT8XXX2_ECPM_SCDCR1 ECREG(IT83XX_ECPM_BASE + 0x0d)
|
||||||
|
#define IT8XXX2_ECPM_SCDCR2 ECREG(IT83XX_ECPM_BASE + 0x0e)
|
||||||
|
#define IT8XXX2_ECPM_SCDCR3 ECREG(IT83XX_ECPM_BASE + 0x0f)
|
||||||
|
#define IT8XXX2_ECPM_SCDCR4 ECREG(IT83XX_ECPM_BASE + 0x10)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The count number of the counter for 25 ms register.
|
* The count number of the counter for 25 ms register.
|
||||||
* The 25 ms register is calculated by (count number *1.024 kHz).
|
* The 25 ms register is calculated by (count number *1.024 kHz).
|
||||||
|
|
|
@ -15,28 +15,37 @@ static int ite_it8xxx2_init(const struct device *arg)
|
||||||
ARG_UNUSED(arg);
|
ARG_UNUSED(arg);
|
||||||
|
|
||||||
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay)
|
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay)
|
||||||
/* uart1 board init */
|
/* UART1 board init */
|
||||||
CGCTRL3R &= ~(BIT(2));
|
/* bit2: clocks to UART1 modules are not gated. */
|
||||||
AUTOCG &= ~(BIT(6));
|
IT8XXX2_ECPM_CGCTRL3R &= ~BIT(2);
|
||||||
RSTDMMC |= BIT(3); /* Set EC side control */
|
IT8XXX2_ECPM_AUTOCG &= ~BIT(6);
|
||||||
RSTC4 = BIT(1); /* W-One to reset controller */
|
|
||||||
GPCRB0 = 0x00; /* tx pin init */
|
/* bit3: UART1 belongs to the EC side. */
|
||||||
GPCRB1 = 0x00; /* rx pin init */
|
IT83XX_GCTRL_RSTDMMC |= BIT(3);
|
||||||
GPCRF3 = 0x00; /* rts pin init */
|
/* reset UART before config it */
|
||||||
GPCRD5 = 0x00; /* cts pin init */
|
IT83XX_GCTRL_RSTC4 = BIT(1);
|
||||||
|
|
||||||
|
/* switch UART1 on without hardware flow control */
|
||||||
|
IT8XXX2_GPIO_GRC1 |= BIT(0);
|
||||||
|
|
||||||
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay) */
|
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart1), okay) */
|
||||||
|
|
||||||
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay)
|
#if DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay)
|
||||||
/* uart2 board init */
|
/* UART2 board init */
|
||||||
GCR21 &= ~(BIT(0) | BIT(1)); /* setting voltage 3.3v */
|
/* setting voltage 3.3v */
|
||||||
CGCTRL3R &= ~(BIT(2));
|
IT8XXX2_GPIO_GRC21 &= ~(BIT(0) | BIT(1));
|
||||||
AUTOCG &= ~(BIT(5));
|
/* bit2: clocks to UART2 modules are not gated. */
|
||||||
RSTDMMC |= BIT(2); /* Set EC side control */
|
IT8XXX2_ECPM_CGCTRL3R &= ~BIT(2);
|
||||||
RSTC4 = BIT(2); /* W-One to reset controller */
|
IT8XXX2_ECPM_AUTOCG &= ~BIT(5);
|
||||||
GPCRH1 = 0x00; /* tx pin init */
|
|
||||||
GPCRH2 = 0x00; /* rx pin init */
|
/* bit3: UART2 belongs to the EC side. */
|
||||||
GPCRE5 = 0x00; /* rts pin init */
|
IT83XX_GCTRL_RSTDMMC |= BIT(2);
|
||||||
GPCRI7 = 0x00; /* cts pin init */
|
/* reset UART before config it */
|
||||||
|
IT83XX_GCTRL_RSTC4 = BIT(2);
|
||||||
|
|
||||||
|
/* switch UART2 on without hardware flow control */
|
||||||
|
IT8XXX2_GPIO_GRC1 |= BIT(2);
|
||||||
|
|
||||||
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay) */
|
#endif /* DT_NODE_HAS_STATUS(DT_NODELABEL(uart2), okay) */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,11 @@
|
||||||
(*((volatile unsigned char *)(reg)))
|
(*((volatile unsigned char *)(reg)))
|
||||||
|
|
||||||
/* PINMUX config */
|
/* PINMUX config */
|
||||||
#define IT8XXX2_PINMUX_IOF0 0x00
|
#define IT8XXX2_PINMUX_FUNC_1 PINMUX_FUNC_A
|
||||||
#define IT8XXX2_PINMUX_IOF1 0x01
|
#define IT8XXX2_PINMUX_FUNC_2 PINMUX_FUNC_B
|
||||||
#define IT8XXX2_PINMUX_PINS 128
|
#define IT8XXX2_PINMUX_FUNC_3 PINMUX_FUNC_C
|
||||||
|
#define IT8XXX2_PINMUX_FUNC_4 PINMUX_FUNC_D
|
||||||
|
#define IT8XXX2_PINMUX_PINS 8
|
||||||
|
|
||||||
|
|
||||||
#endif /* __RISCV_ITE_SOC_H_ */
|
#endif /* __RISCV_ITE_SOC_H_ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue