diff --git a/src/mainboard/google/storm/Kconfig b/src/mainboard/google/storm/Kconfig index 903e8ae7da..b6baef1f3a 100644 --- a/src/mainboard/google/storm/Kconfig +++ b/src/mainboard/google/storm/Kconfig @@ -22,6 +22,7 @@ if BOARD_GOOGLE_STORM config BOARD_SPECIFIC_OPTIONS def_bool y select BOARD_ID_SUPPORT + select CHROMEOS select COMMON_CBFS_SPI_WRAPPER select MAINBOARD_HAS_BOOTBLOCK_INIT select SOC_QC_IPQ806X diff --git a/src/mainboard/google/storm/mainboard.c b/src/mainboard/google/storm/mainboard.c index 94f3a92215..442e9e9581 100644 --- a/src/mainboard/google/storm/mainboard.c +++ b/src/mainboard/google/storm/mainboard.c @@ -19,7 +19,11 @@ #include #include +#include #include +#include +#include + #include #include #include @@ -93,3 +97,51 @@ void lb_board(struct lb_header *header) dma->range_start = CONFIG_DRAM_DMA_START; dma->range_size = CONFIG_DRAM_DMA_SIZE; } + +#define FAKE_GPIO_NUM -1 + +struct gpio_desc { + gpio_t gpio_num; + const char *gpio_name; + uint32_t fake_value; +}; + +static const struct gpio_desc descriptors[] = { + { 15, "developer" }, + { 16, "recovery" }, + { 17, "write protect" }, + { FAKE_GPIO_NUM, "power", 1 }, /* Power never pressed. */ + { FAKE_GPIO_NUM, "lid", 0 } /* Lid always open. */ +}; + +static void fill_lb_gpio(struct lb_gpio *pgpio, const struct gpio_desc *pdesc) +{ + gpio_t gpio_num = pdesc->gpio_num; + + pgpio->port = gpio_num; + if (gpio_num == FAKE_GPIO_NUM) { + pgpio->value = pdesc->fake_value; + } else { + gpio_tlmm_config_set(gpio_num, GPIO_FUNC_DISABLE, + GPIO_NO_PULL, GPIO_2MA, GPIO_DISABLE); + udelay(10); /* Should be enough to settle. */ + pgpio->value = gpio_get_in_value(gpio_num); + } + pgpio->polarity = ACTIVE_LOW; + strncpy((char *)pgpio->name, pdesc->gpio_name, sizeof(pgpio->name)); + + printk(BIOS_INFO, "%s: %s: port %d value %d\n", + __func__, pgpio->name, pgpio->port, pgpio->value); +} + +void fill_lb_gpios(struct lb_gpios *gpios) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(descriptors); i++) + fill_lb_gpio(gpios->gpios + i, descriptors + i); + + + gpios->size = sizeof(*gpios) + sizeof(struct lb_gpio) * i; + gpios->count = i; +}