Merge branches 'arm/omap', 'arm/exynos', 'arm/smmu', 'arm/mediatek', 'arm/qcom',...
[sfrench/cifs-2.6.git] / arch / unicore32 / kernel / irq.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * linux/arch/unicore32/kernel/irq.c
4  *
5  * Code specific to PKUnity SoC and UniCore ISA
6  *
7  * Copyright (C) 2001-2010 GUAN Xue-tao
8  */
9 #include <linux/kernel_stat.h>
10 #include <linux/module.h>
11 #include <linux/signal.h>
12 #include <linux/ioport.h>
13 #include <linux/interrupt.h>
14 #include <linux/irq.h>
15 #include <linux/random.h>
16 #include <linux/smp.h>
17 #include <linux/init.h>
18 #include <linux/seq_file.h>
19 #include <linux/errno.h>
20 #include <linux/list.h>
21 #include <linux/kallsyms.h>
22 #include <linux/proc_fs.h>
23 #include <linux/syscore_ops.h>
24 #include <linux/gpio.h>
25
26 #include <mach/hardware.h>
27
28 #include "setup.h"
29
30 /*
31  * PKUnity GPIO edge detection for IRQs:
32  * IRQs are generated on Falling-Edge, Rising-Edge, or both.
33  * Use this instead of directly setting GRER/GFER.
34  */
35 static int GPIO_IRQ_rising_edge;
36 static int GPIO_IRQ_falling_edge;
37 static int GPIO_IRQ_mask = 0;
38
39 #define GPIO_MASK(irq)          (1 << (irq - IRQ_GPIO0))
40
41 static int puv3_gpio_type(struct irq_data *d, unsigned int type)
42 {
43         unsigned int mask;
44
45         if (d->irq < IRQ_GPIOHIGH)
46                 mask = 1 << d->irq;
47         else
48                 mask = GPIO_MASK(d->irq);
49
50         if (type == IRQ_TYPE_PROBE) {
51                 if ((GPIO_IRQ_rising_edge | GPIO_IRQ_falling_edge) & mask)
52                         return 0;
53                 type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
54         }
55
56         if (type & IRQ_TYPE_EDGE_RISING)
57                 GPIO_IRQ_rising_edge |= mask;
58         else
59                 GPIO_IRQ_rising_edge &= ~mask;
60         if (type & IRQ_TYPE_EDGE_FALLING)
61                 GPIO_IRQ_falling_edge |= mask;
62         else
63                 GPIO_IRQ_falling_edge &= ~mask;
64
65         writel(GPIO_IRQ_rising_edge & GPIO_IRQ_mask, GPIO_GRER);
66         writel(GPIO_IRQ_falling_edge & GPIO_IRQ_mask, GPIO_GFER);
67
68         return 0;
69 }
70
71 /*
72  * GPIO IRQs must be acknowledged.  This is for IRQs from 0 to 7.
73  */
74 static void puv3_low_gpio_ack(struct irq_data *d)
75 {
76         writel((1 << d->irq), GPIO_GEDR);
77 }
78
79 static void puv3_low_gpio_mask(struct irq_data *d)
80 {
81         writel(readl(INTC_ICMR) & ~(1 << d->irq), INTC_ICMR);
82 }
83
84 static void puv3_low_gpio_unmask(struct irq_data *d)
85 {
86         writel(readl(INTC_ICMR) | (1 << d->irq), INTC_ICMR);
87 }
88
89 static int puv3_low_gpio_wake(struct irq_data *d, unsigned int on)
90 {
91         if (on)
92                 writel(readl(PM_PWER) | (1 << d->irq), PM_PWER);
93         else
94                 writel(readl(PM_PWER) & ~(1 << d->irq), PM_PWER);
95         return 0;
96 }
97
98 static struct irq_chip puv3_low_gpio_chip = {
99         .name           = "GPIO-low",
100         .irq_ack        = puv3_low_gpio_ack,
101         .irq_mask       = puv3_low_gpio_mask,
102         .irq_unmask     = puv3_low_gpio_unmask,
103         .irq_set_type   = puv3_gpio_type,
104         .irq_set_wake   = puv3_low_gpio_wake,
105 };
106
107 /*
108  * IRQ8 (GPIO0 through 27) handler.  We enter here with the
109  * irq_controller_lock held, and IRQs disabled.  Decode the IRQ
110  * and call the handler.
111  */
112 static void puv3_gpio_handler(struct irq_desc *desc)
113 {
114         unsigned int mask, irq;
115
116         mask = readl(GPIO_GEDR);
117         do {
118                 /*
119                  * clear down all currently active IRQ sources.
120                  * We will be processing them all.
121                  */
122                 writel(mask, GPIO_GEDR);
123
124                 irq = IRQ_GPIO0;
125                 do {
126                         if (mask & 1)
127                                 generic_handle_irq(irq);
128                         mask >>= 1;
129                         irq++;
130                 } while (mask);
131                 mask = readl(GPIO_GEDR);
132         } while (mask);
133 }
134
135 /*
136  * GPIO0-27 edge IRQs need to be handled specially.
137  * In addition, the IRQs are all collected up into one bit in the
138  * interrupt controller registers.
139  */
140 static void puv3_high_gpio_ack(struct irq_data *d)
141 {
142         unsigned int mask = GPIO_MASK(d->irq);
143
144         writel(mask, GPIO_GEDR);
145 }
146
147 static void puv3_high_gpio_mask(struct irq_data *d)
148 {
149         unsigned int mask = GPIO_MASK(d->irq);
150
151         GPIO_IRQ_mask &= ~mask;
152
153         writel(readl(GPIO_GRER) & ~mask, GPIO_GRER);
154         writel(readl(GPIO_GFER) & ~mask, GPIO_GFER);
155 }
156
157 static void puv3_high_gpio_unmask(struct irq_data *d)
158 {
159         unsigned int mask = GPIO_MASK(d->irq);
160
161         GPIO_IRQ_mask |= mask;
162
163         writel(GPIO_IRQ_rising_edge & GPIO_IRQ_mask, GPIO_GRER);
164         writel(GPIO_IRQ_falling_edge & GPIO_IRQ_mask, GPIO_GFER);
165 }
166
167 static int puv3_high_gpio_wake(struct irq_data *d, unsigned int on)
168 {
169         if (on)
170                 writel(readl(PM_PWER) | PM_PWER_GPIOHIGH, PM_PWER);
171         else
172                 writel(readl(PM_PWER) & ~PM_PWER_GPIOHIGH, PM_PWER);
173         return 0;
174 }
175
176 static struct irq_chip puv3_high_gpio_chip = {
177         .name           = "GPIO-high",
178         .irq_ack        = puv3_high_gpio_ack,
179         .irq_mask       = puv3_high_gpio_mask,
180         .irq_unmask     = puv3_high_gpio_unmask,
181         .irq_set_type   = puv3_gpio_type,
182         .irq_set_wake   = puv3_high_gpio_wake,
183 };
184
185 /*
186  * We don't need to ACK IRQs on the PKUnity unless they're GPIOs
187  * this is for internal IRQs i.e. from 8 to 31.
188  */
189 static void puv3_mask_irq(struct irq_data *d)
190 {
191         writel(readl(INTC_ICMR) & ~(1 << d->irq), INTC_ICMR);
192 }
193
194 static void puv3_unmask_irq(struct irq_data *d)
195 {
196         writel(readl(INTC_ICMR) | (1 << d->irq), INTC_ICMR);
197 }
198
199 /*
200  * Apart form GPIOs, only the RTC alarm can be a wakeup event.
201  */
202 static int puv3_set_wake(struct irq_data *d, unsigned int on)
203 {
204         if (d->irq == IRQ_RTCAlarm) {
205                 if (on)
206                         writel(readl(PM_PWER) | PM_PWER_RTC, PM_PWER);
207                 else
208                         writel(readl(PM_PWER) & ~PM_PWER_RTC, PM_PWER);
209                 return 0;
210         }
211         return -EINVAL;
212 }
213
214 static struct irq_chip puv3_normal_chip = {
215         .name           = "PKUnity-v3",
216         .irq_ack        = puv3_mask_irq,
217         .irq_mask       = puv3_mask_irq,
218         .irq_unmask     = puv3_unmask_irq,
219         .irq_set_wake   = puv3_set_wake,
220 };
221
222 static struct resource irq_resource = {
223         .name   = "irqs",
224         .start  = io_v2p(PKUNITY_INTC_BASE),
225         .end    = io_v2p(PKUNITY_INTC_BASE) + 0xFFFFF,
226 };
227
228 static struct puv3_irq_state {
229         unsigned int    saved;
230         unsigned int    icmr;
231         unsigned int    iclr;
232         unsigned int    iccr;
233 } puv3_irq_state;
234
235 static int puv3_irq_suspend(void)
236 {
237         struct puv3_irq_state *st = &puv3_irq_state;
238
239         st->saved = 1;
240         st->icmr = readl(INTC_ICMR);
241         st->iclr = readl(INTC_ICLR);
242         st->iccr = readl(INTC_ICCR);
243
244         /*
245          * Disable all GPIO-based interrupts.
246          */
247         writel(readl(INTC_ICMR) & ~(0x1ff), INTC_ICMR);
248
249         /*
250          * Set the appropriate edges for wakeup.
251          */
252         writel(readl(PM_PWER) & GPIO_IRQ_rising_edge, GPIO_GRER);
253         writel(readl(PM_PWER) & GPIO_IRQ_falling_edge, GPIO_GFER);
254
255         /*
256          * Clear any pending GPIO interrupts.
257          */
258         writel(readl(GPIO_GEDR), GPIO_GEDR);
259
260         return 0;
261 }
262
263 static void puv3_irq_resume(void)
264 {
265         struct puv3_irq_state *st = &puv3_irq_state;
266
267         if (st->saved) {
268                 writel(st->iccr, INTC_ICCR);
269                 writel(st->iclr, INTC_ICLR);
270
271                 writel(GPIO_IRQ_rising_edge & GPIO_IRQ_mask, GPIO_GRER);
272                 writel(GPIO_IRQ_falling_edge & GPIO_IRQ_mask, GPIO_GFER);
273
274                 writel(st->icmr, INTC_ICMR);
275         }
276 }
277
278 static struct syscore_ops puv3_irq_syscore_ops = {
279         .suspend        = puv3_irq_suspend,
280         .resume         = puv3_irq_resume,
281 };
282
283 static int __init puv3_irq_init_syscore(void)
284 {
285         register_syscore_ops(&puv3_irq_syscore_ops);
286         return 0;
287 }
288
289 device_initcall(puv3_irq_init_syscore);
290
291 void __init init_IRQ(void)
292 {
293         unsigned int irq;
294
295         request_resource(&iomem_resource, &irq_resource);
296
297         /* disable all IRQs */
298         writel(0, INTC_ICMR);
299
300         /* all IRQs are IRQ, not REAL */
301         writel(0, INTC_ICLR);
302
303         /* clear all GPIO edge detects */
304         writel(FMASK(8, 0) & ~FIELD(1, 1, GPI_SOFF_REQ), GPIO_GPIR);
305         writel(0, GPIO_GFER);
306         writel(0, GPIO_GRER);
307         writel(0x0FFFFFFF, GPIO_GEDR);
308
309         writel(1, INTC_ICCR);
310
311         for (irq = 0; irq < IRQ_GPIOHIGH; irq++) {
312                 irq_set_chip(irq, &puv3_low_gpio_chip);
313                 irq_set_handler(irq, handle_edge_irq);
314                 irq_modify_status(irq,
315                         IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN,
316                         0);
317         }
318
319         for (irq = IRQ_GPIOHIGH + 1; irq < IRQ_GPIO0; irq++) {
320                 irq_set_chip(irq, &puv3_normal_chip);
321                 irq_set_handler(irq, handle_level_irq);
322                 irq_modify_status(irq,
323                         IRQ_NOREQUEST | IRQ_NOAUTOEN,
324                         IRQ_NOPROBE);
325         }
326
327         for (irq = IRQ_GPIO0; irq <= IRQ_GPIO27; irq++) {
328                 irq_set_chip(irq, &puv3_high_gpio_chip);
329                 irq_set_handler(irq, handle_edge_irq);
330                 irq_modify_status(irq,
331                         IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN,
332                         0);
333         }
334
335         /*
336          * Install handler for GPIO 0-27 edge detect interrupts
337          */
338         irq_set_chip(IRQ_GPIOHIGH, &puv3_normal_chip);
339         irq_set_chained_handler(IRQ_GPIOHIGH, puv3_gpio_handler);
340
341 #ifdef CONFIG_PUV3_GPIO
342         puv3_init_gpio();
343 #endif
344 }
345
346 /*
347  * do_IRQ handles all hardware IRQ's.  Decoded IRQs should not
348  * come via this function.  Instead, they should provide their
349  * own 'handler'
350  */
351 asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
352 {
353         struct pt_regs *old_regs = set_irq_regs(regs);
354
355         irq_enter();
356
357         /*
358          * Some hardware gives randomly wrong interrupts.  Rather
359          * than crashing, do something sensible.
360          */
361         if (unlikely(irq >= nr_irqs)) {
362                 if (printk_ratelimit())
363                         printk(KERN_WARNING "Bad IRQ%u\n", irq);
364                 ack_bad_irq(irq);
365         } else {
366                 generic_handle_irq(irq);
367         }
368
369         irq_exit();
370         set_irq_regs(old_regs);
371 }
372