Commit 8e46ea3ec8b132bffd989741e8d154accb623645
Exists in
master
and in
4 other branches
Merge branch 'for_3.1/gpio-cleanup' of git://git.kernel.org/pub/scm/linux/kernel…
…/git/khilman/linux-omap-pm into gpio/next
Showing 6 changed files Side-by-side Diff
arch/arm/mach-omap1/gpio15xx.c
... | ... | @@ -34,11 +34,22 @@ |
34 | 34 | }, |
35 | 35 | }; |
36 | 36 | |
37 | +static struct omap_gpio_reg_offs omap15xx_mpuio_regs = { | |
38 | + .revision = USHRT_MAX, | |
39 | + .direction = OMAP_MPUIO_IO_CNTL, | |
40 | + .datain = OMAP_MPUIO_INPUT_LATCH, | |
41 | + .dataout = OMAP_MPUIO_OUTPUT, | |
42 | + .irqstatus = OMAP_MPUIO_GPIO_INT, | |
43 | + .irqenable = OMAP_MPUIO_GPIO_MASKIT, | |
44 | + .irqenable_inv = true, | |
45 | +}; | |
46 | + | |
37 | 47 | static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = { |
38 | 48 | .virtual_irq_start = IH_MPUIO_BASE, |
39 | 49 | .bank_type = METHOD_MPUIO, |
40 | 50 | .bank_width = 16, |
41 | 51 | .bank_stride = 1, |
52 | + .regs = &omap15xx_mpuio_regs, | |
42 | 53 | }; |
43 | 54 | |
44 | 55 | static struct __initdata platform_device omap15xx_mpu_gpio = { |
45 | 56 | |
... | ... | @@ -64,10 +75,21 @@ |
64 | 75 | }, |
65 | 76 | }; |
66 | 77 | |
78 | +static struct omap_gpio_reg_offs omap15xx_gpio_regs = { | |
79 | + .revision = USHRT_MAX, | |
80 | + .direction = OMAP1510_GPIO_DIR_CONTROL, | |
81 | + .datain = OMAP1510_GPIO_DATA_INPUT, | |
82 | + .dataout = OMAP1510_GPIO_DATA_OUTPUT, | |
83 | + .irqstatus = OMAP1510_GPIO_INT_STATUS, | |
84 | + .irqenable = OMAP1510_GPIO_INT_MASK, | |
85 | + .irqenable_inv = true, | |
86 | +}; | |
87 | + | |
67 | 88 | static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = { |
68 | 89 | .virtual_irq_start = IH_GPIO_BASE, |
69 | 90 | .bank_type = METHOD_GPIO_1510, |
70 | 91 | .bank_width = 16, |
92 | + .regs = &omap15xx_gpio_regs, | |
71 | 93 | }; |
72 | 94 | |
73 | 95 | static struct __initdata platform_device omap15xx_gpio = { |
arch/arm/mach-omap1/gpio16xx.c
... | ... | @@ -37,11 +37,22 @@ |
37 | 37 | }, |
38 | 38 | }; |
39 | 39 | |
40 | +static struct omap_gpio_reg_offs omap16xx_mpuio_regs = { | |
41 | + .revision = USHRT_MAX, | |
42 | + .direction = OMAP_MPUIO_IO_CNTL, | |
43 | + .datain = OMAP_MPUIO_INPUT_LATCH, | |
44 | + .dataout = OMAP_MPUIO_OUTPUT, | |
45 | + .irqstatus = OMAP_MPUIO_GPIO_INT, | |
46 | + .irqenable = OMAP_MPUIO_GPIO_MASKIT, | |
47 | + .irqenable_inv = true, | |
48 | +}; | |
49 | + | |
40 | 50 | static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = { |
41 | 51 | .virtual_irq_start = IH_MPUIO_BASE, |
42 | 52 | .bank_type = METHOD_MPUIO, |
43 | 53 | .bank_width = 16, |
44 | 54 | .bank_stride = 1, |
55 | + .regs = &omap16xx_mpuio_regs, | |
45 | 56 | }; |
46 | 57 | |
47 | 58 | static struct __initdata platform_device omap16xx_mpu_gpio = { |
48 | 59 | |
... | ... | @@ -67,10 +78,24 @@ |
67 | 78 | }, |
68 | 79 | }; |
69 | 80 | |
81 | +static struct omap_gpio_reg_offs omap16xx_gpio_regs = { | |
82 | + .revision = OMAP1610_GPIO_REVISION, | |
83 | + .direction = OMAP1610_GPIO_DIRECTION, | |
84 | + .set_dataout = OMAP1610_GPIO_SET_DATAOUT, | |
85 | + .clr_dataout = OMAP1610_GPIO_CLEAR_DATAOUT, | |
86 | + .datain = OMAP1610_GPIO_DATAIN, | |
87 | + .dataout = OMAP1610_GPIO_DATAOUT, | |
88 | + .irqstatus = OMAP1610_GPIO_IRQSTATUS1, | |
89 | + .irqenable = OMAP1610_GPIO_IRQENABLE1, | |
90 | + .set_irqenable = OMAP1610_GPIO_SET_IRQENABLE1, | |
91 | + .clr_irqenable = OMAP1610_GPIO_CLEAR_IRQENABLE1, | |
92 | +}; | |
93 | + | |
70 | 94 | static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = { |
71 | 95 | .virtual_irq_start = IH_GPIO_BASE, |
72 | 96 | .bank_type = METHOD_GPIO_1610, |
73 | 97 | .bank_width = 16, |
98 | + .regs = &omap16xx_gpio_regs, | |
74 | 99 | }; |
75 | 100 | |
76 | 101 | static struct __initdata platform_device omap16xx_gpio1 = { |
... | ... | @@ -100,6 +125,7 @@ |
100 | 125 | .virtual_irq_start = IH_GPIO_BASE + 16, |
101 | 126 | .bank_type = METHOD_GPIO_1610, |
102 | 127 | .bank_width = 16, |
128 | + .regs = &omap16xx_gpio_regs, | |
103 | 129 | }; |
104 | 130 | |
105 | 131 | static struct __initdata platform_device omap16xx_gpio2 = { |
... | ... | @@ -129,6 +155,7 @@ |
129 | 155 | .virtual_irq_start = IH_GPIO_BASE + 32, |
130 | 156 | .bank_type = METHOD_GPIO_1610, |
131 | 157 | .bank_width = 16, |
158 | + .regs = &omap16xx_gpio_regs, | |
132 | 159 | }; |
133 | 160 | |
134 | 161 | static struct __initdata platform_device omap16xx_gpio3 = { |
... | ... | @@ -158,6 +185,7 @@ |
158 | 185 | .virtual_irq_start = IH_GPIO_BASE + 48, |
159 | 186 | .bank_type = METHOD_GPIO_1610, |
160 | 187 | .bank_width = 16, |
188 | + .regs = &omap16xx_gpio_regs, | |
161 | 189 | }; |
162 | 190 | |
163 | 191 | static struct __initdata platform_device omap16xx_gpio4 = { |
arch/arm/mach-omap1/gpio7xx.c
... | ... | @@ -39,11 +39,22 @@ |
39 | 39 | }, |
40 | 40 | }; |
41 | 41 | |
42 | +static struct omap_gpio_reg_offs omap7xx_mpuio_regs = { | |
43 | + .revision = USHRT_MAX, | |
44 | + .direction = OMAP_MPUIO_IO_CNTL / 2, | |
45 | + .datain = OMAP_MPUIO_INPUT_LATCH / 2, | |
46 | + .dataout = OMAP_MPUIO_OUTPUT / 2, | |
47 | + .irqstatus = OMAP_MPUIO_GPIO_INT / 2, | |
48 | + .irqenable = OMAP_MPUIO_GPIO_MASKIT / 2, | |
49 | + .irqenable_inv = true, | |
50 | +}; | |
51 | + | |
42 | 52 | static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = { |
43 | 53 | .virtual_irq_start = IH_MPUIO_BASE, |
44 | 54 | .bank_type = METHOD_MPUIO, |
45 | 55 | .bank_width = 32, |
46 | 56 | .bank_stride = 2, |
57 | + .regs = &omap7xx_mpuio_regs, | |
47 | 58 | }; |
48 | 59 | |
49 | 60 | static struct __initdata platform_device omap7xx_mpu_gpio = { |
50 | 61 | |
... | ... | @@ -69,10 +80,21 @@ |
69 | 80 | }, |
70 | 81 | }; |
71 | 82 | |
83 | +static struct omap_gpio_reg_offs omap7xx_gpio_regs = { | |
84 | + .revision = USHRT_MAX, | |
85 | + .direction = OMAP7XX_GPIO_DIR_CONTROL, | |
86 | + .datain = OMAP7XX_GPIO_DATA_INPUT, | |
87 | + .dataout = OMAP7XX_GPIO_DATA_OUTPUT, | |
88 | + .irqstatus = OMAP7XX_GPIO_INT_STATUS, | |
89 | + .irqenable = OMAP7XX_GPIO_INT_MASK, | |
90 | + .irqenable_inv = true, | |
91 | +}; | |
92 | + | |
72 | 93 | static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = { |
73 | 94 | .virtual_irq_start = IH_GPIO_BASE, |
74 | 95 | .bank_type = METHOD_GPIO_7XX, |
75 | 96 | .bank_width = 32, |
97 | + .regs = &omap7xx_gpio_regs, | |
76 | 98 | }; |
77 | 99 | |
78 | 100 | static struct __initdata platform_device omap7xx_gpio1 = { |
... | ... | @@ -102,6 +124,7 @@ |
102 | 124 | .virtual_irq_start = IH_GPIO_BASE + 32, |
103 | 125 | .bank_type = METHOD_GPIO_7XX, |
104 | 126 | .bank_width = 32, |
127 | + .regs = &omap7xx_gpio_regs, | |
105 | 128 | }; |
106 | 129 | |
107 | 130 | static struct __initdata platform_device omap7xx_gpio2 = { |
... | ... | @@ -131,6 +154,7 @@ |
131 | 154 | .virtual_irq_start = IH_GPIO_BASE + 64, |
132 | 155 | .bank_type = METHOD_GPIO_7XX, |
133 | 156 | .bank_width = 32, |
157 | + .regs = &omap7xx_gpio_regs, | |
134 | 158 | }; |
135 | 159 | |
136 | 160 | static struct __initdata platform_device omap7xx_gpio3 = { |
... | ... | @@ -160,6 +184,7 @@ |
160 | 184 | .virtual_irq_start = IH_GPIO_BASE + 96, |
161 | 185 | .bank_type = METHOD_GPIO_7XX, |
162 | 186 | .bank_width = 32, |
187 | + .regs = &omap7xx_gpio_regs, | |
163 | 188 | }; |
164 | 189 | |
165 | 190 | static struct __initdata platform_device omap7xx_gpio4 = { |
... | ... | @@ -189,6 +214,7 @@ |
189 | 214 | .virtual_irq_start = IH_GPIO_BASE + 128, |
190 | 215 | .bank_type = METHOD_GPIO_7XX, |
191 | 216 | .bank_width = 32, |
217 | + .regs = &omap7xx_gpio_regs, | |
192 | 218 | }; |
193 | 219 | |
194 | 220 | static struct __initdata platform_device omap7xx_gpio5 = { |
... | ... | @@ -218,6 +244,7 @@ |
218 | 244 | .virtual_irq_start = IH_GPIO_BASE + 160, |
219 | 245 | .bank_type = METHOD_GPIO_7XX, |
220 | 246 | .bank_width = 32, |
247 | + .regs = &omap7xx_gpio_regs, | |
221 | 248 | }; |
222 | 249 | |
223 | 250 | static struct __initdata platform_device omap7xx_gpio6 = { |
arch/arm/mach-omap2/gpio.c
... | ... | @@ -61,13 +61,45 @@ |
61 | 61 | pdata->dbck_flag = dev_attr->dbck_flag; |
62 | 62 | pdata->virtual_irq_start = IH_GPIO_BASE + 32 * (id - 1); |
63 | 63 | |
64 | + pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL); | |
65 | + if (!pdata) { | |
66 | + pr_err("gpio%d: Memory allocation failed\n", id); | |
67 | + return -ENOMEM; | |
68 | + } | |
69 | + | |
64 | 70 | switch (oh->class->rev) { |
65 | 71 | case 0: |
66 | 72 | case 1: |
67 | 73 | pdata->bank_type = METHOD_GPIO_24XX; |
74 | + pdata->regs->revision = OMAP24XX_GPIO_REVISION; | |
75 | + pdata->regs->direction = OMAP24XX_GPIO_OE; | |
76 | + pdata->regs->datain = OMAP24XX_GPIO_DATAIN; | |
77 | + pdata->regs->dataout = OMAP24XX_GPIO_DATAOUT; | |
78 | + pdata->regs->set_dataout = OMAP24XX_GPIO_SETDATAOUT; | |
79 | + pdata->regs->clr_dataout = OMAP24XX_GPIO_CLEARDATAOUT; | |
80 | + pdata->regs->irqstatus = OMAP24XX_GPIO_IRQSTATUS1; | |
81 | + pdata->regs->irqstatus2 = OMAP24XX_GPIO_IRQSTATUS2; | |
82 | + pdata->regs->irqenable = OMAP24XX_GPIO_IRQENABLE1; | |
83 | + pdata->regs->set_irqenable = OMAP24XX_GPIO_SETIRQENABLE1; | |
84 | + pdata->regs->clr_irqenable = OMAP24XX_GPIO_CLEARIRQENABLE1; | |
85 | + pdata->regs->debounce = OMAP24XX_GPIO_DEBOUNCE_VAL; | |
86 | + pdata->regs->debounce_en = OMAP24XX_GPIO_DEBOUNCE_EN; | |
68 | 87 | break; |
69 | 88 | case 2: |
70 | 89 | pdata->bank_type = METHOD_GPIO_44XX; |
90 | + pdata->regs->revision = OMAP4_GPIO_REVISION; | |
91 | + pdata->regs->direction = OMAP4_GPIO_OE; | |
92 | + pdata->regs->datain = OMAP4_GPIO_DATAIN; | |
93 | + pdata->regs->dataout = OMAP4_GPIO_DATAOUT; | |
94 | + pdata->regs->set_dataout = OMAP4_GPIO_SETDATAOUT; | |
95 | + pdata->regs->clr_dataout = OMAP4_GPIO_CLEARDATAOUT; | |
96 | + pdata->regs->irqstatus = OMAP4_GPIO_IRQSTATUS0; | |
97 | + pdata->regs->irqstatus2 = OMAP4_GPIO_IRQSTATUS1; | |
98 | + pdata->regs->irqenable = OMAP4_GPIO_IRQSTATUSSET0; | |
99 | + pdata->regs->set_irqenable = OMAP4_GPIO_IRQSTATUSSET0; | |
100 | + pdata->regs->clr_irqenable = OMAP4_GPIO_IRQSTATUSCLR0; | |
101 | + pdata->regs->debounce = OMAP4_GPIO_DEBOUNCINGTIME; | |
102 | + pdata->regs->debounce_en = OMAP4_GPIO_DEBOUNCENABLE; | |
71 | 103 | break; |
72 | 104 | default: |
73 | 105 | WARN(1, "Invalid gpio bank_type\n"); |
arch/arm/plat-omap/include/plat/gpio.h
... | ... | @@ -174,12 +174,32 @@ |
174 | 174 | bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ |
175 | 175 | }; |
176 | 176 | |
177 | +struct omap_gpio_reg_offs { | |
178 | + u16 revision; | |
179 | + u16 direction; | |
180 | + u16 datain; | |
181 | + u16 dataout; | |
182 | + u16 set_dataout; | |
183 | + u16 clr_dataout; | |
184 | + u16 irqstatus; | |
185 | + u16 irqstatus2; | |
186 | + u16 irqenable; | |
187 | + u16 set_irqenable; | |
188 | + u16 clr_irqenable; | |
189 | + u16 debounce; | |
190 | + u16 debounce_en; | |
191 | + | |
192 | + bool irqenable_inv; | |
193 | +}; | |
194 | + | |
177 | 195 | struct omap_gpio_platform_data { |
178 | 196 | u16 virtual_irq_start; |
179 | 197 | int bank_type; |
180 | 198 | int bank_width; /* GPIO bank width */ |
181 | 199 | int bank_stride; /* Only needed for omap1 MPUIO */ |
182 | 200 | bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ |
201 | + | |
202 | + struct omap_gpio_reg_offs *regs; | |
183 | 203 | }; |
184 | 204 | |
185 | 205 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ |
drivers/gpio/gpio-omap.c
Changes suppressed. Click to show
... | ... | @@ -54,6 +54,11 @@ |
54 | 54 | struct device *dev; |
55 | 55 | bool dbck_flag; |
56 | 56 | int stride; |
57 | + u32 width; | |
58 | + | |
59 | + void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable); | |
60 | + | |
61 | + struct omap_gpio_reg_offs *regs; | |
57 | 62 | }; |
58 | 63 | |
59 | 64 | #ifdef CONFIG_ARCH_OMAP3 |
60 | 65 | |
61 | 66 | |
62 | 67 | |
... | ... | @@ -79,121 +84,18 @@ |
79 | 84 | */ |
80 | 85 | static struct gpio_bank *gpio_bank; |
81 | 86 | |
82 | -static int bank_width; | |
83 | - | |
84 | 87 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ |
85 | 88 | int gpio_bank_count; |
86 | 89 | |
87 | -static inline struct gpio_bank *get_gpio_bank(int gpio) | |
88 | -{ | |
89 | - if (cpu_is_omap15xx()) { | |
90 | - if (OMAP_GPIO_IS_MPUIO(gpio)) | |
91 | - return &gpio_bank[0]; | |
92 | - return &gpio_bank[1]; | |
93 | - } | |
94 | - if (cpu_is_omap16xx()) { | |
95 | - if (OMAP_GPIO_IS_MPUIO(gpio)) | |
96 | - return &gpio_bank[0]; | |
97 | - return &gpio_bank[1 + (gpio >> 4)]; | |
98 | - } | |
99 | - if (cpu_is_omap7xx()) { | |
100 | - if (OMAP_GPIO_IS_MPUIO(gpio)) | |
101 | - return &gpio_bank[0]; | |
102 | - return &gpio_bank[1 + (gpio >> 5)]; | |
103 | - } | |
104 | - if (cpu_is_omap24xx()) | |
105 | - return &gpio_bank[gpio >> 5]; | |
106 | - if (cpu_is_omap34xx() || cpu_is_omap44xx()) | |
107 | - return &gpio_bank[gpio >> 5]; | |
108 | - BUG(); | |
109 | - return NULL; | |
110 | -} | |
90 | +#define GPIO_INDEX(bank, gpio) (gpio % bank->width) | |
91 | +#define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio)) | |
111 | 92 | |
112 | -static inline int get_gpio_index(int gpio) | |
113 | -{ | |
114 | - if (cpu_is_omap7xx()) | |
115 | - return gpio & 0x1f; | |
116 | - if (cpu_is_omap24xx()) | |
117 | - return gpio & 0x1f; | |
118 | - if (cpu_is_omap34xx() || cpu_is_omap44xx()) | |
119 | - return gpio & 0x1f; | |
120 | - return gpio & 0x0f; | |
121 | -} | |
122 | - | |
123 | -static inline int gpio_valid(int gpio) | |
124 | -{ | |
125 | - if (gpio < 0) | |
126 | - return -1; | |
127 | - if (cpu_class_is_omap1() && OMAP_GPIO_IS_MPUIO(gpio)) { | |
128 | - if (gpio >= OMAP_MAX_GPIO_LINES + 16) | |
129 | - return -1; | |
130 | - return 0; | |
131 | - } | |
132 | - if (cpu_is_omap15xx() && gpio < 16) | |
133 | - return 0; | |
134 | - if ((cpu_is_omap16xx()) && gpio < 64) | |
135 | - return 0; | |
136 | - if (cpu_is_omap7xx() && gpio < 192) | |
137 | - return 0; | |
138 | - if (cpu_is_omap2420() && gpio < 128) | |
139 | - return 0; | |
140 | - if (cpu_is_omap2430() && gpio < 160) | |
141 | - return 0; | |
142 | - if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192) | |
143 | - return 0; | |
144 | - return -1; | |
145 | -} | |
146 | - | |
147 | -static int check_gpio(int gpio) | |
148 | -{ | |
149 | - if (unlikely(gpio_valid(gpio) < 0)) { | |
150 | - printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio); | |
151 | - dump_stack(); | |
152 | - return -1; | |
153 | - } | |
154 | - return 0; | |
155 | -} | |
156 | - | |
157 | 93 | static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) |
158 | 94 | { |
159 | 95 | void __iomem *reg = bank->base; |
160 | 96 | u32 l; |
161 | 97 | |
162 | - switch (bank->method) { | |
163 | -#ifdef CONFIG_ARCH_OMAP1 | |
164 | - case METHOD_MPUIO: | |
165 | - reg += OMAP_MPUIO_IO_CNTL / bank->stride; | |
166 | - break; | |
167 | -#endif | |
168 | -#ifdef CONFIG_ARCH_OMAP15XX | |
169 | - case METHOD_GPIO_1510: | |
170 | - reg += OMAP1510_GPIO_DIR_CONTROL; | |
171 | - break; | |
172 | -#endif | |
173 | -#ifdef CONFIG_ARCH_OMAP16XX | |
174 | - case METHOD_GPIO_1610: | |
175 | - reg += OMAP1610_GPIO_DIRECTION; | |
176 | - break; | |
177 | -#endif | |
178 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
179 | - case METHOD_GPIO_7XX: | |
180 | - reg += OMAP7XX_GPIO_DIR_CONTROL; | |
181 | - break; | |
182 | -#endif | |
183 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
184 | - case METHOD_GPIO_24XX: | |
185 | - reg += OMAP24XX_GPIO_OE; | |
186 | - break; | |
187 | -#endif | |
188 | -#if defined(CONFIG_ARCH_OMAP4) | |
189 | - case METHOD_GPIO_44XX: | |
190 | - reg += OMAP4_GPIO_OE; | |
191 | - break; | |
192 | -#endif | |
193 | - default: | |
194 | - WARN_ON(1); | |
195 | - return; | |
196 | - } | |
98 | + reg += bank->regs->direction; | |
197 | 99 | l = __raw_readl(reg); |
198 | 100 | if (is_input) |
199 | 101 | l |= 1 << gpio; |
200 | 102 | |
201 | 103 | |
202 | 104 | |
203 | 105 | |
204 | 106 | |
205 | 107 | |
206 | 108 | |
... | ... | @@ -202,165 +104,48 @@ |
202 | 104 | __raw_writel(l, reg); |
203 | 105 | } |
204 | 106 | |
205 | -static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | |
107 | + | |
108 | +/* set data out value using dedicate set/clear register */ | |
109 | +static void _set_gpio_dataout_reg(struct gpio_bank *bank, int gpio, int enable) | |
206 | 110 | { |
207 | 111 | void __iomem *reg = bank->base; |
208 | - u32 l = 0; | |
112 | + u32 l = GPIO_BIT(bank, gpio); | |
209 | 113 | |
210 | - switch (bank->method) { | |
211 | -#ifdef CONFIG_ARCH_OMAP1 | |
212 | - case METHOD_MPUIO: | |
213 | - reg += OMAP_MPUIO_OUTPUT / bank->stride; | |
214 | - l = __raw_readl(reg); | |
215 | - if (enable) | |
216 | - l |= 1 << gpio; | |
217 | - else | |
218 | - l &= ~(1 << gpio); | |
219 | - break; | |
220 | -#endif | |
221 | -#ifdef CONFIG_ARCH_OMAP15XX | |
222 | - case METHOD_GPIO_1510: | |
223 | - reg += OMAP1510_GPIO_DATA_OUTPUT; | |
224 | - l = __raw_readl(reg); | |
225 | - if (enable) | |
226 | - l |= 1 << gpio; | |
227 | - else | |
228 | - l &= ~(1 << gpio); | |
229 | - break; | |
230 | -#endif | |
231 | -#ifdef CONFIG_ARCH_OMAP16XX | |
232 | - case METHOD_GPIO_1610: | |
233 | - if (enable) | |
234 | - reg += OMAP1610_GPIO_SET_DATAOUT; | |
235 | - else | |
236 | - reg += OMAP1610_GPIO_CLEAR_DATAOUT; | |
237 | - l = 1 << gpio; | |
238 | - break; | |
239 | -#endif | |
240 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
241 | - case METHOD_GPIO_7XX: | |
242 | - reg += OMAP7XX_GPIO_DATA_OUTPUT; | |
243 | - l = __raw_readl(reg); | |
244 | - if (enable) | |
245 | - l |= 1 << gpio; | |
246 | - else | |
247 | - l &= ~(1 << gpio); | |
248 | - break; | |
249 | -#endif | |
250 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
251 | - case METHOD_GPIO_24XX: | |
252 | - if (enable) | |
253 | - reg += OMAP24XX_GPIO_SETDATAOUT; | |
254 | - else | |
255 | - reg += OMAP24XX_GPIO_CLEARDATAOUT; | |
256 | - l = 1 << gpio; | |
257 | - break; | |
258 | -#endif | |
259 | -#ifdef CONFIG_ARCH_OMAP4 | |
260 | - case METHOD_GPIO_44XX: | |
261 | - if (enable) | |
262 | - reg += OMAP4_GPIO_SETDATAOUT; | |
263 | - else | |
264 | - reg += OMAP4_GPIO_CLEARDATAOUT; | |
265 | - l = 1 << gpio; | |
266 | - break; | |
267 | -#endif | |
268 | - default: | |
269 | - WARN_ON(1); | |
270 | - return; | |
271 | - } | |
114 | + if (enable) | |
115 | + reg += bank->regs->set_dataout; | |
116 | + else | |
117 | + reg += bank->regs->clr_dataout; | |
118 | + | |
272 | 119 | __raw_writel(l, reg); |
273 | 120 | } |
274 | 121 | |
122 | +/* set data out value using mask register */ | |
123 | +static void _set_gpio_dataout_mask(struct gpio_bank *bank, int gpio, int enable) | |
124 | +{ | |
125 | + void __iomem *reg = bank->base + bank->regs->dataout; | |
126 | + u32 gpio_bit = GPIO_BIT(bank, gpio); | |
127 | + u32 l; | |
128 | + | |
129 | + l = __raw_readl(reg); | |
130 | + if (enable) | |
131 | + l |= gpio_bit; | |
132 | + else | |
133 | + l &= ~gpio_bit; | |
134 | + __raw_writel(l, reg); | |
135 | +} | |
136 | + | |
275 | 137 | static int _get_gpio_datain(struct gpio_bank *bank, int gpio) |
276 | 138 | { |
277 | - void __iomem *reg; | |
139 | + void __iomem *reg = bank->base + bank->regs->datain; | |
278 | 140 | |
279 | - if (check_gpio(gpio) < 0) | |
280 | - return -EINVAL; | |
281 | - reg = bank->base; | |
282 | - switch (bank->method) { | |
283 | -#ifdef CONFIG_ARCH_OMAP1 | |
284 | - case METHOD_MPUIO: | |
285 | - reg += OMAP_MPUIO_INPUT_LATCH / bank->stride; | |
286 | - break; | |
287 | -#endif | |
288 | -#ifdef CONFIG_ARCH_OMAP15XX | |
289 | - case METHOD_GPIO_1510: | |
290 | - reg += OMAP1510_GPIO_DATA_INPUT; | |
291 | - break; | |
292 | -#endif | |
293 | -#ifdef CONFIG_ARCH_OMAP16XX | |
294 | - case METHOD_GPIO_1610: | |
295 | - reg += OMAP1610_GPIO_DATAIN; | |
296 | - break; | |
297 | -#endif | |
298 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
299 | - case METHOD_GPIO_7XX: | |
300 | - reg += OMAP7XX_GPIO_DATA_INPUT; | |
301 | - break; | |
302 | -#endif | |
303 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
304 | - case METHOD_GPIO_24XX: | |
305 | - reg += OMAP24XX_GPIO_DATAIN; | |
306 | - break; | |
307 | -#endif | |
308 | -#ifdef CONFIG_ARCH_OMAP4 | |
309 | - case METHOD_GPIO_44XX: | |
310 | - reg += OMAP4_GPIO_DATAIN; | |
311 | - break; | |
312 | -#endif | |
313 | - default: | |
314 | - return -EINVAL; | |
315 | - } | |
316 | - return (__raw_readl(reg) | |
317 | - & (1 << get_gpio_index(gpio))) != 0; | |
141 | + return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0; | |
318 | 142 | } |
319 | 143 | |
320 | 144 | static int _get_gpio_dataout(struct gpio_bank *bank, int gpio) |
321 | 145 | { |
322 | - void __iomem *reg; | |
146 | + void __iomem *reg = bank->base + bank->regs->dataout; | |
323 | 147 | |
324 | - if (check_gpio(gpio) < 0) | |
325 | - return -EINVAL; | |
326 | - reg = bank->base; | |
327 | - | |
328 | - switch (bank->method) { | |
329 | -#ifdef CONFIG_ARCH_OMAP1 | |
330 | - case METHOD_MPUIO: | |
331 | - reg += OMAP_MPUIO_OUTPUT / bank->stride; | |
332 | - break; | |
333 | -#endif | |
334 | -#ifdef CONFIG_ARCH_OMAP15XX | |
335 | - case METHOD_GPIO_1510: | |
336 | - reg += OMAP1510_GPIO_DATA_OUTPUT; | |
337 | - break; | |
338 | -#endif | |
339 | -#ifdef CONFIG_ARCH_OMAP16XX | |
340 | - case METHOD_GPIO_1610: | |
341 | - reg += OMAP1610_GPIO_DATAOUT; | |
342 | - break; | |
343 | -#endif | |
344 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
345 | - case METHOD_GPIO_7XX: | |
346 | - reg += OMAP7XX_GPIO_DATA_OUTPUT; | |
347 | - break; | |
348 | -#endif | |
349 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
350 | - case METHOD_GPIO_24XX: | |
351 | - reg += OMAP24XX_GPIO_DATAOUT; | |
352 | - break; | |
353 | -#endif | |
354 | -#ifdef CONFIG_ARCH_OMAP4 | |
355 | - case METHOD_GPIO_44XX: | |
356 | - reg += OMAP4_GPIO_DATAOUT; | |
357 | - break; | |
358 | -#endif | |
359 | - default: | |
360 | - return -EINVAL; | |
361 | - } | |
362 | - | |
363 | - return (__raw_readl(reg) & (1 << get_gpio_index(gpio))) != 0; | |
148 | + return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0; | |
364 | 149 | } |
365 | 150 | |
366 | 151 | #define MOD_REG_BIT(reg, bit_mask, set) \ |
... | ... | @@ -383,7 +168,7 @@ |
383 | 168 | static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, |
384 | 169 | unsigned debounce) |
385 | 170 | { |
386 | - void __iomem *reg = bank->base; | |
171 | + void __iomem *reg; | |
387 | 172 | u32 val; |
388 | 173 | u32 l; |
389 | 174 | |
390 | 175 | |
391 | 176 | |
... | ... | @@ -397,21 +182,12 @@ |
397 | 182 | else |
398 | 183 | debounce = (debounce / 0x1f) - 1; |
399 | 184 | |
400 | - l = 1 << get_gpio_index(gpio); | |
185 | + l = GPIO_BIT(bank, gpio); | |
401 | 186 | |
402 | - if (bank->method == METHOD_GPIO_44XX) | |
403 | - reg += OMAP4_GPIO_DEBOUNCINGTIME; | |
404 | - else | |
405 | - reg += OMAP24XX_GPIO_DEBOUNCE_VAL; | |
406 | - | |
187 | + reg = bank->base + bank->regs->debounce; | |
407 | 188 | __raw_writel(debounce, reg); |
408 | 189 | |
409 | - reg = bank->base; | |
410 | - if (bank->method == METHOD_GPIO_44XX) | |
411 | - reg += OMAP4_GPIO_DEBOUNCENABLE; | |
412 | - else | |
413 | - reg += OMAP24XX_GPIO_DEBOUNCE_EN; | |
414 | - | |
190 | + reg = bank->base + bank->regs->debounce_en; | |
415 | 191 | val = __raw_readl(reg); |
416 | 192 | |
417 | 193 | if (debounce) { |
... | ... | @@ -628,9 +404,6 @@ |
628 | 404 | else |
629 | 405 | gpio = d->irq - IH_GPIO_BASE; |
630 | 406 | |
631 | - if (check_gpio(gpio) < 0) | |
632 | - return -EINVAL; | |
633 | - | |
634 | 407 | if (type & ~IRQ_TYPE_SENSE_MASK) |
635 | 408 | return -EINVAL; |
636 | 409 | |
... | ... | @@ -641,7 +414,7 @@ |
641 | 414 | |
642 | 415 | bank = irq_data_get_irq_chip_data(d); |
643 | 416 | spin_lock_irqsave(&bank->lock, flags); |
644 | - retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type); | |
417 | + retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type); | |
645 | 418 | spin_unlock_irqrestore(&bank->lock, flags); |
646 | 419 | |
647 | 420 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) |
648 | 421 | |
649 | 422 | |
650 | 423 | |
651 | 424 | |
652 | 425 | |
653 | 426 | |
654 | 427 | |
655 | 428 | |
656 | 429 | |
657 | 430 | |
658 | 431 | |
659 | 432 | |
660 | 433 | |
661 | 434 | |
662 | 435 | |
663 | 436 | |
664 | 437 | |
665 | 438 | |
... | ... | @@ -656,195 +429,81 @@ |
656 | 429 | { |
657 | 430 | void __iomem *reg = bank->base; |
658 | 431 | |
659 | - switch (bank->method) { | |
660 | -#ifdef CONFIG_ARCH_OMAP1 | |
661 | - case METHOD_MPUIO: | |
662 | - /* MPUIO irqstatus is reset by reading the status register, | |
663 | - * so do nothing here */ | |
664 | - return; | |
665 | -#endif | |
666 | -#ifdef CONFIG_ARCH_OMAP15XX | |
667 | - case METHOD_GPIO_1510: | |
668 | - reg += OMAP1510_GPIO_INT_STATUS; | |
669 | - break; | |
670 | -#endif | |
671 | -#ifdef CONFIG_ARCH_OMAP16XX | |
672 | - case METHOD_GPIO_1610: | |
673 | - reg += OMAP1610_GPIO_IRQSTATUS1; | |
674 | - break; | |
675 | -#endif | |
676 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
677 | - case METHOD_GPIO_7XX: | |
678 | - reg += OMAP7XX_GPIO_INT_STATUS; | |
679 | - break; | |
680 | -#endif | |
681 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
682 | - case METHOD_GPIO_24XX: | |
683 | - reg += OMAP24XX_GPIO_IRQSTATUS1; | |
684 | - break; | |
685 | -#endif | |
686 | -#if defined(CONFIG_ARCH_OMAP4) | |
687 | - case METHOD_GPIO_44XX: | |
688 | - reg += OMAP4_GPIO_IRQSTATUS0; | |
689 | - break; | |
690 | -#endif | |
691 | - default: | |
692 | - WARN_ON(1); | |
693 | - return; | |
694 | - } | |
432 | + reg += bank->regs->irqstatus; | |
695 | 433 | __raw_writel(gpio_mask, reg); |
696 | 434 | |
697 | 435 | /* Workaround for clearing DSP GPIO interrupts to allow retention */ |
698 | - if (cpu_is_omap24xx() || cpu_is_omap34xx()) | |
699 | - reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; | |
700 | - else if (cpu_is_omap44xx()) | |
701 | - reg = bank->base + OMAP4_GPIO_IRQSTATUS1; | |
702 | - | |
703 | - if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | |
436 | + if (bank->regs->irqstatus2) { | |
437 | + reg = bank->base + bank->regs->irqstatus2; | |
704 | 438 | __raw_writel(gpio_mask, reg); |
439 | + } | |
705 | 440 | |
706 | 441 | /* Flush posted write for the irq status to avoid spurious interrupts */ |
707 | 442 | __raw_readl(reg); |
708 | - } | |
709 | 443 | } |
710 | 444 | |
711 | 445 | static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) |
712 | 446 | { |
713 | - _clear_gpio_irqbank(bank, 1 << get_gpio_index(gpio)); | |
447 | + _clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | |
714 | 448 | } |
715 | 449 | |
716 | 450 | static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) |
717 | 451 | { |
718 | 452 | void __iomem *reg = bank->base; |
719 | - int inv = 0; | |
720 | 453 | u32 l; |
721 | - u32 mask; | |
454 | + u32 mask = (1 << bank->width) - 1; | |
722 | 455 | |
723 | - switch (bank->method) { | |
724 | -#ifdef CONFIG_ARCH_OMAP1 | |
725 | - case METHOD_MPUIO: | |
726 | - reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride; | |
727 | - mask = 0xffff; | |
728 | - inv = 1; | |
729 | - break; | |
730 | -#endif | |
731 | -#ifdef CONFIG_ARCH_OMAP15XX | |
732 | - case METHOD_GPIO_1510: | |
733 | - reg += OMAP1510_GPIO_INT_MASK; | |
734 | - mask = 0xffff; | |
735 | - inv = 1; | |
736 | - break; | |
737 | -#endif | |
738 | -#ifdef CONFIG_ARCH_OMAP16XX | |
739 | - case METHOD_GPIO_1610: | |
740 | - reg += OMAP1610_GPIO_IRQENABLE1; | |
741 | - mask = 0xffff; | |
742 | - break; | |
743 | -#endif | |
744 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
745 | - case METHOD_GPIO_7XX: | |
746 | - reg += OMAP7XX_GPIO_INT_MASK; | |
747 | - mask = 0xffffffff; | |
748 | - inv = 1; | |
749 | - break; | |
750 | -#endif | |
751 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
752 | - case METHOD_GPIO_24XX: | |
753 | - reg += OMAP24XX_GPIO_IRQENABLE1; | |
754 | - mask = 0xffffffff; | |
755 | - break; | |
756 | -#endif | |
757 | -#if defined(CONFIG_ARCH_OMAP4) | |
758 | - case METHOD_GPIO_44XX: | |
759 | - reg += OMAP4_GPIO_IRQSTATUSSET0; | |
760 | - mask = 0xffffffff; | |
761 | - break; | |
762 | -#endif | |
763 | - default: | |
764 | - WARN_ON(1); | |
765 | - return 0; | |
766 | - } | |
767 | - | |
456 | + reg += bank->regs->irqenable; | |
768 | 457 | l = __raw_readl(reg); |
769 | - if (inv) | |
458 | + if (bank->regs->irqenable_inv) | |
770 | 459 | l = ~l; |
771 | 460 | l &= mask; |
772 | 461 | return l; |
773 | 462 | } |
774 | 463 | |
775 | -static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable) | |
464 | +static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |
776 | 465 | { |
777 | 466 | void __iomem *reg = bank->base; |
778 | 467 | u32 l; |
779 | 468 | |
780 | - switch (bank->method) { | |
781 | -#ifdef CONFIG_ARCH_OMAP1 | |
782 | - case METHOD_MPUIO: | |
783 | - reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride; | |
469 | + if (bank->regs->set_irqenable) { | |
470 | + reg += bank->regs->set_irqenable; | |
471 | + l = gpio_mask; | |
472 | + } else { | |
473 | + reg += bank->regs->irqenable; | |
784 | 474 | l = __raw_readl(reg); |
785 | - if (enable) | |
786 | - l &= ~(gpio_mask); | |
475 | + if (bank->regs->irqenable_inv) | |
476 | + l &= ~gpio_mask; | |
787 | 477 | else |
788 | 478 | l |= gpio_mask; |
789 | - break; | |
790 | -#endif | |
791 | -#ifdef CONFIG_ARCH_OMAP15XX | |
792 | - case METHOD_GPIO_1510: | |
793 | - reg += OMAP1510_GPIO_INT_MASK; | |
794 | - l = __raw_readl(reg); | |
795 | - if (enable) | |
796 | - l &= ~(gpio_mask); | |
797 | - else | |
798 | - l |= gpio_mask; | |
799 | - break; | |
800 | -#endif | |
801 | -#ifdef CONFIG_ARCH_OMAP16XX | |
802 | - case METHOD_GPIO_1610: | |
803 | - if (enable) | |
804 | - reg += OMAP1610_GPIO_SET_IRQENABLE1; | |
805 | - else | |
806 | - reg += OMAP1610_GPIO_CLEAR_IRQENABLE1; | |
479 | + } | |
480 | + | |
481 | + __raw_writel(l, reg); | |
482 | +} | |
483 | + | |
484 | +static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |
485 | +{ | |
486 | + void __iomem *reg = bank->base; | |
487 | + u32 l; | |
488 | + | |
489 | + if (bank->regs->clr_irqenable) { | |
490 | + reg += bank->regs->clr_irqenable; | |
807 | 491 | l = gpio_mask; |
808 | - break; | |
809 | -#endif | |
810 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
811 | - case METHOD_GPIO_7XX: | |
812 | - reg += OMAP7XX_GPIO_INT_MASK; | |
492 | + } else { | |
493 | + reg += bank->regs->irqenable; | |
813 | 494 | l = __raw_readl(reg); |
814 | - if (enable) | |
815 | - l &= ~(gpio_mask); | |
816 | - else | |
495 | + if (bank->regs->irqenable_inv) | |
817 | 496 | l |= gpio_mask; |
818 | - break; | |
819 | -#endif | |
820 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
821 | - case METHOD_GPIO_24XX: | |
822 | - if (enable) | |
823 | - reg += OMAP24XX_GPIO_SETIRQENABLE1; | |
824 | 497 | else |
825 | - reg += OMAP24XX_GPIO_CLEARIRQENABLE1; | |
826 | - l = gpio_mask; | |
827 | - break; | |
828 | -#endif | |
829 | -#ifdef CONFIG_ARCH_OMAP4 | |
830 | - case METHOD_GPIO_44XX: | |
831 | - if (enable) | |
832 | - reg += OMAP4_GPIO_IRQSTATUSSET0; | |
833 | - else | |
834 | - reg += OMAP4_GPIO_IRQSTATUSCLR0; | |
835 | - l = gpio_mask; | |
836 | - break; | |
837 | -#endif | |
838 | - default: | |
839 | - WARN_ON(1); | |
840 | - return; | |
498 | + l &= ~gpio_mask; | |
841 | 499 | } |
500 | + | |
842 | 501 | __raw_writel(l, reg); |
843 | 502 | } |
844 | 503 | |
845 | 504 | static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) |
846 | 505 | { |
847 | - _enable_gpio_irqbank(bank, 1 << get_gpio_index(gpio), enable); | |
506 | + _enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio)); | |
848 | 507 | } |
849 | 508 | |
850 | 509 | /* |
851 | 510 | |
852 | 511 | |
853 | 512 | |
854 | 513 | |
... | ... | @@ -857,50 +516,32 @@ |
857 | 516 | */ |
858 | 517 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) |
859 | 518 | { |
860 | - unsigned long uninitialized_var(flags); | |
519 | + u32 gpio_bit = GPIO_BIT(bank, gpio); | |
520 | + unsigned long flags; | |
861 | 521 | |
862 | - switch (bank->method) { | |
863 | -#ifdef CONFIG_ARCH_OMAP16XX | |
864 | - case METHOD_MPUIO: | |
865 | - case METHOD_GPIO_1610: | |
866 | - spin_lock_irqsave(&bank->lock, flags); | |
867 | - if (enable) | |
868 | - bank->suspend_wakeup |= (1 << gpio); | |
869 | - else | |
870 | - bank->suspend_wakeup &= ~(1 << gpio); | |
871 | - spin_unlock_irqrestore(&bank->lock, flags); | |
872 | - return 0; | |
873 | -#endif | |
874 | -#ifdef CONFIG_ARCH_OMAP2PLUS | |
875 | - case METHOD_GPIO_24XX: | |
876 | - case METHOD_GPIO_44XX: | |
877 | - if (bank->non_wakeup_gpios & (1 << gpio)) { | |
878 | - printk(KERN_ERR "Unable to modify wakeup on " | |
879 | - "non-wakeup GPIO%d\n", | |
880 | - (bank - gpio_bank) * 32 + gpio); | |
881 | - return -EINVAL; | |
882 | - } | |
883 | - spin_lock_irqsave(&bank->lock, flags); | |
884 | - if (enable) | |
885 | - bank->suspend_wakeup |= (1 << gpio); | |
886 | - else | |
887 | - bank->suspend_wakeup &= ~(1 << gpio); | |
888 | - spin_unlock_irqrestore(&bank->lock, flags); | |
889 | - return 0; | |
890 | -#endif | |
891 | - default: | |
892 | - printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n", | |
893 | - bank->method); | |
522 | + if (bank->non_wakeup_gpios & gpio_bit) { | |
523 | + dev_err(bank->dev, | |
524 | + "Unable to modify wakeup on non-wakeup GPIO%d\n", gpio); | |
894 | 525 | return -EINVAL; |
895 | 526 | } |
527 | + | |
528 | + spin_lock_irqsave(&bank->lock, flags); | |
529 | + if (enable) | |
530 | + bank->suspend_wakeup |= gpio_bit; | |
531 | + else | |
532 | + bank->suspend_wakeup &= ~gpio_bit; | |
533 | + | |
534 | + spin_unlock_irqrestore(&bank->lock, flags); | |
535 | + | |
536 | + return 0; | |
896 | 537 | } |
897 | 538 | |
898 | 539 | static void _reset_gpio(struct gpio_bank *bank, int gpio) |
899 | 540 | { |
900 | - _set_gpio_direction(bank, get_gpio_index(gpio), 1); | |
541 | + _set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1); | |
901 | 542 | _set_gpio_irqenable(bank, gpio, 0); |
902 | 543 | _clear_gpio_irqstatus(bank, gpio); |
903 | - _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | |
544 | + _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); | |
904 | 545 | } |
905 | 546 | |
906 | 547 | /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */ |
907 | 548 | |
... | ... | @@ -910,10 +551,8 @@ |
910 | 551 | struct gpio_bank *bank; |
911 | 552 | int retval; |
912 | 553 | |
913 | - if (check_gpio(gpio) < 0) | |
914 | - return -ENODEV; | |
915 | 554 | bank = irq_data_get_irq_chip_data(d); |
916 | - retval = _set_gpio_wakeup(bank, get_gpio_index(gpio), enable); | |
555 | + retval = _set_gpio_wakeup(bank, gpio, enable); | |
917 | 556 | |
918 | 557 | return retval; |
919 | 558 | } |
... | ... | @@ -1029,31 +668,7 @@ |
1029 | 668 | chained_irq_enter(chip, desc); |
1030 | 669 | |
1031 | 670 | bank = irq_get_handler_data(irq); |
1032 | -#ifdef CONFIG_ARCH_OMAP1 | |
1033 | - if (bank->method == METHOD_MPUIO) | |
1034 | - isr_reg = bank->base + | |
1035 | - OMAP_MPUIO_GPIO_INT / bank->stride; | |
1036 | -#endif | |
1037 | -#ifdef CONFIG_ARCH_OMAP15XX | |
1038 | - if (bank->method == METHOD_GPIO_1510) | |
1039 | - isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS; | |
1040 | -#endif | |
1041 | -#if defined(CONFIG_ARCH_OMAP16XX) | |
1042 | - if (bank->method == METHOD_GPIO_1610) | |
1043 | - isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1; | |
1044 | -#endif | |
1045 | -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | |
1046 | - if (bank->method == METHOD_GPIO_7XX) | |
1047 | - isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS; | |
1048 | -#endif | |
1049 | -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | |
1050 | - if (bank->method == METHOD_GPIO_24XX) | |
1051 | - isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; | |
1052 | -#endif | |
1053 | -#if defined(CONFIG_ARCH_OMAP4) | |
1054 | - if (bank->method == METHOD_GPIO_44XX) | |
1055 | - isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0; | |
1056 | -#endif | |
671 | + isr_reg = bank->base + bank->regs->irqstatus; | |
1057 | 672 | |
1058 | 673 | if (WARN_ON(!isr_reg)) |
1059 | 674 | goto exit; |
1060 | 675 | |
... | ... | @@ -1075,9 +690,9 @@ |
1075 | 690 | /* clear edge sensitive interrupts before handler(s) are |
1076 | 691 | called so that we don't miss any interrupt occurred while |
1077 | 692 | executing them */ |
1078 | - _enable_gpio_irqbank(bank, isr_saved & ~level_mask, 0); | |
693 | + _disable_gpio_irqbank(bank, isr_saved & ~level_mask); | |
1079 | 694 | _clear_gpio_irqbank(bank, isr_saved & ~level_mask); |
1080 | - _enable_gpio_irqbank(bank, isr_saved & ~level_mask, 1); | |
695 | + _enable_gpio_irqbank(bank, isr_saved & ~level_mask); | |
1081 | 696 | |
1082 | 697 | /* if there is only edge sensitive GPIO pin interrupts |
1083 | 698 | configured, we could unmask GPIO bank interrupt immediately */ |
... | ... | @@ -1093,7 +708,7 @@ |
1093 | 708 | |
1094 | 709 | gpio_irq = bank->virtual_irq_start; |
1095 | 710 | for (; isr != 0; isr >>= 1, gpio_irq++) { |
1096 | - gpio_index = get_gpio_index(irq_to_gpio(gpio_irq)); | |
711 | + gpio_index = GPIO_INDEX(bank, irq_to_gpio(gpio_irq)); | |
1097 | 712 | |
1098 | 713 | if (!(isr & 1)) |
1099 | 714 | continue; |
... | ... | @@ -1149,7 +764,7 @@ |
1149 | 764 | |
1150 | 765 | spin_lock_irqsave(&bank->lock, flags); |
1151 | 766 | _set_gpio_irqenable(bank, gpio, 0); |
1152 | - _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | |
767 | + _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); | |
1153 | 768 | spin_unlock_irqrestore(&bank->lock, flags); |
1154 | 769 | } |
1155 | 770 | |
1156 | 771 | |
... | ... | @@ -1157,13 +772,13 @@ |
1157 | 772 | { |
1158 | 773 | unsigned int gpio = d->irq - IH_GPIO_BASE; |
1159 | 774 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); |
1160 | - unsigned int irq_mask = 1 << get_gpio_index(gpio); | |
775 | + unsigned int irq_mask = GPIO_BIT(bank, gpio); | |
1161 | 776 | u32 trigger = irqd_get_trigger_type(d); |
1162 | 777 | unsigned long flags; |
1163 | 778 | |
1164 | 779 | spin_lock_irqsave(&bank->lock, flags); |
1165 | 780 | if (trigger) |
1166 | - _set_gpio_triggering(bank, get_gpio_index(gpio), trigger); | |
781 | + _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger); | |
1167 | 782 | |
1168 | 783 | /* For level-triggered GPIOs, the clearing must be done after |
1169 | 784 | * the HW source is cleared, thus after the handler has run */ |
1170 | 785 | |
... | ... | @@ -1190,45 +805,8 @@ |
1190 | 805 | |
1191 | 806 | #ifdef CONFIG_ARCH_OMAP1 |
1192 | 807 | |
1193 | -/* MPUIO uses the always-on 32k clock */ | |
1194 | - | |
1195 | -static void mpuio_ack_irq(struct irq_data *d) | |
1196 | -{ | |
1197 | - /* The ISR is reset automatically, so do nothing here. */ | |
1198 | -} | |
1199 | - | |
1200 | -static void mpuio_mask_irq(struct irq_data *d) | |
1201 | -{ | |
1202 | - unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE); | |
1203 | - struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | |
1204 | - | |
1205 | - _set_gpio_irqenable(bank, gpio, 0); | |
1206 | -} | |
1207 | - | |
1208 | -static void mpuio_unmask_irq(struct irq_data *d) | |
1209 | -{ | |
1210 | - unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE); | |
1211 | - struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | |
1212 | - | |
1213 | - _set_gpio_irqenable(bank, gpio, 1); | |
1214 | -} | |
1215 | - | |
1216 | -static struct irq_chip mpuio_irq_chip = { | |
1217 | - .name = "MPUIO", | |
1218 | - .irq_ack = mpuio_ack_irq, | |
1219 | - .irq_mask = mpuio_mask_irq, | |
1220 | - .irq_unmask = mpuio_unmask_irq, | |
1221 | - .irq_set_type = gpio_irq_type, | |
1222 | -#ifdef CONFIG_ARCH_OMAP16XX | |
1223 | - /* REVISIT: assuming only 16xx supports MPUIO wake events */ | |
1224 | - .irq_set_wake = gpio_wake_enable, | |
1225 | -#endif | |
1226 | -}; | |
1227 | - | |
1228 | - | |
1229 | 808 | #define bank_is_mpuio(bank) ((bank)->method == METHOD_MPUIO) |
1230 | 809 | |
1231 | - | |
1232 | 810 | #ifdef CONFIG_ARCH_OMAP16XX |
1233 | 811 | |
1234 | 812 | #include <linux/platform_device.h> |
... | ... | @@ -1288,7 +866,7 @@ |
1288 | 866 | |
1289 | 867 | static inline void mpuio_init(void) |
1290 | 868 | { |
1291 | - struct gpio_bank *bank = get_gpio_bank(OMAP_MPUIO(0)); | |
869 | + struct gpio_bank *bank = &gpio_bank[0]; | |
1292 | 870 | platform_set_drvdata(&omap_mpuio_device, bank); |
1293 | 871 | |
1294 | 872 | if (platform_driver_register(&omap_mpuio_driver) == 0) |
... | ... | @@ -1301,8 +879,6 @@ |
1301 | 879 | |
1302 | 880 | #else |
1303 | 881 | |
1304 | -extern struct irq_chip mpuio_irq_chip; | |
1305 | - | |
1306 | 882 | #define bank_is_mpuio(bank) 0 |
1307 | 883 | static inline void mpuio_init(void) {} |
1308 | 884 | |
1309 | 885 | |
... | ... | @@ -1328,31 +904,8 @@ |
1328 | 904 | |
1329 | 905 | static int gpio_is_input(struct gpio_bank *bank, int mask) |
1330 | 906 | { |
1331 | - void __iomem *reg = bank->base; | |
907 | + void __iomem *reg = bank->base + bank->regs->direction; | |
1332 | 908 | |
1333 | - switch (bank->method) { | |
1334 | - case METHOD_MPUIO: | |
1335 | - reg += OMAP_MPUIO_IO_CNTL / bank->stride; | |
1336 | - break; | |
1337 | - case METHOD_GPIO_1510: | |
1338 | - reg += OMAP1510_GPIO_DIR_CONTROL; | |
1339 | - break; | |
1340 | - case METHOD_GPIO_1610: | |
1341 | - reg += OMAP1610_GPIO_DIRECTION; | |
1342 | - break; | |
1343 | - case METHOD_GPIO_7XX: | |
1344 | - reg += OMAP7XX_GPIO_DIR_CONTROL; | |
1345 | - break; | |
1346 | - case METHOD_GPIO_24XX: | |
1347 | - reg += OMAP24XX_GPIO_OE; | |
1348 | - break; | |
1349 | - case METHOD_GPIO_44XX: | |
1350 | - reg += OMAP4_GPIO_OE; | |
1351 | - break; | |
1352 | - default: | |
1353 | - WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method"); | |
1354 | - return -EINVAL; | |
1355 | - } | |
1356 | 909 | return __raw_readl(reg) & mask; |
1357 | 910 | } |
1358 | 911 | |
1359 | 912 | |
... | ... | @@ -1364,9 +917,9 @@ |
1364 | 917 | u32 mask; |
1365 | 918 | |
1366 | 919 | gpio = chip->base + offset; |
1367 | - bank = get_gpio_bank(gpio); | |
920 | + bank = container_of(chip, struct gpio_bank, chip); | |
1368 | 921 | reg = bank->base; |
1369 | - mask = 1 << get_gpio_index(gpio); | |
922 | + mask = GPIO_BIT(bank, gpio); | |
1370 | 923 | |
1371 | 924 | if (gpio_is_input(bank, mask)) |
1372 | 925 | return _get_gpio_datain(bank, gpio); |
... | ... | @@ -1381,7 +934,7 @@ |
1381 | 934 | |
1382 | 935 | bank = container_of(chip, struct gpio_bank, chip); |
1383 | 936 | spin_lock_irqsave(&bank->lock, flags); |
1384 | - _set_gpio_dataout(bank, offset, value); | |
937 | + bank->set_dataout(bank, offset, value); | |
1385 | 938 | _set_gpio_direction(bank, offset, 0); |
1386 | 939 | spin_unlock_irqrestore(&bank->lock, flags); |
1387 | 940 | return 0; |
... | ... | @@ -1415,7 +968,7 @@ |
1415 | 968 | |
1416 | 969 | bank = container_of(chip, struct gpio_bank, chip); |
1417 | 970 | spin_lock_irqsave(&bank->lock, flags); |
1418 | - _set_gpio_dataout(bank, offset, value); | |
971 | + bank->set_dataout(bank, offset, value); | |
1419 | 972 | spin_unlock_irqrestore(&bank->lock, flags); |
1420 | 973 | } |
1421 | 974 | |
1422 | 975 | |
1423 | 976 | |
1424 | 977 | |
... | ... | @@ -1431,19 +984,17 @@ |
1431 | 984 | |
1432 | 985 | static void __init omap_gpio_show_rev(struct gpio_bank *bank) |
1433 | 986 | { |
987 | + static bool called; | |
1434 | 988 | u32 rev; |
1435 | 989 | |
1436 | - if (cpu_is_omap16xx() && !(bank->method != METHOD_MPUIO)) | |
1437 | - rev = __raw_readw(bank->base + OMAP1610_GPIO_REVISION); | |
1438 | - else if (cpu_is_omap24xx() || cpu_is_omap34xx()) | |
1439 | - rev = __raw_readl(bank->base + OMAP24XX_GPIO_REVISION); | |
1440 | - else if (cpu_is_omap44xx()) | |
1441 | - rev = __raw_readl(bank->base + OMAP4_GPIO_REVISION); | |
1442 | - else | |
990 | + if (called || bank->regs->revision == USHRT_MAX) | |
1443 | 991 | return; |
1444 | 992 | |
1445 | - printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n", | |
993 | + rev = __raw_readw(bank->base + bank->regs->revision); | |
994 | + pr_info("OMAP GPIO hardware version %d.%d\n", | |
1446 | 995 | (rev >> 4) & 0x0f, rev & 0x0f); |
996 | + | |
997 | + called = true; | |
1447 | 998 | } |
1448 | 999 | |
1449 | 1000 | /* This lock class tells lockdep that GPIO irqs are in a different |
... | ... | @@ -1525,6 +1076,30 @@ |
1525 | 1076 | } |
1526 | 1077 | } |
1527 | 1078 | |
1079 | +static __init void | |
1080 | +omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start, | |
1081 | + unsigned int num) | |
1082 | +{ | |
1083 | + struct irq_chip_generic *gc; | |
1084 | + struct irq_chip_type *ct; | |
1085 | + | |
1086 | + gc = irq_alloc_generic_chip("MPUIO", 1, irq_start, bank->base, | |
1087 | + handle_simple_irq); | |
1088 | + ct = gc->chip_types; | |
1089 | + | |
1090 | + /* NOTE: No ack required, reading IRQ status clears it. */ | |
1091 | + ct->chip.irq_mask = irq_gc_mask_set_bit; | |
1092 | + ct->chip.irq_unmask = irq_gc_mask_clr_bit; | |
1093 | + ct->chip.irq_set_type = gpio_irq_type; | |
1094 | + /* REVISIT: assuming only 16xx supports MPUIO wake events */ | |
1095 | + if (cpu_is_omap16xx()) | |
1096 | + ct->chip.irq_set_wake = gpio_wake_enable, | |
1097 | + | |
1098 | + ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride; | |
1099 | + irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, | |
1100 | + IRQ_NOREQUEST | IRQ_NOPROBE, 0); | |
1101 | +} | |
1102 | + | |
1528 | 1103 | static void __devinit omap_gpio_chip_init(struct gpio_bank *bank) |
1529 | 1104 | { |
1530 | 1105 | int j; |
1531 | 1106 | |
1532 | 1107 | |
1533 | 1108 | |
1534 | 1109 | |
... | ... | @@ -1552,22 +1127,23 @@ |
1552 | 1127 | } else { |
1553 | 1128 | bank->chip.label = "gpio"; |
1554 | 1129 | bank->chip.base = gpio; |
1555 | - gpio += bank_width; | |
1130 | + gpio += bank->width; | |
1556 | 1131 | } |
1557 | - bank->chip.ngpio = bank_width; | |
1132 | + bank->chip.ngpio = bank->width; | |
1558 | 1133 | |
1559 | 1134 | gpiochip_add(&bank->chip); |
1560 | 1135 | |
1561 | 1136 | for (j = bank->virtual_irq_start; |
1562 | - j < bank->virtual_irq_start + bank_width; j++) { | |
1137 | + j < bank->virtual_irq_start + bank->width; j++) { | |
1563 | 1138 | irq_set_lockdep_class(j, &gpio_lock_class); |
1564 | 1139 | irq_set_chip_data(j, bank); |
1565 | - if (bank_is_mpuio(bank)) | |
1566 | - irq_set_chip(j, &mpuio_irq_chip); | |
1567 | - else | |
1140 | + if (bank_is_mpuio(bank)) { | |
1141 | + omap_mpuio_alloc_gc(bank, j, bank->width); | |
1142 | + } else { | |
1568 | 1143 | irq_set_chip(j, &gpio_irq_chip); |
1569 | - irq_set_handler(j, handle_simple_irq); | |
1570 | - set_irq_flags(j, IRQF_VALID); | |
1144 | + irq_set_handler(j, handle_simple_irq); | |
1145 | + set_irq_flags(j, IRQF_VALID); | |
1146 | + } | |
1571 | 1147 | } |
1572 | 1148 | irq_set_chained_handler(bank->irq, gpio_irq_handler); |
1573 | 1149 | irq_set_handler_data(bank->irq, bank); |
... | ... | @@ -1609,7 +1185,14 @@ |
1609 | 1185 | bank->dev = &pdev->dev; |
1610 | 1186 | bank->dbck_flag = pdata->dbck_flag; |
1611 | 1187 | bank->stride = pdata->bank_stride; |
1612 | - bank_width = pdata->bank_width; | |
1188 | + bank->width = pdata->bank_width; | |
1189 | + | |
1190 | + bank->regs = pdata->regs; | |
1191 | + | |
1192 | + if (bank->regs->set_dataout && bank->regs->clr_dataout) | |
1193 | + bank->set_dataout = _set_gpio_dataout_reg; | |
1194 | + else | |
1195 | + bank->set_dataout = _set_gpio_dataout_mask; | |
1613 | 1196 | |
1614 | 1197 | spin_lock_init(&bank->lock); |
1615 | 1198 |