summaryrefslogtreecommitdiff
path: root/chip/g/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/g/gpio.c')
-rw-r--r--chip/g/gpio.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/chip/g/gpio.c b/chip/g/gpio.c
index 122f7f1f24..6f306b78ef 100644
--- a/chip/g/gpio.c
+++ b/chip/g/gpio.c
@@ -41,6 +41,31 @@ void gpio_set_level(enum gpio_signal signal, int value)
set_one_gpio_bit(g->port, g->mask, value);
}
+int gpio_get_flags_by_mask(uint32_t port, uint32_t mask)
+{
+ uint32_t flags = 0;
+ uint32_t val = 0;
+
+ /* Only one bit must be set. */
+ if ((mask != (mask & -mask)) || (mask == 0))
+ return 0;
+
+ /* Check mode. */
+ /* ARM DDI 0479B: 3.5.2 */
+ val = GR_GPIO_SETDOUTEN(port) & mask;
+ if (val) {
+ flags |= GPIO_OUTPUT;
+ val = GR_GPIO_DOUT(port) & mask;
+ if (val)
+ flags |= GPIO_HIGH;
+ else
+ flags |= GPIO_LOW;
+ } else
+ flags |= GPIO_INPUT;
+
+ return flags;
+}
+
void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags)
{
/* Only matters for outputs */