xref: /openbmc/linux/arch/arm/mach-orion5x/irq.c (revision 0fdebc5e)
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