diff options
author | Shinya Kuribayashi <skuribay@ruby.dti.ne.jp> | 2009-03-21 09:04:21 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-03-30 08:49:42 -0400 |
commit | fb2826b7f6ecd93c29d2ef69578f087545251b17 (patch) | |
tree | c7cdef2690b1d0d8b684de0aad2e77c2561f45cb | |
parent | 47c969ee54e142eba71626f99b3d99cc461b84f3 (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.c | 10 |
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) { |