omap: gpio: Use generic API
authorSanjeev Premi <premi@ti.com>
Thu, 8 Sep 2011 14:47:25 +0000 (10:47 -0400)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Tue, 13 Sep 2011 06:25:15 +0000 (08:25 +0200)
Convert all OMAP specific functions to use the common API
definitions in include/asm/gpio.h. In the process, made
few additional changes:
 - Use -EINVAL consistently. -1 was used in many places.
 - Removed one-liner static functions that were used only
   once. Replaced the content as necessary.
 - Combines implementation of functions omap_get_gpio_dataout()
   and omap_get_gpio_datain(). To do so, new static function
   _get_gpio_direction() was added.

Signed-off-by: Sanjeev Premi <premi@ti.com>
Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
arch/arm/cpu/armv7/omap-common/gpio.c
arch/arm/include/asm/omap_gpio.h

index 4749524..e62c6f4 100644 (file)
@@ -40,6 +40,9 @@
 #include <asm/io.h>
 #include <asm/errno.h>
 
+#define OMAP_GPIO_DIR_OUT      0
+#define OMAP_GPIO_DIR_IN       1
+
 static inline const struct gpio_bank *get_gpio_bank(int gpio)
 {
        return &omap_gpio_bank[gpio >> 5];
@@ -53,17 +56,17 @@ static inline int get_gpio_index(int gpio)
 static inline int gpio_valid(int gpio)
 {
        if (gpio < 0)
-               return -1;
+               return -EINVAL;
        if (gpio < 192)
                return 0;
-       return -1;
+       return -EINVAL;
 }
 
 static int check_gpio(int gpio)
 {
        if (gpio_valid(gpio) < 0) {
                printf("ERROR : check_gpio: invalid GPIO %d\n", gpio);
-               return -1;
+               return -EINVAL;
        }
        return 0;
 }
@@ -89,14 +92,29 @@ static void _set_gpio_direction(const struct gpio_bank *bank, int gpio,
        __raw_writel(l, reg);
 }
 
-void omap_set_gpio_direction(int gpio, int is_input)
+/**
+ * Get the direction of the GPIO by reading the GPIO_OE register
+ * corresponding to the specified bank.
+ */
+static int _get_gpio_direction(const struct gpio_bank *bank, int gpio)
 {
-       const struct gpio_bank *bank;
+       void *reg = bank->base;
+       u32 v;
 
-       if (check_gpio(gpio) < 0)
-               return;
-       bank = get_gpio_bank(gpio);
-       _set_gpio_direction(bank, get_gpio_index(gpio), is_input);
+       switch (bank->method) {
+       case METHOD_GPIO_24XX:
+               reg += OMAP_GPIO_OE;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       v = __raw_readl(reg);
+
+       if (v & (1 << gpio))
+               return OMAP_GPIO_DIR_IN;
+       else
+               return OMAP_GPIO_DIR_OUT;
 }
 
 static void _set_gpio_dataout(const struct gpio_bank *bank, int gpio,
@@ -121,20 +139,27 @@ static void _set_gpio_dataout(const struct gpio_bank *bank, int gpio,
        __raw_writel(l, reg);
 }
 
-void omap_set_gpio_dataout(int gpio, int enable)
+/**
+ * Set value of the specified gpio
+ */
+void gpio_set_value(int gpio, int value)
 {
        const struct gpio_bank *bank;
 
        if (check_gpio(gpio) < 0)
                return;
        bank = get_gpio_bank(gpio);
-       _set_gpio_dataout(bank, get_gpio_index(gpio), enable);
+       _set_gpio_dataout(bank, get_gpio_index(gpio), value);
 }
 
-int omap_get_gpio_datain(int gpio)
+/**
+ * Get value of the specified gpio
+ */
+int gpio_get_value(int gpio)
 {
        const struct gpio_bank *bank;
        void *reg;
+       int input;
 
        if (check_gpio(gpio) < 0)
                return -EINVAL;
@@ -142,7 +167,17 @@ int omap_get_gpio_datain(int gpio)
        reg = bank->base;
        switch (bank->method) {
        case METHOD_GPIO_24XX:
-               reg += OMAP_GPIO_DATAIN;
+               input = _get_gpio_direction(bank, get_gpio_index(gpio));
+               switch (input) {
+               case OMAP_GPIO_DIR_IN:
+                       reg += OMAP_GPIO_DATAIN;
+                       break;
+               case OMAP_GPIO_DIR_OUT:
+                       reg += OMAP_GPIO_DATAOUT;
+                       break;
+               default:
+                       return -EINVAL;
+               }
                break;
        default:
                return -EINVAL;
@@ -151,32 +186,45 @@ int omap_get_gpio_datain(int gpio)
                        & (1 << get_gpio_index(gpio))) != 0;
 }
 
-int omap_get_gpio_dataout(int gpio)
+/**
+ * Set gpio direction as input
+ */
+int gpio_direction_input(unsigned gpio)
 {
-       struct gpio_bank *bank;
-       void *reg;
+       const struct gpio_bank *bank;
 
        if (check_gpio(gpio) < 0)
                return -EINVAL;
+
        bank = get_gpio_bank(gpio);
-       reg = bank->base;
-       switch (bank->method) {
-       case METHOD_GPIO_24XX:
-               reg += OMAP_GPIO_DATAOUT;
-               break;
-       default:
-               return -EINVAL;
-       }
-       return (__raw_readl(reg)
-                       & (1 << get_gpio_index(gpio))) != 0;
+       _set_gpio_direction(bank, get_gpio_index(gpio), 1);
+
+       return 0;
 }
 
-static void _reset_gpio(const struct gpio_bank *bank, int gpio)
+/**
+ * Set gpio direction as output
+ */
+int gpio_direction_output(unsigned gpio, int value)
 {
-       _set_gpio_direction(bank, get_gpio_index(gpio), 1);
+       const struct gpio_bank *bank;
+
+       if (check_gpio(gpio) < 0)
+               return -EINVAL;
+
+       bank = get_gpio_bank(gpio);
+       _set_gpio_dataout(bank, get_gpio_index(gpio), value);
+       _set_gpio_direction(bank, get_gpio_index(gpio), 0);
+
+       return 0;
 }
 
-int omap_request_gpio(int gpio)
+/**
+ * Request a gpio before using it.
+ *
+ * NOTE: Argument 'label' is unused.
+ */
+int gpio_request(int gpio, const char *label)
 {
        if (check_gpio(gpio) < 0)
                return -EINVAL;
@@ -184,7 +232,10 @@ int omap_request_gpio(int gpio)
        return 0;
 }
 
-void omap_free_gpio(int gpio)
+/**
+ * Reset and free the gpio after using it.
+ */
+void gpio_free(unsigned gpio)
 {
        const struct gpio_bank *bank;
 
@@ -192,5 +243,5 @@ void omap_free_gpio(int gpio)
                return;
        bank = get_gpio_bank(gpio);
 
-       _reset_gpio(bank, gpio);
+       _set_gpio_direction(bank, get_gpio_index(gpio), 1);
 }
index 8741572..516cc42 100644 (file)
@@ -49,19 +49,4 @@ extern const struct gpio_bank *const omap_gpio_bank;
 
 #define METHOD_GPIO_24XX       4
 
-/* This is the interface */
-
-/* Request a gpio before using it */
-int omap_request_gpio(int gpio);
-/* Reset and free a gpio after using it */
-void omap_free_gpio(int gpio);
-/* Sets the gpio as input or output */
-void omap_set_gpio_direction(int gpio, int is_input);
-/* Set or clear a gpio output */
-void omap_set_gpio_dataout(int gpio, int enable);
-/* Get the value of a gpio input */
-int omap_get_gpio_datain(int gpio);
-/* Get the value of a gpio output */
-int omap_get_gpio_dataout(int gpio);
-
 #endif /* _GPIO_H_ */