diff options
author | Furquan Shaikh <furquan@google.com> | 2014-04-10 20:35:05 -0700 |
---|---|---|
committer | Marc Jones <marc.jones@se-eng.com> | 2014-11-13 06:28:46 +0100 |
commit | 9d91aba2861a38f0ab99d96d0f53de9a2c73df2d (patch) | |
tree | 66adb95833e23146517d75ea93359b4c95e5c92d /src/soc/qualcomm/ipq806x/gpio.c | |
parent | d551e82beb3b7ca58996a41ddc22ce3fc19dd225 (diff) |
ipq806x: Add support for GPIO operations
Basic support for ipq806x GPIO CFG and IO reg operations
Reference: IPQ806x PRM, u-boot arch-ipq806x/gpio.*
BUG=None
BRANCH=None
TEST=Compiled successfully
Original-Change-Id: Ia0a9f288de3ac7bdb1cd4acbf44ba46af4dcc4e2
Original-Reviewed-on: https://chromium-review.googlesource.com/194217
Original-Tested-by: Furquan Shaikh <furquan@chromium.org>
Original-Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org>
(cherry picked from commit 0b48e6655e63b467fe79d52149be01d23a2a3712)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>
Change-Id: I09e222f35b4b20c8eb901f33cf4451085c4c99cc
Reviewed-on: http://review.coreboot.org/7266
Tested-by: build bot (Jenkins)
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Diffstat (limited to 'src/soc/qualcomm/ipq806x/gpio.c')
-rw-r--r-- | src/soc/qualcomm/ipq806x/gpio.c | 123 |
1 files changed, 110 insertions, 13 deletions
diff --git a/src/soc/qualcomm/ipq806x/gpio.c b/src/soc/qualcomm/ipq806x/gpio.c index 6e4140e4f1..ac41e1a568 100644 --- a/src/soc/qualcomm/ipq806x/gpio.c +++ b/src/soc/qualcomm/ipq806x/gpio.c @@ -28,16 +28,29 @@ * SUCH DAMAGE. */ -#include <asm/arch-ipq806x/iomap.h> -#include <asm/arch-ipq806x/gpio.h> -#include <asm/io.h> +#include <iomap.h> +#include <gpio.h> +#include <arch/io.h> + +/******************************************************* +Function description: check for invalid GPIO # +Arguments : +gpio_t gpio - Gpio number + +Return : GPIO Valid(0)/Invalid(1) +*******************************************************/ + +static inline int gpio_not_valid(gpio_t gpio) +{ + return (gpio > GPIO_MAX_NUM); +} + /******************************************************* Function description: configure GPIO functinality Arguments : -unsigned int gpio - Gpio number +gpio_t gpio - Gpio number unsigned int func - Functionality number -unsigned int dir - direction 0- i/p, 1- o/p 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. @@ -46,17 +59,101 @@ Return : None *******************************************************/ -void gpio_tlmm_config(unsigned int gpio, unsigned int func, - unsigned int dir, unsigned int pull, - unsigned int drvstr, unsigned int enable) +void gpio_tlmm_config_set(gpio_t gpio, unsigned int func, + unsigned int pull, unsigned int drvstr, + unsigned int enable) { unsigned int val = 0; - val |= pull; - val |= func << 2; - val |= drvstr << 6; - val |= enable << 9; + + if (gpio_not_valid(gpio)) + return; + + val |= (pull & GPIO_CFG_PULL_MASK) << GPIO_CFG_PULL_SHIFT; + 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); - return; } +/******************************************************* +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. + +Return : None +*******************************************************/ + + +void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func, + unsigned int *pull, unsigned int *drvstr, + unsigned int *enable) +{ + unsigned int val; + + 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; + *func = (val >> GPIO_CFG_FUNC_SHIFT) & GPIO_CFG_FUNC_MASK; + *drvstr = (val >> GPIO_CFG_DRV_SHIFT) & GPIO_CFG_DRV_MASK; + *enable = (val >> GPIO_CFG_OE_SHIFT) & GPIO_CFG_OE_MASK; +} + +/******************************************************* +Function description: configure GPIO IO functinality +Arguments : +gpio_t gpio - Gpio number +unsigned int out - Controls value of GPIO output + +Return : None +*******************************************************/ + +void gpio_io_config_set(gpio_t gpio, unsigned int out) +{ + unsigned int val; + + if (gpio_not_valid(gpio)) + return; + + unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio); + + val = readl(addr); + if (out) + val |= (1 << GPIO_IO_OUT_SHIFT); + else + val &= (~(1 << GPIO_IO_OUT_SHIFT)); + + writel(val,addr); +} + +/******************************************************* +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) +{ + unsigned int val; + + if (gpio_not_valid(gpio)) + return; + + unsigned int *addr = (unsigned int *)GPIO_CONFIG_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; +} |