|
@@ -8,6 +8,7 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <linux/interrupt.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
+#include <linux/irqchip/chained_irq.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/irq.h>
|
|
#include <linux/irq.h>
|
|
@@ -88,10 +89,11 @@ EXPORT_SYMBOL_GPL(bcsr_mod);
|
|
static void bcsr_csc_handler(unsigned int irq, struct irq_desc *d)
|
|
static void bcsr_csc_handler(unsigned int irq, struct irq_desc *d)
|
|
{
|
|
{
|
|
unsigned short bisr = __raw_readw(bcsr_virt + BCSR_REG_INTSTAT);
|
|
unsigned short bisr = __raw_readw(bcsr_virt + BCSR_REG_INTSTAT);
|
|
|
|
+ struct irq_chip *chip = irq_desc_get_chip(d);
|
|
|
|
|
|
- disable_irq_nosync(irq);
|
|
|
|
|
|
+ chained_irq_enter(chip, d);
|
|
generic_handle_irq(bcsr_csc_base + __ffs(bisr));
|
|
generic_handle_irq(bcsr_csc_base + __ffs(bisr));
|
|
- enable_irq(irq);
|
|
|
|
|
|
+ chained_irq_exit(chip, d);
|
|
}
|
|
}
|
|
|
|
|
|
static void bcsr_irq_mask(struct irq_data *d)
|
|
static void bcsr_irq_mask(struct irq_data *d)
|