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