Merge branch 'for-linus' of git://repo.or.cz/cris-mirror
[kernel.git] / arch / arm / mach-imx / include / mach / gpio.h
1 #ifndef _IMX_GPIO_H
2
3 #include <linux/kernel.h>
4 #include <mach/hardware.h>
5 #include <mach/imx-regs.h>
6
7 #define IMX_GPIO_ALLOC_MODE_NORMAL      0
8 #define IMX_GPIO_ALLOC_MODE_NO_ALLOC    1
9 #define IMX_GPIO_ALLOC_MODE_TRY_ALLOC   2
10 #define IMX_GPIO_ALLOC_MODE_ALLOC_ONLY  4
11 #define IMX_GPIO_ALLOC_MODE_RELEASE     8
12
13 extern int imx_gpio_request(unsigned gpio, const char *label);
14
15 extern void imx_gpio_free(unsigned gpio);
16
17 extern int imx_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
18                                         int alloc_mode, const char *label);
19
20 extern int imx_gpio_direction_input(unsigned gpio);
21
22 extern int imx_gpio_direction_output(unsigned gpio, int value);
23
24 extern void __imx_gpio_set_value(unsigned gpio, int value);
25
26 static inline int imx_gpio_get_value(unsigned gpio)
27 {
28         return SSR(gpio >> GPIO_PORT_SHIFT) & (1 << (gpio & GPIO_PIN_MASK));
29 }
30
31 static inline void imx_gpio_set_value_inline(unsigned gpio, int value)
32 {
33         unsigned long flags;
34
35         raw_local_irq_save(flags);
36         if(value)
37                 DR(gpio >> GPIO_PORT_SHIFT) |= (1 << (gpio & GPIO_PIN_MASK));
38         else
39                 DR(gpio >> GPIO_PORT_SHIFT) &= ~(1 << (gpio & GPIO_PIN_MASK));
40         raw_local_irq_restore(flags);
41 }
42
43 static inline void imx_gpio_set_value(unsigned gpio, int value)
44 {
45         if(__builtin_constant_p(gpio))
46                 imx_gpio_set_value_inline(gpio, value);
47         else
48                 __imx_gpio_set_value(gpio, value);
49 }
50
51 extern int imx_gpio_to_irq(unsigned gpio);
52
53 extern int imx_irq_to_gpio(unsigned irq);
54
55 /*-------------------------------------------------------------------------*/
56
57 /* Wrappers for "new style" GPIO calls. These calls i.MX specific versions
58  * to allow future extension of GPIO logic.
59  */
60
61 static inline int gpio_request(unsigned gpio, const char *label)
62 {
63         return imx_gpio_request(gpio, label);
64 }
65
66 static inline void gpio_free(unsigned gpio)
67 {
68         might_sleep();
69
70         imx_gpio_free(gpio);
71 }
72
73 static inline  int gpio_direction_input(unsigned gpio)
74 {
75         return imx_gpio_direction_input(gpio);
76 }
77
78 static inline int gpio_direction_output(unsigned gpio, int value)
79 {
80         return imx_gpio_direction_output(gpio, value);
81 }
82
83 static inline int gpio_get_value(unsigned gpio)
84 {
85         return imx_gpio_get_value(gpio);
86 }
87
88 static inline void gpio_set_value(unsigned gpio, int value)
89 {
90         imx_gpio_set_value(gpio, value);
91 }
92
93 #include <asm-generic/gpio.h>           /* cansleep wrappers */
94
95 static inline int gpio_to_irq(unsigned gpio)
96 {
97         return imx_gpio_to_irq(gpio);
98 }
99
100 static inline int irq_to_gpio(unsigned irq)
101 {
102         return imx_irq_to_gpio(irq);
103 }
104
105
106 #endif