aboutsummaryrefslogtreecommitdiff
path: root/src/soc/qualcomm/ipq806x/gpio.c
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2014-07-25 17:34:42 -0700
committerPatrick Georgi <pgeorgi@google.com>2015-03-23 17:20:07 +0100
commitd36ef6a51df0d9bb840f091adee8b7bf3424b331 (patch)
tree9fb86d06b177b6580283944c92a0baf027f234e8 /src/soc/qualcomm/ipq806x/gpio.c
parent9c9c3364643d9b8e138f503c391163475c9dfffc (diff)
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 Reviewed-on: http://review.coreboot.org/8718 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Diffstat (limited to 'src/soc/qualcomm/ipq806x/gpio.c')
-rw-r--r--src/soc/qualcomm/ipq806x/gpio.c97
1 files changed, 46 insertions, 51 deletions
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);
+}
+