#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/irqchip.h>
#include <linux/irqchip/ingenic.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <asm/mach-jz4740/irq.h>
struct ingenic_intc_data {
#define JZ_REG_INTC_STATUS 0x00
#define JZ_REG_INTC_MASK 0x04
#define JZ_REG_INTC_SET_MASK 0x08
#define JZ_REG_INTC_CLEAR_MASK 0x0c
#define JZ_REG_INTC_PENDING 0x10
static irqreturn_t intc_cascade(int irq, void *data)
struct ingenic_intc_data *intc = irq_get_handler_data(irq);
for (i = 0; i < intc->num_chips; i++) {
irq_reg = readl(intc->base + (i * CHIP_SIZE) +
generic_handle_irq(__fls(irq_reg) + (i * 32) + JZ4740_IRQ_BASE);
static void intc_irq_set_mask(struct irq_chip_generic *gc, uint32_t mask)