13 #include <linux/stddef.h>
14 #include <linux/kernel.h>
20 #include <asm/byteorder.h>
31 #define DBG(fmt...) do { printk(KERN_DEBUG "gef_pic: " fmt); } while (0)
33 #define DBG(fmt...) do { } while (0)
36 #define GEF_PIC_NUM_IRQS 32
39 #define GEF_PIC_INTR_STATUS 0x0000
41 #define GEF_PIC_INTR_MASK(cpu) (0x0010 + (0x4 * cpu))
42 #define GEF_PIC_CPU0_INTR_MASK GEF_PIC_INTR_MASK(0)
43 #define GEF_PIC_CPU1_INTR_MASK GEF_PIC_INTR_MASK(1)
45 #define GEF_PIC_MCP_MASK(cpu) (0x0018 + (0x4 * cpu))
46 #define GEF_PIC_CPU0_MCP_MASK GEF_PIC_MCP_MASK(0)
47 #define GEF_PIC_CPU1_MCP_MASK GEF_PIC_MCP_MASK(1)
52 static void __iomem *gef_pic_irq_reg_base;
54 static int gef_pic_cascade_irq;
105 if (cascade_irq !=
NO_IRQ)
111 static void gef_pic_mask(
struct irq_data *
d)
114 unsigned int hwirq = irqd_to_hwirq(d);
119 mask &= ~(1 << hwirq);
124 static void gef_pic_mask_ack(
struct irq_data *d)
132 static void gef_pic_unmask(
struct irq_data *d)
135 unsigned int hwirq = irqd_to_hwirq(d);
140 mask |= (1 << hwirq);
145 static struct irq_chip gef_pic_chip = {
147 .irq_mask = gef_pic_mask,
148 .irq_mask_ack = gef_pic_mask_ack,
149 .irq_unmask = gef_pic_unmask,
156 static int gef_pic_host_map(
struct irq_domain *
h,
unsigned int virq,
167 const u32 *intspec,
unsigned int intsize,
171 *out_hwirq = intspec[0];
173 *out_flags = intspec[1];
181 .map = gef_pic_host_map,
182 .xlate = gef_pic_host_xlate,
194 gef_pic_irq_reg_base =
of_iomap(np, 0);
209 if (gef_pic_cascade_irq ==
NO_IRQ) {
216 &gef_pic_host_ops,
NULL);
217 if (gef_pic_irq_host ==
NULL)
231 unsigned int virq =
NO_IRQ;
238 active = cause &
mask;
242 if (active & (0x1 << hwirq))