storm: supply vboot GPIO settings in coreboot table

Storm provides three real and two fake gpios. To keep things simple,
define them all as active low and provide appropriate values for the
fake ones.

BUG=chrome-os-partner:30705
TEST=with the appropriate depthcharge change booted proto0, observed
     appropriate behavior following the dev switch setting

Change-Id: Icb7fb55949fa97ead9d19f0da76392ee63bbb5b8
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/210922
This commit is contained in:
Vadim Bendebury 2014-08-01 17:36:45 -07:00 committed by chrome-internal-fetch
commit d48d1dcc88
2 changed files with 53 additions and 0 deletions

View file

@ -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

View file

@ -19,7 +19,11 @@
#include <arch/cache.h>
#include <boot/coreboot_tables.h>
#include <console/console.h>
#include <device/device.h>
#include <delay.h>
#include <string.h>
#include <soc/qualcomm/ipq806x/include/clock.h>
#include <soc/qualcomm/ipq806x/include/gpio.h>
#include <soc/qualcomm/ipq806x/include/usb.h>
@ -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;
}