diff options
-rw-r--r-- | arch/arm/mach-sa1100/include/mach/irqs.h | 73 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/irq.c | 87 | ||||
-rw-r--r-- | drivers/gpio/gpio-sa1100.c | 2 |
3 files changed, 93 insertions, 69 deletions
diff --git a/arch/arm/mach-sa1100/include/mach/irqs.h b/arch/arm/mach-sa1100/include/mach/irqs.h index de0983494c7e..734e30e406a3 100644 --- a/arch/arm/mach-sa1100/include/mach/irqs.h +++ b/arch/arm/mach-sa1100/include/mach/irqs.h | |||
@@ -8,17 +8,17 @@ | |||
8 | * 2001/11/14 RMK Cleaned up and standardised a lot of the IRQs. | 8 | * 2001/11/14 RMK Cleaned up and standardised a lot of the IRQs. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #define IRQ_GPIO0 1 | 11 | #define IRQ_GPIO0_SC 1 |
12 | #define IRQ_GPIO1 2 | 12 | #define IRQ_GPIO1_SC 2 |
13 | #define IRQ_GPIO2 3 | 13 | #define IRQ_GPIO2_SC 3 |
14 | #define IRQ_GPIO3 4 | 14 | #define IRQ_GPIO3_SC 4 |
15 | #define IRQ_GPIO4 5 | 15 | #define IRQ_GPIO4_SC 5 |
16 | #define IRQ_GPIO5 6 | 16 | #define IRQ_GPIO5_SC 6 |
17 | #define IRQ_GPIO6 7 | 17 | #define IRQ_GPIO6_SC 7 |
18 | #define IRQ_GPIO7 8 | 18 | #define IRQ_GPIO7_SC 8 |
19 | #define IRQ_GPIO8 9 | 19 | #define IRQ_GPIO8_SC 9 |
20 | #define IRQ_GPIO9 10 | 20 | #define IRQ_GPIO9_SC 10 |
21 | #define IRQ_GPIO10 11 | 21 | #define IRQ_GPIO10_SC 11 |
22 | #define IRQ_GPIO11_27 12 | 22 | #define IRQ_GPIO11_27 12 |
23 | #define IRQ_LCD 13 /* LCD controller */ | 23 | #define IRQ_LCD 13 /* LCD controller */ |
24 | #define IRQ_Ser0UDC 14 /* Ser. port 0 UDC */ | 24 | #define IRQ_Ser0UDC 14 /* Ser. port 0 UDC */ |
@@ -41,32 +41,43 @@ | |||
41 | #define IRQ_RTC1Hz 31 /* RTC 1 Hz clock */ | 41 | #define IRQ_RTC1Hz 31 /* RTC 1 Hz clock */ |
42 | #define IRQ_RTCAlrm 32 /* RTC Alarm */ | 42 | #define IRQ_RTCAlrm 32 /* RTC Alarm */ |
43 | 43 | ||
44 | #define IRQ_GPIO11 33 | 44 | #define IRQ_GPIO0 33 |
45 | #define IRQ_GPIO12 34 | 45 | #define IRQ_GPIO1 34 |
46 | #define IRQ_GPIO13 35 | 46 | #define IRQ_GPIO2 35 |
47 | #define IRQ_GPIO14 36 | 47 | #define IRQ_GPIO3 36 |
48 | #define IRQ_GPIO15 37 | 48 | #define IRQ_GPIO4 37 |
49 | #define IRQ_GPIO16 38 | 49 | #define IRQ_GPIO5 38 |
50 | #define IRQ_GPIO17 39 | 50 | #define IRQ_GPIO6 39 |
51 | #define IRQ_GPIO18 40 | 51 | #define IRQ_GPIO7 40 |
52 | #define IRQ_GPIO19 41 | 52 | #define IRQ_GPIO8 41 |
53 | #define IRQ_GPIO20 42 | 53 | #define IRQ_GPIO9 42 |
54 | #define IRQ_GPIO21 43 | 54 | #define IRQ_GPIO10 43 |
55 | #define IRQ_GPIO22 44 | 55 | #define IRQ_GPIO11 44 |
56 | #define IRQ_GPIO23 45 | 56 | #define IRQ_GPIO12 45 |
57 | #define IRQ_GPIO24 46 | 57 | #define IRQ_GPIO13 46 |
58 | #define IRQ_GPIO25 47 | 58 | #define IRQ_GPIO14 47 |
59 | #define IRQ_GPIO26 48 | 59 | #define IRQ_GPIO15 48 |
60 | #define IRQ_GPIO27 49 | 60 | #define IRQ_GPIO16 49 |
61 | #define IRQ_GPIO17 50 | ||
62 | #define IRQ_GPIO18 51 | ||
63 | #define IRQ_GPIO19 52 | ||
64 | #define IRQ_GPIO20 53 | ||
65 | #define IRQ_GPIO21 54 | ||
66 | #define IRQ_GPIO22 55 | ||
67 | #define IRQ_GPIO23 56 | ||
68 | #define IRQ_GPIO24 57 | ||
69 | #define IRQ_GPIO25 58 | ||
70 | #define IRQ_GPIO26 59 | ||
71 | #define IRQ_GPIO27 60 | ||
61 | 72 | ||
62 | /* | 73 | /* |
63 | * The next 16 interrupts are for board specific purposes. Since | 74 | * The next 16 interrupts are for board specific purposes. Since |
64 | * the kernel can only run on one machine at a time, we can re-use | 75 | * the kernel can only run on one machine at a time, we can re-use |
65 | * these. If you need more, increase IRQ_BOARD_END, but keep it | 76 | * these. If you need more, increase IRQ_BOARD_END, but keep it |
66 | * within sensible limits. IRQs 49 to 64 are available. | 77 | * within sensible limits. IRQs 61 to 76 are available. |
67 | */ | 78 | */ |
68 | #define IRQ_BOARD_START 50 | 79 | #define IRQ_BOARD_START 61 |
69 | #define IRQ_BOARD_END 66 | 80 | #define IRQ_BOARD_END 77 |
70 | 81 | ||
71 | /* | 82 | /* |
72 | * Figure out the MAX IRQ number. | 83 | * Figure out the MAX IRQ number. |
diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index 63e2901db416..2dc6a2a9c60c 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c | |||
@@ -87,7 +87,7 @@ static struct irq_domain *sa1100_normal_irqdomain; | |||
87 | */ | 87 | */ |
88 | static int GPIO_IRQ_rising_edge; | 88 | static int GPIO_IRQ_rising_edge; |
89 | static int GPIO_IRQ_falling_edge; | 89 | static int GPIO_IRQ_falling_edge; |
90 | static int GPIO_IRQ_mask = (1 << 11) - 1; | 90 | static int GPIO_IRQ_mask; |
91 | 91 | ||
92 | static int sa1100_gpio_type(struct irq_data *d, unsigned int type) | 92 | static int sa1100_gpio_type(struct irq_data *d, unsigned int type) |
93 | { | 93 | { |
@@ -124,6 +124,26 @@ static void sa1100_gpio_ack(struct irq_data *d) | |||
124 | GEDR = BIT(d->hwirq); | 124 | GEDR = BIT(d->hwirq); |
125 | } | 125 | } |
126 | 126 | ||
127 | static void sa1100_gpio_mask(struct irq_data *d) | ||
128 | { | ||
129 | unsigned int mask = BIT(d->hwirq); | ||
130 | |||
131 | GPIO_IRQ_mask &= ~mask; | ||
132 | |||
133 | GRER &= ~mask; | ||
134 | GFER &= ~mask; | ||
135 | } | ||
136 | |||
137 | static void sa1100_gpio_unmask(struct irq_data *d) | ||
138 | { | ||
139 | unsigned int mask = BIT(d->hwirq); | ||
140 | |||
141 | GPIO_IRQ_mask |= mask; | ||
142 | |||
143 | GRER = GPIO_IRQ_rising_edge & GPIO_IRQ_mask; | ||
144 | GFER = GPIO_IRQ_falling_edge & GPIO_IRQ_mask; | ||
145 | } | ||
146 | |||
127 | static int sa1100_gpio_wake(struct irq_data *d, unsigned int on) | 147 | static int sa1100_gpio_wake(struct irq_data *d, unsigned int on) |
128 | { | 148 | { |
129 | if (on) | 149 | if (on) |
@@ -139,8 +159,8 @@ static int sa1100_gpio_wake(struct irq_data *d, unsigned int on) | |||
139 | static struct irq_chip sa1100_low_gpio_chip = { | 159 | static struct irq_chip sa1100_low_gpio_chip = { |
140 | .name = "GPIO-l", | 160 | .name = "GPIO-l", |
141 | .irq_ack = sa1100_gpio_ack, | 161 | .irq_ack = sa1100_gpio_ack, |
142 | .irq_mask = sa1100_mask_irq, | 162 | .irq_mask = sa1100_gpio_mask, |
143 | .irq_unmask = sa1100_unmask_irq, | 163 | .irq_unmask = sa1100_gpio_unmask, |
144 | .irq_set_type = sa1100_gpio_type, | 164 | .irq_set_type = sa1100_gpio_type, |
145 | .irq_set_wake = sa1100_gpio_wake, | 165 | .irq_set_wake = sa1100_gpio_wake, |
146 | }; | 166 | }; |
@@ -163,16 +183,16 @@ static struct irq_domain_ops sa1100_low_gpio_irqdomain_ops = { | |||
163 | static struct irq_domain *sa1100_low_gpio_irqdomain; | 183 | static struct irq_domain *sa1100_low_gpio_irqdomain; |
164 | 184 | ||
165 | /* | 185 | /* |
166 | * IRQ11 (GPIO11 through 27) handler. We enter here with the | 186 | * IRQ 0-11 (GPIO) handler. We enter here with the |
167 | * irq_controller_lock held, and IRQs disabled. Decode the IRQ | 187 | * irq_controller_lock held, and IRQs disabled. Decode the IRQ |
168 | * and call the handler. | 188 | * and call the handler. |
169 | */ | 189 | */ |
170 | static void | 190 | static void |
171 | sa1100_high_gpio_handler(unsigned int irq, struct irq_desc *desc) | 191 | sa1100_gpio_handler(unsigned int irq, struct irq_desc *desc) |
172 | { | 192 | { |
173 | unsigned int mask; | 193 | unsigned int mask; |
174 | 194 | ||
175 | mask = GEDR & 0xfffff800; | 195 | mask = GEDR; |
176 | do { | 196 | do { |
177 | /* | 197 | /* |
178 | * clear down all currently active IRQ sources. | 198 | * clear down all currently active IRQ sources. |
@@ -180,8 +200,7 @@ sa1100_high_gpio_handler(unsigned int irq, struct irq_desc *desc) | |||
180 | */ | 200 | */ |
181 | GEDR = mask; | 201 | GEDR = mask; |
182 | 202 | ||
183 | irq = IRQ_GPIO11; | 203 | irq = IRQ_GPIO0; |
184 | mask >>= 11; | ||
185 | do { | 204 | do { |
186 | if (mask & 1) | 205 | if (mask & 1) |
187 | generic_handle_irq(irq); | 206 | generic_handle_irq(irq); |
@@ -189,7 +208,7 @@ sa1100_high_gpio_handler(unsigned int irq, struct irq_desc *desc) | |||
189 | irq++; | 208 | irq++; |
190 | } while (mask); | 209 | } while (mask); |
191 | 210 | ||
192 | mask = GEDR & 0xfffff800; | 211 | mask = GEDR; |
193 | } while (mask); | 212 | } while (mask); |
194 | } | 213 | } |
195 | 214 | ||
@@ -198,31 +217,11 @@ sa1100_high_gpio_handler(unsigned int irq, struct irq_desc *desc) | |||
198 | * In addition, the IRQs are all collected up into one bit in the | 217 | * In addition, the IRQs are all collected up into one bit in the |
199 | * interrupt controller registers. | 218 | * interrupt controller registers. |
200 | */ | 219 | */ |
201 | static void sa1100_high_gpio_mask(struct irq_data *d) | ||
202 | { | ||
203 | unsigned int mask = BIT(d->hwirq); | ||
204 | |||
205 | GPIO_IRQ_mask &= ~mask; | ||
206 | |||
207 | GRER &= ~mask; | ||
208 | GFER &= ~mask; | ||
209 | } | ||
210 | |||
211 | static void sa1100_high_gpio_unmask(struct irq_data *d) | ||
212 | { | ||
213 | unsigned int mask = BIT(d->hwirq); | ||
214 | |||
215 | GPIO_IRQ_mask |= mask; | ||
216 | |||
217 | GRER = GPIO_IRQ_rising_edge & GPIO_IRQ_mask; | ||
218 | GFER = GPIO_IRQ_falling_edge & GPIO_IRQ_mask; | ||
219 | } | ||
220 | |||
221 | static struct irq_chip sa1100_high_gpio_chip = { | 220 | static struct irq_chip sa1100_high_gpio_chip = { |
222 | .name = "GPIO-h", | 221 | .name = "GPIO-h", |
223 | .irq_ack = sa1100_gpio_ack, | 222 | .irq_ack = sa1100_gpio_ack, |
224 | .irq_mask = sa1100_high_gpio_mask, | 223 | .irq_mask = sa1100_gpio_mask, |
225 | .irq_unmask = sa1100_high_gpio_unmask, | 224 | .irq_unmask = sa1100_gpio_unmask, |
226 | .irq_set_type = sa1100_gpio_type, | 225 | .irq_set_type = sa1100_gpio_type, |
227 | .irq_set_wake = sa1100_gpio_wake, | 226 | .irq_set_wake = sa1100_gpio_wake, |
228 | }; | 227 | }; |
@@ -325,7 +324,7 @@ sa1100_handle_irq(struct pt_regs *regs) | |||
325 | if (mask == 0) | 324 | if (mask == 0) |
326 | break; | 325 | break; |
327 | 326 | ||
328 | handle_IRQ(ffs(mask) - 1 + IRQ_GPIO0, regs); | 327 | handle_IRQ(ffs(mask) - 1 + IRQ_GPIO0_SC, regs); |
329 | } while (1); | 328 | } while (1); |
330 | } | 329 | } |
331 | 330 | ||
@@ -350,22 +349,36 @@ void __init sa1100_init_irq(void) | |||
350 | */ | 349 | */ |
351 | ICCR = 1; | 350 | ICCR = 1; |
352 | 351 | ||
352 | sa1100_normal_irqdomain = irq_domain_add_legacy(NULL, | ||
353 | 32, IRQ_GPIO0_SC, 0, | ||
354 | &sa1100_normal_irqdomain_ops, NULL); | ||
355 | |||
353 | sa1100_low_gpio_irqdomain = irq_domain_add_legacy(NULL, | 356 | sa1100_low_gpio_irqdomain = irq_domain_add_legacy(NULL, |
354 | 11, IRQ_GPIO0, 0, | 357 | 11, IRQ_GPIO0, 0, |
355 | &sa1100_low_gpio_irqdomain_ops, NULL); | 358 | &sa1100_low_gpio_irqdomain_ops, NULL); |
356 | 359 | ||
357 | sa1100_normal_irqdomain = irq_domain_add_legacy(NULL, | ||
358 | 21, IRQ_GPIO11_27, 11, | ||
359 | &sa1100_normal_irqdomain_ops, NULL); | ||
360 | |||
361 | sa1100_high_gpio_irqdomain = irq_domain_add_legacy(NULL, | 360 | sa1100_high_gpio_irqdomain = irq_domain_add_legacy(NULL, |
362 | 17, IRQ_GPIO11, 11, | 361 | 17, IRQ_GPIO11, 11, |
363 | &sa1100_high_gpio_irqdomain_ops, NULL); | 362 | &sa1100_high_gpio_irqdomain_ops, NULL); |
364 | 363 | ||
365 | /* | 364 | /* |
365 | * Install handlers for GPIO 0-10 edge detect interrupts | ||
366 | */ | ||
367 | irq_set_chained_handler(IRQ_GPIO0_SC, sa1100_gpio_handler); | ||
368 | irq_set_chained_handler(IRQ_GPIO1_SC, sa1100_gpio_handler); | ||
369 | irq_set_chained_handler(IRQ_GPIO2_SC, sa1100_gpio_handler); | ||
370 | irq_set_chained_handler(IRQ_GPIO3_SC, sa1100_gpio_handler); | ||
371 | irq_set_chained_handler(IRQ_GPIO4_SC, sa1100_gpio_handler); | ||
372 | irq_set_chained_handler(IRQ_GPIO5_SC, sa1100_gpio_handler); | ||
373 | irq_set_chained_handler(IRQ_GPIO6_SC, sa1100_gpio_handler); | ||
374 | irq_set_chained_handler(IRQ_GPIO7_SC, sa1100_gpio_handler); | ||
375 | irq_set_chained_handler(IRQ_GPIO8_SC, sa1100_gpio_handler); | ||
376 | irq_set_chained_handler(IRQ_GPIO9_SC, sa1100_gpio_handler); | ||
377 | irq_set_chained_handler(IRQ_GPIO10_SC, sa1100_gpio_handler); | ||
378 | /* | ||
366 | * Install handler for GPIO 11-27 edge detect interrupts | 379 | * Install handler for GPIO 11-27 edge detect interrupts |
367 | */ | 380 | */ |
368 | irq_set_chained_handler(IRQ_GPIO11_27, sa1100_high_gpio_handler); | 381 | irq_set_chained_handler(IRQ_GPIO11_27, sa1100_gpio_handler); |
369 | 382 | ||
370 | set_handle_irq(sa1100_handle_irq); | 383 | set_handle_irq(sa1100_handle_irq); |
371 | 384 | ||
diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c index a90be34e4d5c..5b5d3c7bb84e 100644 --- a/drivers/gpio/gpio-sa1100.c +++ b/drivers/gpio/gpio-sa1100.c | |||
@@ -50,7 +50,7 @@ static int sa1100_direction_output(struct gpio_chip *chip, unsigned offset, int | |||
50 | 50 | ||
51 | static int sa1100_to_irq(struct gpio_chip *chip, unsigned offset) | 51 | static int sa1100_to_irq(struct gpio_chip *chip, unsigned offset) |
52 | { | 52 | { |
53 | return offset < 11 ? (IRQ_GPIO0 + offset) : (IRQ_GPIO11 - 11 + offset); | 53 | return IRQ_GPIO0 + offset; |
54 | } | 54 | } |
55 | 55 | ||
56 | static struct gpio_chip sa1100_gpio_chip = { | 56 | static struct gpio_chip sa1100_gpio_chip = { |