summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Staaf <robotboy@chromium.org>2014-07-14 15:33:29 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-07-17 00:39:52 +0000
commit7746b32e17571b0e0cbdcbd101787b742d35c825 (patch)
tree5b4374d93630dda800996687239aac5cec681dc7
parent1e73a1ba06b7879de3b03c7cefec9135bf73fcf5 (diff)
downloadchrome-ec-7746b32e17571b0e0cbdcbd101787b742d35c825.tar.gz
GPIO: Move definition of alternate functions to gpio.inc
This is a straightforward conversion of existing tables into X-Macro style definitions for the GPIO alternate functions. This change in itself, is not particularly powerful, but having all GPIO settings in a single file makes a board easier to understand. Signed-off-by: Anton Staaf <robotboy@chromium.org> BRANCH=none TEST=make buildall -j Followed by manual testing of interrupt on change and UART functionality on STM32F0 based discovery board. Change-Id: Ib7f1f014f4bd289d7c0ac3100470ba2dc71ca579 Reviewed-on: https://chromium-review.googlesource.com/207987 Reviewed-by: Randall Spangler <rspangler@chromium.org> Tested-by: Anton Staaf <robotboy@chromium.org> Commit-Queue: Anton Staaf <robotboy@chromium.org>
-rw-r--r--board/bds/board.c9
-rw-r--r--board/bds/gpio.inc5
-rw-r--r--board/big/board.c8
-rw-r--r--board/big/gpio.inc4
-rw-r--r--board/discovery-stm32f072/board.c6
-rw-r--r--board/discovery-stm32f072/gpio.inc2
-rw-r--r--board/discovery/board.c6
-rw-r--r--board/discovery/gpio.inc2
-rw-r--r--board/falco/board.c18
-rw-r--r--board/falco/gpio.inc14
-rw-r--r--board/firefly/board.c9
-rw-r--r--board/firefly/gpio.inc5
-rw-r--r--board/fruitpie/board.c9
-rw-r--r--board/fruitpie/gpio.inc5
-rw-r--r--board/host/board.c5
-rw-r--r--board/it8380dev/board.c6
-rw-r--r--board/it8380dev/gpio.inc2
-rw-r--r--board/link/board.c19
-rw-r--r--board/link/gpio.inc15
-rw-r--r--board/mccroskey/board.c9
-rw-r--r--board/mec1322_evb/board.c23
-rw-r--r--board/mec1322_evb/gpio.inc19
-rw-r--r--board/nyan/board.c8
-rw-r--r--board/nyan/gpio.inc4
-rw-r--r--board/peppy/board.c16
-rw-r--r--board/peppy/gpio.inc12
-rw-r--r--board/pit/board.c8
-rw-r--r--board/pit/gpio.inc4
-rw-r--r--board/rambi/board.c14
-rw-r--r--board/rambi/gpio.inc10
-rw-r--r--board/ryu/board.c11
-rw-r--r--board/ryu/gpio.inc7
-rw-r--r--board/samus/board.c22
-rw-r--r--board/samus/gpio.inc19
-rw-r--r--board/samus_pd/board.c13
-rw-r--r--board/samus_pd/gpio.inc9
-rw-r--r--board/snow/board.c9
-rw-r--r--board/spring/board.c9
-rw-r--r--board/squawks/board.c15
-rw-r--r--board/squawks/gpio.inc11
-rw-r--r--board/twinkie/board.c9
-rw-r--r--board/twinkie/gpio.inc5
-rw-r--r--board/veyron/board.c8
-rw-r--r--board/veyron/gpio.inc4
-rw-r--r--include/gpio.wrap20
-rw-r--r--include/gpio_list.h13
46 files changed, 190 insertions, 270 deletions
diff --git a/board/bds/board.c b/board/bds/board.c
index 8f2142df09..e1ff649a6f 100644
--- a/board/bds/board.c
+++ b/board/bds/board.c
@@ -39,12 +39,3 @@ const struct i2c_port_t i2c_ports[] = {
const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports);
#include "gpio_list.h"
-
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART}, /* UART0 */
- {GPIO_G, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_G, 0x80, 3, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_B, 0x03, 1, MODULE_UART}, /* UART1 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
diff --git a/board/bds/gpio.inc b/board/bds/gpio.inc
index f22d0d0d7a..06f290e53c 100644
--- a/board/bds/gpio.inc
+++ b/board/bds/gpio.inc
@@ -15,3 +15,8 @@ GPIO(DEBUG_LED, A, 7, GPIO_OUT_LOW, NULL)
*/
UNIMPLEMENTED(WP) /* Write protect input */
UNIMPLEMENTED(ENTERING_RW) /* EC entering RW code */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, 0) /* UART0 */
+ALTERNATE(G, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(G, 0x80, 3, GPIO_OPEN_DRAIN, 0) /* I2C5 SDA */
+ALTERNATE(B, 0x03, 1, MODULE_UART, 0) /* UART1 */
diff --git a/board/big/board.c b/board/big/board.c
index e970a80aa2..ebc7f14a5e 100644
--- a/board/big/board.c
+++ b/board/big/board.c
@@ -29,14 +29,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT},
- {GPIO_A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT},
- {GPIO_B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT},
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_SOC1V8_XPSHOLD, 1, "XPSHOLD"},
diff --git a/board/big/gpio.inc b/board/big/gpio.inc
index f8cd6720a3..e35673e5fe 100644
--- a/board/big/gpio.inc
+++ b/board/big/gpio.inc
@@ -56,3 +56,7 @@ GPIO(CHARGING, A, 11, GPIO_OUT_LOW, NULL)
GPIO(EC_BL_OVERRIDE, H, 1, GPIO_ODR_HIGH, NULL)
GPIO(PMIC_THERM_L, A, 1, GPIO_ODR_HIGH, NULL)
GPIO(PMIC_WARM_RESET_L, C, 3, GPIO_ODR_HIGH, NULL)
+
+ALTERNATE(A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT)
+ALTERNATE(A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT)
+ALTERNATE(B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT)
diff --git a/board/discovery-stm32f072/board.c b/board/discovery-stm32f072/board.c
index 546b07d8d9..9d736dcaf5 100644
--- a/board/discovery-stm32f072/board.c
+++ b/board/discovery-stm32f072/board.c
@@ -33,9 +33,3 @@ static void board_init(void)
gpio_enable_interrupt(GPIO_USER_BUTTON);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0xC000, 1, MODULE_UART}, /* USART2: PA14/PA15 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
diff --git a/board/discovery-stm32f072/gpio.inc b/board/discovery-stm32f072/gpio.inc
index f3e2106452..d0bd0b2f3e 100644
--- a/board/discovery-stm32f072/gpio.inc
+++ b/board/discovery-stm32f072/gpio.inc
@@ -17,3 +17,5 @@ GPIO(LED_R, C, 9, GPIO_OUT_LOW, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
UNIMPLEMENTED(WP_L)
+
+ALTERNATE(A, 0xC000, 1, MODULE_UART, 0) /* USART2: PA14/PA15 */
diff --git a/board/discovery/board.c b/board/discovery/board.c
index 5548577943..1821cb6f7c 100644
--- a/board/discovery/board.c
+++ b/board/discovery/board.c
@@ -23,9 +23,3 @@ static void board_init(void)
gpio_enable_interrupt(GPIO_USER_BUTTON);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x0600, GPIO_ALT_USART, MODULE_UART},
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
diff --git a/board/discovery/gpio.inc b/board/discovery/gpio.inc
index 4f09cc3ab3..91e4d9587b 100644
--- a/board/discovery/gpio.inc
+++ b/board/discovery/gpio.inc
@@ -15,3 +15,5 @@ GPIO(LED_GREEN, B, 7, GPIO_OUT_LOW, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
UNIMPLEMENTED(WP_L)
+
+ALTERNATE(A, 0x0600, GPIO_ALT_USART, MODULE_UART, 0)
diff --git a/board/falco/board.c b/board/falco/board.c
index a9eeee7723..4d04312816 100644
--- a/board/falco/board.c
+++ b/board/falco/board.c
@@ -33,24 +33,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART, GPIO_PULL_UP}, /* UART0 */
- {GPIO_A, 0x40, 3, MODULE_I2C}, /* I2C1 SCL */
- {GPIO_A, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C1 SDA */
- {GPIO_B, 0x04, 3, MODULE_I2C}, /* I2C0 SCL */
- {GPIO_B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C0 SDA */
- {GPIO_B, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_G, 0x30, 1, MODULE_UART}, /* UART2 */
- {GPIO_J, 0x40, 1, MODULE_PECI}, /* PECI Tx */
- {GPIO_J, 0x80, 0, MODULE_PECI, GPIO_ANALOG}, /* PECI Rx */
- {GPIO_L, 0x3f, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0x33, 15, MODULE_LPC}, /* LPC */
- {GPIO_N, 0x0c, 1, MODULE_PWM_FAN}, /* FAN0PWM2 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_PP5000_PGOOD, 1, "PGOOD_PP5000"},
diff --git a/board/falco/gpio.inc b/board/falco/gpio.inc
index f4e714a5da..3356c2ae83 100644
--- a/board/falco/gpio.inc
+++ b/board/falco/gpio.inc
@@ -86,3 +86,17 @@ GPIO(PWR_LED_L, N, 6, GPIO_OUT_HIGH, NULL) /* Power LED */
GPIO(KB_LED_EN, D, 4, GPIO_OUT_LOW, NULL) /* Keyboard LED */
GPIO(BAT_LED0, D, 0, GPIO_OUT_LOW, NULL) /* Battery charger status */
GPIO(BAT_LED1, D, 1, GPIO_OUT_LOW, NULL) /* Battery charger status */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, GPIO_PULL_UP) /* UART0 */
+ALTERNATE(A, 0x40, 3, MODULE_I2C, 0) /* I2C1 SCL */
+ALTERNATE(A, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C1 SDA */
+ALTERNATE(B, 0x04, 3, MODULE_I2C, 0) /* I2C0 SCL */
+ALTERNATE(B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C0 SDA */
+ALTERNATE(B, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C5 SDA */
+ALTERNATE(G, 0x30, 1, MODULE_UART, 0) /* UART2 */
+ALTERNATE(J, 0x40, 1, MODULE_PECI, 0) /* PECI Tx */
+ALTERNATE(J, 0x80, 0, MODULE_PECI, GPIO_ANALOG) /* PECI Rx */
+ALTERNATE(L, 0x3f, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0x33, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(N, 0x0c, 1, MODULE_PWM_FAN, 0) /* FAN0PWM2 */
diff --git a/board/firefly/board.c b/board/firefly/board.c
index e5a9277ca7..da660ee0bc 100644
--- a/board/firefly/board.c
+++ b/board/firefly/board.c
@@ -80,15 +80,6 @@ void board_config_pre_init(void)
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_B, 0x0008, 0, MODULE_USB_PD},/* SPI1: SCK(PB3) */
- {GPIO_B, 0x0200, 2, MODULE_USB_PD},/* TIM17_CH1: PB9) */
- {GPIO_A, 0x0600, 1, MODULE_UART, GPIO_PULL_UP},/* USART1: PA9/PA10 */
- {GPIO_B, 0x00c0, 1, MODULE_I2C}, /* I2C SLAVE:PB6/7 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
/* USB PD CC lines sensing. Converted to mV (3300mV/4096). */
diff --git a/board/firefly/gpio.inc b/board/firefly/gpio.inc
index bf4a70851a..49863406c0 100644
--- a/board/firefly/gpio.inc
+++ b/board/firefly/gpio.inc
@@ -59,3 +59,8 @@ GPIO(TP_F1, F, 1, GPIO_ODR_HIGH, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
UNIMPLEMENTED(WP_L)
+
+ALTERNATE(B, 0x0008, 0, MODULE_USB_PD, 0) /* SPI1: SCK(PB3) */
+ALTERNATE(B, 0x0200, 2, MODULE_USB_PD, 0) /* TIM17_CH1: PB9) */
+ALTERNATE(A, 0x0600, 1, MODULE_UART, GPIO_PULL_UP) /* USART1: PA9/PA10 */
+ALTERNATE(B, 0x00c0, 1, MODULE_I2C, 0) /* I2C SLAVE:PB6/7 */
diff --git a/board/fruitpie/board.c b/board/fruitpie/board.c
index e734c5c2af..7cde9d9d98 100644
--- a/board/fruitpie/board.c
+++ b/board/fruitpie/board.c
@@ -47,15 +47,6 @@ static void board_init(void)
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_B, 0x2000, 0, MODULE_USB_PD},/* SPI2: SCK(PB13) */
- {GPIO_B, 0x0200, 2, MODULE_USB_PD},/* TIM17_CH1: PB9) */
- {GPIO_A, 0xC000, 1, MODULE_UART}, /* USART2: PA14/PA15 */
- {GPIO_B, 0x0cc0, 1, MODULE_I2C}, /* I2C SLAVE:PB6/7 MASTER:PB10/11 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
/* USB PD CC lines sensing. Converted to mV (3300mV/4096). */
diff --git a/board/fruitpie/gpio.inc b/board/fruitpie/gpio.inc
index ff41c5f212..39aabd455a 100644
--- a/board/fruitpie/gpio.inc
+++ b/board/fruitpie/gpio.inc
@@ -66,3 +66,8 @@ GPIO(TP11, F, 1, GPIO_ODR_HIGH, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
UNIMPLEMENTED(WP_L)
+
+ALTERNATE(B, 0x2000, 0, MODULE_USB_PD, 0) /* SPI2: SCK(PB13) */
+ALTERNATE(B, 0x0200, 2, MODULE_USB_PD, 0) /* TIM17_CH1: PB9) */
+ALTERNATE(A, 0xC000, 1, MODULE_UART, 0) /* USART2: PA14/PA15 */
+ALTERNATE(B, 0x0cc0, 1, MODULE_I2C, 0) /* I2C SLAVE:PB6/7 MASTER:PB10/11 */
diff --git a/board/host/board.c b/board/host/board.c
index 407018a573..055fad8192 100644
--- a/board/host/board.c
+++ b/board/host/board.c
@@ -23,11 +23,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions; not on simulated host platform */
-const struct gpio_alt_func gpio_alt_funcs[] = {
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
test_mockable_static int dummy_temp_get_val(int idx, int *temp_ptr)
{
*temp_ptr = 0;
diff --git a/board/it8380dev/board.c b/board/it8380dev/board.c
index 51799ba46a..401a221c44 100644
--- a/board/it8380dev/board.c
+++ b/board/it8380dev/board.c
@@ -24,12 +24,6 @@ void test_interrupt(enum gpio_signal signal)
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_B, 0x03, 1, MODULE_UART, GPIO_PULL_UP}, /* UART0 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* Initialize board. */
static void board_init(void)
{
diff --git a/board/it8380dev/gpio.inc b/board/it8380dev/gpio.inc
index dd8ffebde2..5091fdb3ef 100644
--- a/board/it8380dev/gpio.inc
+++ b/board/it8380dev/gpio.inc
@@ -30,3 +30,5 @@ GPIO(START_SW, E, 4, GPIO_INT_FALLING, test_interrupt)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
+
+ALTERNATE(B, 0x03, 1, MODULE_UART, GPIO_PULL_UP) /* UART0 */
diff --git a/board/link/board.c b/board/link/board.c
index f3e22f720e..8e2881a664 100644
--- a/board/link/board.c
+++ b/board/link/board.c
@@ -31,25 +31,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART}, /* UART0 */
- {GPIO_A, 0x40, 3, MODULE_I2C}, /* I2C1 SCL */
- {GPIO_A, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C1 SDA */
- {GPIO_B, 0x04, 3, MODULE_I2C}, /* I2C0 SCL */
- {GPIO_B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C0 SDA */
- {GPIO_B, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_C, 0x30, 2, MODULE_UART}, /* UART1 */
- {GPIO_J, 0x40, 1, MODULE_PECI}, /* PECI Tx */
- {GPIO_J, 0x80, 0, MODULE_PECI, GPIO_ANALOG}, /* PECI Rx */
- {GPIO_K, 0x40, 1, MODULE_PWM_KBLIGHT}, /* FAN0PWM1 */
- {GPIO_L, 0x3f, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0x33, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0xc0, 1, MODULE_PWM_FAN}, /* FAN0PWM0 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_PGOOD_5VALW, 1, "PGOOD_5VALW"},
diff --git a/board/link/gpio.inc b/board/link/gpio.inc
index 30d5116110..a7c909866f 100644
--- a/board/link/gpio.inc
+++ b/board/link/gpio.inc
@@ -80,3 +80,18 @@ GPIO(USB2_CTL2, D, 5, GPIO_OUT_LOW, NULL) /* USB charger port 2 CTL2
GPIO(USB2_CTL3, D, 6, GPIO_OUT_LOW, NULL) /* USB charger port 2 CTL3 output */
GPIO(USB2_ENABLE, D, 7, GPIO_OUT_LOW, NULL) /* USB charger port 2 enable */
GPIO(USB2_ILIM_SEL, E, 0, GPIO_OUT_LOW, NULL) /* USB charger port 2 ILIM_SEL output */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, 0) /* UART0 */
+ALTERNATE(A, 0x40, 3, MODULE_I2C, 0) /* I2C1 SCL */
+ALTERNATE(A, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C1 SDA */
+ALTERNATE(B, 0x04, 3, MODULE_I2C, 0) /* I2C0 SCL */
+ALTERNATE(B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C0 SDA */
+ALTERNATE(B, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C5 SDA */
+ALTERNATE(C, 0x30, 2, MODULE_UART, 0) /* UART1 */
+ALTERNATE(J, 0x40, 1, MODULE_PECI, 0) /* PECI Tx */
+ALTERNATE(J, 0x80, 0, MODULE_PECI, GPIO_ANALOG) /* PECI Rx */
+ALTERNATE(K, 0x40, 1, MODULE_PWM_KBLIGHT, 0) /* FAN0PWM1 */
+ALTERNATE(L, 0x3f, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0x33, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0xc0, 1, MODULE_PWM_FAN, 0) /* FAN0PWM0 */
diff --git a/board/mccroskey/board.c b/board/mccroskey/board.c
index 20dff4a0b0..40993923ce 100644
--- a/board/mccroskey/board.c
+++ b/board/mccroskey/board.c
@@ -24,15 +24,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- /*
- * TODO(crosbug.com/p/23494): Use this instead of hard-coded register
- * writes in board_config_pre_init().
- */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
void board_config_pre_init(void)
{
uint32_t val;
diff --git a/board/mec1322_evb/board.c b/board/mec1322_evb/board.c
index 38ff53f332..7deae735b8 100644
--- a/board/mec1322_evb/board.c
+++ b/board/mec1322_evb/board.c
@@ -17,29 +17,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_PORT(16), 0x24, 1, MODULE_UART}, /* UART0 */
- {GPIO_PORT(3), (1 << 4), 3, MODULE_PWM_FAN},
- {GPIO_PORT(14), (1 << 0), 3, MODULE_PWM_FAN},
- /*
- * I2C0: External pull-up resistors on EVB are too weak. Let's
- * also enable internal pull-up here.
- */
- {GPIO_PORT(1), 0x60, 2, MODULE_I2C, GPIO_PULL_UP},
- {GPIO_PORT(0), 0xfe, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_OUTPUT},
- {GPIO_PORT(1), 0x03, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_OUTPUT},
- {GPIO_PORT(3), 0x04, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT},
- {GPIO_PORT(4), 0x0d, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT},
- {GPIO_PORT(10), 0xd8, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_OUTPUT},
- {GPIO_PORT(12), 0x60, 2, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT},
- {GPIO_PORT(14), 0x14, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT},
- {GPIO_PORT(2), 0x20, 2, MODULE_LPC},
- {GPIO_PORT(12), 0x14, 1, MODULE_SPI},
- {GPIO_PORT(6), 0x10, 1, MODULE_SPI},
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
[ADC_CH_1] = {"ADC1", 1, 1, 0, MEC1322_ADC_CH(1)},
diff --git a/board/mec1322_evb/gpio.inc b/board/mec1322_evb/gpio.inc
index b008e90a5c..35baf9c77d 100644
--- a/board/mec1322_evb/gpio.inc
+++ b/board/mec1322_evb/gpio.inc
@@ -24,3 +24,22 @@ GPIO(SHD_CS0, PORT(15), 0, GPIO_ODR_HIGH, NULL)
UNIMPLEMENTED(RECOVERY_L) /* Recovery signal from DOWN button */
UNIMPLEMENTED(WP) /* Write protect input */
UNIMPLEMENTED(ENTERING_RW) /* EC entering RW code */
+
+ALTERNATE(PORT(16), 0x24, 1, MODULE_UART, 0) /* UART0 */
+ALTERNATE(PORT(3), (1 << 4), 3, MODULE_PWM_FAN, 0)
+ALTERNATE(PORT(14), (1 << 0), 3, MODULE_PWM_FAN, 0)
+/*
+ * I2C0: External pull-up resistors on EVB are too weak. Let's
+ * also enable internal pull-up here.
+ */
+ALTERNATE(PORT(1), 0x60, 2, MODULE_I2C, GPIO_PULL_UP)
+ALTERNATE(PORT(0), 0xfe, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_OUTPUT)
+ALTERNATE(PORT(1), 0x03, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_OUTPUT)
+ALTERNATE(PORT(3), 0x04, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT)
+ALTERNATE(PORT(4), 0x0d, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT)
+ALTERNATE(PORT(10), 0xd8, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_OUTPUT)
+ALTERNATE(PORT(12), 0x60, 2, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT)
+ALTERNATE(PORT(14), 0x14, 3, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT)
+ALTERNATE(PORT(2), 0x20, 2, MODULE_LPC, 0)
+ALTERNATE(PORT(12), 0x14, 1, MODULE_SPI, 0)
+ALTERNATE(PORT(6), 0x10, 1, MODULE_SPI, 0)
diff --git a/board/nyan/board.c b/board/nyan/board.c
index 89d6a72dd7..4c246cc520 100644
--- a/board/nyan/board.c
+++ b/board/nyan/board.c
@@ -28,14 +28,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT},
- {GPIO_A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT},
- {GPIO_B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT},
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_SOC1V8_XPSHOLD, 1, "XPSHOLD"},
diff --git a/board/nyan/gpio.inc b/board/nyan/gpio.inc
index f8cd6720a3..e35673e5fe 100644
--- a/board/nyan/gpio.inc
+++ b/board/nyan/gpio.inc
@@ -56,3 +56,7 @@ GPIO(CHARGING, A, 11, GPIO_OUT_LOW, NULL)
GPIO(EC_BL_OVERRIDE, H, 1, GPIO_ODR_HIGH, NULL)
GPIO(PMIC_THERM_L, A, 1, GPIO_ODR_HIGH, NULL)
GPIO(PMIC_WARM_RESET_L, C, 3, GPIO_ODR_HIGH, NULL)
+
+ALTERNATE(A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT)
+ALTERNATE(A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT)
+ALTERNATE(B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT)
diff --git a/board/peppy/board.c b/board/peppy/board.c
index 0758daeec6..3a3a92d29f 100644
--- a/board/peppy/board.c
+++ b/board/peppy/board.c
@@ -32,22 +32,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART, GPIO_PULL_UP}, /* UART0 */
- {GPIO_B, 0x04, 3, MODULE_I2C}, /* I2C0 SCL */
- {GPIO_B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C0 SDA */
- {GPIO_B, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_G, 0x30, 1, MODULE_UART}, /* UART2 */
- {GPIO_J, 0x40, 1, MODULE_PECI}, /* PECI Tx */
- {GPIO_J, 0x80, 0, MODULE_PECI, GPIO_ANALOG}, /* PECI Rx */
- {GPIO_L, 0x3f, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0x33, 15, MODULE_LPC}, /* LPC */
- {GPIO_N, 0x0c, 1, MODULE_PWM_FAN}, /* FAN0PWM2 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_PP5000_PGOOD, 1, "PGOOD_PP5000"},
diff --git a/board/peppy/gpio.inc b/board/peppy/gpio.inc
index 47c4b89a7d..3e275ec397 100644
--- a/board/peppy/gpio.inc
+++ b/board/peppy/gpio.inc
@@ -87,3 +87,15 @@ GPIO(BAT_LED0_L, D, 0, GPIO_ODR_HIGH, NULL) /* Battery charging LED -
GPIO(BAT_LED1_L, N, 4, GPIO_ODR_HIGH, NULL) /* Battery charging LED - orange */
GPIO(PWR_LED0_L, D, 1, GPIO_ODR_HIGH, NULL) /* Power LED - blue */
GPIO(PWR_LED1_L, N, 6, GPIO_ODR_HIGH, NULL) /* Power LED - orange */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, GPIO_PULL_UP) /* UART0 */
+ALTERNATE(B, 0x04, 3, MODULE_I2C, 0) /* I2C0 SCL */
+ALTERNATE(B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C0 SDA */
+ALTERNATE(B, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C5 SDA */
+ALTERNATE(G, 0x30, 1, MODULE_UART, 0) /* UART2 */
+ALTERNATE(J, 0x40, 1, MODULE_PECI, 0) /* PECI Tx */
+ALTERNATE(J, 0x80, 0, MODULE_PECI, GPIO_ANALOG) /* PECI Rx */
+ALTERNATE(L, 0x3f, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0x33, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(N, 0x0c, 1, MODULE_PWM_FAN, 0) /* FAN0PWM2 */
diff --git a/board/pit/board.c b/board/pit/board.c
index 08f5697cfc..7015a96d4f 100644
--- a/board/pit/board.c
+++ b/board/pit/board.c
@@ -26,14 +26,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI},
- {GPIO_A, 0x0600, GPIO_ALT_USART, MODULE_UART},
- {GPIO_B, 0x0cc0, GPIO_ALT_I2C, MODULE_I2C},
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* Battery temperature ranges in degrees C */
static const struct battery_info info = {
.start_charging_min_c = 0,
diff --git a/board/pit/gpio.inc b/board/pit/gpio.inc
index 2f64bf01e3..8c00cab0bd 100644
--- a/board/pit/gpio.inc
+++ b/board/pit/gpio.inc
@@ -56,3 +56,7 @@ GPIO(KB_OUT09, B, 1, GPIO_KB_OUTPUT, NULL)
GPIO(KB_OUT10, C, 5, GPIO_KB_OUTPUT, NULL)
GPIO(KB_OUT11, C, 4, GPIO_KB_OUTPUT, NULL)
GPIO(KB_OUT12, A, 13, GPIO_KB_OUTPUT, NULL)
+
+ALTERNATE(A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, 0)
+ALTERNATE(A, 0x0600, GPIO_ALT_USART, MODULE_UART, 0)
+ALTERNATE(B, 0x0cc0, GPIO_ALT_I2C, MODULE_I2C, 0)
diff --git a/board/rambi/board.c b/board/rambi/board.c
index 9810f5a0c5..35e5849b73 100644
--- a/board/rambi/board.c
+++ b/board/rambi/board.c
@@ -34,20 +34,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART}, /* UART0 */
- {GPIO_B, 0x04, 3, MODULE_I2C}, /* I2C0 SCL */
- {GPIO_B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C0 SDA */
- {GPIO_B, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_D, 0x0f, 2, MODULE_SPI}, /* SPI1 */
- {GPIO_L, 0x3f, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0x21, 15, MODULE_LPC}, /* LPC */
- {GPIO_N, 0x50, 1, MODULE_PWM_LED, GPIO_OPEN_DRAIN}, /* FAN0PWM 3&4 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_PP1050_PGOOD, 1, "PGOOD_PP1050"},
diff --git a/board/rambi/gpio.inc b/board/rambi/gpio.inc
index cdeac22574..43a87ae928 100644
--- a/board/rambi/gpio.inc
+++ b/board/rambi/gpio.inc
@@ -65,3 +65,13 @@ GPIO(VCORE_EN, C, 5, GPIO_OUT_LOW, NULL) /* Enable core power suppli
GPIO(WLAN_OFF_L, J, 4, GPIO_OUT_LOW, NULL) /* Disable WiFi radio */
GPIO(PCH_SCI_L, M, 1, GPIO_ODR_HIGH, NULL) /* Assert SCI to PCH */
GPIO(KBD_IRQ_L, M, 3, GPIO_ODR_HIGH, NULL) /* Negative edge triggered irq. */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, 0) /* UART0 */
+ALTERNATE(B, 0x04, 3, MODULE_I2C, 0) /* I2C0 SCL */
+ALTERNATE(B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C0 SDA */
+ALTERNATE(B, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C5 SDA */
+ALTERNATE(D, 0x0f, 2, MODULE_SPI, 0) /* SPI1 */
+ALTERNATE(L, 0x3f, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0x21, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(N, 0x50, 1, MODULE_PWM_LED, GPIO_OPEN_DRAIN) /* FAN0PWM 3&4 */
diff --git a/board/ryu/board.c b/board/ryu/board.c
index 88ae11f796..7c6af05513 100644
--- a/board/ryu/board.c
+++ b/board/ryu/board.c
@@ -52,17 +52,6 @@ static void board_init(void)
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_B, 0x0008, 0, MODULE_USB_PD},/* SPI1: SCK(PB3) */
- {GPIO_B, 0x0002, 0, MODULE_USB_PD},/* TIM14_CH1: PB1 */
- {GPIO_B, 0x00C0, 0, MODULE_UART}, /* USART1: PB6/PB7 */
- {GPIO_A, 0xC000, 1, MODULE_UART}, /* USART2: PA14/PA15 */
- {GPIO_C, 0x0C00, 1, MODULE_UART}, /* USART3: PC10/PC11 */
- {GPIO_B, 0x0F00, 1, MODULE_I2C}, /* I2C SLAVE:PB10/11 MASTER:PB8/9 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
/* Vbus sensing. Converted to mV, /10 voltage divider. */
diff --git a/board/ryu/gpio.inc b/board/ryu/gpio.inc
index 2c90eb3303..c656550087 100644
--- a/board/ryu/gpio.inc
+++ b/board/ryu/gpio.inc
@@ -109,3 +109,10 @@ GPIO(SH_UART_RX, C, 10, GPIO_INPUT, NULL)
GPIO(AP_UART_TX, B, 6, GPIO_OUT_LOW, NULL)
GPIO(AP_UART_RX, B, 7, GPIO_INPUT, NULL)
#endif
+
+ALTERNATE(B, 0x0008, 0, MODULE_USB_PD, 0) /* SPI1: SCK(PB3) */
+ALTERNATE(B, 0x0002, 0, MODULE_USB_PD, 0) /* TIM14_CH1: PB1 */
+ALTERNATE(B, 0x00C0, 0, MODULE_UART, 0) /* USART1: PB6/PB7 */
+ALTERNATE(A, 0xC000, 1, MODULE_UART, 0) /* USART2: PA14/PA15 */
+ALTERNATE(C, 0x0C00, 1, MODULE_UART, 0) /* USART3: PC10/PC11 */
+ALTERNATE(B, 0x0F00, 1, MODULE_I2C, 0) /* I2C SLAVE:PB10/11 MASTER:PB8/9 */
diff --git a/board/samus/board.c b/board/samus/board.c
index 046ddfcc5e..06ddb8e0d7 100644
--- a/board/samus/board.c
+++ b/board/samus/board.c
@@ -46,28 +46,6 @@ static void pd_mcu_interrupt(enum gpio_signal signal)
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART}, /* UART0 */
- {GPIO_A, 0x40, 3, MODULE_I2C}, /* I2C1 SCL */
- {GPIO_A, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C1 SDA */
- {GPIO_B, 0x04, 3, MODULE_I2C}, /* I2C0 SCL */
- {GPIO_B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C0 SDA */
- {GPIO_B, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_G, 0x30, 1, MODULE_UART}, /* UART2 */
- {GPIO_J, 0x40, 1, MODULE_PECI}, /* PECI Tx */
- {GPIO_J, 0x80, 0, MODULE_PECI, GPIO_ANALOG}, /* PECI Rx */
- {GPIO_L, 0x3f, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0x33, 15, MODULE_LPC}, /* LPC */
-#ifdef HEY_USE_BUILTIN_CLKRUN
- {GPIO_M, 0x04, 15, MODULE_LPC, GPIO_OPEN_DRAIN},/* LPC */
-#endif
- {GPIO_N, 0x3c, 1, MODULE_PWM_FAN}, /* FAN0PWM 2&3 */
- {GPIO_N, 0x40, 1, MODULE_PWM_KBLIGHT}, /* FAN0PWM4 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_PP1050_PGOOD, 1, "PGOOD_PP1050"},
diff --git a/board/samus/gpio.inc b/board/samus/gpio.inc
index d1c954a17a..d2a4754f52 100644
--- a/board/samus/gpio.inc
+++ b/board/samus/gpio.inc
@@ -97,3 +97,22 @@ GPIO(USB2_CTL2, D, 1, GPIO_OUT_HIGH, NULL) /* USB charger port 2 CTL2
GPIO(USB2_CTL3, D, 4, GPIO_OUT_LOW, NULL) /* USB charger port 2 CTL3 output */
GPIO(USB2_ENABLE, D, 5, GPIO_OUT_HIGH, NULL) /* USB charger port 2 enable */
GPIO(USB2_ILIM_SEL, D, 6, GPIO_OUT_LOW, NULL) /* USB charger port 2 ILIM_SEL output */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, 0) /* UART0 */
+ALTERNATE(A, 0x40, 3, MODULE_I2C, 0) /* I2C1 SCL */
+ALTERNATE(A, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C1 SDA */
+ALTERNATE(B, 0x04, 3, MODULE_I2C, 0) /* I2C0 SCL */
+ALTERNATE(B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C0 SDA */
+ALTERNATE(B, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C5 SDA */
+ALTERNATE(G, 0x30, 1, MODULE_UART, 0) /* UART2 */
+ALTERNATE(J, 0x40, 1, MODULE_PECI, 0) /* PECI Tx */
+ALTERNATE(J, 0x80, 0, MODULE_PECI, GPIO_ANALOG) /* PECI Rx */
+ALTERNATE(L, 0x3f, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0x33, 15, MODULE_LPC, 0) /* LPC */
+#ifdef HEY_USE_BUILTIN_CLKRUN
+ALTERNATE(M, 0x04, 15, MODULE_LPC, GPIO_OPEN_DRAIN) /* LPC */
+#endif
+
+ALTERNATE(N, 0x3c, 1, MODULE_PWM_FAN, 0) /* FAN0PWM 2&3 */
+ALTERNATE(N, 0x40, 1, MODULE_PWM_KBLIGHT, 0) /* FAN0PWM4 */
diff --git a/board/samus_pd/board.c b/board/samus_pd/board.c
index cb6431d6ff..6f7e8a211e 100644
--- a/board/samus_pd/board.c
+++ b/board/samus_pd/board.c
@@ -119,19 +119,6 @@ static void board_init(void)
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_B, 0x0008, 0, MODULE_USB_PD},/* SPI1: SCK(PB3) */
- {GPIO_B, 0x2000, 0, MODULE_USB_PD},/* SPI2: SCK(PB13) */
- {GPIO_B, 0x0002, 0, MODULE_USB_PD},/* TIM14_CH1: PB1) */
- {GPIO_E, 0x0002, 0, MODULE_USB_PD},/* TIM17_CH1: PE1) */
- {GPIO_A, 0x0600, 1, MODULE_UART}, /* USART1: PA9/PA10 */
- {GPIO_D, 0x0060, 0, MODULE_UART}, /* USART2: PD5/PD6 */
- {GPIO_C, 0x0030, 1, MODULE_UART}, /* USART3: PC4/PC5 */
- {GPIO_B, 0x0cc0, 1, MODULE_I2C}, /* I2C SLAVE:PB6/7 MASTER:PB10/11 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
/* USB PD CC lines sensing. Converted to mV (3300mV/4096). */
diff --git a/board/samus_pd/gpio.inc b/board/samus_pd/gpio.inc
index 7da19454af..03480d517f 100644
--- a/board/samus_pd/gpio.inc
+++ b/board/samus_pd/gpio.inc
@@ -121,3 +121,12 @@ GPIO(AP_UART_RX, D, 6, GPIO_INPUT, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
UNIMPLEMENTED(WP_L)
+
+ALTERNATE(B, 0x0008, 0, MODULE_USB_PD, 0) /* SPI1: SCK(PB3) */
+ALTERNATE(B, 0x2000, 0, MODULE_USB_PD, 0) /* SPI2: SCK(PB13) */
+ALTERNATE(B, 0x0002, 0, MODULE_USB_PD, 0) /* TIM14_CH1: PB1) */
+ALTERNATE(E, 0x0002, 0, MODULE_USB_PD, 0) /* TIM17_CH1: PE1) */
+ALTERNATE(A, 0x0600, 1, MODULE_UART, 0) /* USART1: PA9/PA10 */
+ALTERNATE(D, 0x0060, 0, MODULE_UART, 0) /* USART2: PD5/PD6 */
+ALTERNATE(C, 0x0030, 1, MODULE_UART, 0) /* USART3: PC4/PC5 */
+ALTERNATE(B, 0x0cc0, 1, MODULE_I2C, 0) /* I2C SLAVE:PB6/7 MASTER:PB10/11 */
diff --git a/board/snow/board.c b/board/snow/board.c
index 058c95feb2..c356378fb1 100644
--- a/board/snow/board.c
+++ b/board/snow/board.c
@@ -33,15 +33,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- /*
- * TODO(crosbug.com/p/21618): use this instead of hard-coded register
- * writes in board_config_pre_init().
- */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* Battery temperature ranges in degrees C */
static const struct battery_info info = {
.start_charging_min_c = 0,
diff --git a/board/spring/board.c b/board/spring/board.c
index fc8879694c..b501574cd1 100644
--- a/board/spring/board.c
+++ b/board/spring/board.c
@@ -33,15 +33,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- /*
- * TODO(crosbug.com/p/21618): use this instead of hard-coded register
- * writes in board_config_pre_init().
- */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
/*
diff --git a/board/squawks/board.c b/board/squawks/board.c
index f199e99d3e..292dc31ee6 100644
--- a/board/squawks/board.c
+++ b/board/squawks/board.c
@@ -34,21 +34,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x03, 1, MODULE_UART}, /* UART0 */
- {GPIO_B, 0x04, 3, MODULE_I2C}, /* I2C0 SCL */
- {GPIO_B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C0 SDA */
- {GPIO_B, 0x40, 3, MODULE_I2C}, /* I2C5 SCL */
- {GPIO_B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN}, /* I2C5 SDA */
- {GPIO_D, 0x0f, 2, MODULE_SPI}, /* SPI1 */
- {GPIO_L, 0x3f, 15, MODULE_LPC}, /* LPC */
- {GPIO_M, 0x21, 15, MODULE_LPC}, /* LPC */
- {GPIO_N, 0x50, 1, MODULE_PWM_LED, GPIO_OPEN_DRAIN}, /* FAN0PWM 3&4 */
- {GPIO_M, 0x40, 1, MODULE_PWM_LED, GPIO_OPEN_DRAIN}, /* FAN0PWM0 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_PP1050_PGOOD, 1, "PGOOD_PP1050"},
diff --git a/board/squawks/gpio.inc b/board/squawks/gpio.inc
index 8707c8f9cc..a479672acc 100644
--- a/board/squawks/gpio.inc
+++ b/board/squawks/gpio.inc
@@ -65,3 +65,14 @@ GPIO(VCORE_EN, C, 5, GPIO_OUT_LOW, NULL) /* Enable core power suppli
GPIO(WLAN_OFF_L, J, 4, GPIO_OUT_LOW, NULL) /* Disable WiFi radio */
GPIO(PCH_SCI_L, M, 1, GPIO_ODR_HIGH, NULL) /* Assert SCI to PCH */
GPIO(KBD_IRQ_L, M, 3, GPIO_ODR_HIGH, NULL) /* Negative edge triggered irq. */
+
+ALTERNATE(A, 0x03, 1, MODULE_UART, 0) /* UART0 */
+ALTERNATE(B, 0x04, 3, MODULE_I2C, 0) /* I2C0 SCL */
+ALTERNATE(B, 0x08, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C0 SDA */
+ALTERNATE(B, 0x40, 3, MODULE_I2C, 0) /* I2C5 SCL */
+ALTERNATE(B, 0x80, 3, MODULE_I2C, GPIO_OPEN_DRAIN) /* I2C5 SDA */
+ALTERNATE(D, 0x0f, 2, MODULE_SPI, 0) /* SPI1 */
+ALTERNATE(L, 0x3f, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(M, 0x21, 15, MODULE_LPC, 0) /* LPC */
+ALTERNATE(N, 0x50, 1, MODULE_PWM_LED, GPIO_OPEN_DRAIN) /* FAN0PWM 3&4 */
+ALTERNATE(M, 0x40, 1, MODULE_PWM_LED, GPIO_OPEN_DRAIN) /* FAN0PWM0 */
diff --git a/board/twinkie/board.c b/board/twinkie/board.c
index 5e8e2773e0..669533465b 100644
--- a/board/twinkie/board.c
+++ b/board/twinkie/board.c
@@ -54,15 +54,6 @@ static void board_init(void)
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x0020, 0, MODULE_USB_PD},/* SPI1: SCK(PA5) */
- {GPIO_B, 0x0200, 2, MODULE_USB_PD},/* TIM17_CH1: PB9 */
- {GPIO_A, 0x0600, 1, MODULE_UART, GPIO_PULL_UP}, /* USART1: PA9/PA10 */
- {GPIO_B, 0x00C0, 1, MODULE_I2C}, /* I2C1 MASTER:PB6/7 */
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* ADC channels */
const struct adc_t adc_channels[] = {
/* USB PD CC lines sensing. Converted to mV (3300mV/4096). */
diff --git a/board/twinkie/gpio.inc b/board/twinkie/gpio.inc
index 405d6f3b6b..cfb565c753 100644
--- a/board/twinkie/gpio.inc
+++ b/board/twinkie/gpio.inc
@@ -39,3 +39,8 @@ GPIO(CC2_RP3A0, C, 15, GPIO_ODR_HIGH, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
UNIMPLEMENTED(WP_L)
+
+ALTERNATE(A, 0x0020, 0, MODULE_USB_PD, 0) /* SPI1: SCK(PA5) */
+ALTERNATE(B, 0x0200, 2, MODULE_USB_PD, 0) /* TIM17_CH1: PB9 */
+ALTERNATE(A, 0x0600, 1, MODULE_UART, GPIO_PULL_UP) /* USART1: PA9/PA10 */
+ALTERNATE(B, 0x00C0, 1, MODULE_I2C, 0) /* I2C1 MASTER:PB6/7 */
diff --git a/board/veyron/board.c b/board/veyron/board.c
index b20f921274..78a5df10bc 100644
--- a/board/veyron/board.c
+++ b/board/veyron/board.c
@@ -29,14 +29,6 @@
#include "gpio_list.h"
-/* Pins with alternate functions */
-const struct gpio_alt_func gpio_alt_funcs[] = {
- {GPIO_A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT},
- {GPIO_A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT},
- {GPIO_B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT},
-};
-const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);
-
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_SOC1V8_XPSHOLD, 1, "XPSHOLD"},
diff --git a/board/veyron/gpio.inc b/board/veyron/gpio.inc
index f8cd6720a3..e35673e5fe 100644
--- a/board/veyron/gpio.inc
+++ b/board/veyron/gpio.inc
@@ -56,3 +56,7 @@ GPIO(CHARGING, A, 11, GPIO_OUT_LOW, NULL)
GPIO(EC_BL_OVERRIDE, H, 1, GPIO_ODR_HIGH, NULL)
GPIO(PMIC_THERM_L, A, 1, GPIO_ODR_HIGH, NULL)
GPIO(PMIC_WARM_RESET_L, C, 3, GPIO_ODR_HIGH, NULL)
+
+ALTERNATE(A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT)
+ALTERNATE(A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT)
+ALTERNATE(B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT)
diff --git a/include/gpio.wrap b/include/gpio.wrap
index 941d97ac67..cf4fbb319a 100644
--- a/include/gpio.wrap
+++ b/include/gpio.wrap
@@ -16,7 +16,24 @@
* parameters are passed on to the gpio_info directly.
*/
#ifndef GPIO
-#define GPIO(name, port, pin, function, signal)
+#define GPIO(name, port, pin, flags, signal)
+#endif
+
+/*
+ * The ALTERNATE macro is used associate a GPIO with an alternate function.
+ *
+ * Alternate functions allow hardware peripherals access to GPIO pins.
+ * Modules use gpio_config_module to enable and disable the alternate functions
+ * of GPIOs assigned to that module. So if the module parameter is MODULE_UART
+ * then when the uart_init function is called the GPIO will be switched to its
+ * alternate function mode. The function parameter is chip/variant specific
+ * and will usually need to be looked up in the datasheet. The flags parameter
+ * has the same meaning as in the GPIO macro above. This macro can assign
+ * multiple pins on the same port to a module, the second parameter is the
+ * bitmask of pins to be assigned.
+ */
+#ifndef ALTERNATE
+#define ALTERNATE(port, mask, function, module, flags)
#endif
/*
@@ -44,4 +61,5 @@
* Once the gpio.inc file has been included these macros are no longer needed.
*/
#undef GPIO
+#undef ALTERNATE
#undef UNIMPLEMENTED
diff --git a/include/gpio_list.h b/include/gpio_list.h
index 6d41fb9115..9077c17fd2 100644
--- a/include/gpio_list.h
+++ b/include/gpio_list.h
@@ -15,3 +15,16 @@ const struct gpio_info gpio_list[] = {
};
BUILD_ASSERT(ARRAY_SIZE(gpio_list) == GPIO_COUNT);
+
+/*
+ * Construct the gpio_alt_funcs array. This array is used by gpio_config_module
+ * to enable and disable GPIO alternate functions on a module by module basis.
+ */
+#define ALTERNATE(port, mask, function, module, flags) \
+ {GPIO_##port, mask, function, module, flags},
+
+const struct gpio_alt_func gpio_alt_funcs[] = {
+ #include "gpio.wrap"
+};
+
+const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs);