xref: /openbmc/linux/arch/arm/mach-orion5x/irq.c (revision fc05c24d)
19dd0b194SLennert Buytenhek /*
29dd0b194SLennert Buytenhek  * arch/arm/mach-orion5x/irq.c
39dd0b194SLennert Buytenhek  *
49dd0b194SLennert Buytenhek  * Core IRQ functions for Marvell Orion System On Chip
59dd0b194SLennert Buytenhek  *
69dd0b194SLennert Buytenhek  * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
79dd0b194SLennert Buytenhek  *
89dd0b194SLennert Buytenhek  * This file is licensed under the terms of the GNU General Public
99dd0b194SLennert Buytenhek  * License version 2.  This program is licensed "as is" without any
109dd0b194SLennert Buytenhek  * warranty of any kind, whether express or implied.
119dd0b194SLennert Buytenhek  */
122f8163baSRussell King #include <linux/gpio.h>
139dd0b194SLennert Buytenhek #include <linux/kernel.h>
149dd0b194SLennert Buytenhek #include <linux/irq.h>
153904a393SThomas Petazzoni #include <linux/io.h>
16ce91574cSRob Herring #include <plat/orion-gpio.h>
176f088f1dSLennert Buytenhek #include <plat/irq.h>
18ab5ab9dbSThomas Petazzoni #include <asm/exception.h>
19c22c2c60SArnd Bergmann #include "bridge-regs.h"
2042366666SAndrew Lunn #include "common.h"
219dd0b194SLennert Buytenhek 
22278b45b0SAndrew Lunn static int __initdata gpio0_irqs[4] = {
23278b45b0SAndrew Lunn 	IRQ_ORION5X_GPIO_0_7,
24278b45b0SAndrew Lunn 	IRQ_ORION5X_GPIO_8_15,
25278b45b0SAndrew Lunn 	IRQ_ORION5X_GPIO_16_23,
26278b45b0SAndrew Lunn 	IRQ_ORION5X_GPIO_24_31,
27278b45b0SAndrew Lunn };
289dd0b194SLennert Buytenhek 
29fc05c24dSBen Dooks static asmlinkage void
30ab5ab9dbSThomas Petazzoni __exception_irq_entry orion5x_legacy_handle_irq(struct pt_regs *regs)
31ab5ab9dbSThomas Petazzoni {
32ab5ab9dbSThomas Petazzoni 	u32 stat;
33ab5ab9dbSThomas Petazzoni 
34ab5ab9dbSThomas Petazzoni 	stat = readl_relaxed(MAIN_IRQ_CAUSE);
35ab5ab9dbSThomas Petazzoni 	stat &= readl_relaxed(MAIN_IRQ_MASK);
36ab5ab9dbSThomas Petazzoni 	if (stat) {
375be9fc23SBenjamin Cama 		unsigned int hwirq = 1 + __fls(stat);
38ab5ab9dbSThomas Petazzoni 		handle_IRQ(hwirq, regs);
39ab5ab9dbSThomas Petazzoni 		return;
40ab5ab9dbSThomas Petazzoni 	}
41ab5ab9dbSThomas Petazzoni }
42ab5ab9dbSThomas Petazzoni 
4307332318SLennert Buytenhek void __init orion5x_init_irq(void)
449dd0b194SLennert Buytenhek {
455be9fc23SBenjamin Cama 	orion_irq_init(1, MAIN_IRQ_MASK);
469dd0b194SLennert Buytenhek 
47ab5ab9dbSThomas Petazzoni 	set_handle_irq(orion5x_legacy_handle_irq);
48ab5ab9dbSThomas Petazzoni 
499dd0b194SLennert Buytenhek 	/*
509eac6d0aSLennert Buytenhek 	 * Initialize gpiolib for GPIOs 0-31.
519dd0b194SLennert Buytenhek 	 */
523904a393SThomas Petazzoni 	orion_gpio_init(NULL, 0, 32, GPIO_VIRT_BASE, 0,
53278b45b0SAndrew Lunn 			IRQ_ORION5X_GPIO_START, gpio0_irqs);
549dd0b194SLennert Buytenhek }
55