Merge tag 'pinctrl-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[platform/kernel/linux-starfive.git] / drivers / irqchip / irq-stm32-exti.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Maxime Coquelin 2015
4  * Copyright (C) STMicroelectronics 2017
5  * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
6  */
7
8 #include <linux/bitops.h>
9 #include <linux/delay.h>
10 #include <linux/hwspinlock.h>
11 #include <linux/interrupt.h>
12 #include <linux/io.h>
13 #include <linux/irq.h>
14 #include <linux/irqchip.h>
15 #include <linux/irqchip/chained_irq.h>
16 #include <linux/irqdomain.h>
17 #include <linux/mod_devicetable.h>
18 #include <linux/module.h>
19 #include <linux/of_address.h>
20 #include <linux/of_irq.h>
21 #include <linux/platform_device.h>
22 #include <linux/syscore_ops.h>
23
24 #include <dt-bindings/interrupt-controller/arm-gic.h>
25
26 #define IRQS_PER_BANK 32
27
28 #define HWSPNLCK_TIMEOUT        1000 /* usec */
29
30 struct stm32_exti_bank {
31         u32 imr_ofst;
32         u32 emr_ofst;
33         u32 rtsr_ofst;
34         u32 ftsr_ofst;
35         u32 swier_ofst;
36         u32 rpr_ofst;
37         u32 fpr_ofst;
38         u32 trg_ofst;
39 };
40
41 #define UNDEF_REG ~0
42
43 struct stm32_exti_drv_data {
44         const struct stm32_exti_bank **exti_banks;
45         const u8 *desc_irqs;
46         u32 bank_nr;
47 };
48
49 struct stm32_exti_chip_data {
50         struct stm32_exti_host_data *host_data;
51         const struct stm32_exti_bank *reg_bank;
52         struct raw_spinlock rlock;
53         u32 wake_active;
54         u32 mask_cache;
55         u32 rtsr_cache;
56         u32 ftsr_cache;
57 };
58
59 struct stm32_exti_host_data {
60         void __iomem *base;
61         struct stm32_exti_chip_data *chips_data;
62         const struct stm32_exti_drv_data *drv_data;
63         struct hwspinlock *hwlock;
64 };
65
66 static struct stm32_exti_host_data *stm32_host_data;
67
68 static const struct stm32_exti_bank stm32f4xx_exti_b1 = {
69         .imr_ofst       = 0x00,
70         .emr_ofst       = 0x04,
71         .rtsr_ofst      = 0x08,
72         .ftsr_ofst      = 0x0C,
73         .swier_ofst     = 0x10,
74         .rpr_ofst       = 0x14,
75         .fpr_ofst       = UNDEF_REG,
76         .trg_ofst       = UNDEF_REG,
77 };
78
79 static const struct stm32_exti_bank *stm32f4xx_exti_banks[] = {
80         &stm32f4xx_exti_b1,
81 };
82
83 static const struct stm32_exti_drv_data stm32f4xx_drv_data = {
84         .exti_banks = stm32f4xx_exti_banks,
85         .bank_nr = ARRAY_SIZE(stm32f4xx_exti_banks),
86 };
87
88 static const struct stm32_exti_bank stm32h7xx_exti_b1 = {
89         .imr_ofst       = 0x80,
90         .emr_ofst       = 0x84,
91         .rtsr_ofst      = 0x00,
92         .ftsr_ofst      = 0x04,
93         .swier_ofst     = 0x08,
94         .rpr_ofst       = 0x88,
95         .fpr_ofst       = UNDEF_REG,
96         .trg_ofst       = UNDEF_REG,
97 };
98
99 static const struct stm32_exti_bank stm32h7xx_exti_b2 = {
100         .imr_ofst       = 0x90,
101         .emr_ofst       = 0x94,
102         .rtsr_ofst      = 0x20,
103         .ftsr_ofst      = 0x24,
104         .swier_ofst     = 0x28,
105         .rpr_ofst       = 0x98,
106         .fpr_ofst       = UNDEF_REG,
107         .trg_ofst       = UNDEF_REG,
108 };
109
110 static const struct stm32_exti_bank stm32h7xx_exti_b3 = {
111         .imr_ofst       = 0xA0,
112         .emr_ofst       = 0xA4,
113         .rtsr_ofst      = 0x40,
114         .ftsr_ofst      = 0x44,
115         .swier_ofst     = 0x48,
116         .rpr_ofst       = 0xA8,
117         .fpr_ofst       = UNDEF_REG,
118         .trg_ofst       = UNDEF_REG,
119 };
120
121 static const struct stm32_exti_bank *stm32h7xx_exti_banks[] = {
122         &stm32h7xx_exti_b1,
123         &stm32h7xx_exti_b2,
124         &stm32h7xx_exti_b3,
125 };
126
127 static const struct stm32_exti_drv_data stm32h7xx_drv_data = {
128         .exti_banks = stm32h7xx_exti_banks,
129         .bank_nr = ARRAY_SIZE(stm32h7xx_exti_banks),
130 };
131
132 static const struct stm32_exti_bank stm32mp1_exti_b1 = {
133         .imr_ofst       = 0x80,
134         .emr_ofst       = UNDEF_REG,
135         .rtsr_ofst      = 0x00,
136         .ftsr_ofst      = 0x04,
137         .swier_ofst     = 0x08,
138         .rpr_ofst       = 0x0C,
139         .fpr_ofst       = 0x10,
140         .trg_ofst       = 0x3EC,
141 };
142
143 static const struct stm32_exti_bank stm32mp1_exti_b2 = {
144         .imr_ofst       = 0x90,
145         .emr_ofst       = UNDEF_REG,
146         .rtsr_ofst      = 0x20,
147         .ftsr_ofst      = 0x24,
148         .swier_ofst     = 0x28,
149         .rpr_ofst       = 0x2C,
150         .fpr_ofst       = 0x30,
151         .trg_ofst       = 0x3E8,
152 };
153
154 static const struct stm32_exti_bank stm32mp1_exti_b3 = {
155         .imr_ofst       = 0xA0,
156         .emr_ofst       = UNDEF_REG,
157         .rtsr_ofst      = 0x40,
158         .ftsr_ofst      = 0x44,
159         .swier_ofst     = 0x48,
160         .rpr_ofst       = 0x4C,
161         .fpr_ofst       = 0x50,
162         .trg_ofst       = 0x3E4,
163 };
164
165 static const struct stm32_exti_bank *stm32mp1_exti_banks[] = {
166         &stm32mp1_exti_b1,
167         &stm32mp1_exti_b2,
168         &stm32mp1_exti_b3,
169 };
170
171 static struct irq_chip stm32_exti_h_chip;
172 static struct irq_chip stm32_exti_h_chip_direct;
173
174 #define EXTI_INVALID_IRQ       U8_MAX
175 #define STM32MP1_DESC_IRQ_SIZE (ARRAY_SIZE(stm32mp1_exti_banks) * IRQS_PER_BANK)
176
177 /*
178  * Use some intentionally tricky logic here to initialize the whole array to
179  * EXTI_INVALID_IRQ, but then override certain fields, requiring us to indicate
180  * that we "know" that there are overrides in this structure, and we'll need to
181  * disable that warning from W=1 builds.
182  */
183 __diag_push();
184 __diag_ignore_all("-Woverride-init",
185                   "logic to initialize all and then override some is OK");
186
187 static const u8 stm32mp1_desc_irq[] = {
188         /* default value */
189         [0 ... (STM32MP1_DESC_IRQ_SIZE - 1)] = EXTI_INVALID_IRQ,
190
191         [0] = 6,
192         [1] = 7,
193         [2] = 8,
194         [3] = 9,
195         [4] = 10,
196         [5] = 23,
197         [6] = 64,
198         [7] = 65,
199         [8] = 66,
200         [9] = 67,
201         [10] = 40,
202         [11] = 42,
203         [12] = 76,
204         [13] = 77,
205         [14] = 121,
206         [15] = 127,
207         [16] = 1,
208         [19] = 3,
209         [21] = 31,
210         [22] = 33,
211         [23] = 72,
212         [24] = 95,
213         [25] = 107,
214         [26] = 37,
215         [27] = 38,
216         [28] = 39,
217         [29] = 71,
218         [30] = 52,
219         [31] = 53,
220         [32] = 82,
221         [33] = 83,
222         [46] = 151,
223         [47] = 93,
224         [48] = 138,
225         [50] = 139,
226         [52] = 140,
227         [53] = 141,
228         [54] = 135,
229         [61] = 100,
230         [65] = 144,
231         [68] = 143,
232         [70] = 62,
233         [73] = 129,
234 };
235
236 static const u8 stm32mp13_desc_irq[] = {
237         /* default value */
238         [0 ... (STM32MP1_DESC_IRQ_SIZE - 1)] = EXTI_INVALID_IRQ,
239
240         [0] = 6,
241         [1] = 7,
242         [2] = 8,
243         [3] = 9,
244         [4] = 10,
245         [5] = 24,
246         [6] = 65,
247         [7] = 66,
248         [8] = 67,
249         [9] = 68,
250         [10] = 41,
251         [11] = 43,
252         [12] = 77,
253         [13] = 78,
254         [14] = 106,
255         [15] = 109,
256         [16] = 1,
257         [19] = 3,
258         [21] = 32,
259         [22] = 34,
260         [23] = 73,
261         [24] = 93,
262         [25] = 114,
263         [26] = 38,
264         [27] = 39,
265         [28] = 40,
266         [29] = 72,
267         [30] = 53,
268         [31] = 54,
269         [32] = 83,
270         [33] = 84,
271         [44] = 96,
272         [47] = 92,
273         [48] = 116,
274         [50] = 117,
275         [52] = 118,
276         [53] = 119,
277         [68] = 63,
278         [70] = 98,
279 };
280
281 __diag_pop();
282
283 static const struct stm32_exti_drv_data stm32mp1_drv_data = {
284         .exti_banks = stm32mp1_exti_banks,
285         .bank_nr = ARRAY_SIZE(stm32mp1_exti_banks),
286         .desc_irqs = stm32mp1_desc_irq,
287 };
288
289 static const struct stm32_exti_drv_data stm32mp13_drv_data = {
290         .exti_banks = stm32mp1_exti_banks,
291         .bank_nr = ARRAY_SIZE(stm32mp1_exti_banks),
292         .desc_irqs = stm32mp13_desc_irq,
293 };
294
295 static unsigned long stm32_exti_pending(struct irq_chip_generic *gc)
296 {
297         struct stm32_exti_chip_data *chip_data = gc->private;
298         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
299         unsigned long pending;
300
301         pending = irq_reg_readl(gc, stm32_bank->rpr_ofst);
302         if (stm32_bank->fpr_ofst != UNDEF_REG)
303                 pending |= irq_reg_readl(gc, stm32_bank->fpr_ofst);
304
305         return pending;
306 }
307
308 static void stm32_irq_handler(struct irq_desc *desc)
309 {
310         struct irq_domain *domain = irq_desc_get_handler_data(desc);
311         struct irq_chip *chip = irq_desc_get_chip(desc);
312         unsigned int nbanks = domain->gc->num_chips;
313         struct irq_chip_generic *gc;
314         unsigned long pending;
315         int n, i, irq_base = 0;
316
317         chained_irq_enter(chip, desc);
318
319         for (i = 0; i < nbanks; i++, irq_base += IRQS_PER_BANK) {
320                 gc = irq_get_domain_generic_chip(domain, irq_base);
321
322                 while ((pending = stm32_exti_pending(gc))) {
323                         for_each_set_bit(n, &pending, IRQS_PER_BANK)
324                                 generic_handle_domain_irq(domain, irq_base + n);
325                 }
326         }
327
328         chained_irq_exit(chip, desc);
329 }
330
331 static int stm32_exti_set_type(struct irq_data *d,
332                                unsigned int type, u32 *rtsr, u32 *ftsr)
333 {
334         u32 mask = BIT(d->hwirq % IRQS_PER_BANK);
335
336         switch (type) {
337         case IRQ_TYPE_EDGE_RISING:
338                 *rtsr |= mask;
339                 *ftsr &= ~mask;
340                 break;
341         case IRQ_TYPE_EDGE_FALLING:
342                 *rtsr &= ~mask;
343                 *ftsr |= mask;
344                 break;
345         case IRQ_TYPE_EDGE_BOTH:
346                 *rtsr |= mask;
347                 *ftsr |= mask;
348                 break;
349         default:
350                 return -EINVAL;
351         }
352
353         return 0;
354 }
355
356 static int stm32_irq_set_type(struct irq_data *d, unsigned int type)
357 {
358         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
359         struct stm32_exti_chip_data *chip_data = gc->private;
360         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
361         struct hwspinlock *hwlock = chip_data->host_data->hwlock;
362         u32 rtsr, ftsr;
363         int err;
364
365         irq_gc_lock(gc);
366
367         if (hwlock) {
368                 err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT);
369                 if (err) {
370                         pr_err("%s can't get hwspinlock (%d)\n", __func__, err);
371                         goto unlock;
372                 }
373         }
374
375         rtsr = irq_reg_readl(gc, stm32_bank->rtsr_ofst);
376         ftsr = irq_reg_readl(gc, stm32_bank->ftsr_ofst);
377
378         err = stm32_exti_set_type(d, type, &rtsr, &ftsr);
379         if (err)
380                 goto unspinlock;
381
382         irq_reg_writel(gc, rtsr, stm32_bank->rtsr_ofst);
383         irq_reg_writel(gc, ftsr, stm32_bank->ftsr_ofst);
384
385 unspinlock:
386         if (hwlock)
387                 hwspin_unlock_in_atomic(hwlock);
388 unlock:
389         irq_gc_unlock(gc);
390
391         return err;
392 }
393
394 static void stm32_chip_suspend(struct stm32_exti_chip_data *chip_data,
395                                u32 wake_active)
396 {
397         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
398         void __iomem *base = chip_data->host_data->base;
399
400         /* save rtsr, ftsr registers */
401         chip_data->rtsr_cache = readl_relaxed(base + stm32_bank->rtsr_ofst);
402         chip_data->ftsr_cache = readl_relaxed(base + stm32_bank->ftsr_ofst);
403
404         writel_relaxed(wake_active, base + stm32_bank->imr_ofst);
405 }
406
407 static void stm32_chip_resume(struct stm32_exti_chip_data *chip_data,
408                               u32 mask_cache)
409 {
410         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
411         void __iomem *base = chip_data->host_data->base;
412
413         /* restore rtsr, ftsr, registers */
414         writel_relaxed(chip_data->rtsr_cache, base + stm32_bank->rtsr_ofst);
415         writel_relaxed(chip_data->ftsr_cache, base + stm32_bank->ftsr_ofst);
416
417         writel_relaxed(mask_cache, base + stm32_bank->imr_ofst);
418 }
419
420 static void stm32_irq_suspend(struct irq_chip_generic *gc)
421 {
422         struct stm32_exti_chip_data *chip_data = gc->private;
423
424         irq_gc_lock(gc);
425         stm32_chip_suspend(chip_data, gc->wake_active);
426         irq_gc_unlock(gc);
427 }
428
429 static void stm32_irq_resume(struct irq_chip_generic *gc)
430 {
431         struct stm32_exti_chip_data *chip_data = gc->private;
432
433         irq_gc_lock(gc);
434         stm32_chip_resume(chip_data, gc->mask_cache);
435         irq_gc_unlock(gc);
436 }
437
438 static int stm32_exti_alloc(struct irq_domain *d, unsigned int virq,
439                             unsigned int nr_irqs, void *data)
440 {
441         struct irq_fwspec *fwspec = data;
442         irq_hw_number_t hwirq;
443
444         hwirq = fwspec->param[0];
445
446         irq_map_generic_chip(d, virq, hwirq);
447
448         return 0;
449 }
450
451 static void stm32_exti_free(struct irq_domain *d, unsigned int virq,
452                             unsigned int nr_irqs)
453 {
454         struct irq_data *data = irq_domain_get_irq_data(d, virq);
455
456         irq_domain_reset_irq_data(data);
457 }
458
459 static const struct irq_domain_ops irq_exti_domain_ops = {
460         .map    = irq_map_generic_chip,
461         .alloc  = stm32_exti_alloc,
462         .free   = stm32_exti_free,
463         .xlate  = irq_domain_xlate_twocell,
464 };
465
466 static void stm32_irq_ack(struct irq_data *d)
467 {
468         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
469         struct stm32_exti_chip_data *chip_data = gc->private;
470         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
471
472         irq_gc_lock(gc);
473
474         irq_reg_writel(gc, d->mask, stm32_bank->rpr_ofst);
475         if (stm32_bank->fpr_ofst != UNDEF_REG)
476                 irq_reg_writel(gc, d->mask, stm32_bank->fpr_ofst);
477
478         irq_gc_unlock(gc);
479 }
480
481 /* directly set the target bit without reading first. */
482 static inline void stm32_exti_write_bit(struct irq_data *d, u32 reg)
483 {
484         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
485         void __iomem *base = chip_data->host_data->base;
486         u32 val = BIT(d->hwirq % IRQS_PER_BANK);
487
488         writel_relaxed(val, base + reg);
489 }
490
491 static inline u32 stm32_exti_set_bit(struct irq_data *d, u32 reg)
492 {
493         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
494         void __iomem *base = chip_data->host_data->base;
495         u32 val;
496
497         val = readl_relaxed(base + reg);
498         val |= BIT(d->hwirq % IRQS_PER_BANK);
499         writel_relaxed(val, base + reg);
500
501         return val;
502 }
503
504 static inline u32 stm32_exti_clr_bit(struct irq_data *d, u32 reg)
505 {
506         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
507         void __iomem *base = chip_data->host_data->base;
508         u32 val;
509
510         val = readl_relaxed(base + reg);
511         val &= ~BIT(d->hwirq % IRQS_PER_BANK);
512         writel_relaxed(val, base + reg);
513
514         return val;
515 }
516
517 static void stm32_exti_h_eoi(struct irq_data *d)
518 {
519         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
520         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
521
522         raw_spin_lock(&chip_data->rlock);
523
524         stm32_exti_write_bit(d, stm32_bank->rpr_ofst);
525         if (stm32_bank->fpr_ofst != UNDEF_REG)
526                 stm32_exti_write_bit(d, stm32_bank->fpr_ofst);
527
528         raw_spin_unlock(&chip_data->rlock);
529
530         if (d->parent_data->chip)
531                 irq_chip_eoi_parent(d);
532 }
533
534 static void stm32_exti_h_mask(struct irq_data *d)
535 {
536         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
537         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
538
539         raw_spin_lock(&chip_data->rlock);
540         chip_data->mask_cache = stm32_exti_clr_bit(d, stm32_bank->imr_ofst);
541         raw_spin_unlock(&chip_data->rlock);
542
543         if (d->parent_data->chip)
544                 irq_chip_mask_parent(d);
545 }
546
547 static void stm32_exti_h_unmask(struct irq_data *d)
548 {
549         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
550         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
551
552         raw_spin_lock(&chip_data->rlock);
553         chip_data->mask_cache = stm32_exti_set_bit(d, stm32_bank->imr_ofst);
554         raw_spin_unlock(&chip_data->rlock);
555
556         if (d->parent_data->chip)
557                 irq_chip_unmask_parent(d);
558 }
559
560 static int stm32_exti_h_set_type(struct irq_data *d, unsigned int type)
561 {
562         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
563         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
564         struct hwspinlock *hwlock = chip_data->host_data->hwlock;
565         void __iomem *base = chip_data->host_data->base;
566         u32 rtsr, ftsr;
567         int err;
568
569         raw_spin_lock(&chip_data->rlock);
570
571         if (hwlock) {
572                 err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT);
573                 if (err) {
574                         pr_err("%s can't get hwspinlock (%d)\n", __func__, err);
575                         goto unlock;
576                 }
577         }
578
579         rtsr = readl_relaxed(base + stm32_bank->rtsr_ofst);
580         ftsr = readl_relaxed(base + stm32_bank->ftsr_ofst);
581
582         err = stm32_exti_set_type(d, type, &rtsr, &ftsr);
583         if (err)
584                 goto unspinlock;
585
586         writel_relaxed(rtsr, base + stm32_bank->rtsr_ofst);
587         writel_relaxed(ftsr, base + stm32_bank->ftsr_ofst);
588
589 unspinlock:
590         if (hwlock)
591                 hwspin_unlock_in_atomic(hwlock);
592 unlock:
593         raw_spin_unlock(&chip_data->rlock);
594
595         return err;
596 }
597
598 static int stm32_exti_h_set_wake(struct irq_data *d, unsigned int on)
599 {
600         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
601         u32 mask = BIT(d->hwirq % IRQS_PER_BANK);
602
603         raw_spin_lock(&chip_data->rlock);
604
605         if (on)
606                 chip_data->wake_active |= mask;
607         else
608                 chip_data->wake_active &= ~mask;
609
610         raw_spin_unlock(&chip_data->rlock);
611
612         return 0;
613 }
614
615 static int stm32_exti_h_set_affinity(struct irq_data *d,
616                                      const struct cpumask *dest, bool force)
617 {
618         if (d->parent_data->chip)
619                 return irq_chip_set_affinity_parent(d, dest, force);
620
621         return IRQ_SET_MASK_OK_DONE;
622 }
623
624 static int __maybe_unused stm32_exti_h_suspend(void)
625 {
626         struct stm32_exti_chip_data *chip_data;
627         int i;
628
629         for (i = 0; i < stm32_host_data->drv_data->bank_nr; i++) {
630                 chip_data = &stm32_host_data->chips_data[i];
631                 raw_spin_lock(&chip_data->rlock);
632                 stm32_chip_suspend(chip_data, chip_data->wake_active);
633                 raw_spin_unlock(&chip_data->rlock);
634         }
635
636         return 0;
637 }
638
639 static void __maybe_unused stm32_exti_h_resume(void)
640 {
641         struct stm32_exti_chip_data *chip_data;
642         int i;
643
644         for (i = 0; i < stm32_host_data->drv_data->bank_nr; i++) {
645                 chip_data = &stm32_host_data->chips_data[i];
646                 raw_spin_lock(&chip_data->rlock);
647                 stm32_chip_resume(chip_data, chip_data->mask_cache);
648                 raw_spin_unlock(&chip_data->rlock);
649         }
650 }
651
652 static struct syscore_ops stm32_exti_h_syscore_ops = {
653 #ifdef CONFIG_PM_SLEEP
654         .suspend        = stm32_exti_h_suspend,
655         .resume         = stm32_exti_h_resume,
656 #endif
657 };
658
659 static void stm32_exti_h_syscore_init(struct stm32_exti_host_data *host_data)
660 {
661         stm32_host_data = host_data;
662         register_syscore_ops(&stm32_exti_h_syscore_ops);
663 }
664
665 static void stm32_exti_h_syscore_deinit(void)
666 {
667         unregister_syscore_ops(&stm32_exti_h_syscore_ops);
668 }
669
670 static int stm32_exti_h_retrigger(struct irq_data *d)
671 {
672         struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d);
673         const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank;
674         void __iomem *base = chip_data->host_data->base;
675         u32 mask = BIT(d->hwirq % IRQS_PER_BANK);
676
677         writel_relaxed(mask, base + stm32_bank->swier_ofst);
678
679         return 0;
680 }
681
682 static struct irq_chip stm32_exti_h_chip = {
683         .name                   = "stm32-exti-h",
684         .irq_eoi                = stm32_exti_h_eoi,
685         .irq_mask               = stm32_exti_h_mask,
686         .irq_unmask             = stm32_exti_h_unmask,
687         .irq_retrigger          = stm32_exti_h_retrigger,
688         .irq_set_type           = stm32_exti_h_set_type,
689         .irq_set_wake           = stm32_exti_h_set_wake,
690         .flags                  = IRQCHIP_MASK_ON_SUSPEND,
691         .irq_set_affinity       = IS_ENABLED(CONFIG_SMP) ? stm32_exti_h_set_affinity : NULL,
692 };
693
694 static struct irq_chip stm32_exti_h_chip_direct = {
695         .name                   = "stm32-exti-h-direct",
696         .irq_eoi                = irq_chip_eoi_parent,
697         .irq_ack                = irq_chip_ack_parent,
698         .irq_mask               = stm32_exti_h_mask,
699         .irq_unmask             = stm32_exti_h_unmask,
700         .irq_retrigger          = irq_chip_retrigger_hierarchy,
701         .irq_set_type           = irq_chip_set_type_parent,
702         .irq_set_wake           = stm32_exti_h_set_wake,
703         .flags                  = IRQCHIP_MASK_ON_SUSPEND,
704         .irq_set_affinity       = IS_ENABLED(CONFIG_SMP) ? irq_chip_set_affinity_parent : NULL,
705 };
706
707 static int stm32_exti_h_domain_alloc(struct irq_domain *dm,
708                                      unsigned int virq,
709                                      unsigned int nr_irqs, void *data)
710 {
711         struct stm32_exti_host_data *host_data = dm->host_data;
712         struct stm32_exti_chip_data *chip_data;
713         u8 desc_irq;
714         struct irq_fwspec *fwspec = data;
715         struct irq_fwspec p_fwspec;
716         irq_hw_number_t hwirq;
717         int bank;
718         u32 event_trg;
719         struct irq_chip *chip;
720
721         hwirq = fwspec->param[0];
722         if (hwirq >= host_data->drv_data->bank_nr * IRQS_PER_BANK)
723                 return -EINVAL;
724
725         bank  = hwirq / IRQS_PER_BANK;
726         chip_data = &host_data->chips_data[bank];
727
728         event_trg = readl_relaxed(host_data->base + chip_data->reg_bank->trg_ofst);
729         chip = (event_trg & BIT(hwirq % IRQS_PER_BANK)) ?
730                &stm32_exti_h_chip : &stm32_exti_h_chip_direct;
731
732         irq_domain_set_hwirq_and_chip(dm, virq, hwirq, chip, chip_data);
733
734         if (!host_data->drv_data->desc_irqs)
735                 return -EINVAL;
736
737         desc_irq = host_data->drv_data->desc_irqs[hwirq];
738         if (desc_irq != EXTI_INVALID_IRQ) {
739                 p_fwspec.fwnode = dm->parent->fwnode;
740                 p_fwspec.param_count = 3;
741                 p_fwspec.param[0] = GIC_SPI;
742                 p_fwspec.param[1] = desc_irq;
743                 p_fwspec.param[2] = IRQ_TYPE_LEVEL_HIGH;
744
745                 return irq_domain_alloc_irqs_parent(dm, virq, 1, &p_fwspec);
746         }
747
748         return 0;
749 }
750
751 static struct
752 stm32_exti_host_data *stm32_exti_host_init(const struct stm32_exti_drv_data *dd,
753                                            struct device_node *node)
754 {
755         struct stm32_exti_host_data *host_data;
756
757         host_data = kzalloc(sizeof(*host_data), GFP_KERNEL);
758         if (!host_data)
759                 return NULL;
760
761         host_data->drv_data = dd;
762         host_data->chips_data = kcalloc(dd->bank_nr,
763                                         sizeof(struct stm32_exti_chip_data),
764                                         GFP_KERNEL);
765         if (!host_data->chips_data)
766                 goto free_host_data;
767
768         host_data->base = of_iomap(node, 0);
769         if (!host_data->base) {
770                 pr_err("%pOF: Unable to map registers\n", node);
771                 goto free_chips_data;
772         }
773
774         stm32_host_data = host_data;
775
776         return host_data;
777
778 free_chips_data:
779         kfree(host_data->chips_data);
780 free_host_data:
781         kfree(host_data);
782
783         return NULL;
784 }
785
786 static struct
787 stm32_exti_chip_data *stm32_exti_chip_init(struct stm32_exti_host_data *h_data,
788                                            u32 bank_idx,
789                                            struct device_node *node)
790 {
791         const struct stm32_exti_bank *stm32_bank;
792         struct stm32_exti_chip_data *chip_data;
793         void __iomem *base = h_data->base;
794
795         stm32_bank = h_data->drv_data->exti_banks[bank_idx];
796         chip_data = &h_data->chips_data[bank_idx];
797         chip_data->host_data = h_data;
798         chip_data->reg_bank = stm32_bank;
799
800         raw_spin_lock_init(&chip_data->rlock);
801
802         /*
803          * This IP has no reset, so after hot reboot we should
804          * clear registers to avoid residue
805          */
806         writel_relaxed(0, base + stm32_bank->imr_ofst);
807         if (stm32_bank->emr_ofst != UNDEF_REG)
808                 writel_relaxed(0, base + stm32_bank->emr_ofst);
809
810         pr_info("%pOF: bank%d\n", node, bank_idx);
811
812         return chip_data;
813 }
814
815 static int __init stm32_exti_init(const struct stm32_exti_drv_data *drv_data,
816                                   struct device_node *node)
817 {
818         struct stm32_exti_host_data *host_data;
819         unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
820         int nr_irqs, ret, i;
821         struct irq_chip_generic *gc;
822         struct irq_domain *domain;
823
824         host_data = stm32_exti_host_init(drv_data, node);
825         if (!host_data)
826                 return -ENOMEM;
827
828         domain = irq_domain_add_linear(node, drv_data->bank_nr * IRQS_PER_BANK,
829                                        &irq_exti_domain_ops, NULL);
830         if (!domain) {
831                 pr_err("%pOFn: Could not register interrupt domain.\n",
832                        node);
833                 ret = -ENOMEM;
834                 goto out_unmap;
835         }
836
837         ret = irq_alloc_domain_generic_chips(domain, IRQS_PER_BANK, 1, "exti",
838                                              handle_edge_irq, clr, 0, 0);
839         if (ret) {
840                 pr_err("%pOF: Could not allocate generic interrupt chip.\n",
841                        node);
842                 goto out_free_domain;
843         }
844
845         for (i = 0; i < drv_data->bank_nr; i++) {
846                 const struct stm32_exti_bank *stm32_bank;
847                 struct stm32_exti_chip_data *chip_data;
848
849                 stm32_bank = drv_data->exti_banks[i];
850                 chip_data = stm32_exti_chip_init(host_data, i, node);
851
852                 gc = irq_get_domain_generic_chip(domain, i * IRQS_PER_BANK);
853
854                 gc->reg_base = host_data->base;
855                 gc->chip_types->type = IRQ_TYPE_EDGE_BOTH;
856                 gc->chip_types->chip.irq_ack = stm32_irq_ack;
857                 gc->chip_types->chip.irq_mask = irq_gc_mask_clr_bit;
858                 gc->chip_types->chip.irq_unmask = irq_gc_mask_set_bit;
859                 gc->chip_types->chip.irq_set_type = stm32_irq_set_type;
860                 gc->chip_types->chip.irq_set_wake = irq_gc_set_wake;
861                 gc->suspend = stm32_irq_suspend;
862                 gc->resume = stm32_irq_resume;
863                 gc->wake_enabled = IRQ_MSK(IRQS_PER_BANK);
864
865                 gc->chip_types->regs.mask = stm32_bank->imr_ofst;
866                 gc->private = (void *)chip_data;
867         }
868
869         nr_irqs = of_irq_count(node);
870         for (i = 0; i < nr_irqs; i++) {
871                 unsigned int irq = irq_of_parse_and_map(node, i);
872
873                 irq_set_handler_data(irq, domain);
874                 irq_set_chained_handler(irq, stm32_irq_handler);
875         }
876
877         return 0;
878
879 out_free_domain:
880         irq_domain_remove(domain);
881 out_unmap:
882         iounmap(host_data->base);
883         kfree(host_data->chips_data);
884         kfree(host_data);
885         return ret;
886 }
887
888 static const struct irq_domain_ops stm32_exti_h_domain_ops = {
889         .alloc  = stm32_exti_h_domain_alloc,
890         .free   = irq_domain_free_irqs_common,
891         .xlate = irq_domain_xlate_twocell,
892 };
893
894 static void stm32_exti_remove_irq(void *data)
895 {
896         struct irq_domain *domain = data;
897
898         irq_domain_remove(domain);
899 }
900
901 static int stm32_exti_remove(struct platform_device *pdev)
902 {
903         stm32_exti_h_syscore_deinit();
904         return 0;
905 }
906
907 static int stm32_exti_probe(struct platform_device *pdev)
908 {
909         int ret, i;
910         struct device *dev = &pdev->dev;
911         struct device_node *np = dev->of_node;
912         struct irq_domain *parent_domain, *domain;
913         struct stm32_exti_host_data *host_data;
914         const struct stm32_exti_drv_data *drv_data;
915
916         host_data = devm_kzalloc(dev, sizeof(*host_data), GFP_KERNEL);
917         if (!host_data)
918                 return -ENOMEM;
919
920         /* check for optional hwspinlock which may be not available yet */
921         ret = of_hwspin_lock_get_id(np, 0);
922         if (ret == -EPROBE_DEFER)
923                 /* hwspinlock framework not yet ready */
924                 return ret;
925
926         if (ret >= 0) {
927                 host_data->hwlock = devm_hwspin_lock_request_specific(dev, ret);
928                 if (!host_data->hwlock) {
929                         dev_err(dev, "Failed to request hwspinlock\n");
930                         return -EINVAL;
931                 }
932         } else if (ret != -ENOENT) {
933                 /* note: ENOENT is a valid case (means 'no hwspinlock') */
934                 dev_err(dev, "Failed to get hwspinlock\n");
935                 return ret;
936         }
937
938         /* initialize host_data */
939         drv_data = of_device_get_match_data(dev);
940         if (!drv_data) {
941                 dev_err(dev, "no of match data\n");
942                 return -ENODEV;
943         }
944         host_data->drv_data = drv_data;
945
946         host_data->chips_data = devm_kcalloc(dev, drv_data->bank_nr,
947                                              sizeof(*host_data->chips_data),
948                                              GFP_KERNEL);
949         if (!host_data->chips_data)
950                 return -ENOMEM;
951
952         host_data->base = devm_platform_ioremap_resource(pdev, 0);
953         if (IS_ERR(host_data->base))
954                 return PTR_ERR(host_data->base);
955
956         for (i = 0; i < drv_data->bank_nr; i++)
957                 stm32_exti_chip_init(host_data, i, np);
958
959         parent_domain = irq_find_host(of_irq_find_parent(np));
960         if (!parent_domain) {
961                 dev_err(dev, "GIC interrupt-parent not found\n");
962                 return -EINVAL;
963         }
964
965         domain = irq_domain_add_hierarchy(parent_domain, 0,
966                                           drv_data->bank_nr * IRQS_PER_BANK,
967                                           np, &stm32_exti_h_domain_ops,
968                                           host_data);
969
970         if (!domain) {
971                 dev_err(dev, "Could not register exti domain\n");
972                 return -ENOMEM;
973         }
974
975         ret = devm_add_action_or_reset(dev, stm32_exti_remove_irq, domain);
976         if (ret)
977                 return ret;
978
979         stm32_exti_h_syscore_init(host_data);
980
981         return 0;
982 }
983
984 /* platform driver only for MP1 */
985 static const struct of_device_id stm32_exti_ids[] = {
986         { .compatible = "st,stm32mp1-exti", .data = &stm32mp1_drv_data},
987         { .compatible = "st,stm32mp13-exti", .data = &stm32mp13_drv_data},
988         {},
989 };
990 MODULE_DEVICE_TABLE(of, stm32_exti_ids);
991
992 static struct platform_driver stm32_exti_driver = {
993         .probe          = stm32_exti_probe,
994         .remove         = stm32_exti_remove,
995         .driver         = {
996                 .name   = "stm32_exti",
997                 .of_match_table = stm32_exti_ids,
998         },
999 };
1000
1001 static int __init stm32_exti_arch_init(void)
1002 {
1003         return platform_driver_register(&stm32_exti_driver);
1004 }
1005
1006 static void __exit stm32_exti_arch_exit(void)
1007 {
1008         return platform_driver_unregister(&stm32_exti_driver);
1009 }
1010
1011 arch_initcall(stm32_exti_arch_init);
1012 module_exit(stm32_exti_arch_exit);
1013
1014 /* no platform driver for F4 and H7 */
1015 static int __init stm32f4_exti_of_init(struct device_node *np,
1016                                        struct device_node *parent)
1017 {
1018         return stm32_exti_init(&stm32f4xx_drv_data, np);
1019 }
1020
1021 IRQCHIP_DECLARE(stm32f4_exti, "st,stm32-exti", stm32f4_exti_of_init);
1022
1023 static int __init stm32h7_exti_of_init(struct device_node *np,
1024                                        struct device_node *parent)
1025 {
1026         return stm32_exti_init(&stm32h7xx_drv_data, np);
1027 }
1028
1029 IRQCHIP_DECLARE(stm32h7_exti, "st,stm32h7-exti", stm32h7_exti_of_init);