11 #include <linux/errno.h>
16 #include <linux/random.h>
17 #include <linux/slab.h>
22 #define EIC_IER 0x0000
23 #define EIC_IDR 0x0004
24 #define EIC_IMR 0x0008
25 #define EIC_ISR 0x000c
26 #define EIC_ICR 0x0010
27 #define EIC_MODE 0x0014
28 #define EIC_EDGE 0x0018
29 #define EIC_LEVEL 0x001c
30 #define EIC_NMIC 0x0024
33 #define EIC_NMIC_ENABLE (1 << 0)
36 #define EIC_BIT(name) \
37 (1 << EIC_##name##_OFFSET)
38 #define EIC_BF(name,value) \
39 (((value) & ((1 << EIC_##name##_SIZE) - 1)) \
40 << EIC_##name##_OFFSET)
41 #define EIC_BFEXT(name,value) \
42 (((value) >> EIC_##name##_OFFSET) \
43 & ((1 << EIC_##name##_SIZE) - 1))
44 #define EIC_BFINS(name,value,old) \
45 (((old) & ~(((1 << EIC_##name##_SIZE) - 1) \
46 << EIC_##name##_OFFSET)) \
50 #define eic_readl(port,reg) \
51 __raw_readl((port)->regs + EIC_##reg)
52 #define eic_writel(port,reg,value) \
53 __raw_writel((value), (port)->regs + EIC_##reg)
61 static struct eic *nmi_eic;
62 static bool nmi_enabled;
64 static void eic_ack_irq(
struct irq_data *
d)
66 struct eic *
eic = irq_data_get_irq_chip_data(d);
70 static void eic_mask_irq(
struct irq_data *
d)
72 struct eic *
eic = irq_data_get_irq_chip_data(d);
76 static void eic_mask_ack_irq(
struct irq_data *d)
78 struct eic *eic = irq_data_get_irq_chip_data(d);
83 static void eic_unmask_irq(
struct irq_data *d)
85 struct eic *eic = irq_data_get_irq_chip_data(d);
89 static int eic_set_irq_type(
struct irq_data *d,
unsigned int flow_type)
91 struct eic *eic = irq_data_get_irq_chip_data(d);
129 irqd_set_trigger_type(d, flow_type);
140 .irq_ack = eic_ack_irq,
141 .irq_mask = eic_mask_irq,
142 .irq_mask_ack = eic_mask_ack_irq,
143 .irq_unmask = eic_unmask_irq,
144 .irq_set_type = eic_set_irq_type,
147 static void demux_eic_irq(
unsigned int irq,
struct irq_desc *
desc)
149 struct eic *eic = irq_desc_get_handler_data(desc);
150 unsigned long status, pending;
157 i = fls(pending) - 1;
158 pending &= ~(1 <<
i);
187 unsigned int nr_of_irqs;
188 unsigned int int_irq;
194 if (!regs || (
int)int_irq <= 0) {
195 dev_dbg(&pdev->
dev,
"missing regs and/or irq resource\n");
200 eic = kzalloc(
sizeof(
struct eic),
GFP_KERNEL);
202 dev_dbg(&pdev->
dev,
"no memory for eic structure\n");
220 nr_of_irqs = fls(pattern);
226 eic->
chip = &eic_chip;
228 for (i = 0; i < nr_of_irqs; i++) {
229 irq_set_chip_and_handler(eic->
first_irq + i, &eic_chip,
234 irq_set_chained_handler(int_irq, demux_eic_irq);
248 "External Interrupt Controller at 0x%p, IRQ %u\n",
251 "Handling %u external IRQs, starting with IRQ %u\n",
268 static int __init eic_init(
void)