summaryrefslogtreecommitdiff
path: root/chip/npcx/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/npcx/gpio.c')
-rw-r--r--chip/npcx/gpio.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/chip/npcx/gpio.c b/chip/npcx/gpio.c
index 8c3f6cde0a..1c125c3f57 100644
--- a/chip/npcx/gpio.c
+++ b/chip/npcx/gpio.c
@@ -82,9 +82,9 @@ const struct gpio_lvol_item gpio_lvol_table[] = NPCX_LVOL_TABLE;
/*****************************************************************************/
/* Internal functions */
-static int gpio_match(uint8_t port, uint8_t mask, struct npcx_gpio gpio)
+static int gpio_match(uint8_t port, uint8_t bit, struct npcx_gpio gpio)
{
- return (gpio.valid && (gpio.port == port) && ((1 << gpio.bit) == mask));
+ return (gpio.valid && (gpio.port == port) && (gpio.bit == bit));
}
static int gpio_alt_sel(uint8_t port, uint8_t bit, int8_t func)
@@ -94,7 +94,7 @@ static int gpio_alt_sel(uint8_t port, uint8_t bit, int8_t func)
for (map = ARRAY_BEGIN(gpio_alt_table);
map < ARRAY_END(gpio_alt_table);
map++) {
- if (gpio_match(port, 1 << bit, map->gpio)) {
+ if (gpio_match(port, bit, map->gpio)) {
uint8_t alt_mask = 1 << map->alt.bit;
/*
@@ -177,7 +177,7 @@ static void gpio_interrupt_type_sel(enum gpio_signal signal, uint32_t flags)
}
/* Select low voltage detection level */
-void gpio_low_voltage_level_sel(uint8_t port, uint8_t mask, uint8_t low_voltage)
+void gpio_low_voltage_level_sel(uint8_t port, uint8_t bit, uint8_t low_voltage)
{
int i, j;
@@ -185,7 +185,7 @@ void gpio_low_voltage_level_sel(uint8_t port, uint8_t mask, uint8_t low_voltage)
const struct npcx_gpio *gpio = gpio_lvol_table[i].lvol_gpio;
for (j = 0; j < ARRAY_SIZE(gpio_lvol_table[0].lvol_gpio); j++)
- if (gpio_match(port, mask, gpio[j])) {
+ if (gpio_match(port, bit, gpio[j])) {
if (low_voltage)
/* Select vol-detect level for 1.8V */
SET_BIT(NPCX_LV_GPIO_CTL(i), j);
@@ -198,10 +198,21 @@ void gpio_low_voltage_level_sel(uint8_t port, uint8_t mask, uint8_t low_voltage)
}
if (low_voltage)
- CPRINTS("Warn! No low voltage support in port%d, mask%d\n",
- port, mask);
+ CPRINTS("Warn! No low voltage support in port:0x%x, bit:%d",
+ port, bit);
}
+/* Set the low voltage detection level by mask */
+static void gpio_low_vol_sel_by_mask(uint8_t p, uint8_t mask, uint8_t low_vol)
+{
+ int bit;
+ uint32_t lv_mask = mask;
+
+ while (lv_mask) {
+ bit = get_next_bit(&lv_mask);
+ gpio_low_voltage_level_sel(p, bit, low_vol);
+ };
+}
/* The bypass of low voltage IOs for better power consumption */
#ifdef CONFIG_LOW_POWER_IDLE
static int gpio_is_i2c_pin(enum gpio_signal signal)
@@ -322,9 +333,9 @@ void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags)
* Set IO type to open-drain before selecting low-voltage level
*/
NPCX_PTYPE(port) |= mask;
- gpio_low_voltage_level_sel(port, mask, 1);
+ gpio_low_vol_sel_by_mask(port, mask, 1);
} else
- gpio_low_voltage_level_sel(port, mask, 0);
+ gpio_low_vol_sel_by_mask(port, mask, 0);
/* Set up interrupt type */
if (flags & GPIO_INT_ANY) {