diff options
| author | Kukjin Kim <kgene.kim@samsung.com> | 2010-12-30 18:01:08 -0500 |
|---|---|---|
| committer | Kukjin Kim <kgene.kim@samsung.com> | 2010-12-30 18:01:08 -0500 |
| commit | fa353e9f409340cefc7650854065cbcea85c347d (patch) | |
| tree | c98cc2835f8fd5f9b27a08ecc95afae8f38b3ec2 | |
| parent | a8928ce7e09eed34b59525779cb833f8438d0733 (diff) | |
| parent | 85140ad591e696bc88b0ad7c978256f91099e6c9 (diff) | |
Merge branch 'dev/s5pv310-irq' into next-s5pv310
| -rw-r--r-- | arch/arm/mach-s5pv310/cpu.c | 9 | ||||
| -rw-r--r-- | arch/arm/mach-s5pv310/include/mach/irqs.h | 13 | ||||
| -rw-r--r-- | arch/arm/mach-s5pv310/irq-combiner.c | 6 |
3 files changed, 24 insertions, 4 deletions
diff --git a/arch/arm/mach-s5pv310/cpu.c b/arch/arm/mach-s5pv310/cpu.c index 7b6e066e2271..9900464082db 100644 --- a/arch/arm/mach-s5pv310/cpu.c +++ b/arch/arm/mach-s5pv310/cpu.c | |||
| @@ -132,6 +132,15 @@ void __init s5pv310_init_irq(void) | |||
| 132 | gic_cpu_init(0, S5P_VA_GIC_CPU); | 132 | gic_cpu_init(0, S5P_VA_GIC_CPU); |
| 133 | 133 | ||
| 134 | for (irq = 0; irq < MAX_COMBINER_NR; irq++) { | 134 | for (irq = 0; irq < MAX_COMBINER_NR; irq++) { |
| 135 | |||
| 136 | /* | ||
| 137 | * From SPI(0) to SPI(39) and SPI(51), SPI(53) are | ||
| 138 | * connected to the interrupt combiner. These irqs | ||
| 139 | * should be initialized to support cascade interrupt. | ||
| 140 | */ | ||
| 141 | if ((irq >= 40) && !(irq == 51) && !(irq == 53)) | ||
| 142 | continue; | ||
| 143 | |||
| 135 | combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | 144 | combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), |
| 136 | COMBINER_IRQ(irq, 0)); | 145 | COMBINER_IRQ(irq, 0)); |
| 137 | combiner_cascade_irq(irq, IRQ_SPI(irq)); | 146 | combiner_cascade_irq(irq, IRQ_SPI(irq)); |
diff --git a/arch/arm/mach-s5pv310/include/mach/irqs.h b/arch/arm/mach-s5pv310/include/mach/irqs.h index 99e7dad8a85a..f9a2830620d8 100644 --- a/arch/arm/mach-s5pv310/include/mach/irqs.h +++ b/arch/arm/mach-s5pv310/include/mach/irqs.h | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | 25 | ||
| 26 | #define IRQ_SPI(x) S5P_IRQ(x+32) | 26 | #define IRQ_SPI(x) S5P_IRQ(x+32) |
| 27 | 27 | ||
| 28 | #define IRQ_MCT1 IRQ_SPI(35) | ||
| 29 | |||
| 28 | #define IRQ_EINT0 IRQ_SPI(40) | 30 | #define IRQ_EINT0 IRQ_SPI(40) |
| 29 | #define IRQ_EINT1 IRQ_SPI(41) | 31 | #define IRQ_EINT1 IRQ_SPI(41) |
| 30 | #define IRQ_EINT2 IRQ_SPI(42) | 32 | #define IRQ_EINT2 IRQ_SPI(42) |
| @@ -36,9 +38,8 @@ | |||
| 36 | #define IRQ_JPEG IRQ_SPI(48) | 38 | #define IRQ_JPEG IRQ_SPI(48) |
| 37 | #define IRQ_2D IRQ_SPI(49) | 39 | #define IRQ_2D IRQ_SPI(49) |
| 38 | #define IRQ_PCIE IRQ_SPI(50) | 40 | #define IRQ_PCIE IRQ_SPI(50) |
| 39 | #define IRQ_SYSTEM_TIMER IRQ_SPI(51) | 41 | #define IRQ_MCT0 IRQ_SPI(51) |
| 40 | #define IRQ_MFC IRQ_SPI(52) | 42 | #define IRQ_MFC IRQ_SPI(52) |
| 41 | #define IRQ_WDT IRQ_SPI(53) | ||
| 42 | #define IRQ_AUDIO_SS IRQ_SPI(54) | 43 | #define IRQ_AUDIO_SS IRQ_SPI(54) |
| 43 | #define IRQ_AC97 IRQ_SPI(55) | 44 | #define IRQ_AC97 IRQ_SPI(55) |
| 44 | #define IRQ_SPDIF IRQ_SPI(56) | 45 | #define IRQ_SPDIF IRQ_SPI(56) |
| @@ -85,6 +86,8 @@ | |||
| 85 | 86 | ||
| 86 | #define IRQ_ONENAND_AUDI COMBINER_IRQ(34, 0) | 87 | #define IRQ_ONENAND_AUDI COMBINER_IRQ(34, 0) |
| 87 | 88 | ||
| 89 | #define IRQ_MCT_L1 COMBINER_IRQ(35, 3) | ||
| 90 | |||
| 88 | #define IRQ_EINT4 COMBINER_IRQ(37, 0) | 91 | #define IRQ_EINT4 COMBINER_IRQ(37, 0) |
| 89 | #define IRQ_EINT5 COMBINER_IRQ(37, 1) | 92 | #define IRQ_EINT5 COMBINER_IRQ(37, 1) |
| 90 | #define IRQ_EINT6 COMBINER_IRQ(37, 2) | 93 | #define IRQ_EINT6 COMBINER_IRQ(37, 2) |
| @@ -101,7 +104,11 @@ | |||
| 101 | 104 | ||
| 102 | #define IRQ_EINT16_31 COMBINER_IRQ(39, 0) | 105 | #define IRQ_EINT16_31 COMBINER_IRQ(39, 0) |
| 103 | 106 | ||
| 104 | #define MAX_COMBINER_NR 40 | 107 | #define IRQ_MCT_L0 COMBINER_IRQ(51, 0) |
| 108 | |||
| 109 | #define IRQ_WDT COMBINER_IRQ(53, 0) | ||
| 110 | |||
| 111 | #define MAX_COMBINER_NR 54 | ||
| 105 | 112 | ||
| 106 | #define S5P_IRQ_EINT_BASE COMBINER_IRQ(MAX_COMBINER_NR, 0) | 113 | #define S5P_IRQ_EINT_BASE COMBINER_IRQ(MAX_COMBINER_NR, 0) |
| 107 | 114 | ||
diff --git a/arch/arm/mach-s5pv310/irq-combiner.c b/arch/arm/mach-s5pv310/irq-combiner.c index c3f88c3faf6c..aad5c3d525d1 100644 --- a/arch/arm/mach-s5pv310/irq-combiner.c +++ b/arch/arm/mach-s5pv310/irq-combiner.c | |||
| @@ -24,6 +24,7 @@ static DEFINE_SPINLOCK(irq_controller_lock); | |||
| 24 | 24 | ||
| 25 | struct combiner_chip_data { | 25 | struct combiner_chip_data { |
| 26 | unsigned int irq_offset; | 26 | unsigned int irq_offset; |
| 27 | unsigned int irq_mask; | ||
| 27 | void __iomem *base; | 28 | void __iomem *base; |
| 28 | }; | 29 | }; |
| 29 | 30 | ||
| @@ -62,6 +63,7 @@ static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | |||
| 62 | spin_lock(&irq_controller_lock); | 63 | spin_lock(&irq_controller_lock); |
| 63 | status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); | 64 | status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); |
| 64 | spin_unlock(&irq_controller_lock); | 65 | spin_unlock(&irq_controller_lock); |
| 66 | status &= chip_data->irq_mask; | ||
| 65 | 67 | ||
| 66 | if (status == 0) | 68 | if (status == 0) |
| 67 | goto out; | 69 | goto out; |
| @@ -104,10 +106,12 @@ void __init combiner_init(unsigned int combiner_nr, void __iomem *base, | |||
| 104 | 106 | ||
| 105 | combiner_data[combiner_nr].base = base; | 107 | combiner_data[combiner_nr].base = base; |
| 106 | combiner_data[combiner_nr].irq_offset = irq_start; | 108 | combiner_data[combiner_nr].irq_offset = irq_start; |
| 109 | combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); | ||
| 107 | 110 | ||
| 108 | /* Disable all interrupts */ | 111 | /* Disable all interrupts */ |
| 109 | 112 | ||
| 110 | __raw_writel(0xffffffff, base + COMBINER_ENABLE_CLEAR); | 113 | __raw_writel(combiner_data[combiner_nr].irq_mask, |
| 114 | base + COMBINER_ENABLE_CLEAR); | ||
| 111 | 115 | ||
| 112 | /* Setup the Linux IRQ subsystem */ | 116 | /* Setup the Linux IRQ subsystem */ |
| 113 | 117 | ||
