summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/soc/rockchip/common/gpio.c11
-rw-r--r--src/soc/rockchip/common/include/soc/gpio.h10
-rw-r--r--src/soc/rockchip/rk3288/gpio.c6
-rw-r--r--src/soc/rockchip/rk3399/gpio.c33
4 files changed, 52 insertions, 8 deletions
diff --git a/src/soc/rockchip/common/gpio.c b/src/soc/rockchip/common/gpio.c
index 6f30229817..6ea38d4d5f 100644
--- a/src/soc/rockchip/common/gpio.c
+++ b/src/soc/rockchip/common/gpio.c
@@ -21,21 +21,16 @@
#include <soc/soc.h>
#include <stdlib.h>
-enum {
- PULLNONE = 0,
- PULLUP,
- PULLDOWN
-};
-
static void __gpio_input(gpio_t gpio, u32 pull)
{
+ u32 pull_val = gpio_get_pull_val(gpio, pull);
clrbits_le32(&gpio_port[gpio.port]->swporta_ddr, 1 << gpio.num);
if (is_pmu_gpio(gpio))
clrsetbits_le32(gpio_grf_reg(gpio), 3 << (gpio.idx * 2),
- pull << (gpio.idx * 2));
+ pull_val << (gpio.idx * 2));
else
write32(gpio_grf_reg(gpio), RK_CLRSETBITS(3 << (gpio.idx * 2),
- pull << (gpio.idx * 2)));
+ pull_val << (gpio.idx * 2)));
}
void gpio_input(gpio_t gpio)
diff --git a/src/soc/rockchip/common/include/soc/gpio.h b/src/soc/rockchip/common/include/soc/gpio.h
index 55eb41d980..2c72435065 100644
--- a/src/soc/rockchip/common/include/soc/gpio.h
+++ b/src/soc/rockchip/common/include/soc/gpio.h
@@ -72,4 +72,14 @@ int is_pmu_gpio(gpio_t gpio);
/* Return the io addr of gpio register */
void *gpio_grf_reg(gpio_t gpio);
+
+enum {
+ PULLNONE = 0,
+ PULLUP,
+ PULLDOWN
+};
+
+/* The gpio pull bias setting may be different between SoCs */
+u32 gpio_get_pull_val(gpio_t gpio, u32 pull);
+
#endif
diff --git a/src/soc/rockchip/rk3288/gpio.c b/src/soc/rockchip/rk3288/gpio.c
index 8a15b85908..c6104087e4 100644
--- a/src/soc/rockchip/rk3288/gpio.c
+++ b/src/soc/rockchip/rk3288/gpio.c
@@ -50,3 +50,9 @@ void *gpio_grf_reg(gpio_t gpio)
/* There is one pmu gpio, gpio0 , so " - 1" */
return &rk3288_grf->gpio1_p[(gpio.port - 1)][gpio.bank];
}
+
+u32 gpio_get_pull_val(gpio_t gpio, u32 pull)
+{
+ /* use the default gpio pull bias setting defined in soc/gpio.h */
+ return pull;
+}
diff --git a/src/soc/rockchip/rk3399/gpio.c b/src/soc/rockchip/rk3399/gpio.c
index 18e0b70931..a0cf05974c 100644
--- a/src/soc/rockchip/rk3399/gpio.c
+++ b/src/soc/rockchip/rk3399/gpio.c
@@ -47,3 +47,36 @@ void *gpio_grf_reg(gpio_t gpio)
/* There are two pmu gpio, 0 and 1, so " - 2" */
return &rk3399_grf->gpio2_p[(gpio.port - 2)][gpio.bank];
}
+
+#define IS_GPIO_BANK(g, p, b) (g.port == p && g.bank == GPIO_##b)
+
+enum {
+ PULLNONE_1V8 = 0,
+ PULLDOWN_1V8 = 1,
+ PULLUP_1V8 = 3,
+};
+
+u32 gpio_get_pull_val(gpio_t gpio, u32 pull)
+{
+ /* The default pull bias setting defined in soc/gpio.h */
+ u32 pull_val = pull;
+
+ /* GPIO0_A, GPIO0_B, GPIO2_C, GPIO2_D use the 1V8 pull bias setting.
+ * Defined in TRM V.03 Part1 Page 331 and Page 458
+ */
+ if (IS_GPIO_BANK(gpio, 0, A) || IS_GPIO_BANK(gpio, 0, B) ||
+ IS_GPIO_BANK(gpio, 2, C) || IS_GPIO_BANK(gpio, 2, D)) {
+ switch (pull) {
+ case PULLUP:
+ pull_val = PULLUP_1V8;
+ break;
+ case PULLDOWN:
+ pull_val = PULLDOWN_1V8;
+ break;
+ default:
+ pull_val = PULLNONE_1V8;
+ }
+ }
+
+ return pull_val;
+}