1*0fdebc5eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
29dd0b194SLennert Buytenhek /*
39dd0b194SLennert Buytenhek * arch/arm/mach-orion5x/irq.c
49dd0b194SLennert Buytenhek *
59dd0b194SLennert Buytenhek * Core IRQ functions for Marvell Orion System On Chip
69dd0b194SLennert Buytenhek *
79dd0b194SLennert Buytenhek * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
89dd0b194SLennert Buytenhek */
92f8163baSRussell King #include <linux/gpio.h>
109dd0b194SLennert Buytenhek #include <linux/kernel.h>
119dd0b194SLennert Buytenhek #include <linux/irq.h>
123904a393SThomas Petazzoni #include <linux/io.h>
13ce91574cSRob Herring #include <plat/orion-gpio.h>
146f088f1dSLennert Buytenhek #include <plat/irq.h>
15ab5ab9dbSThomas Petazzoni #include <asm/exception.h>
16c22c2c60SArnd Bergmann #include "bridge-regs.h"
1742366666SAndrew Lunn #include "common.h"
189dd0b194SLennert Buytenhek
19278b45b0SAndrew Lunn static int __initdata gpio0_irqs[4] = {
20278b45b0SAndrew Lunn IRQ_ORION5X_GPIO_0_7,
21278b45b0SAndrew Lunn IRQ_ORION5X_GPIO_8_15,
22278b45b0SAndrew Lunn IRQ_ORION5X_GPIO_16_23,
23278b45b0SAndrew Lunn IRQ_ORION5X_GPIO_24_31,
24278b45b0SAndrew Lunn };
259dd0b194SLennert Buytenhek
26fc05c24dSBen Dooks static asmlinkage void
orion5x_legacy_handle_irq(struct pt_regs * regs)27ab5ab9dbSThomas Petazzoni __exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
28ab5ab9dbSThomas Petazzoni {
29ab5ab9dbSThomas Petazzoni u32 stat;
30ab5ab9dbSThomas Petazzoni
31ab5ab9dbSThomas Petazzoni stat = readl_relaxed(MAIN_IRQ_CAUSE);
32ab5ab9dbSThomas Petazzoni stat &= readl_relaxed(MAIN_IRQ_MASK);
33ab5ab9dbSThomas Petazzoni if (stat) {
345be9fc23SBenjamin Cama unsigned int hwirq = 1 + __fls(stat);
35ab5ab9dbSThomas Petazzoni handle_IRQ(hwirq, regs);
36ab5ab9dbSThomas Petazzoni return;
37ab5ab9dbSThomas Petazzoni }
38ab5ab9dbSThomas Petazzoni }
39ab5ab9dbSThomas Petazzoni
orion5x_init_irq(void)4007332318SLennert Buytenhek void __init orion5x_init_irq(void)
419dd0b194SLennert Buytenhek {
425be9fc23SBenjamin Cama orion_irq_init(1, MAIN_IRQ_MASK);
439dd0b194SLennert Buytenhek
44ab5ab9dbSThomas Petazzoni set_handle_irq(orion5x_legacy_handle_irq);
45ab5ab9dbSThomas Petazzoni
469dd0b194SLennert Buytenhek /*
479eac6d0aSLennert Buytenhek * Initialize gpiolib for GPIOs 0-31.
489dd0b194SLennert Buytenhek */
49bba14b32SAndy Shevchenko orion_gpio_init(0, 32, GPIO_VIRT_BASE, 0,
50278b45b0SAndrew Lunn IRQ_ORION5X_GPIO_START, gpio0_irqs);
519dd0b194SLennert Buytenhek }
52