blackfin: GPIO: Implement more GPIO APIs
authorSonic Zhang <sonic.zhang@analog.com>
Fri, 27 Apr 2012 10:25:16 +0000 (18:25 +0800)
committerBob Liu <lliubbo@gmail.com>
Mon, 21 May 2012 06:54:34 +0000 (14:54 +0800)
Implement more GPIO APIs in case GPIOLIB is disabled.

Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Bob Liu <lliubbo@gmail.com>
arch/blackfin/include/asm/gpio.h

index 12d3571b523232db7a230b853c87deb802a24062..3d84d96f7c2cdac272ec7d799be295f86ad0b6a8 100644 (file)
@@ -26,6 +26,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/compiler.h>
+#include <linux/gpio.h>
 
 /***********************************************************
 *
@@ -244,6 +245,49 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
        return -EINVAL;
 }
 
+static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
+{
+       int err;
+
+       err = bfin_gpio_request(gpio, label);
+       if (err)
+               return err;
+
+       if (flags & GPIOF_DIR_IN)
+               err = bfin_gpio_direction_input(gpio);
+       else
+               err = bfin_gpio_direction_output(gpio,
+                       (flags & GPIOF_INIT_HIGH) ? 1 : 0);
+
+       if (err)
+               bfin_gpio_free(gpio);
+
+       return err;
+}
+
+static inline int gpio_request_array(const struct gpio *array, size_t num)
+{
+       int i, err;
+
+       for (i = 0; i < num; i++, array++) {
+               err = gpio_request_one(array->gpio, array->flags, array->label);
+               if (err)
+                       goto err_free;
+       }
+       return 0;
+
+err_free:
+       while (i--)
+               bfin_gpio_free((--array)->gpio);
+       return err;
+}
+
+static inline void gpio_free_array(const struct gpio *array, size_t num)
+{
+       while (num--)
+               bfin_gpio_free((array++)->gpio);
+}
+
 static inline int __gpio_get_value(unsigned gpio)
 {
        return bfin_gpio_get_value(gpio);