|
@@ -2428,16 +2428,17 @@ static void irq_handle_io(struct ddb *dev, u32 s)
|
|
|
irqreturn_t ddb_irq_handler0(int irq, void *dev_id)
|
|
|
{
|
|
|
struct ddb *dev = (struct ddb *)dev_id;
|
|
|
- u32 s = ddbreadl(dev, INTERRUPT_STATUS);
|
|
|
+ u32 mask = 0x8fffff00;
|
|
|
+ u32 s = mask & ddbreadl(dev, INTERRUPT_STATUS);
|
|
|
|
|
|
+ if (!s)
|
|
|
+ return IRQ_NONE;
|
|
|
do {
|
|
|
if (s & 0x80000000)
|
|
|
return IRQ_NONE;
|
|
|
- if (!(s & 0xfffff00))
|
|
|
- return IRQ_NONE;
|
|
|
- ddbwritel(dev, s & 0xfffff00, INTERRUPT_ACK);
|
|
|
+ ddbwritel(dev, s, INTERRUPT_ACK);
|
|
|
irq_handle_io(dev, s);
|
|
|
- } while ((s = ddbreadl(dev, INTERRUPT_STATUS)));
|
|
|
+ } while ((s = mask & ddbreadl(dev, INTERRUPT_STATUS)));
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
@@ -2445,16 +2446,17 @@ irqreturn_t ddb_irq_handler0(int irq, void *dev_id)
|
|
|
irqreturn_t ddb_irq_handler1(int irq, void *dev_id)
|
|
|
{
|
|
|
struct ddb *dev = (struct ddb *)dev_id;
|
|
|
- u32 s = ddbreadl(dev, INTERRUPT_STATUS);
|
|
|
+ u32 mask = 0x8000000f;
|
|
|
+ u32 s = mask & ddbreadl(dev, INTERRUPT_STATUS);
|
|
|
|
|
|
+ if (!s)
|
|
|
+ return IRQ_NONE;
|
|
|
do {
|
|
|
if (s & 0x80000000)
|
|
|
return IRQ_NONE;
|
|
|
- if (!(s & 0x0000f))
|
|
|
- return IRQ_NONE;
|
|
|
- ddbwritel(dev, s & 0x0000f, INTERRUPT_ACK);
|
|
|
+ ddbwritel(dev, s, INTERRUPT_ACK);
|
|
|
irq_handle_msg(dev, s);
|
|
|
- } while ((s = ddbreadl(dev, INTERRUPT_STATUS)));
|
|
|
+ } while ((s = mask & ddbreadl(dev, INTERRUPT_STATUS)));
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
|
}
|