Marc Jones (marc.jones@se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8718
-gerrit
commit 8b0e4b3dd74ce754eede8df6a342e65c2dbaca84 Author: Vadim Bendebury vbendeb@chromium.org Date: Fri Jul 25 17:34:42 2014 -0700
ipq806x: implement GPIO API
Add implementation of the GPIO API defined in src/include/gpiolib.h. Also, clean up the GPIO driver, make it use pointers instead of integers for register address.
This requires a touch in the SPI driver, where the CS GPIO is toggled and in the board function where it enables USB interface.
BUG=chrome-os-partner:30489 TEST=tested with the following patches, observed proto0 properly read the board ID.
Original-Change-Id: I0962947c6bb32a854ca300752d259a48e9e7b4eb Original-Signed-off-by: Vadim Bendebury vbendeb@chromium.org Original-Reviewed-on: https://chromium-review.googlesource.com/210115 Original-Reviewed-by: David Hendricks dhendrix@chromium.org (cherry picked from commit e951f735001509d135cc61530ed0eecb5fc31a85) Signed-off-by: Marc Jones marc.jones@se-eng.com
Change-Id: I8a612dce000931835054086c1b02ebfc43dc57d2 --- src/mainboard/google/storm/mainboard.c | 1 + src/soc/qualcomm/ipq806x/gpio.c | 97 +++++++++++++++----------------- src/soc/qualcomm/ipq806x/include/gpio.h | 5 +- src/soc/qualcomm/ipq806x/include/iomap.h | 4 +- src/soc/qualcomm/ipq806x/spi.c | 4 +- 5 files changed, 53 insertions(+), 58 deletions(-)
diff --git a/src/mainboard/google/storm/mainboard.c b/src/mainboard/google/storm/mainboard.c index bb4cff8..94f3a92 100644 --- a/src/mainboard/google/storm/mainboard.c +++ b/src/mainboard/google/storm/mainboard.c @@ -40,6 +40,7 @@ static void setup_usb(void) #if !CONFIG_BOARD_VARIANT_AP148 gpio_tlmm_config_set(USB_ENABLE_GPIO, FUNC_SEL_GPIO, GPIO_PULL_UP, GPIO_10MA, GPIO_ENABLE); + gpio_set_out_value(USB_ENABLE_GPIO, 1); #endif usb_clock_config();
diff --git a/src/soc/qualcomm/ipq806x/gpio.c b/src/soc/qualcomm/ipq806x/gpio.c index ac41e1a..8cce3ba 100644 --- a/src/soc/qualcomm/ipq806x/gpio.c +++ b/src/soc/qualcomm/ipq806x/gpio.c @@ -50,20 +50,20 @@ static inline int gpio_not_valid(gpio_t gpio) Function description: configure GPIO functinality Arguments : gpio_t gpio - Gpio number -unsigned int func - Functionality number -unsigned int pull - pull up/down, no pull range(0-3) -unsigned int drvstr - range (0 - 7)-> (2- 16)MA steps of 2 -unsigned int enable - 1 - Disable, 2- Enable. +unsigned func - Functionality number +unsigned pull - pull up/down, no pull range(0-3) +unsigned drvstr - range (0 - 7)-> (2- 16)MA steps of 2 +unsigned enable - 0 Disable, 1 - Enable.
Return : None *******************************************************/
-void gpio_tlmm_config_set(gpio_t gpio, unsigned int func, - unsigned int pull, unsigned int drvstr, - unsigned int enable) +void gpio_tlmm_config_set(gpio_t gpio, unsigned func, + unsigned pull, unsigned drvstr, + unsigned enable) { - unsigned int val = 0; + unsigned val = 0;
if (gpio_not_valid(gpio)) return; @@ -72,33 +72,33 @@ void gpio_tlmm_config_set(gpio_t gpio, unsigned int func, val |= (func & GPIO_CFG_FUNC_MASK) << GPIO_CFG_FUNC_SHIFT; val |= (drvstr & GPIO_CFG_DRV_MASK) << GPIO_CFG_DRV_SHIFT; val |= (enable & GPIO_CFG_OE_MASK) << GPIO_CFG_OE_SHIFT; - unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio); - writel(val, addr); + + writel(val, GPIO_CONFIG_ADDR(gpio)); }
/******************************************************* Function description: Get GPIO configuration Arguments : gpio_t gpio - Gpio number -unsigned int *func - Functionality number -unsigned int *pull - pull up/down, no pull range(0-3) -unsigned int *drvstr - range (0 - 7)-> (2- 16)MA steps of 2 -unsigned int *enable - 1 - Disable, 2- Enable. +unsigned *func - Functionality number +unsigned *pull - pull up/down, no pull range(0-3) +unsigned *drvstr - range (0 - 7)-> (2- 16)MA steps of 2 +unsigned *enable - 0 - Disable, 1- Enable.
Return : None *******************************************************/
-void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func, - unsigned int *pull, unsigned int *drvstr, - unsigned int *enable) +void gpio_tlmm_config_get(gpio_t gpio, unsigned *func, + unsigned *pull, unsigned *drvstr, + unsigned *enable) { - unsigned int val; + unsigned val; + void *addr = GPIO_CONFIG_ADDR(gpio);
if (gpio_not_valid(gpio)) return;
- unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio); val = readl(addr);
*pull = (val >> GPIO_CFG_PULL_SHIFT) & GPIO_CFG_PULL_MASK; @@ -108,52 +108,47 @@ void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func, }
/******************************************************* -Function description: configure GPIO IO functinality +Function description: get GPIO IO functinality details Arguments : gpio_t gpio - Gpio number -unsigned int out - Controls value of GPIO output +unsigned *in - Value of GPIO input +unsigned *out - Value of GPIO output
Return : None *******************************************************/ - -void gpio_io_config_set(gpio_t gpio, unsigned int out) +int gpio_get_in_value(gpio_t gpio) { - unsigned int val; - if (gpio_not_valid(gpio)) - return; - - unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio); + return -1;
- val = readl(addr); - if (out) - val |= (1 << GPIO_IO_OUT_SHIFT); - else - val &= (~(1 << GPIO_IO_OUT_SHIFT));
- writel(val,addr); + return (readl(GPIO_IN_OUT_ADDR(gpio)) >> GPIO_IO_IN_SHIFT) & + GPIO_IO_IN_MASK; }
-/******************************************************* -Function description: get GPIO IO functinality details -Arguments : -gpio_t gpio - Gpio number -unsigned int *in - Value of GPIO input -unsigned int *out - Value of GPIO output - -Return : None -*******************************************************/ - -void gpio_io_config_get(gpio_t gpio, unsigned int *in, unsigned int *out) +void gpio_set_out_value(gpio_t gpio, int value) { - unsigned int val; - if (gpio_not_valid(gpio)) return;
- unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio); + writel((value & 1) << GPIO_IO_OUT_SHIFT, GPIO_IN_OUT_ADDR(gpio)); +}
- val = readl(addr); - *in = (val >> GPIO_IO_IN_SHIFT) & GPIO_IO_IN_MASK; - *out = (val >> GPIO_IO_OUT_SHIFT) & GPIO_IO_OUT_MASK; +void gpio_input_pulldown(gpio_t gpio) +{ + gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE, + GPIO_PULL_DOWN, GPIO_2MA, GPIO_DISABLE); } + +void gpio_input_pullup(gpio_t gpio) +{ + gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE, + GPIO_PULL_UP, GPIO_2MA, GPIO_DISABLE); +} + +void gpio_input(gpio_t gpio) +{ + gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE, + GPIO_NO_PULL, GPIO_2MA, GPIO_DISABLE); +} + diff --git a/src/soc/qualcomm/ipq806x/include/gpio.h b/src/soc/qualcomm/ipq806x/include/gpio.h index 1f35aa7..276022c 100644 --- a/src/soc/qualcomm/ipq806x/include/gpio.h +++ b/src/soc/qualcomm/ipq806x/include/gpio.h @@ -64,8 +64,8 @@ #define GPIO_16MA 7
/* GPIO TLMM: Status */ -#define GPIO_ENABLE 0 -#define GPIO_DISABLE 1 +#define GPIO_DISABLE 0 +#define GPIO_ENABLE 1
/* GPIO MAX Valid # */ #define GPIO_MAX_NUM 68 @@ -99,7 +99,6 @@ void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func, unsigned int *enable);
void gpio_io_config_set(gpio_t gpio, unsigned int out); -void gpio_io_config_get(gpio_t gpio, unsigned int *in, unsigned int *out);
/* Keep this to maintain backwards compatibility with the vendor API. */ static inline void gpio_tlmm_config(unsigned int gpio, unsigned int func, diff --git a/src/soc/qualcomm/ipq806x/include/iomap.h b/src/soc/qualcomm/ipq806x/include/iomap.h index 69744bc..c9c8fc4 100644 --- a/src/soc/qualcomm/ipq806x/include/iomap.h +++ b/src/soc/qualcomm/ipq806x/include/iomap.h @@ -81,9 +81,9 @@ #define DGT_CLEAR DGT_REG(0x000C) #define DGT_CLK_CTL DGT_REG(0x0010)
-#define TLMM_BASE_ADDR 0x00800000 +#define TLMM_BASE_ADDR ((char *)0x00800000) #define GPIO_CONFIG_ADDR(x) (TLMM_BASE_ADDR + 0x1000 + (x)*0x10) -#define GPIO_IN_OUT_ADDR(x) (TLMM_BASE_ADDR + 0x1004 + (x)*0x10) +#define GPIO_IN_OUT_ADDR(x) (GPIO_CONFIG_ADDR(x) + 4)
/* Yes, this is not a typo... host2 is actually mapped before host1. */ #define USB_HOST2_XHCI_BASE 0x10000000 diff --git a/src/soc/qualcomm/ipq806x/spi.c b/src/soc/qualcomm/ipq806x/spi.c index 2c16cb6..54d54b2 100644 --- a/src/soc/qualcomm/ipq806x/spi.c +++ b/src/soc/qualcomm/ipq806x/spi.c @@ -279,13 +279,13 @@ static int check_qup_clk_state(unsigned int core_num, int enable) static void CS_change(int port_num, int cs_num, int enable) { unsigned int cs_gpio = cs_gpio_array[port_num][cs_num]; - uint32_t addr = GPIO_IN_OUT_ADDR(cs_gpio); + void *addr = GPIO_IN_OUT_ADDR(cs_gpio); uint32_t val = readl_i(addr);
val &= (~(1 << GPIO_OUTPUT)); if (!enable) val |= (1 << GPIO_OUTPUT); - writel_i(val, addr); + writel(val, addr); }
/*