ARM: at91: introduce AIC5 support
cover ARM: at91: introduce AIC5 support
Hi,
This set of patches introduces AIC5 support with the goal to have only one kernel image for all SOCs.
AIC5 can manage up to 128 irq lines and introduces a new register map and a source select register to select the IRQ line we want to configure.
Regards
Ludovic
PATCH 1/4 ARM: at91: at91 based machines specify their own irq handler at run time
From: Ludovic Desroches <[email protected]>
SOC_AT91SAM9 selects MULTI_IRQ_HANDLER in order to let machines specify their own IRQ handler at run time.
--- arch/arm/mach-at91/Kconfig | 1 + arch/arm/mach-at91/board-1arm.c | 1 + arch/arm/mach-at91/board-afeb-9260v1.c | 1 + arch/arm/mach-at91/board-cam60.c | 1 + arch/arm/mach-at91/board-carmeva.c | 1 + arch/arm/mach-at91/board-cpu9krea.c | 1 + arch/arm/mach-at91/board-cpuat91.c | 1 + arch/arm/mach-at91/board-csb337.c | 1 + arch/arm/mach-at91/board-csb637.c | 1 + arch/arm/mach-at91/board-dt.c | 1 + arch/arm/mach-at91/board-eb01.c | 1 + arch/arm/mach-at91/board-eb9200.c | 1 + arch/arm/mach-at91/board-ecbat91.c | 1 + arch/arm/mach-at91/board-eco920.c | 1 + arch/arm/mach-at91/board-flexibity.c | 1 + arch/arm/mach-at91/board-foxg20.c | 1 + arch/arm/mach-at91/board-gsia18s.c | 1 + arch/arm/mach-at91/board-kafa.c | 1 + arch/arm/mach-at91/board-kb9202.c | 1 + arch/arm/mach-at91/board-neocore926.c | 1 + arch/arm/mach-at91/board-pcontrol-g20.c | 1 + arch/arm/mach-at91/board-picotux200.c | 1 + arch/arm/mach-at91/board-qil-a9260.c | 1 + arch/arm/mach-at91/board-rm9200dk.c | 1 + arch/arm/mach-at91/board-rm9200ek.c | 1 + arch/arm/mach-at91/board-rsi-ews.c | 1 + arch/arm/mach-at91/board-sam9-l9260.c | 1 + arch/arm/mach-at91/board-sam9260ek.c | 1 + arch/arm/mach-at91/board-sam9261ek.c | 1 + arch/arm/mach-at91/board-sam9263ek.c | 1 + arch/arm/mach-at91/board-sam9g20ek.c | 1 + arch/arm/mach-at91/board-sam9m10g45ek.c | 1 + arch/arm/mach-at91/board-sam9rlek.c | 1 + arch/arm/mach-at91/board-snapper9260.c | 1 + arch/arm/mach-at91/board-stamp9g20.c | 1 + arch/arm/mach-at91/board-usb-a926x.c | 1 + arch/arm/mach-at91/board-yl-9200.c | 1 + arch/arm/mach-at91/include/mach/entry-macro.S | 27 ------------------------- arch/arm/mach-at91/include/mach/irqs.h | 2 + arch/arm/mach-at91/irq.c | 19 +++++++++++++++++ 40 files changed, 58 insertions(+), 27 deletions(-) delete mode 100644 arch/arm/mach-at91/include/mach/entry-macro.S
arch/arm/mach-at91/Kconfig +1 -0
@@ -29,6 +29,7 @@ comment "Atmel AT91 Processor" config SOC_AT91SAM9 bool select CPU_ARM926T + select MULTI_IRQ_HANDLER select AT91_SAM9_TIME select AT91_SAM9_SMC
arch/arm/mach-at91/board-1arm.c +1 -0
@@ -91,6 +91,7 @@ MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")/* Maintainer: Lennert Buytenhek <[email protected]> */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = onearm_init_early, .init_irq = at91_init_irq_default, .init_machine = onearm_board_init,
arch/arm/mach-at91/board-afeb-9260v1.c +1 -0
@@ -212,6 +212,7 @@ MACHINE_START(AFEB9260, "Custom afeb9260 board")/* Maintainer: Sergey Lapin <[email protected]> */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = afeb9260_init_early, .init_irq = at91_init_irq_default, .init_machine = afeb9260_board_init,
arch/arm/mach-at91/board-cam60.c +1 -0
@@ -188,6 +188,7 @@ MACHINE_START(CAM60, "KwikByte CAM60")/* Maintainer: KwikByte */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = cam60_init_early, .init_irq = at91_init_irq_default, .init_machine = cam60_board_init,
arch/arm/mach-at91/board-carmeva.c +1 -0
@@ -158,6 +158,7 @@ MACHINE_START(CARMEVA, "Carmeva")/* Maintainer: Conitec Datasystems */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = carmeva_init_early, .init_irq = at91_init_irq_default, .init_machine = carmeva_board_init,
arch/arm/mach-at91/board-cpu9krea.c +1 -0
@@ -376,6 +376,7 @@ MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")/* Maintainer: Eric Benard - EUKREA Electromatique */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = cpu9krea_init_early, .init_irq = at91_init_irq_default, .init_machine = cpu9krea_board_init,
arch/arm/mach-at91/board-cpuat91.c +1 -0
@@ -178,6 +178,7 @@ MACHINE_START(CPUAT91, "Eukrea")/* Maintainer: Eric Benard - EUKREA Electromatique */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = cpuat91_init_early, .init_irq = at91_init_irq_default, .init_machine = cpuat91_board_init,
arch/arm/mach-at91/board-csb337.c +1 -0
@@ -252,6 +252,7 @@ MACHINE_START(CSB337, "Cogent CSB337")/* Maintainer: Bill Gatliff */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = csb337_init_early, .init_irq = at91_init_irq_default, .init_machine = csb337_board_init,
arch/arm/mach-at91/board-csb637.c +1 -0
@@ -133,6 +133,7 @@ MACHINE_START(CSB637, "Cogent CSB637")/* Maintainer: Bill Gatliff */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = csb637_init_early, .init_irq = at91_init_irq_default, .init_machine = csb637_board_init,
arch/arm/mach-at91/board-dt.c +1 -0
@@ -53,6 +53,7 @@ DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM (Device Tree)")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = at91_dt_initialize, .init_irq = at91_dt_init_irq, .init_machine = at91_dt_device_init,
arch/arm/mach-at91/board-eb01.c +1 -0
@@ -43,6 +43,7 @@ static void __init at91eb01_init_early(void)MACHINE_START (AT91EB01 ,"Atmel AT91 EB01" )/* Maintainer: Greg Ungerer <[email protected]> */ .timer = &at91x40_timer, + .handle_irq = at91_aic_handle_irq, .init_early = at91eb01_init_early, .init_irq = at91eb01_init_irq,MACHINE_END
arch/arm/mach-at91/board-eb9200.c +1 -0
@@ -118,6 +118,7 @@ static void __init eb9200_board_init(void)MACHINE_START (ATEB9200 ,"Embest ATEB9200" ) .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = eb9200_init_early, .init_irq = at91_init_irq_default, .init_machine = eb9200_board_init,
arch/arm/mach-at91/board-ecbat91.c +1 -0
@@ -170,6 +170,7 @@ MACHINE_START(ECBAT91, "emQbit's ECB_AT91")/* Maintainer: emQbit.com */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ecb_at91init_early, .init_irq = at91_init_irq_default, .init_machine = ecb_at91board_init,
arch/arm/mach-at91/board-eco920.c +1 -0
@@ -132,6 +132,7 @@ MACHINE_START(ECO920, "eco920")/* Maintainer: Sascha Hauer */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = eco920_init_early, .init_irq = at91_init_irq_default, .init_machine = eco920_board_init,
arch/arm/mach-at91/board-flexibity.c +1 -0
@@ -160,6 +160,7 @@ MACHINE_START(FLEXIBITY, "Flexibity Connect")/* Maintainer: Maxim Osipov */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = flexibity_init_early, .init_irq = at91_init_irq_default, .init_machine = flexibity_board_init,
arch/arm/mach-at91/board-foxg20.c +1 -0
@@ -262,6 +262,7 @@ MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20")/* Maintainer: Sergio Tanzilli */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = foxg20_init_early, .init_irq = at91_init_irq_default, .init_machine = foxg20_board_init,
arch/arm/mach-at91/board-gsia18s.c +1 -0
@@ -575,6 +575,7 @@ static void __init gsia18s_board_init(void)MACHINE_START (GSIA18S ,"GS_IA18_S" ) .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = gsia18s_init_early, .init_irq = at91_init_irq_default, .init_machine = gsia18s_board_init,
arch/arm/mach-at91/board-kafa.c +1 -0
@@ -93,6 +93,7 @@ MACHINE_START(KAFA, "Sperry-Sun KAFA")/* Maintainer: Sergei Sharonov */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = kafa_init_early, .init_irq = at91_init_irq_default, .init_machine = kafa_board_init,
arch/arm/mach-at91/board-kb9202.c +1 -0
@@ -133,6 +133,7 @@ MACHINE_START(KB9200, "KB920x")/* Maintainer: KwikByte, Inc. */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = kb9202_init_early, .init_irq = at91_init_irq_default, .init_machine = kb9202_board_init,
arch/arm/mach-at91/board-neocore926.c +1 -0
@@ -378,6 +378,7 @@ MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926")/* Maintainer: ADENEO */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = neocore926_init_early, .init_irq = at91_init_irq_default, .init_machine = neocore926_board_init,
arch/arm/mach-at91/board-pcontrol-g20.c +1 -0
@@ -218,6 +218,7 @@ MACHINE_START(PCONTROL_G20, "PControl G20")/* Maintainer: pgsellmann at portner-elektronik.at */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = pcontrol_g20_init_early, .init_irq = at91_init_irq_default, .init_machine = pcontrol_g20_board_init,
arch/arm/mach-at91/board-picotux200.c +1 -0
@@ -120,6 +120,7 @@ MACHINE_START(PICOTUX2XX, "picotux 200")/* Maintainer: Kleinhenz Elektronik GmbH */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = picotux200_init_early, .init_irq = at91_init_irq_default, .init_machine = picotux200_board_init,
arch/arm/mach-at91/board-qil-a9260.c +1 -0
@@ -258,6 +258,7 @@ MACHINE_START(QIL_A9260, "CALAO QIL_A9260")/* Maintainer: calao-systems */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-rm9200dk.c +1 -0
@@ -223,6 +223,7 @@ MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")/* Maintainer: SAN People/Atmel */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = dk_init_early, .init_irq = at91_init_irq_default, .init_machine = dk_board_init,
arch/arm/mach-at91/board-rm9200ek.c +1 -0
@@ -190,6 +190,7 @@ MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")/* Maintainer: SAN People/Atmel */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-rsi-ews.c +1 -0
@@ -225,6 +225,7 @@ MACHINE_START(RSI_EWS, "RSI EWS")/* Maintainer: Josef Holzmayr <[email protected]> */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = rsi_ews_init_early, .init_irq = at91_init_irq_default, .init_machine = rsi_ews_board_init,
arch/arm/mach-at91/board-sam9-l9260.c +1 -0
@@ -202,6 +202,7 @@ MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")/* Maintainer: Olimex */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-sam9260ek.c +1 -0
@@ -344,6 +344,7 @@ MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-sam9261ek.c +1 -0
@@ -615,6 +615,7 @@ MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-sam9263ek.c +1 -0
@@ -443,6 +443,7 @@ MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-sam9g20ek.c +1 -0
@@ -422,6 +422,7 @@ MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-sam9m10g45ek.c +1 -0
@@ -503,6 +503,7 @@ MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-sam9rlek.c +1 -0
@@ -319,6 +319,7 @@ MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-snapper9260.c +1 -0
@@ -178,6 +178,7 @@ static void __init snapper9260_board_init(void)MACHINE_START (SNAPPER_9260 ,"Bluewater Systems Snapper 9260/9G20 module" ) .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = snapper9260_init_early, .init_irq = at91_init_irq_default, .init_machine = snapper9260_board_init,
arch/arm/mach-at91/board-stamp9g20.c +1 -0
@@ -296,6 +296,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20")/* Maintainer: taskit GmbH */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = stamp9g20_init_early, .init_irq = at91_init_irq_default, .init_machine = stamp9g20evb_board_init,
arch/arm/mach-at91/board-usb-a926x.c +1 -0
@@ -376,6 +376,7 @@ MACHINE_START(USB_A9G20, "CALAO USB_A92G0")/* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default, .init_machine = ek_board_init,
arch/arm/mach-at91/board-yl-9200.c +1 -0
@@ -590,6 +590,7 @@ MACHINE_START(YL9200, "uCdragon YL-9200")/* Maintainer: S.Birtles */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .handle_irq = at91_aic_handle_irq, .init_early = yl9200_init_early, .init_irq = at91_init_irq_default, .init_machine = yl9200_board_init,
arch/arm/mach-at91/include/mach/entry-macro.S deleted +0 -27
@@ -1,27 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/entry-macro.S - * - * Copyright (C) 2003-2005 SAN People - * - * Low-level IRQ helper macros for AT91RM9200 platforms - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include <mach/hardware.h> -#include <mach/at91_aic.h> - - .macro get_irqnr_preamble, base, tmp - ldr \base, =at91_aic_base @ base virtual address of AIC peripheral - ldr \base, [\base] - .endm - - .macro get_irqnr_and_base, irqnr, irqstat, base, tmp - ldr \irqnr, [\base, #AT91_AIC_IVR] @ read IRQ vector register: de-asserts nIRQ to processor (and clears interrupt) - ldr \irqstat, [\base, #AT91_AIC_ISR] @ read interrupt source number - teq \irqstat, #0 @ ISR is 0 when no current interrupt, or spurious interrupt - streq \tmp, [\base, #AT91_AIC_EOICR] @ not going to be handled further, then ACK it now. - .endm -
arch/arm/mach-at91/include/mach/irqs.h +2 -0
@@ -38,4 +38,6 @@/* FIQ is AIC source 0. */ #define FIQ_START AT91_ID_FIQ +void at91_aic_handle_irq (struct pt_regs *regs); +#endif
arch/arm/mach-at91/irq.c +19 -0
@@ -35,6 +35,7 @@#include <asm/irq.h> #include <asm/setup.h> +#include <asm/exception.h> #include <asm/mach/arch.h> #include <asm/mach/irq.h> #include <asm/mach/map.h>
@@ -43,6 +44,24 @@ void __iomem *at91_aic_base;static struct irq_domain *at91_aic_domain;static struct device_node *at91_aic_np; +asmlinkage void __exception_irq_entry at91_aic_handle_irq(struct pt_regs *regs) +{ +u32 irqnr; +u32 irqstat; + + irqnr =at91_aic_read (AT91_AIC_IVR ); + irqstat =at91_aic_read (AT91_AIC_ISR ); + +/* +* ISR value is 0 when there is no current interrupt or when there is +* a spurious interrupt +*/ +if (!irqstat) +at91_aic_write (AT91_AIC_EOICR ,0 ); +else +handle_IRQ (irqnr, regs); +} +static void at91_aic_mask_irq (struct irq_data *d) {/* Disable interrupt on AIC */
Signature · 1 line
1.7.5.4
PATCH 1/4 ARM: at91: at91 based machines specify their own irq handler at run time
Quoted 5 lines · ludovic.desroches at atmel.com
From: Ludovic Desroches <[email protected]>
SOC_AT91SAM9selectsMULTI_IRQ_HANDLERin order to let machines specify their own IRQ handler at run time.
Quoted 7 lines
Signed-off-by Ludovic Desroches <[email protected]>--- arch/arm/mach-at91/board-cpu9krea.c | 1 + arch/arm/mach-at91/board-sam9g20ek.c | 1 + arch/arm/mach-at91/board-sam9261ek.c | 1 + arch/arm/mach-at91/board-stamp9g20.c | 1 + arch/arm/mach-at91/board-usb-a926x.c | 1 +
At least these board files contain more than one MACHINE_START, but you only update the last one. Same for the third patch.
I have not looked at the rest of the patch.
PATCH 1/4 ARM: at91: at91 based machines specify their own irq handler at run time
Hi Christian,
Quoted 14 lines · Christian Glindkamp
Quoted 5 lines · ludovic.desroches at atmel.com
From: Ludovic Desroches<[email protected]>
SOC_AT91SAM9selectsMULTI_IRQ_HANDLERin order to let machines specify their own IRQ handler at run time.Quoted 7 lines
Signed-off-by Ludovic Desroches<[email protected]>--- arch/arm/mach-at91/board-cpu9krea.c | 1 + arch/arm/mach-at91/board-sam9g20ek.c | 1 + arch/arm/mach-at91/board-sam9261ek.c | 1 + arch/arm/mach-at91/board-stamp9g20.c | 1 + arch/arm/mach-at91/board-usb-a926x.c | 1 +
Quoted 2 lines
At least these board files contain more than one
MACHINE_START, but you only update the last one. Same for the third patch.
Thanks for your feedback, I'll correct it in V2.
Quoted 4 lines
I have not looked at the rest of the patch.
Regards
Ludovic
PATCH 2/4 ARM: at91: fix irq_alloc_descs parameters for sparse irq
In reply to ludovic.desroches at atmel.comFrom: Ludovic Desroches <[email protected]>
When SPARSE_IRQ is enabled, all NR_IRQS or mach_desc->nr_irqs will be allocated by arch_probe_nr_irqs(). This caused irq_alloc_descs to allocate irq_descs after the pre-allocated space. Make irq_alloc_descs search for an exact irq range in order to get an error when it has been pre-allocated.
--- arch/arm/mach-at91/irq.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-at91/irq.c +2 -2
@@ -275,9 +275,9 @@ void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])panic ("Unable to ioremap AIC registers\n" );/* Add irq domain for AIC */ - irq_base =irq_alloc_descs (-1 ,0 ,NR_AIC_IRQS ,0 ); + irq_base =irq_alloc_descs (0 ,0 ,NR_AIC_IRQS ,0 );if (irq_base <0 ) { -WARN (1 ,"Cannot allocate irq_descs, assuming pre-allocated\n" ); +pr_warn ("Cannot allocate irq_descs, assuming pre-allocated\n" ); irq_base =0 ; } at91_aic_domain = irq_domain_add_legacy(at91_aic_np, NR_AIC_IRQS,
Signature · 1 line
1.7.5.4
PATCH 3/4 ARM: at91: enable use of sparse irq
In reply to ludovic.desroches at atmel.comFrom: Ludovic Desroches <[email protected]>
If we want to have one kernel for all atmel SOCs, nr_irqs has to be set at runtime since the number of irqs managed by AIC depends on its version.
--- arch/arm/mach-at91/Kconfig | 1 + arch/arm/mach-at91/at91rm9200.c | 1 + arch/arm/mach-at91/at91sam9260.c | 1 + arch/arm/mach-at91/at91sam9261.c | 1 + arch/arm/mach-at91/at91sam9263.c | 1 + arch/arm/mach-at91/at91sam9g45.c | 1 + arch/arm/mach-at91/at91sam9rl.c | 1 + arch/arm/mach-at91/at91x40.c | 1 + arch/arm/mach-at91/board-1arm.c | 2 ++ arch/arm/mach-at91/board-afeb-9260v1.c | 2 ++ arch/arm/mach-at91/board-cam60.c | 2 ++ arch/arm/mach-at91/board-carmeva.c | 2 ++ arch/arm/mach-at91/board-cpu9krea.c | 2 ++ arch/arm/mach-at91/board-cpuat91.c | 2 ++ arch/arm/mach-at91/board-csb337.c | 2 ++ arch/arm/mach-at91/board-csb637.c | 2 ++ arch/arm/mach-at91/board-dt.c | 1 + arch/arm/mach-at91/board-eb01.c | 2 ++ arch/arm/mach-at91/board-eb9200.c | 2 ++ arch/arm/mach-at91/board-ecbat91.c | 2 ++ arch/arm/mach-at91/board-eco920.c | 2 ++ arch/arm/mach-at91/board-flexibity.c | 2 ++ arch/arm/mach-at91/board-foxg20.c | 2 ++ arch/arm/mach-at91/board-gsia18s.c | 2 ++ arch/arm/mach-at91/board-kafa.c | 2 ++ arch/arm/mach-at91/board-kb9202.c | 2 ++ arch/arm/mach-at91/board-neocore926.c | 2 ++ arch/arm/mach-at91/board-pcontrol-g20.c | 2 ++ arch/arm/mach-at91/board-picotux200.c | 2 ++ arch/arm/mach-at91/board-qil-a9260.c | 2 ++ arch/arm/mach-at91/board-rm9200dk.c | 2 ++ arch/arm/mach-at91/board-rm9200ek.c | 2 ++ arch/arm/mach-at91/board-rsi-ews.c | 2 ++ arch/arm/mach-at91/board-sam9-l9260.c | 2 ++ arch/arm/mach-at91/board-sam9260ek.c | 2 ++ arch/arm/mach-at91/board-sam9261ek.c | 2 ++ arch/arm/mach-at91/board-sam9263ek.c | 2 ++ arch/arm/mach-at91/board-sam9g20ek.c | 2 ++ arch/arm/mach-at91/board-sam9m10g45ek.c | 2 ++ arch/arm/mach-at91/board-sam9rlek.c | 2 ++ arch/arm/mach-at91/board-snapper9260.c | 2 ++ arch/arm/mach-at91/board-stamp9g20.c | 2 ++ arch/arm/mach-at91/board-usb-a926x.c | 2 ++ arch/arm/mach-at91/board-yl-9200.c | 2 ++ arch/arm/mach-at91/gpio.c | 1 + arch/arm/mach-at91/include/mach/irqs.h | 8 +++++--- arch/arm/mach-at91/irq.c | 1 + arch/arm/mach-at91/pm.c | 1 + 48 files changed, 87 insertions(+), 3 deletions(-)
arch/arm/mach-at91/Kconfig +1 -0
@@ -30,6 +30,7 @@ config SOC_AT91SAM9 bool select CPU_ARM926T select MULTI_IRQ_HANDLER + select MAY_HAVE_SPARSE_IRQ select AT91_SAM9_TIME select AT91_SAM9_SMC
arch/arm/mach-at91/at91rm9200.c +1 -0
@@ -20,6 +20,7 @@#include <mach/at91_pmc.h> #include <mach/at91_st.h> #include <mach/cpu.h> +#include <mach/irqs.h> #include "soc.h" #include "generic.h"
arch/arm/mach-at91/at91sam9260.c +1 -0
@@ -18,6 +18,7 @@#include <asm/mach/map.h> #include <asm/system_misc.h> #include <mach/cpu.h> +#include <mach/irqs.h> #include <mach/at91_dbgu.h> #include <mach/at91sam9260.h> #include <mach/at91_pmc.h>
arch/arm/mach-at91/at91sam9261.c +1 -0
@@ -18,6 +18,7 @@#include <asm/mach/map.h> #include <asm/system_misc.h> #include <mach/cpu.h> +#include <mach/irqs.h> #include <mach/at91sam9261.h> #include <mach/at91_pmc.h> #include <mach/at91_rstc.h>
arch/arm/mach-at91/at91sam9263.c +1 -0
@@ -17,6 +17,7 @@#include <asm/mach/arch.h> #include <asm/mach/map.h> #include <asm/system_misc.h> +#include <mach/irqs.h> #include <mach/at91sam9263.h> #include <mach/at91_pmc.h> #include <mach/at91_rstc.h>
arch/arm/mach-at91/at91sam9g45.c +1 -0
@@ -20,6 +20,7 @@#include <mach/at91sam9g45.h> #include <mach/at91_pmc.h> #include <mach/cpu.h> +#include <mach/irqs.h> #include "soc.h" #include "generic.h"
arch/arm/mach-at91/at91sam9rl.c +1 -0
@@ -17,6 +17,7 @@#include <asm/mach/map.h> #include <asm/system_misc.h> #include <mach/cpu.h> +#include <mach/irqs.h> #include <mach/at91_dbgu.h> #include <mach/at91sam9rl.h> #include <mach/at91_pmc.h>
arch/arm/mach-at91/at91x40.c +1 -0
@@ -18,6 +18,7 @@#include <asm/mach/arch.h> #include <mach/at91x40.h> #include <mach/at91_st.h> +#include <mach/irqs.h> #include <mach/timex.h> #include "generic.h"
arch/arm/mach-at91/board-1arm.c +2 -0
@@ -26,6 +26,7 @@#include <linux/platform_device.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -91,6 +92,7 @@ MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")/* Maintainer: Lennert Buytenhek <[email protected]> */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = onearm_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-afeb-9260v1.c +2 -0
@@ -35,6 +35,7 @@#include <linux/dma-mapping.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -212,6 +213,7 @@ MACHINE_START(AFEB9260, "Custom afeb9260 board")/* Maintainer: Sergey Lapin <[email protected]> */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = afeb9260_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-cam60.c +2 -0
@@ -30,6 +30,7 @@#include <linux/spi/flash.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -188,6 +189,7 @@ MACHINE_START(CAM60, "KwikByte CAM60")/* Maintainer: KwikByte */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = cam60_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-carmeva.c +2 -0
@@ -35,6 +35,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include "generic.h"
@@ -158,6 +159,7 @@ MACHINE_START(CARMEVA, "Carmeva")/* Maintainer: Conitec Datasystems */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = carmeva_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-cpu9krea.c +2 -0
@@ -40,6 +40,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91sam9260_matrix.h>
@@ -376,6 +377,7 @@ MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")/* Maintainer: Eric Benard - EUKREA Electromatique */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = cpu9krea_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-cpuat91.c +2 -0
@@ -28,6 +28,7 @@#include <linux/mtd/plat-ram.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -178,6 +179,7 @@ MACHINE_START(CPUAT91, "Eukrea")/* Maintainer: Eric Benard - EUKREA Electromatique */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = cpuat91_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-csb337.c +2 -0
@@ -38,6 +38,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include "generic.h"
@@ -252,6 +253,7 @@ MACHINE_START(CSB337, "Cogent CSB337")/* Maintainer: Bill Gatliff */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = csb337_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-csb637.c +2 -0
@@ -35,6 +35,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include "generic.h"
@@ -133,6 +134,7 @@ MACHINE_START(CSB637, "Cogent CSB637")/* Maintainer: Bill Gatliff */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = csb637_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-dt.c +1 -0
@@ -16,6 +16,7 @@#include <linux/of_platform.h> #include <mach/board.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/irq.h>
arch/arm/mach-at91/board-eb01.c +2 -0
@@ -25,6 +25,7 @@#include <linux/irq.h> #include <asm/mach-types.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/mach/arch.h> #include <asm/mach/map.h> #include <mach/board.h>
@@ -43,6 +44,7 @@ static void __init at91eb01_init_early(void)MACHINE_START (AT91EB01 ,"Atmel AT91 EB01" )/* Maintainer: Greg Ungerer <[email protected]> */ .timer = &at91x40_timer, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = at91eb01_init_early, .init_irq = at91eb01_init_irq,
arch/arm/mach-at91/board-eb9200.c +2 -0
@@ -27,6 +27,7 @@#include <linux/device.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -118,6 +119,7 @@ static void __init eb9200_board_init(void)MACHINE_START (ATEB9200 ,"Embest ATEB9200" ) .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = eb9200_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-ecbat91.c +2 -0
@@ -29,6 +29,7 @@#include <linux/spi/flash.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -170,6 +171,7 @@ MACHINE_START(ECBAT91, "emQbit's ECB_AT91")/* Maintainer: emQbit.com */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ecb_at91init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-eco920.c +2 -0
@@ -28,6 +28,7 @@#include <mach/at91rm9200_mc.h> #include <mach/at91_ramc.h> #include <mach/cpu.h> +#include <mach/irqs.h> #include "generic.h"
@@ -132,6 +133,7 @@ MACHINE_START(ECO920, "eco920")/* Maintainer: Sascha Hauer */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = eco920_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-flexibity.c +2 -0
@@ -34,6 +34,7 @@#include <mach/hardware.h> #include <mach/board.h> +#include <mach/irqs.h> #include "generic.h"
@@ -159,6 +160,7 @@ static void __init flexibity_board_init(void)MACHINE_START (FLEXIBITY ,"Flexibity Connect" )/* Maintainer: Maxim Osipov */ .timer = &at91sam926x_timer, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .map_io = at91_map_io, .handle_irq = at91_aic_handle_irq, .init_early = flexibity_init_early,
arch/arm/mach-at91/board-foxg20.c +2 -0
@@ -33,6 +33,7 @@#include <linux/w1-gpio.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -262,6 +263,7 @@ MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20")/* Maintainer: Sergio Tanzilli */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = foxg20_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-gsia18s.c +2 -0
@@ -34,6 +34,7 @@#include <mach/at91sam9_smc.h> #include <mach/gsia18s.h> #include <mach/stamp9g20.h> +#include <mach/irqs.h> #include "sam9_smc.h" #include "generic.h"
@@ -575,6 +576,7 @@ static void __init gsia18s_board_init(void)MACHINE_START (GSIA18S ,"GS_IA18_S" ) .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = gsia18s_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-kafa.c +2 -0
@@ -26,6 +26,7 @@#include <linux/platform_device.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -93,6 +94,7 @@ MACHINE_START(KAFA, "Sperry-Sun KAFA")/* Maintainer: Sergei Sharonov */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = kafa_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-kb9202.c +2 -0
@@ -27,6 +27,7 @@#include <linux/platform_device.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -133,6 +134,7 @@ MACHINE_START(KB9200, "KB920x")/* Maintainer: KwikByte, Inc. */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = kb9202_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-neocore926.c +2 -0
@@ -44,6 +44,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h>
@@ -378,6 +379,7 @@ MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926")/* Maintainer: ADENEO */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = neocore926_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-pcontrol-g20.c +2 -0
@@ -32,6 +32,7 @@#include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/stamp9g20.h> +#include <mach/irqs.h> #include "sam9_smc.h" #include "generic.h"
@@ -218,6 +219,7 @@ MACHINE_START(PCONTROL_G20, "PControl G20")/* Maintainer: pgsellmann at portner-elektronik.at */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = pcontrol_g20_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-picotux200.c +2 -0
@@ -29,6 +29,7 @@#include <linux/mtd/physmap.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -120,6 +121,7 @@ MACHINE_START(PICOTUX2XX, "picotux 200")/* Maintainer: Kleinhenz Elektronik GmbH */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = picotux200_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-qil-a9260.c +2 -0
@@ -40,6 +40,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91_shdwc.h>
@@ -258,6 +259,7 @@ MACHINE_START(QIL_A9260, "CALAO QIL_A9260")/* Maintainer: calao-systems */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-rm9200dk.c +2 -0
@@ -39,6 +39,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91rm9200_mc.h> #include <mach/at91_ramc.h>
@@ -223,6 +224,7 @@ MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")/* Maintainer: SAN People/Atmel */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = dk_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-rm9200ek.c +2 -0
@@ -39,6 +39,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91rm9200_mc.h> #include <mach/at91_ramc.h>
@@ -190,6 +191,7 @@ MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")/* Maintainer: SAN People/Atmel */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-rsi-ews.c +2 -0
@@ -25,6 +25,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <linux/gpio.h>
@@ -225,6 +226,7 @@ MACHINE_START(RSI_EWS, "RSI EWS")/* Maintainer: Josef Holzmayr <[email protected]> */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = rsi_ews_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9-l9260.c +2 -0
@@ -29,6 +29,7 @@#include <linux/spi/spi.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -202,6 +203,7 @@ MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")/* Maintainer: Olimex */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9260ek.c +2 -0
@@ -41,6 +41,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91_shdwc.h>
@@ -344,6 +345,7 @@ MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9261ek.c +2 -0
@@ -45,6 +45,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91_shdwc.h>
@@ -615,6 +616,7 @@ MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9263ek.c +2 -0
@@ -44,6 +44,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91_shdwc.h>
@@ -443,6 +444,7 @@ MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9g20ek.c +2 -0
@@ -35,6 +35,7 @@#include <linux/platform_data/at91_adc.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/setup.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -422,6 +423,7 @@ MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9m10g45ek.c +2 -0
@@ -30,6 +30,7 @@#include <linux/platform_data/at91_adc.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <video/atmel_lcdc.h> #include <media/soc_camera.h> #include <media/atmel-isi.h>
@@ -503,6 +504,7 @@ MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-sam9rlek.c +2 -0
@@ -30,6 +30,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91_shdwc.h>
@@ -319,6 +320,7 @@ MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")/* Maintainer: Atmel */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-snapper9260.c +2 -0
@@ -32,6 +32,7 @@#include <asm/mach/arch.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h>
@@ -178,6 +179,7 @@ static void __init snapper9260_board_init(void)MACHINE_START (SNAPPER_9260 ,"Bluewater Systems Snapper 9260/9G20 module" ) .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = snapper9260_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-stamp9g20.c +2 -0
@@ -25,6 +25,7 @@#include <asm/mach-types.h> #include <asm/mach/arch.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h>
@@ -296,6 +297,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20")/* Maintainer: taskit GmbH */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = stamp9g20_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-usb-a926x.c +2 -0
@@ -41,6 +41,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91sam9_smc.h> #include <mach/at91_shdwc.h>
@@ -376,6 +377,7 @@ MACHINE_START(USB_A9G20, "CALAO USB_A92G0")/* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */ .timer = &at91sam926x_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = ek_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/board-yl-9200.c +2 -0
@@ -43,6 +43,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <mach/board.h> #include <mach/at91rm9200_mc.h> #include <mach/at91_ramc.h>
@@ -590,6 +591,7 @@ MACHINE_START(YL9200, "uCdragon YL-9200")/* Maintainer: S.Birtles */ .timer = &at91rm9200_timer, .map_io = at91_map_io, + .nr_irqs = NR_AIC_IRQS + NR_GPIO_IRQS, .handle_irq = at91_aic_handle_irq, .init_early = yl9200_init_early, .init_irq = at91_init_irq_default,
arch/arm/mach-at91/gpio.c +1 -0
@@ -29,6 +29,7 @@#include <asm/mach/irq.h> #include <mach/hardware.h> +#include <mach/at91_aic.h> #include <mach/at91_pio.h> #include "generic.h"
arch/arm/mach-at91/include/mach/irqs.h +5 -3
@@ -24,8 +24,8 @@#include <linux/io.h> #include <mach/at91_aic.h> -#define NR_AIC_IRQS 32 - +#define NR_AIC_IRQS 32 +#define NR_GPIO_IRQS (5 * 32)/* * IRQ interrupt symbols are the AT91xxx_ID_* symbols
@@ -33,7 +33,9 @@* symbols in gpio.h for ones handled indirectly as GPIOs. * We make provision for 5 banks of GPIO. */ -#define NR_IRQS (NR_AIC_IRQS + (5 * 32)) +#ifndef NR_IRQS +#define NR_IRQS (NR_AIC_IRQS + NR_GPIO_IRQS) +#endif /* FIQ is AIC source 0. */ #define FIQ_START AT91_ID_FIQ
arch/arm/mach-at91/irq.c +1 -0
@@ -32,6 +32,7 @@#include <linux/err.h> #include <mach/hardware.h> +#include <mach/irqs.h> #include <asm/irq.h> #include <asm/setup.h>
arch/arm/mach-at91/pm.c +1 -0
@@ -25,6 +25,7 @@#include <asm/mach/time.h> #include <asm/mach/irq.h> +#include <mach/at91_aic.h> #include <mach/at91_pmc.h> #include <mach/cpu.h>
Signature · 1 line
1.7.5.4
PATCH 4/4 ARM: at91: add AIC5 support
In reply to ludovic.desroches at atmel.comFrom: Ludovic Desroches <[email protected]>
The number of lines of AIC5 has increased from 32 to 128. Due to this increase, a source select register has been introduced for the interrupt line selection. Moreover, register mapping has been changed. For that reasons, we need some dedicated callbacks for AIC5.
Power management is also concerned by these changes. On suspend, we can't get the whole interrupt mask register as before, we have to read this register 128 times. To reduce this overhead, a snapshot of the whole IMR is maintained.
--- arch/arm/mach-at91/generic.h | 2 + arch/arm/mach-at91/include/mach/at91_aic.h | 24 ++ arch/arm/mach-at91/include/mach/irqs.h | 2 + arch/arm/mach-at91/irq.c | 357 +++++++++++++++++++++++----- 4 files changed, 331 insertions(+), 54 deletions(-)
arch/arm/mach-at91/generic.h +2 -0
@@ -29,6 +29,8 @@ extern void __init at91x40_init_interrupts(unsigned int priority[]);extern void __init at91_aic_init (unsigned int priority[]);extern int __init at91_aic_of_init (struct device_node *node,struct device_node *parent); +extern int __init at91_aic5_of_init (struct device_node *node, +struct device_node *parent);/* Timer */
arch/arm/mach-at91/include/mach/at91_aic.h +24 -0
@@ -28,7 +28,11 @@ extern void __iomem *at91_aic_base; .extern at91_aic_base#endif +#define AT91_AIC5_SSR 0x0/* Source Select Register [AIC5] */ +#define AT91_AIC5_INTSEL_MSK (0x7f << 0)/* Interrupt Line Selection Mask */ +#define AT91_AIC_SMR (n) ((n) * 4)/* Source Mode Registers 0-31 */ +#define AT91_AIC5_SMR 0x4/* Source Mode Register [AIC5] */ #define AT91_AIC_PRIOR (7 << 0)/* Priority Level */ #define AT91_AIC_SRCTYPE (3 << 5)/* Interrupt Source Type */ #define AT91_AIC_SRCTYPE_LOW (0 << 5)
@@ -37,29 +41,49 @@ extern void __iomem *at91_aic_base;#define AT91_AIC_SRCTYPE_RISING (3 << 5)#define AT91_AIC_SVR (n) (0x80 + ((n) * 4))/* Source Vector Registers 0-31 */ +#define AT91_AIC5_SVR 0x8/* Source Vector Register [AIC5] */ #define AT91_AIC_IVR 0x100/* Interrupt Vector Register */ +#define AT91_AIC5_IVR 0x10/* Interrupt Vector Register [AIC5] */ #define AT91_AIC_FVR 0x104/* Fast Interrupt Vector Register */ +#define AT91_AIC5_FVR 0x14/* Fast Interrupt Vector Register [AIC5] */ #define AT91_AIC_ISR 0x108/* Interrupt Status Register */ +#define AT91_AIC5_ISR 0x18/* Interrupt Status Register [AIC5] */ #define AT91_AIC_IRQID (0x1f << 0)/* Current Interrupt Identifier */ #define AT91_AIC_IPR 0x10c/* Interrupt Pending Register */ +#define AT91_AIC5_IPR0 0x20/* Interrupt Pending Register 0 [AIC5] */ +#define AT91_AIC5_IPR1 0x24/* Interrupt Pending Register 1 [AIC5] */ +#define AT91_AIC5_IPR2 0x28/* Interrupt Pending Register 2 [AIC5] */ +#define AT91_AIC5_IPR3 0x2c/* Interrupt Pending Register 3 [AIC5] */ #define AT91_AIC_IMR 0x110/* Interrupt Mask Register */ +#define AT91_AIC5_IMR 0x30/* Interrupt Mask Register [AIC5] */ #define AT91_AIC_CISR 0x114/* Core Interrupt Status Register */ +#define AT91_AIC5_CISR 0x34/* Core Interrupt Status Register [AIC5] */ #define AT91_AIC_NFIQ (1 << 0)/* nFIQ Status */ #define AT91_AIC_NIRQ (1 << 1)/* nIRQ Status */ #define AT91_AIC_IECR 0x120/* Interrupt Enable Command Register */ +#define AT91_AIC5_IECR 0x40/* Interrupt Enable Command Register [AIC5] */ #define AT91_AIC_IDCR 0x124/* Interrupt Disable Command Register */ +#define AT91_AIC5_IDCR 0x44/* Interrupt Disable Command Register [AIC5] */ #define AT91_AIC_ICCR 0x128/* Interrupt Clear Command Register */ +#define AT91_AIC5_ICCR 0x48/* Interrupt Clear Command Register [AIC5] */ #define AT91_AIC_ISCR 0x12c/* Interrupt Set Command Register */ +#define AT91_AIC5_ISCR 0x4c/* Interrupt Set Command Register [AIC5] */ #define AT91_AIC_EOICR 0x130/* End of Interrupt Command Register */ +#define AT91_AIC5_EOICR 0x38/* End of Interrupt Command Register [AIC5] */ #define AT91_AIC_SPU 0x134/* Spurious Interrupt Vector Register */ +#define AT91_AIC5_SPU 0x3c/* Spurious Interrupt Vector Register [AIC5] */ #define AT91_AIC_DCR 0x138/* Debug Control Register */ +#define AT91_AIC5_DCR 0x6c/* Debug Control Register [AIC5] */ #define AT91_AIC_DCR_PROT (1 << 0)/* Protection Mode */ #define AT91_AIC_DCR_GMSK (1 << 1)/* General Mask */ #define AT91_AIC_FFER 0x140/* Fast Forcing Enable Register [SAM9 only] */ +#define AT91_AIC5_FFER 0x50/* Fast Forcing Enable Register [AIC5] */ #define AT91_AIC_FFDR 0x144/* Fast Forcing Disable Register [SAM9 only] */ +#define AT91_AIC5_FFDR 0x54/* Fast Forcing Disable Register [AIC5] */ #define AT91_AIC_FFSR 0x148/* Fast Forcing Status Register [SAM9 only] */ +#define AT91_AIC5_FFSR 0x58/* Fast Forcing Status Register [AIC5] */ #endif
arch/arm/mach-at91/include/mach/irqs.h +2 -0
@@ -25,6 +25,7 @@#include <mach/at91_aic.h> #define NR_AIC_IRQS 32 +#define NR_AIC5_IRQS 128#define NR_GPIO_IRQS (5 * 32)/*
@@ -41,5 +42,6 @@#define FIQ_START AT91_ID_FIQvoid at91_aic_handle_irq (struct pt_regs *regs); +void at91_aic5_handle_irq (struct pt_regs *regs);#endif
arch/arm/mach-at91/irq.c +303 -54
480 lines not on this page · raw message
Signature · 1 line
1.7.5.4