driver: gpio: npcx: Support GPIO_VOLTAGE_1P8 flag

This CL configures low-voltage (1.8V) detection via GPIO driver with
GPIO_VOLTAGE_1P8 flag. It also adds support for this flag in
pin_get_config() function.

Signed-off-by: Mulin Chao <mlchao@nuvoton.com>
This commit is contained in:
Mulin Chao 2022-07-18 19:01:39 -07:00 committed by Carles Cufí
commit 9267655f42
12 changed files with 267 additions and 52 deletions

View file

@ -30,10 +30,10 @@ struct gpio_npcx_config {
uintptr_t base;
/* IO port */
int port;
/* Size of wui mapping array */
int wui_size;
/* Mapping table between gpio bits and wui */
struct npcx_wui wui_maps[];
struct npcx_wui wui_maps[NPCX_GPIO_PORT_PIN_NUM];
/* Mapping table between gpio bits and lvol */
struct npcx_lvol lvol_maps[NPCX_GPIO_PORT_PIN_NUM];
};
/* Driver data */
@ -98,6 +98,8 @@ void npcx_gpio_disable_io_pads(const struct device *dev, int pin)
static int gpio_npcx_config(const struct device *dev,
gpio_pin_t pin, gpio_flags_t flags)
{
const struct gpio_npcx_config *const config = dev->config;
const struct npcx_lvol *lvol = &config->lvol_maps[pin];
struct gpio_reg *const inst = HAL_INSTANCE(dev);
uint32_t mask = BIT(pin);
@ -121,6 +123,20 @@ static int gpio_npcx_config(const struct device *dev,
inst->PDIR &= ~mask;
}
/* Does this IO pad support low-voltage input (1.8V) detection? */
if (lvol->ctrl != NPCX_DT_LVOL_CTRL_NONE) {
/*
* If this IO pad is configured for low-voltage input detection,
* the related drive type must select to open-drain also.
*/
if ((flags & GPIO_VOLTAGE_1P8) != 0) {
flags |= GPIO_OPEN_DRAIN;
npcx_lvol_set_detect_level(lvol->ctrl, lvol->bit, true);
} else {
npcx_lvol_set_detect_level(lvol->ctrl, lvol->bit, false);
}
}
/* Select open drain 0:push-pull 1:open-drain */
if ((flags & GPIO_OPEN_DRAIN) != 0) {
inst->PTYPE |= mask;
@ -159,6 +175,8 @@ static int gpio_npcx_config(const struct device *dev,
static int gpio_npcx_pin_get_config(const struct device *port, gpio_pin_t pin,
gpio_flags_t *out_flags)
{
const struct gpio_npcx_config *const config = port->config;
const struct npcx_lvol *lvol = &config->lvol_maps[pin];
struct gpio_reg *const inst = HAL_INSTANCE(port);
uint32_t mask = BIT(pin);
gpio_flags_t flags = 0;
@ -192,6 +210,12 @@ static int gpio_npcx_pin_get_config(const struct device *port, gpio_pin_t pin,
}
}
/* Enable low-voltage detection? */
if (lvol->ctrl != NPCX_DT_LVOL_CTRL_NONE &&
npcx_lvol_get_detect_level(lvol->ctrl, lvol->bit)) {
flags |= GPIO_VOLTAGE_1P8;
};
*out_flags = flags;
return 0;
@ -360,9 +384,6 @@ int gpio_npcx_init(const struct device *dev)
{
ARG_UNUSED(dev);
__ASSERT(((const struct gpio_npcx_config *)dev->config)->wui_size ==
NPCX_GPIO_PORT_PIN_NUM,
"wui_maps array size must equal to its pin number");
return 0;
}
@ -374,9 +395,13 @@ int gpio_npcx_init(const struct device *dev)
}, \
.base = DT_INST_REG_ADDR(inst), \
.port = inst, \
.wui_size = NPCX_DT_WUI_ITEMS_LEN(inst), \
.wui_maps = NPCX_DT_WUI_ITEMS_LIST(inst) \
.wui_maps = NPCX_DT_WUI_ITEMS_LIST(inst), \
.lvol_maps = NPCX_DT_LVOL_ITEMS_LIST(inst), \
}; \
BUILD_ASSERT(NPCX_DT_WUI_ITEMS_LEN(inst) == NPCX_GPIO_PORT_PIN_NUM, \
"size of prop. wui-maps must equal to pin number!"); \
BUILD_ASSERT(NPCX_DT_LVOL_ITEMS_LEN(inst) == NPCX_GPIO_PORT_PIN_NUM, \
"size of prop. lvol-maps must equal to pin number!"); \
\
static struct gpio_npcx_data gpio_npcx_data_##inst; \
\

View file

@ -81,7 +81,7 @@
0x400a5000 0x2000>;
reg-names = "scfg", "glue";
#alt-cells = <3>;
#lvol-cells = <4>;
#lvol-cells = <2>;
label = "SCFG";
};

View file

@ -10,119 +10,127 @@
/* Low-Voltage IO Control 0 */
lvol_iob5: lvol00 {
lvols = <&scfg 0x0b 5 0 0>;
lvols = <&scfg 0 0>;
};
lvol_iob4: lvol01 {
lvols = <&scfg 0x0b 4 0 1>;
lvols = <&scfg 0 1>;
};
lvol_iob3: lvol02 {
lvols = <&scfg 0x0b 3 0 2>;
lvols = <&scfg 0 2>;
};
lvol_iob2: lvol03 {
lvols = <&scfg 0x0b 2 0 3>;
lvols = <&scfg 0 3>;
};
lvol_io90: lvol04 {
lvols = <&scfg 0x09 0 0 4>;
lvols = <&scfg 0 4>;
};
lvol_io87: lvol05 {
lvols = <&scfg 0x08 7 0 5>;
lvols = <&scfg 0 5>;
};
lvol_io00: lvol06 {
lvols = <&scfg 0x00 0 0 6>;
lvols = <&scfg 0 6>;
};
lvol_io33: lvol07 {
lvols = <&scfg 0x03 3 0 7>;
lvols = <&scfg 0 7>;
};
/* Low-Voltage IO Control 1 */
lvol_io92: lvol10 {
lvols = <&scfg 0x09 2 1 0>;
lvols = <&scfg 1 0>;
};
lvol_io91: lvol11 {
lvols = <&scfg 0x09 1 1 1>;
lvols = <&scfg 1 1>;
};
lvol_iod1: lvol12 {
lvols = <&scfg 0x0d 1 1 2>;
lvols = <&scfg 1 2>;
};
lvol_iod0: lvol13 {
lvols = <&scfg 0x0d 0 1 3>;
lvols = <&scfg 1 3>;
};
lvol_io36: lvol14 {
lvols = <&scfg 0x03 6 1 4>;
lvols = <&scfg 1 4>;
};
lvol_io64: lvol15 {
lvols = <&scfg 0x06 4 1 5>;
lvols = <&scfg 1 5>;
};
/* Low-Voltage IO Control 2 */
lvol_io74: lvol20 {
lvols = <&scfg 0x07 4 2 0>;
lvols = <&scfg 2 0>;
};
lvol_io73: lvol23 {
lvols = <&scfg 0x07 3 2 3>;
lvols = <&scfg 2 3>;
};
lvol_ioc1: lvol24 {
lvols = <&scfg 0x0c 1 2 4>;
lvols = <&scfg 2 4>;
};
lvol_ioc7: lvol25 {
lvols = <&scfg 0x0c 7 2 5>;
lvols = <&scfg 2 5>;
};
lvol_io34: lvol27 {
lvols = <&scfg 0x03 4 2 7>;
lvols = <&scfg 2 7>;
};
/* Low-Voltage IO Control 3 */
lvol_ioc6: lvol30 {
lvols = <&scfg 0x0c 6 3 0>;
lvols = <&scfg 3 0>;
};
lvol_io37: lvol31 {
lvols = <&scfg 0x03 7 3 1>;
lvols = <&scfg 3 1>;
};
lvol_io40: lvol32 {
lvols = <&scfg 0x04 0 3 2>;
lvols = <&scfg 3 2>;
};
lvol_io82: lvol34 {
lvols = <&scfg 0x08 2 3 4>;
lvols = <&scfg 3 4>;
};
lvol_io75: lvol35 {
lvols = <&scfg 0x07 5 3 5>;
lvols = <&scfg 3 5>;
};
lvol_io80: lvol36 {
lvols = <&scfg 0x08 0 3 6>;
lvols = <&scfg 3 6>;
};
lvol_ioc5: lvol37 {
lvols = <&scfg 0x0c 5 3 7>;
lvols = <&scfg 3 7>;
};
/* Low-Voltage IO Control 4 */
lvol_ioc2: lvol41 {
lvols = <&scfg 0x0c 2 4 1>;
lvols = <&scfg 4 1>;
};
lvol_iof3: lvol42 {
lvols = <&scfg 0x0f 3 4 2>;
lvols = <&scfg 4 2>;
};
lvol_iof2: lvol43 {
lvols = <&scfg 0x0f 2 4 3>;
lvols = <&scfg 4 3>;
};
lvol_iof5: lvol44 {
lvols = <&scfg 0x0f 5 4 4>;
lvols = <&scfg 4 4>;
};
lvol_iof4: lvol45 {
lvols = <&scfg 0x0f 4 4 5>;
lvols = <&scfg 4 5>;
};
lvol_ioe4: lvol46 {
lvols = <&scfg 0x0e 4 4 6>;
lvols = <&scfg 4 6>;
};
lvol_ioe3: lvol47 {
lvols = <&scfg 0x0e 3 4 7>;
lvols = <&scfg 4 7>;
};
/* Low-Voltage IO Control 5 */
lvol_io72: lvol50 {
lvols = <&scfg 0x07 2 5 0>;
lvols = <&scfg 5 0>;
};
lvol_io50: lvol53 {
lvols = <&scfg 0x05 0 5 3>;
lvols = <&scfg 5 3>;
};
/*
* Pseudo Low-Voltage IO Control (i.e. IO pad doesn't support
* low voltage detection.)
*/
lvol_none: lvol-pseudo {
lvols = <&scfg 6 0>;
};
};
};

View file

@ -14,7 +14,7 @@
/* Low-Voltage IO Control 4 */
lvol_io86: lvol40 {
lvols = <&scfg 0x08 6 4 0>;
lvols = <&scfg 4 0>;
};
};
};

View file

@ -14,7 +14,7 @@
/* Low-Voltage IO Control 1 */
lvol_io66: lvol17 {
lvols = <&scfg 0x06 6 1 7>;
lvols = <&scfg 1 7>;
};
};
};

View file

@ -103,81 +103,129 @@
gpio0: gpio@40081000 {
wui-maps = <&wui_io00 &wui_io01 &wui_io02 &wui_io03
&wui_io04 &wui_io05 &wui_io06 &wui_io07>;
lvol-maps = <&lvol_io00 &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio1: gpio@40083000 {
wui-maps = <&wui_io10 &wui_io11 &wui_none &wui_none
&wui_io14 &wui_io15 &wui_io16 &wui_io17>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio2: gpio@40085000 {
wui-maps = <&wui_io20 &wui_io21 &wui_io22 &wui_io23
&wui_io24 &wui_io25 &wui_io26 &wui_io27>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio3: gpio@40087000 {
wui-maps = <&wui_io30 &wui_io31 &wui_none &wui_io33
&wui_io34 &wui_none &wui_io36 &wui_io37>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_io33
&lvol_io34 &lvol_none &lvol_io36 &lvol_io37>;
};
gpio4: gpio@40089000 {
wui-maps = <&wui_io40 &wui_io41 &wui_io42 &wui_io43
&wui_io44 &wui_io45 &wui_io46 &wui_io47>;
lvol-maps = <&lvol_io40 &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio5: gpio@4008b000 {
wui-maps = <&wui_io50 &wui_io51 &wui_io52 &wui_io53
&wui_io54 &wui_io55 &wui_io56 &wui_io57>;
lvol-maps = <&lvol_io50 &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio6: gpio@4008d000 {
wui-maps = <&wui_io60 &wui_io61 &wui_io62 &wui_io63
&wui_io64 &wui_none &wui_none &wui_io67>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_io64 &lvol_none &lvol_none &lvol_none>;
};
gpio7: gpio@4008f000 {
wui-maps = <&wui_io70 &wui_none &wui_io72 &wui_io73
&wui_io74 &wui_io75 &wui_io76 &wui_none>;
lvol-maps = <&lvol_none &lvol_none &lvol_io72 &lvol_io73
&lvol_io74 &lvol_io75 &lvol_none &lvol_none>;
};
gpio8: gpio@40091000 {
wui-maps = <&wui_io80 &wui_io81 &wui_io82 &wui_io83
&wui_none &wui_none &wui_io86 &wui_io87>;
lvol-maps = <&lvol_io80 &lvol_none &lvol_io82 &lvol_none
&lvol_none &lvol_none &lvol_io86 &lvol_io87>;
};
gpio9: gpio@40093000 {
wui-maps = <&wui_io90 &wui_io91 &wui_io92 &wui_io93
&wui_io94 &wui_io95 &wui_io96 &wui_io97>;
lvol-maps = <&lvol_io90 &lvol_io91 &lvol_io92 &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpioa: gpio@40095000 {
wui-maps = <&wui_ioa0 &wui_ioa1 &wui_ioa2 &wui_ioa3
&wui_ioa4 &wui_ioa5 &wui_ioa6 &wui_ioa7>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpiob: gpio@40097000 {
wui-maps = <&wui_iob0 &wui_iob1 &wui_iob2 &wui_iob3
&wui_iob4 &wui_iob5 &wui_none &wui_iob7>;
lvol-maps = <&lvol_none &lvol_none &lvol_iob2 &lvol_iob3
&lvol_iob4 &lvol_iob5 &lvol_none &lvol_none>;
};
gpioc: gpio@40099000 {
wui-maps = <&wui_ioc0 &wui_ioc1 &wui_ioc2 &wui_ioc3
&wui_ioc4 &wui_ioc5 &wui_ioc6 &wui_ioc7>;
lvol-maps = <&lvol_none &lvol_ioc1 &lvol_ioc2 &lvol_none
&lvol_none &lvol_ioc5 &lvol_ioc6 &lvol_ioc7>;
};
gpiod: gpio@4009b000 {
wui-maps = <&wui_iod0 &wui_iod1 &wui_iod2 &wui_iod3
&wui_iod4 &wui_iod5 &wui_none &wui_iod7>;
lvol-maps = <&lvol_iod0 &lvol_iod1 &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpioe: gpio@4009d000 {
wui-maps = <&wui_ioe0 &wui_ioe1 &wui_ioe2 &wui_ioe3
&wui_ioe4 &wui_ioe5 &wui_none &wui_none>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_ioe3
&lvol_ioe4 &lvol_none &lvol_none &lvol_none>;
};
gpiof: gpio@4009f000 {
wui-maps = <&wui_iof0 &wui_iof1 &wui_iof2 &wui_iof3
&wui_iof4 &wui_iof5 &wui_none &wui_none>;
lvol-maps = <&lvol_none &lvol_none &lvol_iof2 &lvol_iof3
&lvol_iof4 &lvol_iof5 &lvol_none &lvol_none>;
};
/* ADC0 comparator configuration in npcx7 series */

View file

@ -125,81 +125,129 @@
gpio0: gpio@40081000 {
wui-maps = <&wui_io00 &wui_io01 &wui_io02 &wui_io03
&wui_io04 &wui_io05 &wui_io06 &wui_io07>;
lvol-maps = <&lvol_io00 &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio1: gpio@40083000 {
wui-maps = <&wui_io10 &wui_io11 &wui_none &wui_none
&wui_io14 &wui_io15 &wui_io16 &wui_io17>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio2: gpio@40085000 {
wui-maps = <&wui_io20 &wui_io21 &wui_io22 &wui_io23
&wui_io24 &wui_io25 &wui_io26 &wui_io27>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio3: gpio@40087000 {
wui-maps = <&wui_io30 &wui_io31 &wui_none &wui_io33
&wui_io34 &wui_none &wui_io36 &wui_io37>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_io33
&lvol_io34 &lvol_none &lvol_io36 &lvol_io37>;
};
gpio4: gpio@40089000 {
wui-maps = <&wui_io40 &wui_io41 &wui_io42 &wui_io43
&wui_io44 &wui_io45 &wui_io46 &wui_io47>;
lvol-maps = <&lvol_io40 &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio5: gpio@4008b000 {
wui-maps = <&wui_io50 &wui_io51 &wui_io52 &wui_io53
&wui_io54 &wui_io55 &wui_io56 &wui_io57>;
lvol-maps = <&lvol_io50 &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpio6: gpio@4008d000 {
wui-maps = <&wui_io60 &wui_io61 &wui_io62 &wui_io63
&wui_io64 &wui_none &wui_io66 &wui_io67>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_io64 &lvol_none &lvol_io66 &lvol_none>;
};
gpio7: gpio@4008f000 {
wui-maps = <&wui_io70 &wui_none &wui_io72 &wui_io73
&wui_io74 &wui_io75 &wui_io76 &wui_none>;
lvol-maps = <&lvol_none &lvol_none &lvol_io72 &lvol_io73
&lvol_io74 &lvol_io75 &lvol_none &lvol_none>;
};
gpio8: gpio@40091000 {
wui-maps = <&wui_io80 &wui_io81 &wui_io82 &wui_io83
&wui_none &wui_none &wui_none &wui_io87>;
lvol-maps = <&lvol_io80 &lvol_none &lvol_io82 &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_io87>;
};
gpio9: gpio@40093000 {
wui-maps = <&wui_io90 &wui_io91 &wui_io92 &wui_io93
&wui_io94 &wui_io95 &wui_io96 &wui_io97>;
lvol-maps = <&lvol_io90 &lvol_io91 &lvol_io92 &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpioa: gpio@40095000 {
wui-maps = <&wui_ioa0 &wui_ioa1 &wui_ioa2 &wui_ioa3
&wui_ioa4 &wui_ioa5 &wui_ioa6 &wui_ioa7>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpiob: gpio@40097000 {
wui-maps = <&wui_iob0 &wui_iob1 &wui_iob2 &wui_iob3
&wui_iob4 &wui_iob5 &wui_iob6 &wui_iob7>;
lvol-maps = <&lvol_none &lvol_none &lvol_iob2 &lvol_iob3
&lvol_iob4 &lvol_iob5 &lvol_none &lvol_none>;
};
gpioc: gpio@40099000 {
wui-maps = <&wui_ioc0 &wui_ioc1 &wui_ioc2 &wui_ioc3
&wui_ioc4 &wui_ioc5 &wui_ioc6 &wui_ioc7>;
lvol-maps = <&lvol_none &lvol_ioc1 &lvol_ioc2 &lvol_none
&lvol_none &lvol_ioc5 &lvol_ioc6 &lvol_ioc7>;
};
gpiod: gpio@4009b000 {
wui-maps = <&wui_iod0 &wui_iod1 &wui_iod2 &wui_iod3
&wui_iod4 &wui_iod5 &wui_none &wui_none>;
lvol-maps = <&lvol_iod0 &lvol_iod1 &lvol_none &lvol_none
&lvol_none &lvol_none &lvol_none &lvol_none>;
};
gpioe: gpio@4009d000 {
wui-maps = <&wui_ioe0 &wui_ioe1 &wui_ioe2 &wui_ioe3
&wui_ioe4 &wui_ioe5 &wui_none &wui_none>;
lvol-maps = <&lvol_none &lvol_none &lvol_none &lvol_ioe3
&lvol_ioe4 &lvol_none &lvol_none &lvol_none>;
};
gpiof: gpio@4009f000 {
wui-maps = <&wui_iof0 &wui_iof1 &wui_iof2 &wui_iof3
&wui_iof4 &wui_iof5 &wui_none &wui_none>;
lvol-maps = <&lvol_none &lvol_none &lvol_iof2 &lvol_iof3
&lvol_iof4 &lvol_iof5 &lvol_none &lvol_none>;
};
/* ADC0 comparator configuration in npcx9 series */

View file

@ -28,6 +28,18 @@ properties:
wui-maps = <&wui_io80 &wui_io81 &wui_io82 &wui_io83
&wui_none &wui_none &wui_io86 &wui_io87>;
lvol-maps:
type: phandles
required: false
description: |
Mapping table between Low-Voltage controllers and 8 IOs belong to
this device. Please notice not all IOs support Low-Voltage detection.
In this case, it will be presented by lvol_none.
For example the LVOL mapping on NPCX7 GPIOC would be
lvol-maps = <&lvol_none &lvol_ioc1 &lvol_ioc2 &lvol_none
&lvol_none &lvol_ioc5 &lvol_ioc6 &lvol_ioc7>;
"#gpio-cells":
const: 2

View file

@ -27,7 +27,5 @@ alt-cells:
- inv
lvol-cells:
- io_port
- io_bit
- ctrl
- bit

View file

@ -74,6 +74,24 @@ static void npcx_pinctrl_alt_sel(const struct npcx_alt *alt, int alt_func)
}
/* Platform specific pin-control functions */
void npcx_lvol_set_detect_level(int lvol_ctrl, int lvol_bit, bool enable)
{
const uintptr_t scfg_base = npcx_scfg_cfg.base_scfg;
if (enable) {
NPCX_LV_GPIO_CTL(scfg_base, lvol_ctrl) |= BIT(lvol_bit);
} else {
NPCX_LV_GPIO_CTL(scfg_base, lvol_ctrl) &= ~BIT(lvol_bit);
}
}
bool npcx_lvol_get_detect_level(int lvol_ctrl, int lvol_bit)
{
const uintptr_t scfg_base = npcx_scfg_cfg.base_scfg;
return NPCX_LV_GPIO_CTL(scfg_base, lvol_ctrl) & BIT(lvol_bit);
}
void npcx_pinctrl_i2c_port_sel(int controller, int port)
{
struct glue_reg *const inst_glue = HAL_GLUE_INST();

View file

@ -333,6 +333,48 @@
1), \
}
/**
* @brief Construct a npcx_lvol structure from 'lvol-maps' property at index 'i'.
*
* @param node_id Node identifier.
* @param prop Low voltage configurations property name. (i.e. 'lvol-maps')
* @param idx Property entry index.
*/
#define NPCX_DT_LVOL_CTRL_NONE \
DT_PHA(DT_NODELABEL(lvol_none), lvols, ctrl)
/**
* @brief Length of npcx_lvol structures in 'lvol-maps' property
*
* @param inst instance number for compatible defined in DT_DRV_COMPAT.
* @return length of 'lvol-maps' prop which type is 'phandles'
*/
#define NPCX_DT_LVOL_ITEMS_LEN(inst) DT_INST_PROP_LEN(inst, lvol_maps)
/**
* @brief Construct a npcx_lvol structure from 'lvol-maps' property at index 'i'.
*
* @param node_id Node identifier.
* @param prop Low voltage configurations property name. (i.e. 'lvol-maps')
* @param idx Property entry index.
*/
#define NPCX_DT_LVOL_ITEMS_INIT(node_id, prop, idx) \
{ \
.ctrl = DT_PHA(DT_PROP_BY_IDX(node_id, prop, idx), lvols, ctrl), \
.bit = DT_PHA(DT_PROP_BY_IDX(node_id, prop, idx), lvols, bit), \
},
/**
* @brief Macro function to construct a list of npcx_lvol items from 'lvol-maps'
* property.
*
* @param inst instance number for compatible defined in DT_DRV_COMPAT.
* @return an array of npcx_lvol items.
*/
#define NPCX_DT_LVOL_ITEMS_LIST(inst) { \
DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), lvol_maps, \
NPCX_DT_LVOL_ITEMS_INIT)}
/**
* @brief Check if the host interface type is automatically configured by
* booter.

View file

@ -35,10 +35,8 @@ struct npcx_alt {
* low-voltage detection.
*/
struct npcx_lvol {
uint16_t io_port:5; /** A io pad's port which support low-voltage. */
uint16_t io_bit:3; /** A io pad's bit which support low-voltage. */
uint16_t ctrl:5; /** Related register index for low-voltage conf. */
uint16_t bit:3; /** Related register bit for low-voltage conf. */
uint8_t ctrl:5; /** Related register index for low-voltage conf. */
uint8_t bit:3; /** Related register bit for low-voltage conf. */
};
/**
@ -62,6 +60,24 @@ int npcx_pinctrl_flash_write_protect_set(void);
*/
bool npcx_pinctrl_flash_write_protect_is_set(void);
/**
* @brief Enable low-voltage input detection
*
* @param lvol_ctrl Related register index for low-voltage detection
* @param lvol_bit Related register bit for low-voltage detection
* @param enable True to enable low-voltage input detection, false to disable.
*/
void npcx_lvol_set_detect_level(int lvol_ctrl, int lvol_bit, bool enable);
/**
* @brief Get status of low-voltage input detection
*
* @param lvol_ctrl Related register index for low-voltage detection
* @param lvol_bit Related register bit for low-voltage detection
* @return True means the low-voltage power supply is enabled, otherwise disabled.
*/
bool npcx_lvol_get_detect_level(int lvol_ctrl, int lvol_bit);
/**
* @brief Select the host interface type
*