|
@@ -58,3 +58,59 @@ void gpio_select_periph_B(unsigned int pin, int use_pullup)
|
|
|
else
|
|
|
pio2_writel(base, PUDR, mask);
|
|
|
}
|
|
|
+
|
|
|
+void gpio_select_pio(unsigned int pin, unsigned long gpiof_flags)
|
|
|
+{
|
|
|
+ void *base = gpio_pin_to_addr(pin);
|
|
|
+ uint32_t mask = 1 << (pin & 0x1f);
|
|
|
+
|
|
|
+ if (!base)
|
|
|
+ panic("Invalid GPIO pin %u\n", pin);
|
|
|
+
|
|
|
+ if (gpiof_flags & GPIOF_OUTPUT) {
|
|
|
+ if (gpiof_flags & GPIOF_MULTIDRV)
|
|
|
+ pio2_writel(base, MDER, mask);
|
|
|
+ else
|
|
|
+ pio2_writel(base, MDDR, mask);
|
|
|
+ pio2_writel(base, PUDR, mask);
|
|
|
+ pio2_writel(base, OER, mask);
|
|
|
+ } else {
|
|
|
+ if (gpiof_flags & GPIOF_PULLUP)
|
|
|
+ pio2_writel(base, PUER, mask);
|
|
|
+ else
|
|
|
+ pio2_writel(base, PUDR, mask);
|
|
|
+ if (gpiof_flags & GPIOF_DEGLITCH)
|
|
|
+ pio2_writel(base, IFER, mask);
|
|
|
+ else
|
|
|
+ pio2_writel(base, IFDR, mask);
|
|
|
+ pio2_writel(base, ODR, mask);
|
|
|
+ }
|
|
|
+
|
|
|
+ pio2_writel(base, PER, mask);
|
|
|
+}
|
|
|
+
|
|
|
+void gpio_set_value(unsigned int pin, int value)
|
|
|
+{
|
|
|
+ void *base = gpio_pin_to_addr(pin);
|
|
|
+ uint32_t mask = 1 << (pin & 0x1f);
|
|
|
+
|
|
|
+ if (!base)
|
|
|
+ panic("Invalid GPIO pin %u\n", pin);
|
|
|
+
|
|
|
+ if (value)
|
|
|
+ pio2_writel(base, SODR, mask);
|
|
|
+ else
|
|
|
+ pio2_writel(base, CODR, mask);
|
|
|
+}
|
|
|
+
|
|
|
+int gpio_get_value(unsigned int pin)
|
|
|
+{
|
|
|
+ void *base = gpio_pin_to_addr(pin);
|
|
|
+ int value;
|
|
|
+
|
|
|
+ if (!base)
|
|
|
+ panic("Invalid GPIO pin %u\n", pin);
|
|
|
+
|
|
|
+ value = pio2_readl(base, PDSR);
|
|
|
+ return (value >> (pin & 0x1f)) & 1;
|
|
|
+}
|