aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-davinci/include/mach/gpio.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-davinci/include/mach/gpio.h')
-rw-r--r--arch/arm/mach-davinci/include/mach/gpio.h65
1 files changed, 23 insertions, 42 deletions
diff --git a/arch/arm/mach-davinci/include/mach/gpio.h b/arch/arm/mach-davinci/include/mach/gpio.h
index bdab001950ba..82591d0d48fb 100644
--- a/arch/arm/mach-davinci/include/mach/gpio.h
+++ b/arch/arm/mach-davinci/include/mach/gpio.h
@@ -45,23 +45,13 @@
45/* Convert GPIO signal to GPIO pin number */ 45/* Convert GPIO signal to GPIO pin number */
46#define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio)) 46#define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio))
47 47
48struct davinci_gpio_regs {
49 u32 dir;
50 u32 out_data;
51 u32 set_data;
52 u32 clr_data;
53 u32 in_data;
54 u32 set_rising;
55 u32 clr_rising;
56 u32 set_falling;
57 u32 clr_falling;
58 u32 intstat;
59};
60
61struct davinci_gpio_controller { 48struct davinci_gpio_controller {
62 struct davinci_gpio_regs __iomem *regs;
63 struct gpio_chip chip; 49 struct gpio_chip chip;
64 int irq_base; 50 int irq_base;
51 void __iomem *regs;
52 void __iomem *set_data;
53 void __iomem *clr_data;
54 void __iomem *in_data;
65}; 55};
66 56
67/* The __gpio_to_controller() and __gpio_mask() functions inline to constants 57/* The __gpio_to_controller() and __gpio_mask() functions inline to constants
@@ -73,25 +63,16 @@ struct davinci_gpio_controller {
73 * 63 *
74 * These are NOT part of the cross-platform GPIO interface 64 * These are NOT part of the cross-platform GPIO interface
75 */ 65 */
76static inline struct davinci_gpio_regs __iomem * 66static inline struct davinci_gpio_controller *
77__gpio_to_controller(unsigned gpio) 67__gpio_to_controller(unsigned gpio)
78{ 68{
79 void __iomem *ptr; 69 struct davinci_gpio_controller *ctlrs = davinci_soc_info.gpio_ctlrs;
80 void __iomem *base = davinci_soc_info.gpio_base; 70 int index = gpio / 32;
81 71
82 if (gpio < 32 * 1) 72 if (!ctlrs || index >= davinci_soc_info.gpio_ctlrs_num)
83 ptr = base + 0x10; 73 return NULL;
84 else if (gpio < 32 * 2) 74
85 ptr = base + 0x38; 75 return ctlrs + index;
86 else if (gpio < 32 * 3)
87 ptr = base + 0x60;
88 else if (gpio < 32 * 4)
89 ptr = base + 0x88;
90 else if (gpio < 32 * 5)
91 ptr = base + 0xb0;
92 else
93 ptr = NULL;
94 return ptr;
95} 76}
96 77
97static inline u32 __gpio_mask(unsigned gpio) 78static inline u32 __gpio_mask(unsigned gpio)
@@ -107,16 +88,16 @@ static inline u32 __gpio_mask(unsigned gpio)
107 */ 88 */
108static inline void gpio_set_value(unsigned gpio, int value) 89static inline void gpio_set_value(unsigned gpio, int value)
109{ 90{
110 if (__builtin_constant_p(value) && gpio < DAVINCI_N_GPIO) { 91 if (__builtin_constant_p(value) && gpio < davinci_soc_info.gpio_num) {
111 struct davinci_gpio_regs __iomem *g; 92 struct davinci_gpio_controller *ctlr;
112 u32 mask; 93 u32 mask;
113 94
114 g = __gpio_to_controller(gpio); 95 ctlr = __gpio_to_controller(gpio);
115 mask = __gpio_mask(gpio); 96 mask = __gpio_mask(gpio);
116 if (value) 97 if (value)
117 __raw_writel(mask, &g->set_data); 98 __raw_writel(mask, ctlr->set_data);
118 else 99 else
119 __raw_writel(mask, &g->clr_data); 100 __raw_writel(mask, ctlr->clr_data);
120 return; 101 return;
121 } 102 }
122 103
@@ -134,18 +115,18 @@ static inline void gpio_set_value(unsigned gpio, int value)
134 */ 115 */
135static inline int gpio_get_value(unsigned gpio) 116static inline int gpio_get_value(unsigned gpio)
136{ 117{
137 struct davinci_gpio_regs __iomem *g; 118 struct davinci_gpio_controller *ctlr;
138 119
139 if (!__builtin_constant_p(gpio) || gpio >= DAVINCI_N_GPIO) 120 if (!__builtin_constant_p(gpio) || gpio >= davinci_soc_info.gpio_num)
140 return __gpio_get_value(gpio); 121 return __gpio_get_value(gpio);
141 122
142 g = __gpio_to_controller(gpio); 123 ctlr = __gpio_to_controller(gpio);
143 return __gpio_mask(gpio) & __raw_readl(&g->in_data); 124 return __gpio_mask(gpio) & __raw_readl(ctlr->in_data);
144} 125}
145 126
146static inline int gpio_cansleep(unsigned gpio) 127static inline int gpio_cansleep(unsigned gpio)
147{ 128{
148 if (__builtin_constant_p(gpio) && gpio < DAVINCI_N_GPIO) 129 if (__builtin_constant_p(gpio) && gpio < davinci_soc_info.gpio_num)
149 return 0; 130 return 0;
150 else 131 else
151 return __gpio_cansleep(gpio); 132 return __gpio_cansleep(gpio);