This does two things to the FPGA IRQ controller in the versatile family: - Convert to MULTI_IRQ_HANDLER so we can drop the entry macro from the Integrator. The C IRQ handler was inspired from arch/arm/common/vic.c, recent bug discovered in this handler was accounted for. - Convert to using IRQ domains so we can get rid of the NO_IRQ mess and proceed with device tree and such stuff. As part of the exercise, bump all the low IRQ numbers on the Integrator PIC to start from 1 rather than 0, since IRQ 0 is now NO_IRQ. The Linux IRQ numbers are thus entirely decoupled from the hardware IRQ numbers in this controller. I was unable to split this patch. The main reason is the half-done conversion to device tree in Versatile. Tested on Integrator/AP and Integrator/CP. Cc: Grant Likely <grant.likely@secretlab.ca> Acked-by: Rob Herring <rob.herring@calxeda.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>tirimbino
parent
69964ea4c7
commit
3108e6ab21
@ -1,39 +0,0 @@ |
||||
/* |
||||
* arch/arm/mach-integrator/include/mach/entry-macro.S |
||||
* |
||||
* Low-level IRQ helper macros for Integrator 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/platform.h> |
||||
#include <mach/irqs.h> |
||||
|
||||
.macro get_irqnr_preamble, base, tmp |
||||
.endm |
||||
|
||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
||||
/* FIXME: should not be using soo many LDRs here */ |
||||
ldr \base, =IO_ADDRESS(INTEGRATOR_IC_BASE) |
||||
mov \irqnr, #IRQ_PIC_START |
||||
ldr \irqstat, [\base, #IRQ_STATUS] @ get masked status |
||||
ldr \base, =IO_ADDRESS(INTEGRATOR_HDR_BASE) |
||||
teq \irqstat, #0 |
||||
ldreq \irqstat, [\base, #(INTEGRATOR_HDR_IC_OFFSET+IRQ_STATUS)] |
||||
moveq \irqnr, #IRQ_CIC_START |
||||
|
||||
1001: tst \irqstat, #15 |
||||
bne 1002f |
||||
add \irqnr, \irqnr, #4 |
||||
movs \irqstat, \irqstat, lsr #4 |
||||
bne 1001b |
||||
1002: tst \irqstat, #1 |
||||
bne 1003f |
||||
add \irqnr, \irqnr, #1 |
||||
movs \irqstat, \irqstat, lsr #1 |
||||
bne 1002b |
||||
1003: /* EQ will be set if no irqs pending */ |
||||
.endm |
||||
|
@ -1,12 +1,11 @@ |
||||
#ifndef PLAT_FPGA_IRQ_H |
||||
#define PLAT_FPGA_IRQ_H |
||||
|
||||
struct fpga_irq_data { |
||||
void __iomem *base; |
||||
unsigned int irq_start; |
||||
struct irq_chip chip; |
||||
}; |
||||
struct device_node; |
||||
struct pt_regs; |
||||
|
||||
void fpga_irq_init(int, u32, struct fpga_irq_data *); |
||||
void fpga_handle_irq(struct pt_regs *regs); |
||||
void fpga_irq_init(void __iomem *, const char *, int, int, u32, |
||||
struct device_node *node); |
||||
|
||||
#endif |
||||
|
Loading…
Reference in new issue