aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShinya Kuribayashi <skuribay@ruby.dti.ne.jp>2009-03-21 09:04:21 -0400
committerRalf Baechle <ralf@linux-mips.org>2009-03-30 08:49:42 -0400
commitfb2826b7f6ecd93c29d2ef69578f087545251b17 (patch)
treec7cdef2690b1d0d8b684de0aad2e77c2561f45cb
parent47c969ee54e142eba71626f99b3d99cc461b84f3 (diff)
MIPS: Mark Eins: Fix cascading interrupt dispatcher
* Fix mis-calculated IRQ bitshift on cascading interrupts * Prevent cascading interrupt from being processed afterward Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi@necel.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/emma/markeins/irq.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/mips/emma/markeins/irq.c b/arch/mips/emma/markeins/irq.c
index c2583ecc93cf..263132d7b3a3 100644
--- a/arch/mips/emma/markeins/irq.c
+++ b/arch/mips/emma/markeins/irq.c
@@ -213,8 +213,7 @@ void emma2rh_irq_dispatch(void)
213 emma2rh_in32(EMMA2RH_BHIF_INT_EN_0); 213 emma2rh_in32(EMMA2RH_BHIF_INT_EN_0);
214 214
215#ifdef EMMA2RH_SW_CASCADE 215#ifdef EMMA2RH_SW_CASCADE
216 if (intStatus & 216 if (intStatus & (1UL << EMMA2RH_SW_CASCADE)) {
217 (1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
218 u32 swIntStatus; 217 u32 swIntStatus;
219 swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT) 218 swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT)
220 & emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); 219 & emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
@@ -225,6 +224,8 @@ void emma2rh_irq_dispatch(void)
225 } 224 }
226 } 225 }
227 } 226 }
227 /* Skip S/W interrupt */
228 intStatus &= ~(1UL << EMMA2RH_SW_CASCADE);
228#endif 229#endif
229 230
230 for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { 231 for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
@@ -238,8 +239,7 @@ void emma2rh_irq_dispatch(void)
238 emma2rh_in32(EMMA2RH_BHIF_INT_EN_1); 239 emma2rh_in32(EMMA2RH_BHIF_INT_EN_1);
239 240
240#ifdef EMMA2RH_GPIO_CASCADE 241#ifdef EMMA2RH_GPIO_CASCADE
241 if (intStatus & 242 if (intStatus & (1UL << (EMMA2RH_GPIO_CASCADE % 32))) {
242 (1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
243 u32 gpioIntStatus; 243 u32 gpioIntStatus;
244 gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST) 244 gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST)
245 & emma2rh_in32(EMMA2RH_GPIO_INT_MASK); 245 & emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
@@ -250,6 +250,8 @@ void emma2rh_irq_dispatch(void)
250 } 250 }
251 } 251 }
252 } 252 }
253 /* Skip GPIO interrupt */
254 intStatus &= ~(1UL << (EMMA2RH_GPIO_CASCADE % 32));
253#endif 255#endif
254 256
255 for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) { 257 for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) {