summaryrefslogtreecommitdiff
path: root/src/soc/qualcomm/ipq806x/gpio.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2014-04-10 20:35:05 -0700
committerMarc Jones <marc.jones@se-eng.com>2014-11-13 06:28:46 +0100
commit9d91aba2861a38f0ab99d96d0f53de9a2c73df2d (patch)
tree66adb95833e23146517d75ea93359b4c95e5c92d /src/soc/qualcomm/ipq806x/gpio.c
parentd551e82beb3b7ca58996a41ddc22ce3fc19dd225 (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.c123
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;
+}