1edabd38eSSaeed Bishara /* 2edabd38eSSaeed Bishara * arch/arm/mach-dove/irq.c 3edabd38eSSaeed Bishara * 4edabd38eSSaeed Bishara * Dove IRQ handling. 5edabd38eSSaeed Bishara * 6edabd38eSSaeed Bishara * This file is licensed under the terms of the GNU General Public 7edabd38eSSaeed Bishara * License version 2. This program is licensed "as is" without any 8edabd38eSSaeed Bishara * warranty of any kind, whether express or implied. 9edabd38eSSaeed Bishara */ 10edabd38eSSaeed Bishara #include <linux/init.h> 11edabd38eSSaeed Bishara #include <linux/irq.h> 12edabd38eSSaeed Bishara #include <linux/io.h> 13b8cd337cSArnd Bergmann #include <asm/exception.h> 14ce78179eSArnd Bergmann 15edabd38eSSaeed Bishara #include <plat/irq.h> 16ce91574cSRob Herring #include <plat/orion-gpio.h> 17ce78179eSArnd Bergmann 18ce78179eSArnd Bergmann #include "pm.h" 19ce78179eSArnd Bergmann #include "bridge-regs.h" 20edabd38eSSaeed Bishara #include "common.h" 21edabd38eSSaeed Bishara 22278b45b0SAndrew Lunn static int __initdata gpio0_irqs[4] = { 23278b45b0SAndrew Lunn IRQ_DOVE_GPIO_0_7, 24278b45b0SAndrew Lunn IRQ_DOVE_GPIO_8_15, 25278b45b0SAndrew Lunn IRQ_DOVE_GPIO_16_23, 26278b45b0SAndrew Lunn IRQ_DOVE_GPIO_24_31, 27278b45b0SAndrew Lunn }; 28278b45b0SAndrew Lunn 29278b45b0SAndrew Lunn static int __initdata gpio1_irqs[4] = { 30278b45b0SAndrew Lunn IRQ_DOVE_HIGH_GPIO, 31278b45b0SAndrew Lunn 0, 32278b45b0SAndrew Lunn 0, 33278b45b0SAndrew Lunn 0, 34278b45b0SAndrew Lunn }; 35278b45b0SAndrew Lunn 36278b45b0SAndrew Lunn static int __initdata gpio2_irqs[4] = { 37278b45b0SAndrew Lunn 0, 38278b45b0SAndrew Lunn 0, 39278b45b0SAndrew Lunn 0, 40278b45b0SAndrew Lunn 0, 41278b45b0SAndrew Lunn }; 42278b45b0SAndrew Lunn 43deac3d87SThomas Petazzoni static void __iomem *dove_irq_base = IRQ_VIRT_BASE; 44deac3d87SThomas Petazzoni 45deac3d87SThomas Petazzoni static asmlinkage void 46deac3d87SThomas Petazzoni __exception_irq_entry dove_legacy_handle_irq(struct pt_regs *regs) 47deac3d87SThomas Petazzoni { 48deac3d87SThomas Petazzoni u32 stat; 49deac3d87SThomas Petazzoni 50deac3d87SThomas Petazzoni stat = readl_relaxed(dove_irq_base + IRQ_CAUSE_LOW_OFF); 51deac3d87SThomas Petazzoni stat &= readl_relaxed(dove_irq_base + IRQ_MASK_LOW_OFF); 52deac3d87SThomas Petazzoni if (stat) { 535d6bed2aSRussell King unsigned int hwirq = 1 + __fls(stat); 54deac3d87SThomas Petazzoni handle_IRQ(hwirq, regs); 55deac3d87SThomas Petazzoni return; 56deac3d87SThomas Petazzoni } 57deac3d87SThomas Petazzoni stat = readl_relaxed(dove_irq_base + IRQ_CAUSE_HIGH_OFF); 58deac3d87SThomas Petazzoni stat &= readl_relaxed(dove_irq_base + IRQ_MASK_HIGH_OFF); 59deac3d87SThomas Petazzoni if (stat) { 605d6bed2aSRussell King unsigned int hwirq = 33 + __fls(stat); 61deac3d87SThomas Petazzoni handle_IRQ(hwirq, regs); 62deac3d87SThomas Petazzoni return; 63deac3d87SThomas Petazzoni } 64deac3d87SThomas Petazzoni } 65deac3d87SThomas Petazzoni 66edabd38eSSaeed Bishara void __init dove_init_irq(void) 67edabd38eSSaeed Bishara { 685d6bed2aSRussell King orion_irq_init(1, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF); 695d6bed2aSRussell King orion_irq_init(33, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF); 70edabd38eSSaeed Bishara 71deac3d87SThomas Petazzoni set_handle_irq(dove_legacy_handle_irq); 72deac3d87SThomas Petazzoni 73edabd38eSSaeed Bishara /* 749eac6d0aSLennert Buytenhek * Initialize gpiolib for GPIOs 0-71. 75edabd38eSSaeed Bishara */ 76c3c5a281SThomas Petazzoni orion_gpio_init(NULL, 0, 32, DOVE_GPIO_LO_VIRT_BASE, 0, 77278b45b0SAndrew Lunn IRQ_DOVE_GPIO_START, gpio0_irqs); 789eac6d0aSLennert Buytenhek 79c3c5a281SThomas Petazzoni orion_gpio_init(NULL, 32, 32, DOVE_GPIO_HI_VIRT_BASE, 0, 80278b45b0SAndrew Lunn IRQ_DOVE_GPIO_START + 32, gpio1_irqs); 819eac6d0aSLennert Buytenhek 82c3c5a281SThomas Petazzoni orion_gpio_init(NULL, 64, 8, DOVE_GPIO2_VIRT_BASE, 0, 83278b45b0SAndrew Lunn IRQ_DOVE_GPIO_START + 64, gpio2_irqs); 84edabd38eSSaeed Bishara } 85