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;
+}
 
 #define GPIO_PIN_PE25  (GPIO_PIOE_BASE + 25)
 #define GPIO_PIN_PE26  (GPIO_PIOE_BASE + 26)
 
+#define GPIOF_PULLUP   0x00000001      /* (not-OUT) Enable pull-up */
+#define GPIOF_OUTPUT   0x00000002      /* (OUT) Enable output driver */
+#define GPIOF_DEGLITCH 0x00000004      /* (IN) Filter glitches */
+#define GPIOF_MULTIDRV 0x00000008      /* Enable multidriver option */
+
 static inline void *gpio_pin_to_addr(unsigned int pin)
 {
        switch (pin >> 5) {
 
 void gpio_select_periph_A(unsigned int pin, int use_pullup);
 void gpio_select_periph_B(unsigned int pin, int use_pullup);
+void gpio_select_pio(unsigned int pin, unsigned long gpiof_flags);
+void gpio_set_value(unsigned int pin, int value);
+int gpio_get_value(unsigned int pin);
 
 void gpio_enable_ebi(void);