static DEFINE_SPINLOCK(gpio_lock);
 static const char *gpio_label[GPIO_MAX];  /* non null for allocated GPIOs */
-static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)];
+static unsigned long gpio_valid_input[BITS_TO_LONGS(GPIO_MAX)];
+static unsigned long gpio_valid_output[BITS_TO_LONGS(GPIO_MAX)];
 
 static inline void __set_direction(unsigned pin, int input)
 {
 {
        unsigned long flags;
 
-       if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
+       if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid_input)) {
                pr_debug("%s: invalid GPIO %d\n", __func__, pin);
                return -EINVAL;
        }
        unsigned long flags;
        u32 u;
 
-       if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
+       if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid_output)) {
                pr_debug("%s: invalid GPIO %d\n", __func__, pin);
                return -EINVAL;
        }
        unsigned long flags;
        int ret;
 
-       if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
+       if (pin >= GPIO_MAX ||
+           !(test_bit(pin, gpio_valid_input) ||
+             test_bit(pin, gpio_valid_output))) {
                pr_debug("%s: invalid GPIO %d\n", __func__, pin);
                return -EINVAL;
        }
 
 void gpio_free(unsigned pin)
 {
-       if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
+       if (pin >= GPIO_MAX ||
+           !(test_bit(pin, gpio_valid_input) ||
+             test_bit(pin, gpio_valid_output))) {
                pr_debug("%s: invalid GPIO %d\n", __func__, pin);
                return;
        }
        __set_direction(pin, 0);
 }
 
-void __init orion_gpio_set_valid(unsigned pin, int valid)
+void __init orion_gpio_set_valid(unsigned pin, int mode)
 {
-       if (valid)
-               __set_bit(pin, gpio_valid);
+       if (mode == 1)
+               mode = GPIO_INPUT_OK | GPIO_OUTPUT_OK;
+       if (mode & GPIO_INPUT_OK)
+               __set_bit(pin, gpio_valid_input);
        else
-               __clear_bit(pin, gpio_valid);
+               __clear_bit(pin, gpio_valid_input);
+       if (mode & GPIO_OUTPUT_OK)
+               __set_bit(pin, gpio_valid_output);
+       else
+               __clear_bit(pin, gpio_valid_output);
 }
 
 void orion_gpio_set_blink(unsigned pin, int blink)
 
  * Orion-specific GPIO API extensions.
  */
 void orion_gpio_set_unused(unsigned pin);
-void orion_gpio_set_valid(unsigned pin, int valid);
 void orion_gpio_set_blink(unsigned pin, int blink);
 
+#define GPIO_BIDI_OK           (1 << 0)
+#define GPIO_INPUT_OK          (1 << 1)
+#define GPIO_OUTPUT_OK         (1 << 2)
+void orion_gpio_set_valid(unsigned pin, int mode);
+
 /*
  * GPIO interrupt handling.
  */