]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/arm/plat-orion/gpio.c
[ARM] Orion: make gpio /input/output validation separate
[mv-sheeva.git] / arch / arm / plat-orion / gpio.c
index 0d12c21647663d5191167569354bd3af1d7d84b5..32eb9e33bebbe448d47d7500b53e79dfe81d46a8 100644 (file)
@@ -19,7 +19,8 @@
 
 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)
 {
@@ -53,7 +54,7 @@ int gpio_direction_input(unsigned pin)
 {
        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;
        }
@@ -83,7 +84,7 @@ int gpio_direction_output(unsigned pin, int value)
        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;
        }
@@ -161,7 +162,9 @@ int gpio_request(unsigned pin, const char *label)
        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;
        }
@@ -183,7 +186,9 @@ EXPORT_SYMBOL(gpio_request);
 
 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;
        }
@@ -208,12 +213,18 @@ void __init orion_gpio_set_unused(unsigned pin)
        __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)