summaryrefslogtreecommitdiff
path: root/chip/lm4/gpio.c
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-01-12 16:45:45 -0800
committerRandall Spangler <rspangler@chromium.org>2012-01-12 16:47:46 -0800
commit3c90a7f2ac806bdcdb8f6a6f0f1bc8309caa2c23 (patch)
treed79ee231d543267c2618a8c675b010738da0e8a4 /chip/lm4/gpio.c
parent70a9928add62f6fddb0e9dc8e135246446c66eee (diff)
downloadchrome-ec-3c90a7f2ac806bdcdb8f6a6f0f1bc8309caa2c23.tar.gz
Move board-specific GPIO lists to board-specific files
Signed-off-by: Randall Spangler <rspangler@chromium.org> BUG=chrome-os-partner:7528 TEST=none Change-Id: I47fd5d709a9575e41fdcdf21a7440ebbb762cef5
Diffstat (limited to 'chip/lm4/gpio.c')
-rw-r--r--chip/lm4/gpio.c205
1 files changed, 23 insertions, 182 deletions
diff --git a/chip/lm4/gpio.c b/chip/lm4/gpio.c
index f2c1b38b34..646f50107b 100644
--- a/chip/lm4/gpio.c
+++ b/chip/lm4/gpio.c
@@ -1,10 +1,11 @@
-/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* GPIO module for Chrome EC */
+#include "board.h"
#include "console.h"
#include "gpio.h"
#include "power_button.h"
@@ -24,175 +25,15 @@ const uint32_t gpio_bases[] = {
};
-/* Raw flags for GPIO_INFO */
-#define GI_OUTPUT 0x0001 /* Output */
-#define GI_PULL 0x0002 /* Input with on-chip pullup/pulldown */
-#define GI_HIGH 0x0004 /* If GI_OUTPUT, default high; if GI_PULL, pull
- * up (otherwise default low / pull down) */
-#define GI_INT_RISING 0x0010 /* Interrupt on rising edge */
-#define GI_INT_FALLING 0x0020 /* Interrupt on falling edge */
-#define GI_INT_BOTH 0x0040 /* Interrupt on both edges */
-#define GI_INT_LOW 0x0080 /* Interrupt on low level */
-#define GI_INT_HIGH 0x0100 /* Interrupt on high level */
-/* Common flag combinations */
-#define GI_OUT_LOW GI_OUTPUT
-#define GI_OUT_HIGH (GI_OUTPUT | GI_HIGH)
-#define GI_PULL_DOWN GI_PULL
-#define GI_PULL_UP (GI_PULL | GI_HIGH)
-#define GI_INT_EDGE (GI_INT_RISING | GI_INT_FALLING | GI_INT_BOTH)
-#define GI_INT_LEVEL (GI_INT_LOW | GI_INT_HIGH)
-#define GI_INT_ANY (GI_INT_EDGE | GI_INT_LEVEL)
-/* Note that if no flags are present, the signal is a high-Z input */
-
-struct gpio_info {
- const char *name;
- int port; /* Port (LM4_GPIO_*) */
- int mask; /* Bitmask on that port (0x01 - 0x80; 0x00 =
- signal not implemented) */
- uint32_t flags; /* Flags (GI_*) */
- void (*irq_handler)(enum gpio_signal signal);
-};
-
-/* Macro for signals which don't exist */
-#define SIGNAL_NOT_IMPLEMENTED(name) {name, LM4_GPIO_A, 0, 0, NULL}
-
-/* Signal information. Must match order from enum gpio_signal. */
-#ifdef BOARD_link
-const struct gpio_info signal_info[GPIO_COUNT] = {
- /* Inputs with interrupt handlers are first for efficiency */
- {"POWER_BUTTONn", LM4_GPIO_K, (1<<7), GI_INT_BOTH,
- power_button_interrupt},
- {"LID_SWITCHn", LM4_GPIO_K, (1<<5), GI_INT_BOTH,
- power_button_interrupt},
- /* Other inputs */
- {"POWER_ONEWIRE", LM4_GPIO_H, (1<<2), 0, NULL},
- {"THERMAL_DATA_READYn", LM4_GPIO_B, (1<<4), 0, NULL},
- {"AC_PRESENT", LM4_GPIO_H, (1<<3), 0, NULL},
- {"PCH_BKLTEN", LM4_GPIO_J, (1<<3), 0, NULL},
- {"PCH_SLP_An", LM4_GPIO_G, (1<<5), 0, NULL},
- {"PCH_SLP_ME_CSW_DEVn", LM4_GPIO_G, (1<<4), 0, NULL},
- {"PCH_SLP_S3n", LM4_GPIO_J, (1<<0), 0, NULL},
- {"PCH_SLP_S4n", LM4_GPIO_J, (1<<1), 0, NULL},
- {"PCH_SLP_S5n", LM4_GPIO_J, (1<<2), 0, NULL},
- {"PCH_SLP_SUSn", LM4_GPIO_G, (1<<3), 0, NULL},
- {"PCH_SUSWARNn", LM4_GPIO_G, (1<<2), 0, NULL},
- {"PGOOD_1_5V_DDR", LM4_GPIO_K, (1<<0), 0, NULL},
- {"PGOOD_1_5V_PCH", LM4_GPIO_K, (1<<1), 0, NULL},
- {"PGOOD_1_8VS", LM4_GPIO_K, (1<<3), 0, NULL},
- {"PGOOD_5VALW", LM4_GPIO_H, (1<<0), 0, NULL},
- {"PGOOD_CPU_CORE", LM4_GPIO_M, (1<<3), 0, NULL},
- {"PGOOD_VCCP", LM4_GPIO_K, (1<<2), 0, NULL},
- {"PGOOD_VCCSA", LM4_GPIO_H, (1<<1), 0, NULL},
- {"PGOOD_VGFX_CORE", LM4_GPIO_D, (1<<2), 0, NULL},
- {"RECOVERYn", LM4_GPIO_H, (1<<7), 0, NULL},
- {"USB1_STATUSn", LM4_GPIO_E, (1<<7), 0, NULL},
- {"USB2_STATUSn", LM4_GPIO_E, (1<<1), 0, NULL},
- {"WRITE_PROTECTn", LM4_GPIO_J, (1<<4), 0, NULL},
- /* Outputs; all unasserted by default */
- {"CPU_PROCHOTn", LM4_GPIO_F, (1<<2), GI_OUT_HIGH, NULL},
- {"ENABLE_1_5V_DDR", LM4_GPIO_H, (1<<5), GI_OUT_LOW, NULL},
- {"ENABLE_BACKLIGHT", LM4_GPIO_H, (1<<4), GI_OUT_LOW, NULL},
- {"ENABLE_VCORE", LM4_GPIO_F, (1<<7), GI_OUT_LOW, NULL},
- {"ENABLE_VS", LM4_GPIO_G, (1<<6), GI_OUT_LOW, NULL},
- {"ENTERING_RW", LM4_GPIO_J, (1<<5), GI_OUT_LOW, NULL},
- {"PCH_A20GATE", LM4_GPIO_Q, (1<<6), GI_OUT_LOW, NULL},
- {"PCH_DPWROK", LM4_GPIO_G, (1<<0), GI_OUT_LOW, NULL},
- {"PCH_HDA_SDO", LM4_GPIO_G, (1<<1), GI_OUT_LOW, NULL},
- {"PCH_LID_SWITCHn", LM4_GPIO_F, (1<<0), GI_OUT_HIGH, NULL},
- {"PCH_NMIn", LM4_GPIO_M, (1<<2), GI_OUT_HIGH, NULL},
- {"PCH_PWRBTNn", LM4_GPIO_G, (1<<7), GI_OUT_HIGH, NULL},
- {"PCH_PWROK", LM4_GPIO_F, (1<<5), GI_OUT_LOW, NULL},
- {"PCH_RCINn", LM4_GPIO_Q, (1<<7), GI_OUT_HIGH, NULL},
- /* Exception: RSMRST# is asserted at power-on */
- {"PCH_RSMRSTn", LM4_GPIO_F, (1<<1), GI_OUT_LOW, NULL},
- {"PCH_SMIn", LM4_GPIO_F, (1<<4), GI_OUT_HIGH, NULL},
- {"PCH_SUSACKn", LM4_GPIO_F, (1<<3), GI_OUT_HIGH, NULL},
- {"SHUNT_1_5V_DDR", LM4_GPIO_F, (1<<6), GI_OUT_HIGH, NULL},
- {"USB1_CTL1", LM4_GPIO_E, (1<<2), GI_OUT_LOW, NULL},
- {"USB1_CTL2", LM4_GPIO_E, (1<<3), GI_OUT_LOW, NULL},
- {"USB1_CTL3", LM4_GPIO_E, (1<<4), GI_OUT_LOW, NULL},
- {"USB1_ENABLE", LM4_GPIO_E, (1<<5), GI_OUT_LOW, NULL},
- {"USB1_ILIM_SEL", LM4_GPIO_E, (1<<6), GI_OUT_LOW, NULL},
- {"USB2_CTL1", LM4_GPIO_D, (1<<4), GI_OUT_LOW, NULL},
- {"USB2_CTL2", LM4_GPIO_D, (1<<5), GI_OUT_LOW, NULL},
- {"USB2_CTL3", LM4_GPIO_D, (1<<6), GI_OUT_LOW, NULL},
- {"USB2_ENABLE", LM4_GPIO_D, (1<<7), GI_OUT_LOW, NULL},
- {"USB2_ILIM_SEL", LM4_GPIO_E, (1<<0), GI_OUT_LOW, NULL},
-};
-
-#else
-const struct gpio_info signal_info[GPIO_COUNT] = {
- /* Inputs with interrupt handlers are first for efficiency */
- {"POWER_BUTTONn", LM4_GPIO_C, (1<<5), GI_PULL_UP | GI_INT_BOTH,
- power_button_interrupt},
- {"LID_SWITCHn", LM4_GPIO_D, (1<<0), GI_PULL_UP | GI_INT_BOTH,
- power_button_interrupt},
- SIGNAL_NOT_IMPLEMENTED("POWER_ONEWIRE"),
- SIGNAL_NOT_IMPLEMENTED("THERMAL_DATA_READYn"),
- /* Other inputs */
- SIGNAL_NOT_IMPLEMENTED("AC_PRESENT"),
- SIGNAL_NOT_IMPLEMENTED("PCH_BKLTEN"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SLP_An"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SLP_ME_CSW_DEVn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SLP_S3n"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SLP_S4n"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SLP_S5n"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SLP_SUSn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SUSWARNn"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_1_5V_DDR"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_1_5V_PCH"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_1_8VS"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_5VALW"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_CPU_CORE"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_VCCP"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_VCCSA"),
- SIGNAL_NOT_IMPLEMENTED("PGOOD_VGFX_CORE"),
- SIGNAL_NOT_IMPLEMENTED("RECOVERYn"),
- SIGNAL_NOT_IMPLEMENTED("USB1_STATUSn"),
- SIGNAL_NOT_IMPLEMENTED("USB2_STATUSn"),
- SIGNAL_NOT_IMPLEMENTED("WRITE_PROTECTn"),
- /* Outputs */
- SIGNAL_NOT_IMPLEMENTED("CPU_PROCHOTn"),
- {"DEBUG_LED", LM4_GPIO_A, (1<<7), GI_OUT_LOW, NULL},
- SIGNAL_NOT_IMPLEMENTED("ENABLE_1_5V_DDR"),
- SIGNAL_NOT_IMPLEMENTED("ENABLE_BACKLIGHT"),
- SIGNAL_NOT_IMPLEMENTED("ENABLE_VCORE"),
- SIGNAL_NOT_IMPLEMENTED("ENABLE_VS"),
- SIGNAL_NOT_IMPLEMENTED("ENTERING_RW"),
- SIGNAL_NOT_IMPLEMENTED("PCH_A20GATE"),
- SIGNAL_NOT_IMPLEMENTED("PCH_DPWROK"),
- SIGNAL_NOT_IMPLEMENTED("PCH_HDA_SDO"),
- SIGNAL_NOT_IMPLEMENTED("PCH_LID_SWITCHn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_NMIn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_PWRBTNn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_PWROK"),
- SIGNAL_NOT_IMPLEMENTED("PCH_RCINn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_RSMRSTn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SMIn"),
- SIGNAL_NOT_IMPLEMENTED("PCH_SUSACKn"),
- SIGNAL_NOT_IMPLEMENTED("SHUNT_1_5V_DDR"),
- SIGNAL_NOT_IMPLEMENTED("USB1_CTL1"),
- SIGNAL_NOT_IMPLEMENTED("USB1_CTL2"),
- SIGNAL_NOT_IMPLEMENTED("USB1_CTL3"),
- SIGNAL_NOT_IMPLEMENTED("USB1_ENABLE"),
- SIGNAL_NOT_IMPLEMENTED("USB1_ILIM_SEL"),
- SIGNAL_NOT_IMPLEMENTED("USB2_CTL1"),
- SIGNAL_NOT_IMPLEMENTED("USB2_CTL2"),
- SIGNAL_NOT_IMPLEMENTED("USB2_CTL3"),
- SIGNAL_NOT_IMPLEMENTED("USB2_ENABLE"),
- SIGNAL_NOT_IMPLEMENTED("USB2_ILIM_SEL"),
-};
-
-#endif
-
-#undef SIGNAL_NOT_IMPLEMENTED
+/* Signal information from board.c. Must match order from enum gpio_signal. */
+extern const struct gpio_info gpio_list[GPIO_COUNT];
/* Find a GPIO signal by name. Returns the signal index, or GPIO_COUNT if
* no match. */
static enum gpio_signal find_signal_by_name(const char *name)
{
- const struct gpio_info *g = signal_info;
+ const struct gpio_info *g = gpio_list;
int i;
if (!name || !*name)
@@ -223,7 +64,7 @@ static int find_gpio_port_index(uint32_t port_base)
int gpio_pre_init(void)
{
volatile uint32_t scratch __attribute__((unused));
- const struct gpio_info *g = signal_info;
+ const struct gpio_info *g = gpio_list;
int i;
/* Enable clocks to all the GPIO blocks (since we use all of them as
@@ -247,15 +88,15 @@ int gpio_pre_init(void)
for (i = 0; i < GPIO_COUNT; i++, g++) {
/* Handle GPIO direction */
- if (g->flags & GI_OUTPUT) {
+ if (g->flags & GPIO_OUTPUT) {
/* Output with default level */
- gpio_set_level(i, g->flags & GI_HIGH);
+ gpio_set_level(i, g->flags & GPIO_HIGH);
LM4_GPIO_DIR(g->port) |= g->mask;
} else {
/* Input */
- if (g->flags & GI_PULL) {
+ if (g->flags & GPIO_PULL) {
/* With pull up/down */
- if (g->flags & GI_HIGH)
+ if (g->flags & GPIO_HIGH)
LM4_GPIO_PUR(g->port) |= g->mask;
else
LM4_GPIO_PDR(g->port) |= g->mask;
@@ -266,13 +107,13 @@ int gpio_pre_init(void)
gpio_set_alternate_function(g->port, g->mask, 0);
/* Set up interrupts if necessary */
- if (g->flags & GI_INT_LEVEL)
+ if (g->flags & GPIO_INT_LEVEL)
LM4_GPIO_IS(g->port) |= g->mask;
- if (g->flags & (GI_INT_RISING | GI_INT_HIGH))
+ if (g->flags & (GPIO_INT_RISING | GPIO_INT_HIGH))
LM4_GPIO_IEV(g->port) |= g->mask;
- if (g->flags & GI_INT_BOTH)
+ if (g->flags & GPIO_INT_BOTH)
LM4_GPIO_IBE(g->port) |= g->mask;
- if (g->flags & GI_INT_ANY)
+ if (g->flags & GPIO_INT_ANY)
LM4_GPIO_IM(g->port) |= g->mask;
}
@@ -320,8 +161,8 @@ void gpio_set_alternate_function(int port, int mask, int func)
int gpio_get_level(enum gpio_signal signal)
{
- return LM4_GPIO_DATA(signal_info[signal].port,
- signal_info[signal].mask) ? 1 : 0;
+ return LM4_GPIO_DATA(gpio_list[signal].port,
+ gpio_list[signal].mask) ? 1 : 0;
}
@@ -329,8 +170,8 @@ int gpio_set_level(enum gpio_signal signal, int value)
{
/* Ok to write 0xff becuase LM4_GPIO_DATA bit-masks only the bit
* we care about. */
- LM4_GPIO_DATA(signal_info[signal].port,
- signal_info[signal].mask) = (value ? 0xff : 0);
+ LM4_GPIO_DATA(gpio_list[signal].port,
+ gpio_list[signal].mask) = (value ? 0xff : 0);
return EC_SUCCESS;
}
@@ -340,7 +181,7 @@ int gpio_set_level(enum gpio_signal signal, int value)
static void gpio_interrupt(int port, uint32_t mis)
{
int i = 0;
- const struct gpio_info *g = signal_info;
+ const struct gpio_info *g = gpio_list;
for (i = 0; i < GPIO_COUNT; i++, g++) {
if (port == g->port && (mis & g->mask) && g->irq_handler)
@@ -365,7 +206,7 @@ DECLARE_IRQ(LM4_IRQ_GPIOC, __gpio_c_interrupt, 1);
static int command_gpio_get(int argc, char **argv)
{
- const struct gpio_info *g = signal_info;
+ const struct gpio_info *g = gpio_list;
int i;
/* If a signal is specified, print only that one */
@@ -375,7 +216,7 @@ static int command_gpio_get(int argc, char **argv)
uart_puts("Unknown signal name.\n");
return EC_ERROR_UNKNOWN;
}
- g = signal_info + i;
+ g = gpio_list + i;
uart_printf(" %d %s\n", gpio_get_level(i), g->name);
return EC_SUCCESS;
}
@@ -409,13 +250,13 @@ static int command_gpio_set(int argc, char **argv)
uart_puts("Unknown signal name.\n");
return EC_ERROR_UNKNOWN;
}
- g = signal_info + i;
+ g = gpio_list + i;
if (!g->mask) {
uart_puts("Signal is not implemented.\n");
return EC_ERROR_UNKNOWN;
}
- if (!(g->flags & GI_OUTPUT)) {
+ if (!(g->flags & GPIO_OUTPUT)) {
uart_puts("Signal is not an output.\n");
return EC_ERROR_UNKNOWN;
}