From d36ef6a51df0d9bb840f091adee8b7bf3424b331 Mon Sep 17 00:00:00 2001 From: Vadim Bendebury Date: Fri, 25 Jul 2014 17:34:42 -0700 Subject: 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 Original-Reviewed-on: https://chromium-review.googlesource.com/210115 Original-Reviewed-by: David Hendricks (cherry picked from commit e951f735001509d135cc61530ed0eecb5fc31a85) Signed-off-by: Marc Jones Change-Id: I8a612dce000931835054086c1b02ebfc43dc57d2 Reviewed-on: http://review.coreboot.org/8718 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer Reviewed-by: Paul Menzel --- src/soc/qualcomm/ipq806x/gpio.c | 97 +++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 51 deletions(-) (limited to 'src/soc/qualcomm/ipq806x/gpio.c') diff --git a/src/soc/qualcomm/ipq806x/gpio.c b/src/soc/qualcomm/ipq806x/gpio.c index ac41e1a568..8cce3ba735 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); +} + -- cgit v1.2.3