18 #include <linux/stddef.h>
20 #include <linux/sched.h>
21 #include <linux/signal.h>
22 #include <linux/pci.h>
25 #include <linux/adb.h>
26 #include <linux/pmu.h>
28 #include <asm/sections.h>
32 #include <asm/pci-bridge.h>
49 unsigned int of_irq_workarounds;
53 static volatile struct pmac_irq_hw
__iomem *pmac_irq_hw[4];
56 static int max_real_irqs;
63 static int pmac_irq_cascade = -1;
66 static void __pmac_retrigger(
unsigned int irq_nr)
68 if (irq_nr >= max_real_irqs && pmac_irq_cascade > 0) {
70 irq_nr = pmac_irq_cascade;
79 static void pmac_mask_and_ack_irq(
struct irq_data *
d)
81 unsigned int src = irqd_to_hwirq(d);
82 unsigned long bit = 1
UL << (src & 0x1f);
97 != (ppc_cached_irq_mask[i] & bit));
101 static void pmac_ack_irq(
struct irq_data *d)
103 unsigned int src = irqd_to_hwirq(d);
104 unsigned long bit = 1
UL << (src & 0x1f);
116 static void __pmac_set_irq_mask(
unsigned int irq_nr,
int nokicklost)
118 unsigned long bit = 1
UL << (irq_nr & 0x1f);
121 if ((
unsigned)irq_nr >= max_irqs)
132 != (ppc_cached_irq_mask[i] & bit));
139 if (bit & ppc_cached_irq_mask[i] &
in_le32(&pmac_irq_hw[i]->
level))
140 __pmac_retrigger(irq_nr);
146 static unsigned int pmac_startup_irq(
struct irq_data *d)
149 unsigned int src = irqd_to_hwirq(d);
150 unsigned long bit = 1
UL << (src & 0x1f);
154 if (!irqd_is_level_type(d))
157 __pmac_set_irq_mask(src, 0);
163 static void pmac_mask_irq(
struct irq_data *d)
166 unsigned int src = irqd_to_hwirq(d);
170 __pmac_set_irq_mask(src, 1);
174 static void pmac_unmask_irq(
struct irq_data *d)
177 unsigned int src = irqd_to_hwirq(d);
181 __pmac_set_irq_mask(src, 0);
185 static int pmac_retrigger(
struct irq_data *d)
190 __pmac_retrigger(irqd_to_hwirq(d));
197 .irq_startup = pmac_startup_irq,
198 .irq_mask = pmac_mask_irq,
199 .irq_ack = pmac_ack_irq,
200 .irq_mask_ack = pmac_mask_and_ack_irq,
201 .irq_unmask = pmac_unmask_irq,
202 .irq_retrigger = pmac_retrigger,
212 for (irq = max_irqs; (irq -= 32) >= max_real_irqs; ) {
214 bits =
in_le32(&pmac_irq_hw[i]->
event) | ppc_lost_interrupts[
i];
216 bits &= ppc_cached_irq_mask[
i];
219 irq += __ilog2(bits);
229 static unsigned int pmac_pic_get_irq(
void)
232 unsigned long bits = 0;
235 #ifdef CONFIG_PPC_PMAC32_PSURGE
242 for (irq = max_real_irqs; (irq -= 32) >= 0; ) {
244 bits =
in_le32(&pmac_irq_hw[i]->
event) | ppc_lost_interrupts[
i];
246 bits &= ppc_cached_irq_mask[
i];
249 irq += __ilog2(bits);
266 static struct irqaction gatwick_cascade_action = {
277 static int pmac_pic_host_map(
struct irq_domain *
h,
unsigned int virq,
292 .
match = pmac_pic_host_match,
293 .map = pmac_pic_host_map,
297 static void __init pmac_pic_probe_oldstyle(
void)
306 ppc_md.get_irq = pmac_pic_get_irq;
313 max_irqs = max_real_irqs = 32;
315 max_irqs = max_real_irqs = 32;
321 max_irqs = max_real_irqs = 64;
345 &pmac_pic_host_ops,
NULL);
355 pmac_irq_hw[i++] = (
volatile struct pmac_irq_hw
__iomem *)
357 if (max_real_irqs > 32)
358 pmac_irq_hw[i++] = (
volatile struct pmac_irq_hw
__iomem *)
368 pmac_irq_hw[i++] = (
volatile struct pmac_irq_hw
__iomem *)
372 (
volatile struct pmac_irq_hw
__iomem *)
378 max_irqs - max_real_irqs, pmac_irq_cascade);
383 for (i = 0; i * 32 < max_irqs; ++
i)
387 if (slave && pmac_irq_cascade !=
NO_IRQ)
388 setup_irq(pmac_irq_cascade, &gatwick_cascade_action);
390 printk(
KERN_INFO "irq: System has %d possible interrupts\n", max_irqs);
397 struct of_irq *out_irq)
415 if (device &&
strcmp(device->
type,
"pci") != 0)
420 intlen /=
sizeof(
u32);
425 out_irq->controller =
NULL;
426 out_irq->specifier[0] = ints[
index];
433 static void __init pmac_pic_setup_mpic_nmi(
struct mpic *mpic)
435 #if defined(CONFIG_XMON) && defined(CONFIG_PPC32)
446 of_node_put(pswitch);
454 const char *
name = master ?
" MPIC 1 " :
" MPIC 2 ";
456 unsigned int flags = master ? 0 : MPIC_SECONDARY;
458 pmac_call_feature(PMAC_FTR_ENABLE_MPIC, np, 0, 0);
461 flags |= MPIC_BIG_ENDIAN;
466 if (master && (flags & MPIC_BIG_ENDIAN))
467 flags |= MPIC_U3_HT_IRQS;
478 static int __init pmac_pic_probe_mpic(
void)
480 struct mpic *mpic1, *mpic2;
486 if (master ==
NULL &&
488 master = of_node_get(np);
489 else if (slave ==
NULL)
490 slave = of_node_get(np);
496 if (master ==
NULL && slave !=
NULL) {
509 mpic1 = pmac_setup_one_mpic(master, 1);
513 pmac_pic_setup_mpic_nmi(mpic1);
519 mpic2 = pmac_setup_one_mpic(slave, 0);
536 of_irq_workarounds |= OF_IMAP_OLDWORLD_MAC;
538 of_irq_workarounds |= OF_IMAP_NO_PHANDLE;
545 if (
pmac_newworld && (of_irq_workarounds & OF_IMAP_NO_PHANDLE)) {
548 for_each_node_with_property(np,
"interrupt-controller") {
559 of_irq_dflt_pic = np;
568 if (pmac_pic_probe_mpic() == 0)
572 pmac_pic_probe_oldstyle();
576 #if defined(CONFIG_PM) && defined(CONFIG_PPC32)
583 unsigned long sleep_save_mask[2];
589 static int pmacpic_find_viaint(
void)
593 #ifdef CONFIG_ADB_PMU
608 static int pmacpic_suspend(
void)
610 int viaint = pmacpic_find_viaint();
612 sleep_save_mask[0] = ppc_cached_irq_mask[0];
613 sleep_save_mask[1] = ppc_cached_irq_mask[1];
614 ppc_cached_irq_mask[0] = 0;
615 ppc_cached_irq_mask[1] = 0;
617 set_bit(viaint, ppc_cached_irq_mask);
619 if (max_real_irqs > 32)
629 static void pmacpic_resume(
void)
634 if (max_real_irqs > 32)
637 for (i = 0; i < max_real_irqs; ++
i)
644 .resume = pmacpic_resume,
647 static int __init init_pmacpic_syscore(
void)