Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

plat-orion: share IRQ handling code

Split off Orion IRQ handling code into plat-orion/, and add
support for multiple sets of (32) interrupts.

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Reviewed-by: Tzachi Perelstein <tzachi@marvell.com>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Nicolas Pitre <nico@marvell.com>

authored by

Lennert Buytenhek and committed by
Nicolas Pitre
01eb5698 69b02f6a

+84 -34
+2 -33
arch/arm/mach-orion/irq.c
··· 15 15 #include <linux/irq.h> 16 16 #include <asm/gpio.h> 17 17 #include <asm/arch/orion.h> 18 + #include <asm/plat-orion/irq.h> 18 19 #include "common.h" 19 20 20 21 /***************************************************************************** ··· 198 197 /***************************************************************************** 199 198 * Orion Main IRQ 200 199 ****************************************************************************/ 201 - static void orion_main_irq_mask(u32 irq) 202 - { 203 - orion_clrbits(MAIN_IRQ_MASK, 1 << irq); 204 - } 205 - 206 - static void orion_main_irq_unmask(u32 irq) 207 - { 208 - orion_setbits(MAIN_IRQ_MASK, 1 << irq); 209 - } 210 - 211 - static struct irq_chip orion_main_irq_chip = { 212 - .name = "Orion-IRQ-Main", 213 - .ack = orion_main_irq_mask, 214 - .mask = orion_main_irq_mask, 215 - .unmask = orion_main_irq_unmask, 216 - }; 217 - 218 200 static void __init orion_init_main_irq(void) 219 201 { 220 - int i; 221 - 222 - /* 223 - * Mask and clear Main IRQ interrupts 224 - */ 225 - orion_write(MAIN_IRQ_MASK, 0x0); 226 - orion_write(MAIN_IRQ_CAUSE, 0x0); 227 - 228 - /* 229 - * Register level handler for Main IRQs 230 - */ 231 - for (i = 0; i < IRQ_ORION_GPIO_START; i++) { 232 - set_irq_chip(i, &orion_main_irq_chip); 233 - set_irq_handler(i, handle_level_irq); 234 - set_irq_flags(i, IRQF_VALID); 235 - } 202 + orion_irq_init(0, (void __iomem *)MAIN_IRQ_MASK); 236 203 } 237 204 238 205 void __init orion_init_irq(void)
+1 -1
arch/arm/plat-orion/Makefile
··· 2 2 # Makefile for the linux kernel. 3 3 # 4 4 5 - obj-y := 5 + obj-y := irq.o 6 6 obj-m := 7 7 obj-n := 8 8 obj- :=
+64
arch/arm/plat-orion/irq.c
··· 1 + /* 2 + * arch/arm/plat-orion/irq.c 3 + * 4 + * Marvell Orion SoC IRQ handling. 5 + * 6 + * This file is licensed under the terms of the GNU General Public 7 + * License version 2. This program is licensed "as is" without any 8 + * warranty of any kind, whether express or implied. 9 + */ 10 + 11 + #include <linux/kernel.h> 12 + #include <linux/init.h> 13 + #include <linux/irq.h> 14 + #include <linux/io.h> 15 + #include <asm/plat-orion/irq.h> 16 + 17 + static void orion_irq_mask(u32 irq) 18 + { 19 + void __iomem *maskaddr = get_irq_chip_data(irq); 20 + u32 mask; 21 + 22 + mask = readl(maskaddr); 23 + mask &= ~(1 << (irq & 31)); 24 + writel(mask, maskaddr); 25 + } 26 + 27 + static void orion_irq_unmask(u32 irq) 28 + { 29 + void __iomem *maskaddr = get_irq_chip_data(irq); 30 + u32 mask; 31 + 32 + mask = readl(maskaddr); 33 + mask |= 1 << (irq & 31); 34 + writel(mask, maskaddr); 35 + } 36 + 37 + static struct irq_chip orion_irq_chip = { 38 + .name = "orion_irq", 39 + .ack = orion_irq_mask, 40 + .mask = orion_irq_mask, 41 + .unmask = orion_irq_unmask, 42 + }; 43 + 44 + void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) 45 + { 46 + unsigned int i; 47 + 48 + /* 49 + * Mask all interrupts initially. 50 + */ 51 + writel(0, maskaddr); 52 + 53 + /* 54 + * Register IRQ sources. 55 + */ 56 + for (i = 0; i < 32; i++) { 57 + unsigned int irq = irq_start + i; 58 + 59 + set_irq_chip(irq, &orion_irq_chip); 60 + set_irq_chip_data(irq, maskaddr); 61 + set_irq_handler(irq, handle_level_irq); 62 + set_irq_flags(irq, IRQF_VALID); 63 + } 64 + }
+17
include/asm-arm/plat-orion/irq.h
··· 1 + /* 2 + * include/asm-arm/plat-orion/irq.h 3 + * 4 + * Marvell Orion SoC IRQ handling. 5 + * 6 + * This file is licensed under the terms of the GNU General Public 7 + * License version 2. This program is licensed "as is" without any 8 + * warranty of any kind, whether express or implied. 9 + */ 10 + 11 + #ifndef __ASM_PLAT_ORION_IRQ_H 12 + #define __ASM_PLAT_ORION_IRQ_H 13 + 14 + void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); 15 + 16 + 17 + #endif