aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorChanghwan Youn <chaos.youn@samsung.com>2010-11-29 03:05:16 -0500
committerKukjin Kim <kgene.kim@samsung.com>2010-12-08 04:11:37 -0500
commit85140ad591e696bc88b0ad7c978256f91099e6c9 (patch)
tree89c04eacc38d85a550417e3bea17725dc36afff2 /arch/arm
parent1f2d6c49f087c84ed54ad3e0801faeca3e2ccfdd (diff)
ARM: S5PV310: Add irq_mask to handle combiner irqs properly
The 4 combiner groups use same registers to handle the interrupt. In previous implementation, the whole registers are checked to find which interupt is occurred and thus interrupt in other groups can be detected. This patch adds irq_mask to solve this problem. Signed-off-by: Changhwan Youn <chaos.youn@samsung.com> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-s5pv310/irq-combiner.c6
1 files changed, 5 insertions, 1 deletions
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
25struct combiner_chip_data { 25struct 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