summaryrefslogtreecommitdiff
path: root/common/ioexpander.c
diff options
context:
space:
mode:
authorEdward Hill <ecgh@chromium.org>2019-10-10 15:43:02 -0600
committerCommit Bot <commit-bot@chromium.org>2019-10-25 18:52:08 +0000
commit9f392b0d616f6fec17d213736e6bf9f4217392e4 (patch)
tree85eb83515d93fa2cd5fe036d270b2811ff9101cb /common/ioexpander.c
parent7eded13a72691fdce4d66f59c5b119969afa35c0 (diff)
downloadchrome-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.c46
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;