1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) Maxime Coquelin 2015
4 * Copyright (C) STMicroelectronics 2017
5 * Author: Maxime Coquelin <mcoquelin.stm32@gmail.com>
8 #include <linux/bitops.h>
9 #include <linux/interrupt.h>
11 #include <linux/irq.h>
12 #include <linux/irqchip.h>
13 #include <linux/irqchip/chained_irq.h>
14 #include <linux/irqdomain.h>
15 #include <linux/of_address.h>
16 #include <linux/of_irq.h>
17 #include <linux/syscore_ops.h>
19 #include <dt-bindings/interrupt-controller/arm-gic.h>
21 #define IRQS_PER_BANK 32
23 struct stm32_exti_bank
{
35 struct stm32_desc_irq
{
40 struct stm32_exti_drv_data
{
41 const struct stm32_exti_bank
**exti_banks
;
42 const struct stm32_desc_irq
*desc_irqs
;
47 struct stm32_exti_chip_data
{
48 struct stm32_exti_host_data
*host_data
;
49 const struct stm32_exti_bank
*reg_bank
;
50 struct raw_spinlock rlock
;
57 struct stm32_exti_host_data
{
59 struct stm32_exti_chip_data
*chips_data
;
60 const struct stm32_exti_drv_data
*drv_data
;
63 static struct stm32_exti_host_data
*stm32_host_data
;
65 static const struct stm32_exti_bank stm32f4xx_exti_b1
= {
72 .fpr_ofst
= UNDEF_REG
,
75 static const struct stm32_exti_bank
*stm32f4xx_exti_banks
[] = {
79 static const struct stm32_exti_drv_data stm32f4xx_drv_data
= {
80 .exti_banks
= stm32f4xx_exti_banks
,
81 .bank_nr
= ARRAY_SIZE(stm32f4xx_exti_banks
),
84 static const struct stm32_exti_bank stm32h7xx_exti_b1
= {
91 .fpr_ofst
= UNDEF_REG
,
94 static const struct stm32_exti_bank stm32h7xx_exti_b2
= {
101 .fpr_ofst
= UNDEF_REG
,
104 static const struct stm32_exti_bank stm32h7xx_exti_b3
= {
111 .fpr_ofst
= UNDEF_REG
,
114 static const struct stm32_exti_bank
*stm32h7xx_exti_banks
[] = {
120 static const struct stm32_exti_drv_data stm32h7xx_drv_data
= {
121 .exti_banks
= stm32h7xx_exti_banks
,
122 .bank_nr
= ARRAY_SIZE(stm32h7xx_exti_banks
),
125 static const struct stm32_exti_bank stm32mp1_exti_b1
= {
135 static const struct stm32_exti_bank stm32mp1_exti_b2
= {
145 static const struct stm32_exti_bank stm32mp1_exti_b3
= {
155 static const struct stm32_exti_bank
*stm32mp1_exti_banks
[] = {
161 static const struct stm32_desc_irq stm32mp1_desc_irq
[] = {
162 { .exti
= 0, .irq_parent
= 6 },
163 { .exti
= 1, .irq_parent
= 7 },
164 { .exti
= 2, .irq_parent
= 8 },
165 { .exti
= 3, .irq_parent
= 9 },
166 { .exti
= 4, .irq_parent
= 10 },
167 { .exti
= 5, .irq_parent
= 23 },
168 { .exti
= 6, .irq_parent
= 64 },
169 { .exti
= 7, .irq_parent
= 65 },
170 { .exti
= 8, .irq_parent
= 66 },
171 { .exti
= 9, .irq_parent
= 67 },
172 { .exti
= 10, .irq_parent
= 40 },
173 { .exti
= 11, .irq_parent
= 42 },
174 { .exti
= 12, .irq_parent
= 76 },
175 { .exti
= 13, .irq_parent
= 77 },
176 { .exti
= 14, .irq_parent
= 121 },
177 { .exti
= 15, .irq_parent
= 127 },
178 { .exti
= 16, .irq_parent
= 1 },
179 { .exti
= 65, .irq_parent
= 144 },
180 { .exti
= 68, .irq_parent
= 143 },
181 { .exti
= 73, .irq_parent
= 129 },
184 static const struct stm32_exti_drv_data stm32mp1_drv_data
= {
185 .exti_banks
= stm32mp1_exti_banks
,
186 .bank_nr
= ARRAY_SIZE(stm32mp1_exti_banks
),
187 .desc_irqs
= stm32mp1_desc_irq
,
188 .irq_nr
= ARRAY_SIZE(stm32mp1_desc_irq
),
191 static int stm32_exti_to_irq(const struct stm32_exti_drv_data
*drv_data
,
192 irq_hw_number_t hwirq
)
194 const struct stm32_desc_irq
*desc_irq
;
197 if (!drv_data
->desc_irqs
)
200 for (i
= 0; i
< drv_data
->irq_nr
; i
++) {
201 desc_irq
= &drv_data
->desc_irqs
[i
];
202 if (desc_irq
->exti
== hwirq
)
203 return desc_irq
->irq_parent
;
209 static unsigned long stm32_exti_pending(struct irq_chip_generic
*gc
)
211 struct stm32_exti_chip_data
*chip_data
= gc
->private;
212 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
213 unsigned long pending
;
215 pending
= irq_reg_readl(gc
, stm32_bank
->rpr_ofst
);
216 if (stm32_bank
->fpr_ofst
!= UNDEF_REG
)
217 pending
|= irq_reg_readl(gc
, stm32_bank
->fpr_ofst
);
222 static void stm32_irq_handler(struct irq_desc
*desc
)
224 struct irq_domain
*domain
= irq_desc_get_handler_data(desc
);
225 struct irq_chip
*chip
= irq_desc_get_chip(desc
);
226 unsigned int virq
, nbanks
= domain
->gc
->num_chips
;
227 struct irq_chip_generic
*gc
;
228 unsigned long pending
;
229 int n
, i
, irq_base
= 0;
231 chained_irq_enter(chip
, desc
);
233 for (i
= 0; i
< nbanks
; i
++, irq_base
+= IRQS_PER_BANK
) {
234 gc
= irq_get_domain_generic_chip(domain
, irq_base
);
236 while ((pending
= stm32_exti_pending(gc
))) {
237 for_each_set_bit(n
, &pending
, IRQS_PER_BANK
) {
238 virq
= irq_find_mapping(domain
, irq_base
+ n
);
239 generic_handle_irq(virq
);
244 chained_irq_exit(chip
, desc
);
247 static int stm32_exti_set_type(struct irq_data
*d
,
248 unsigned int type
, u32
*rtsr
, u32
*ftsr
)
250 u32 mask
= BIT(d
->hwirq
% IRQS_PER_BANK
);
253 case IRQ_TYPE_EDGE_RISING
:
257 case IRQ_TYPE_EDGE_FALLING
:
261 case IRQ_TYPE_EDGE_BOTH
:
272 static int stm32_irq_set_type(struct irq_data
*d
, unsigned int type
)
274 struct irq_chip_generic
*gc
= irq_data_get_irq_chip_data(d
);
275 struct stm32_exti_chip_data
*chip_data
= gc
->private;
276 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
282 rtsr
= irq_reg_readl(gc
, stm32_bank
->rtsr_ofst
);
283 ftsr
= irq_reg_readl(gc
, stm32_bank
->ftsr_ofst
);
285 err
= stm32_exti_set_type(d
, type
, &rtsr
, &ftsr
);
291 irq_reg_writel(gc
, rtsr
, stm32_bank
->rtsr_ofst
);
292 irq_reg_writel(gc
, ftsr
, stm32_bank
->ftsr_ofst
);
299 static void stm32_chip_suspend(struct stm32_exti_chip_data
*chip_data
,
302 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
303 void __iomem
*base
= chip_data
->host_data
->base
;
305 /* save rtsr, ftsr registers */
306 chip_data
->rtsr_cache
= readl_relaxed(base
+ stm32_bank
->rtsr_ofst
);
307 chip_data
->ftsr_cache
= readl_relaxed(base
+ stm32_bank
->ftsr_ofst
);
309 writel_relaxed(wake_active
, base
+ stm32_bank
->imr_ofst
);
312 static void stm32_chip_resume(struct stm32_exti_chip_data
*chip_data
,
315 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
316 void __iomem
*base
= chip_data
->host_data
->base
;
318 /* restore rtsr, ftsr, registers */
319 writel_relaxed(chip_data
->rtsr_cache
, base
+ stm32_bank
->rtsr_ofst
);
320 writel_relaxed(chip_data
->ftsr_cache
, base
+ stm32_bank
->ftsr_ofst
);
322 writel_relaxed(mask_cache
, base
+ stm32_bank
->imr_ofst
);
325 static void stm32_irq_suspend(struct irq_chip_generic
*gc
)
327 struct stm32_exti_chip_data
*chip_data
= gc
->private;
330 stm32_chip_suspend(chip_data
, gc
->wake_active
);
334 static void stm32_irq_resume(struct irq_chip_generic
*gc
)
336 struct stm32_exti_chip_data
*chip_data
= gc
->private;
339 stm32_chip_resume(chip_data
, gc
->mask_cache
);
343 static int stm32_exti_alloc(struct irq_domain
*d
, unsigned int virq
,
344 unsigned int nr_irqs
, void *data
)
346 struct irq_fwspec
*fwspec
= data
;
347 irq_hw_number_t hwirq
;
349 hwirq
= fwspec
->param
[0];
351 irq_map_generic_chip(d
, virq
, hwirq
);
356 static void stm32_exti_free(struct irq_domain
*d
, unsigned int virq
,
357 unsigned int nr_irqs
)
359 struct irq_data
*data
= irq_domain_get_irq_data(d
, virq
);
361 irq_domain_reset_irq_data(data
);
364 static const struct irq_domain_ops irq_exti_domain_ops
= {
365 .map
= irq_map_generic_chip
,
366 .alloc
= stm32_exti_alloc
,
367 .free
= stm32_exti_free
,
370 static void stm32_irq_ack(struct irq_data
*d
)
372 struct irq_chip_generic
*gc
= irq_data_get_irq_chip_data(d
);
373 struct stm32_exti_chip_data
*chip_data
= gc
->private;
374 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
378 irq_reg_writel(gc
, d
->mask
, stm32_bank
->rpr_ofst
);
379 if (stm32_bank
->fpr_ofst
!= UNDEF_REG
)
380 irq_reg_writel(gc
, d
->mask
, stm32_bank
->fpr_ofst
);
385 static inline u32
stm32_exti_set_bit(struct irq_data
*d
, u32 reg
)
387 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
388 void __iomem
*base
= chip_data
->host_data
->base
;
391 val
= readl_relaxed(base
+ reg
);
392 val
|= BIT(d
->hwirq
% IRQS_PER_BANK
);
393 writel_relaxed(val
, base
+ reg
);
398 static inline u32
stm32_exti_clr_bit(struct irq_data
*d
, u32 reg
)
400 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
401 void __iomem
*base
= chip_data
->host_data
->base
;
404 val
= readl_relaxed(base
+ reg
);
405 val
&= ~BIT(d
->hwirq
% IRQS_PER_BANK
);
406 writel_relaxed(val
, base
+ reg
);
411 static void stm32_exti_h_eoi(struct irq_data
*d
)
413 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
414 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
416 raw_spin_lock(&chip_data
->rlock
);
418 stm32_exti_set_bit(d
, stm32_bank
->rpr_ofst
);
419 if (stm32_bank
->fpr_ofst
!= UNDEF_REG
)
420 stm32_exti_set_bit(d
, stm32_bank
->fpr_ofst
);
422 raw_spin_unlock(&chip_data
->rlock
);
424 if (d
->parent_data
->chip
)
425 irq_chip_eoi_parent(d
);
428 static void stm32_exti_h_mask(struct irq_data
*d
)
430 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
431 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
433 raw_spin_lock(&chip_data
->rlock
);
434 chip_data
->mask_cache
= stm32_exti_clr_bit(d
, stm32_bank
->imr_ofst
);
435 raw_spin_unlock(&chip_data
->rlock
);
437 if (d
->parent_data
->chip
)
438 irq_chip_mask_parent(d
);
441 static void stm32_exti_h_unmask(struct irq_data
*d
)
443 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
444 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
446 raw_spin_lock(&chip_data
->rlock
);
447 chip_data
->mask_cache
= stm32_exti_set_bit(d
, stm32_bank
->imr_ofst
);
448 raw_spin_unlock(&chip_data
->rlock
);
450 if (d
->parent_data
->chip
)
451 irq_chip_unmask_parent(d
);
454 static int stm32_exti_h_set_type(struct irq_data
*d
, unsigned int type
)
456 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
457 const struct stm32_exti_bank
*stm32_bank
= chip_data
->reg_bank
;
458 void __iomem
*base
= chip_data
->host_data
->base
;
462 raw_spin_lock(&chip_data
->rlock
);
463 rtsr
= readl_relaxed(base
+ stm32_bank
->rtsr_ofst
);
464 ftsr
= readl_relaxed(base
+ stm32_bank
->ftsr_ofst
);
466 err
= stm32_exti_set_type(d
, type
, &rtsr
, &ftsr
);
468 raw_spin_unlock(&chip_data
->rlock
);
472 writel_relaxed(rtsr
, base
+ stm32_bank
->rtsr_ofst
);
473 writel_relaxed(ftsr
, base
+ stm32_bank
->ftsr_ofst
);
474 raw_spin_unlock(&chip_data
->rlock
);
479 static int stm32_exti_h_set_wake(struct irq_data
*d
, unsigned int on
)
481 struct stm32_exti_chip_data
*chip_data
= irq_data_get_irq_chip_data(d
);
482 u32 mask
= BIT(d
->hwirq
% IRQS_PER_BANK
);
484 raw_spin_lock(&chip_data
->rlock
);
487 chip_data
->wake_active
|= mask
;
489 chip_data
->wake_active
&= ~mask
;
491 raw_spin_unlock(&chip_data
->rlock
);
496 static int stm32_exti_h_set_affinity(struct irq_data
*d
,
497 const struct cpumask
*dest
, bool force
)
499 if (d
->parent_data
->chip
)
500 return irq_chip_set_affinity_parent(d
, dest
, force
);
506 static int stm32_exti_h_suspend(void)
508 struct stm32_exti_chip_data
*chip_data
;
511 for (i
= 0; i
< stm32_host_data
->drv_data
->bank_nr
; i
++) {
512 chip_data
= &stm32_host_data
->chips_data
[i
];
513 raw_spin_lock(&chip_data
->rlock
);
514 stm32_chip_suspend(chip_data
, chip_data
->wake_active
);
515 raw_spin_unlock(&chip_data
->rlock
);
521 static void stm32_exti_h_resume(void)
523 struct stm32_exti_chip_data
*chip_data
;
526 for (i
= 0; i
< stm32_host_data
->drv_data
->bank_nr
; i
++) {
527 chip_data
= &stm32_host_data
->chips_data
[i
];
528 raw_spin_lock(&chip_data
->rlock
);
529 stm32_chip_resume(chip_data
, chip_data
->mask_cache
);
530 raw_spin_unlock(&chip_data
->rlock
);
534 static struct syscore_ops stm32_exti_h_syscore_ops
= {
535 .suspend
= stm32_exti_h_suspend
,
536 .resume
= stm32_exti_h_resume
,
539 static void stm32_exti_h_syscore_init(void)
541 register_syscore_ops(&stm32_exti_h_syscore_ops
);
544 static inline void stm32_exti_h_syscore_init(void) {}
547 static struct irq_chip stm32_exti_h_chip
= {
548 .name
= "stm32-exti-h",
549 .irq_eoi
= stm32_exti_h_eoi
,
550 .irq_mask
= stm32_exti_h_mask
,
551 .irq_unmask
= stm32_exti_h_unmask
,
552 .irq_retrigger
= irq_chip_retrigger_hierarchy
,
553 .irq_set_type
= stm32_exti_h_set_type
,
554 .irq_set_wake
= stm32_exti_h_set_wake
,
555 .flags
= IRQCHIP_MASK_ON_SUSPEND
,
556 .irq_set_affinity
= IS_ENABLED(CONFIG_SMP
) ? stm32_exti_h_set_affinity
: NULL
,
559 static int stm32_exti_h_domain_alloc(struct irq_domain
*dm
,
561 unsigned int nr_irqs
, void *data
)
563 struct stm32_exti_host_data
*host_data
= dm
->host_data
;
564 struct stm32_exti_chip_data
*chip_data
;
565 struct irq_fwspec
*fwspec
= data
;
566 struct irq_fwspec p_fwspec
;
567 irq_hw_number_t hwirq
;
570 hwirq
= fwspec
->param
[0];
571 bank
= hwirq
/ IRQS_PER_BANK
;
572 chip_data
= &host_data
->chips_data
[bank
];
574 irq_domain_set_hwirq_and_chip(dm
, virq
, hwirq
,
575 &stm32_exti_h_chip
, chip_data
);
577 p_irq
= stm32_exti_to_irq(host_data
->drv_data
, hwirq
);
579 p_fwspec
.fwnode
= dm
->parent
->fwnode
;
580 p_fwspec
.param_count
= 3;
581 p_fwspec
.param
[0] = GIC_SPI
;
582 p_fwspec
.param
[1] = p_irq
;
583 p_fwspec
.param
[2] = IRQ_TYPE_LEVEL_HIGH
;
585 return irq_domain_alloc_irqs_parent(dm
, virq
, 1, &p_fwspec
);
592 stm32_exti_host_data
*stm32_exti_host_init(const struct stm32_exti_drv_data
*dd
,
593 struct device_node
*node
)
595 struct stm32_exti_host_data
*host_data
;
597 host_data
= kzalloc(sizeof(*host_data
), GFP_KERNEL
);
601 host_data
->drv_data
= dd
;
602 host_data
->chips_data
= kcalloc(dd
->bank_nr
,
603 sizeof(struct stm32_exti_chip_data
),
605 if (!host_data
->chips_data
)
608 host_data
->base
= of_iomap(node
, 0);
609 if (!host_data
->base
) {
610 pr_err("%pOF: Unable to map registers\n", node
);
611 goto free_chips_data
;
614 stm32_host_data
= host_data
;
619 kfree(host_data
->chips_data
);
627 stm32_exti_chip_data
*stm32_exti_chip_init(struct stm32_exti_host_data
*h_data
,
629 struct device_node
*node
)
631 const struct stm32_exti_bank
*stm32_bank
;
632 struct stm32_exti_chip_data
*chip_data
;
633 void __iomem
*base
= h_data
->base
;
636 stm32_bank
= h_data
->drv_data
->exti_banks
[bank_idx
];
637 chip_data
= &h_data
->chips_data
[bank_idx
];
638 chip_data
->host_data
= h_data
;
639 chip_data
->reg_bank
= stm32_bank
;
641 raw_spin_lock_init(&chip_data
->rlock
);
643 /* Determine number of irqs supported */
644 writel_relaxed(~0UL, base
+ stm32_bank
->rtsr_ofst
);
645 irqs_mask
= readl_relaxed(base
+ stm32_bank
->rtsr_ofst
);
648 * This IP has no reset, so after hot reboot we should
649 * clear registers to avoid residue
651 writel_relaxed(0, base
+ stm32_bank
->imr_ofst
);
652 writel_relaxed(0, base
+ stm32_bank
->emr_ofst
);
654 pr_info("%s: bank%d, External IRQs available:%#x\n",
655 node
->full_name
, bank_idx
, irqs_mask
);
660 static int __init
stm32_exti_init(const struct stm32_exti_drv_data
*drv_data
,
661 struct device_node
*node
)
663 struct stm32_exti_host_data
*host_data
;
664 unsigned int clr
= IRQ_NOREQUEST
| IRQ_NOPROBE
| IRQ_NOAUTOEN
;
666 struct irq_chip_generic
*gc
;
667 struct irq_domain
*domain
;
669 host_data
= stm32_exti_host_init(drv_data
, node
);
673 domain
= irq_domain_add_linear(node
, drv_data
->bank_nr
* IRQS_PER_BANK
,
674 &irq_exti_domain_ops
, NULL
);
676 pr_err("%s: Could not register interrupt domain.\n",
682 ret
= irq_alloc_domain_generic_chips(domain
, IRQS_PER_BANK
, 1, "exti",
683 handle_edge_irq
, clr
, 0, 0);
685 pr_err("%pOF: Could not allocate generic interrupt chip.\n",
687 goto out_free_domain
;
690 for (i
= 0; i
< drv_data
->bank_nr
; i
++) {
691 const struct stm32_exti_bank
*stm32_bank
;
692 struct stm32_exti_chip_data
*chip_data
;
694 stm32_bank
= drv_data
->exti_banks
[i
];
695 chip_data
= stm32_exti_chip_init(host_data
, i
, node
);
697 gc
= irq_get_domain_generic_chip(domain
, i
* IRQS_PER_BANK
);
699 gc
->reg_base
= host_data
->base
;
700 gc
->chip_types
->type
= IRQ_TYPE_EDGE_BOTH
;
701 gc
->chip_types
->chip
.irq_ack
= stm32_irq_ack
;
702 gc
->chip_types
->chip
.irq_mask
= irq_gc_mask_clr_bit
;
703 gc
->chip_types
->chip
.irq_unmask
= irq_gc_mask_set_bit
;
704 gc
->chip_types
->chip
.irq_set_type
= stm32_irq_set_type
;
705 gc
->chip_types
->chip
.irq_set_wake
= irq_gc_set_wake
;
706 gc
->suspend
= stm32_irq_suspend
;
707 gc
->resume
= stm32_irq_resume
;
708 gc
->wake_enabled
= IRQ_MSK(IRQS_PER_BANK
);
710 gc
->chip_types
->regs
.mask
= stm32_bank
->imr_ofst
;
711 gc
->private = (void *)chip_data
;
714 nr_irqs
= of_irq_count(node
);
715 for (i
= 0; i
< nr_irqs
; i
++) {
716 unsigned int irq
= irq_of_parse_and_map(node
, i
);
718 irq_set_handler_data(irq
, domain
);
719 irq_set_chained_handler(irq
, stm32_irq_handler
);
725 irq_domain_remove(domain
);
727 iounmap(host_data
->base
);
728 kfree(host_data
->chips_data
);
733 static const struct irq_domain_ops stm32_exti_h_domain_ops
= {
734 .alloc
= stm32_exti_h_domain_alloc
,
735 .free
= irq_domain_free_irqs_common
,
739 __init
stm32_exti_hierarchy_init(const struct stm32_exti_drv_data
*drv_data
,
740 struct device_node
*node
,
741 struct device_node
*parent
)
743 struct irq_domain
*parent_domain
, *domain
;
744 struct stm32_exti_host_data
*host_data
;
747 parent_domain
= irq_find_host(parent
);
748 if (!parent_domain
) {
749 pr_err("interrupt-parent not found\n");
753 host_data
= stm32_exti_host_init(drv_data
, node
);
757 for (i
= 0; i
< drv_data
->bank_nr
; i
++)
758 stm32_exti_chip_init(host_data
, i
, node
);
760 domain
= irq_domain_add_hierarchy(parent_domain
, 0,
761 drv_data
->bank_nr
* IRQS_PER_BANK
,
762 node
, &stm32_exti_h_domain_ops
,
766 pr_err("%s: Could not register exti domain.\n", node
->name
);
771 stm32_exti_h_syscore_init();
776 iounmap(host_data
->base
);
777 kfree(host_data
->chips_data
);
782 static int __init
stm32f4_exti_of_init(struct device_node
*np
,
783 struct device_node
*parent
)
785 return stm32_exti_init(&stm32f4xx_drv_data
, np
);
788 IRQCHIP_DECLARE(stm32f4_exti
, "st,stm32-exti", stm32f4_exti_of_init
);
790 static int __init
stm32h7_exti_of_init(struct device_node
*np
,
791 struct device_node
*parent
)
793 return stm32_exti_init(&stm32h7xx_drv_data
, np
);
796 IRQCHIP_DECLARE(stm32h7_exti
, "st,stm32h7-exti", stm32h7_exti_of_init
);
798 static int __init
stm32mp1_exti_of_init(struct device_node
*np
,
799 struct device_node
*parent
)
801 return stm32_exti_hierarchy_init(&stm32mp1_drv_data
, np
, parent
);
804 IRQCHIP_DECLARE(stm32mp1_exti
, "st,stm32mp1-exti", stm32mp1_exti_of_init
);