Blackfin arch: Convert Blackfin GPIO driver to use common gpiolib/gpiochip infrastructure
[linux-2.6.git] / arch / blackfin / include / asm / gpio.h
index ad33ac2..f8fe33b 100644 (file)
 #ifndef __ARCH_BLACKFIN_GPIO_H__
 #define __ARCH_BLACKFIN_GPIO_H__
 
-#define gpio_bank(x) ((x) >> 4)
-#define gpio_bit(x)  (1<<((x) & 0xF))
-#define gpio_sub_n(x) ((x) & 0xF)
+#define gpio_bank(x)   ((x) >> 4)
+#define gpio_bit(x)    (1<<((x) & 0xF))
+#define gpio_sub_n(x)  ((x) & 0xF)
+#define GPIO_BANK_NUM  DIV_ROUND_UP(MAX_BLACKFIN_GPIOS, 16)
 
 #define GPIO_BANKSIZE 16
 
 #define PERIPHERAL_USAGE 1
 #define GPIO_USAGE 0
 
+#if defined(BF518_FAMILY)
+#define MAX_BLACKFIN_GPIOS 40
+
+#define        GPIO_PF0        0
+#define        GPIO_PF1        1
+#define        GPIO_PF2        2
+#define        GPIO_PF3        3
+#define        GPIO_PF4        4
+#define        GPIO_PF5        5
+#define        GPIO_PF6        6
+#define        GPIO_PF7        7
+#define        GPIO_PF8        8
+#define        GPIO_PF9        9
+#define        GPIO_PF10       10
+#define        GPIO_PF11       11
+#define        GPIO_PF12       12
+#define        GPIO_PF13       13
+#define        GPIO_PF14       14
+#define        GPIO_PF15       15
+#define        GPIO_PG0        16
+#define        GPIO_PG1        17
+#define        GPIO_PG2        18
+#define        GPIO_PG3        19
+#define        GPIO_PG4        20
+#define        GPIO_PG5        21
+#define        GPIO_PG6        22
+#define        GPIO_PG7        23
+#define        GPIO_PG8        24
+#define        GPIO_PG9        25
+#define        GPIO_PG10       26
+#define        GPIO_PG11       27
+#define        GPIO_PG12       28
+#define        GPIO_PG13       29
+#define        GPIO_PG14       30
+#define        GPIO_PG15       31
+#define        GPIO_PH0        32
+#define        GPIO_PH1        33
+#define        GPIO_PH2        34
+#define        GPIO_PH3        35
+#define        GPIO_PH4        36
+#define        GPIO_PH5        37
+#define        GPIO_PH6        38
+#define        GPIO_PH7        39
+
+#define PORT_F GPIO_PF0
+#define PORT_G GPIO_PG0
+#define PORT_H GPIO_PH0
+
+#endif
+
+
 #ifdef BF533_FAMILY
 #define MAX_BLACKFIN_GPIOS 16
 
 
 #endif
 
+#if defined(BF538_FAMILY)
+       /* FIXME:
+        * For now only support PORTF GPIOs.
+        * PORT C,D and E are for peripheral usage only
+        */
+#define MAX_BLACKFIN_GPIOS 16
+
+#define        GPIO_PF0        0       /* PF */
+#define        GPIO_PF1        1
+#define        GPIO_PF2        2
+#define        GPIO_PF3        3
+#define        GPIO_PF4        4
+#define        GPIO_PF5        5
+#define        GPIO_PF6        6
+#define        GPIO_PF7        7
+#define        GPIO_PF8        8
+#define        GPIO_PF9        9
+#define        GPIO_PF10       10
+#define        GPIO_PF11       11
+#define        GPIO_PF12       12
+#define        GPIO_PF13       13
+#define        GPIO_PF14       14
+#define        GPIO_PF15       15
+#define        GPIO_PC0        16      /* PC */
+#define        GPIO_PC1        17
+#define        GPIO_PC4        20
+#define        GPIO_PC5        21
+#define        GPIO_PC6        22
+#define        GPIO_PC7        23
+#define        GPIO_PC8        24
+#define        GPIO_PC9        25
+#define        GPIO_PD0        32      /* PD */
+#define        GPIO_PD1        33
+#define        GPIO_PD2        34
+#define        GPIO_PD3        35
+#define        GPIO_PD4        36
+#define        GPIO_PD5        37
+#define        GPIO_PD6        38
+#define        GPIO_PD7        39
+#define        GPIO_PD8        40
+#define        GPIO_PD9        41
+#define        GPIO_PD10       42
+#define        GPIO_PD11       43
+#define        GPIO_PD12       44
+#define        GPIO_PD13       45
+#define        GPIO_PE0        48      /* PE */
+#define        GPIO_PE1        49
+#define        GPIO_PE2        50
+#define        GPIO_PE3        51
+#define        GPIO_PE4        52
+#define        GPIO_PE5        53
+#define        GPIO_PE6        54
+#define        GPIO_PE7        55
+#define        GPIO_PE8        56
+#define        GPIO_PE9        57
+#define        GPIO_PE10       58
+#define        GPIO_PE11       59
+#define        GPIO_PE12       60
+#define        GPIO_PE13       61
+#define        GPIO_PE14       62
+#define        GPIO_PE15       63
+
+#define PORT_F GPIO_PF0
+#define PORT_C GPIO_PC0
+#define PORT_D GPIO_PD0
+#define PORT_E GPIO_PE0
+#endif
+
 #if defined(BF527_FAMILY) || defined(BF537_FAMILY)
 #define MAX_BLACKFIN_GPIOS 48
 
@@ -425,20 +545,76 @@ struct gpio_port_s {
 * MODIFICATION HISTORY :
 **************************************************************/
 
-int gpio_request(unsigned, const char *);
-void gpio_free(unsigned);
 
-void gpio_set_value(unsigned gpio, int arg);
-int gpio_get_value(unsigned gpio);
+int bfin_gpio_request(unsigned gpio, const char *label);
+void bfin_gpio_free(unsigned gpio);
+int bfin_gpio_direction_input(unsigned gpio);
+int bfin_gpio_direction_output(unsigned gpio, int value);
+int bfin_gpio_get_value(unsigned gpio);
+void bfin_gpio_set_value(unsigned gpio, int value);
 
 #ifndef BF548_FAMILY
-#define gpio_set_value(gpio, value)    set_gpio_data(gpio, value)
+#define bfin_gpio_set_value(gpio, value)    set_gpio_data(gpio, value)
 #endif
 
-int gpio_direction_input(unsigned gpio);
-int gpio_direction_output(unsigned gpio, int value);
+#ifdef CONFIG_GPIOLIB
+#include <asm-generic/gpio.h>          /* cansleep wrappers */
+
+static inline int gpio_get_value(unsigned int gpio)
+{
+       if (gpio < MAX_BLACKFIN_GPIOS)
+               return bfin_gpio_get_value(gpio);
+       else
+               return __gpio_get_value(gpio);
+}
+
+static inline void gpio_set_value(unsigned int gpio, int value)
+{
+       if (gpio < MAX_BLACKFIN_GPIOS)
+               bfin_gpio_set_value(gpio, value);
+       else
+               __gpio_set_value(gpio, value);
+}
+
+static inline int gpio_cansleep(unsigned int gpio)
+{
+       return __gpio_cansleep(gpio);
+}
+
+#else /* !CONFIG_GPIOLIB */
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+       return bfin_gpio_request(gpio, label);
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+       return bfin_gpio_free(gpio);
+}
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+       return bfin_gpio_direction_input(gpio);
+}
+
+static inline int gpio_direction_output(unsigned gpio, int value)
+{
+       return bfin_gpio_direction_output(gpio, value);
+}
+
+static inline int gpio_get_value(unsigned gpio)
+{
+       return bfin_gpio_get_value(gpio);
+}
+
+static inline void gpio_set_value(unsigned gpio, int value)
+{
+       return bfin_gpio_set_value(gpio, value);
+}
 
 #include <asm-generic/gpio.h>          /* cansleep wrappers */
+#endif /* !CONFIG_GPIOLIB */
 #include <asm/irq.h>
 
 static inline int gpio_to_irq(unsigned gpio)