diff options
author | Edward Hill <ecgh@chromium.org> | 2019-10-10 15:43:02 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-25 18:52:08 +0000 |
commit | 9f392b0d616f6fec17d213736e6bf9f4217392e4 (patch) | |
tree | 85eb83515d93fa2cd5fe036d270b2811ff9101cb /common/ioexpander.c | |
parent | 7eded13a72691fdce4d66f59c5b119969afa35c0 (diff) | |
download | chrome-ec-9f392b0d616f6fec17d213736e6bf9f4217392e4.tar.gz |
GPIO/IOEX/eSPI: Give different IO signals unique values
There are 3 different IO signal types used by the EC.
Ensure they each use a unique range of values so we can tell them apart.
1) Local GPIO => 0 to 0x0FFF
2) IO expander GPIO => 0x1000 to 0x1FFF
3) eSPI virtual wire signals => 0x2000 to 0x2FFF
BUG=b:138600691
BRANCH=none
TEST=IO expander signals still work on Trembyle
Change-Id: I63fadb4bb4573ed3dd121c24e3bd40a00873e29f
Signed-off-by: Edward Hill <ecgh@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1854778
Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'common/ioexpander.c')
-rw-r--r-- | common/ioexpander.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/common/ioexpander.c b/common/ioexpander.c index 796673a668..6b54fd635e 100644 --- a/common/ioexpander.c +++ b/common/ioexpander.c @@ -29,10 +29,22 @@ static int last_val_changed(int i, int v) } } +int signal_is_ioex(int signal) +{ + return ((signal >= IOEX_SIGNAL_START) && (signal < IOEX_SIGNAL_END)); +} + +static const struct ioex_info *ioex_get_signal_info(enum ioex_signal signal) +{ + ASSERT(signal_is_ioex(signal)); + + return ioex_list + signal - IOEX_SIGNAL_START; +} + static int ioex_is_valid_interrupt_signal(enum ioex_signal signal) { const struct ioexpander_drv *drv; - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); /* Fail if no interrupt handler */ if (signal >= ioex_ih_count) @@ -53,7 +65,7 @@ static int ioex_is_valid_interrupt_signal(enum ioex_signal signal) int ioex_enable_interrupt(enum ioex_signal signal) { int rv; - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); const struct ioexpander_drv *drv; rv = ioex_is_valid_interrupt_signal(signal); @@ -68,7 +80,7 @@ int ioex_disable_interrupt(enum ioex_signal signal) { int rv; const struct ioexpander_drv *drv; - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); rv = ioex_is_valid_interrupt_signal(signal); if (rv != EC_SUCCESS) @@ -92,7 +104,7 @@ int ioex_set_flags_by_mask(int ioex, int port, int mask, int flags) int ioex_get_flags(enum ioex_signal signal, int *flags) { - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); return ioex_config[g->ioex].drv->get_flags_by_mask(g->ioex, g->port, g->mask, flags); @@ -100,7 +112,7 @@ int ioex_get_flags(enum ioex_signal signal, int *flags) int ioex_set_flags(enum ioex_signal signal, int flags) { - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); return ioex_config[g->ioex].drv->set_flags_by_mask(g->ioex, g->port, g->mask, flags); @@ -108,7 +120,7 @@ int ioex_set_flags(enum ioex_signal signal, int flags) int ioex_get_level(enum ioex_signal signal, int *val) { - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); return ioex_config[g->ioex].drv->get_level(g->ioex, g->port, g->mask, val); @@ -116,7 +128,7 @@ int ioex_get_level(enum ioex_signal signal, int *val) int ioex_set_level(enum ioex_signal signal, int value) { - const struct ioex_info *g = ioex_list + signal; + const struct ioex_info *g = ioex_get_signal_info(signal); return ioex_config[g->ioex].drv->set_level(g->ioex, g->port, g->mask, value); @@ -155,7 +167,9 @@ DECLARE_HOOK(HOOK_INIT, ioex_init_default, HOOK_PRIO_INIT_I2C + 1); const char *ioex_get_name(enum ioex_signal signal) { - return ioex_list[signal].name; + const struct ioex_info *g = ioex_get_signal_info(signal); + + return g->name; } static void print_ioex_info(int io) @@ -191,7 +205,9 @@ static void print_ioex_info(int io) int ioex_get_default_flags(enum ioex_signal signal) { - return ioex_list[signal].flags; + const struct ioex_info *g = ioex_get_signal_info(signal); + + return g->flags; } /* IO expander commands */ @@ -200,21 +216,21 @@ static enum ioex_signal find_ioex_by_name(const char *name) int i; if (!name) - return IOEX_COUNT; + return -1; - for (i = 0; i < IOEX_COUNT; i++) { + for (i = IOEX_SIGNAL_START; i < IOEX_SIGNAL_END; i++) { if (!strcasecmp(name, ioex_get_name(i))) return i; } - return IOEX_COUNT; + return -1; } static enum ec_error_list ioex_set(const char *name, int value) { enum ioex_signal signal = find_ioex_by_name(name); - if (signal == IOEX_COUNT) + if (signal == -1) return EC_ERROR_INVAL; if (!(ioex_get_default_flags(signal) & GPIO_OUTPUT)) @@ -251,7 +267,7 @@ static int command_ioex_get(int argc, char **argv) /* If a signal is specified, print only that one */ if (argc == 2) { i = find_ioex_by_name(argv[1]); - if (i == IOEX_COUNT) + if (i == -1) return EC_ERROR_PARAM1; print_ioex_info(i); @@ -259,7 +275,7 @@ static int command_ioex_get(int argc, char **argv) } /* Otherwise print them all */ - for (i = 0; i < IOEX_COUNT; i++) + for (i = IOEX_SIGNAL_START; i < IOEX_SIGNAL_END; i++) print_ioex_info(i); return EC_SUCCESS; |