27 #include <asm/pgtable.h>
60 #define SPIDER_CHIP_COUNT 4
61 #define SPIDER_SRC_COUNT 64
62 #define SPIDER_IRQ_INVALID 63
73 return irq_data_get_irq_chip_data(d);
82 static void spider_unmask_irq(
struct irq_data *
d)
85 void __iomem *
cfg = spider_get_irq_config(pic, irqd_to_hwirq(d));
90 static void spider_mask_irq(
struct irq_data *d)
92 struct spider_pic *pic = spider_irq_data_to_pic(d);
93 void __iomem *cfg = spider_get_irq_config(pic, irqd_to_hwirq(d));
98 static void spider_ack_irq(
struct irq_data *d)
100 struct spider_pic *pic = spider_irq_data_to_pic(d);
101 unsigned int src = irqd_to_hwirq(d);
105 if (irqd_is_level_type(d))
116 static int spider_set_irq_type(
struct irq_data *d,
unsigned int type)
119 struct spider_pic *pic = spider_irq_data_to_pic(d);
120 unsigned int hw = irqd_to_hwirq(d);
121 void __iomem *cfg = spider_get_irq_config(pic, hw);
155 old_mask =
in_be32(cfg) & 0x30000000
u;
156 out_be32(cfg, old_mask | (ic << 24) | (0x7 << 16) |
158 out_be32(cfg + 4, (0x2 << 16) | (hw & 0xff));
165 .irq_unmask = spider_unmask_irq,
166 .irq_mask = spider_mask_irq,
167 .irq_ack = spider_ack_irq,
168 .irq_set_type = spider_set_irq_type,
171 static int spider_host_map(
struct irq_domain *
h,
unsigned int virq,
184 const u32 *intspec,
unsigned int intsize,
192 *out_hwirq = intspec[0] & 0x3f;
198 .map = spider_host_map,
199 .xlate = spider_host_xlate,
202 static void spider_irq_cascade(
unsigned int irq,
struct irq_desc *
desc)
205 struct spider_pic *pic = irq_desc_get_handler_data(desc);
206 unsigned int cs, virq;
228 static unsigned int __init spider_find_cascade_and_node(
struct spider_pic *pic)
232 int imaplen, intsize,
unit;
251 if (imap ==
NULL || imaplen < (intsize + 1))
264 unit = imap[intsize - 1];
281 (pic->
node_id << IIC_IRQ_NODE_SHIFT) |
282 (2 << IIC_IRQ_CLASS_SHIFT) |
293 struct spider_pic *pic = &spider_pics[
chip];
299 panic(
"spider_pic: can't map registers !");
303 &spider_host_ops, pic);
305 panic(
"spider_pic: can't allocate irq host !");
320 virq = spider_find_cascade_and_node(pic);
324 irq_set_chained_handler(virq, spider_irq_cascade);
355 static long hard_coded_pics[] =
356 { 0x24000008000ul, 0x34000008000ul};
360 spider_init_one(dn, chip++, r.
start);