pic.c 18.3 KB
Newer Older
1 2 3 4 5 6 7
/*
 *  Support for the interrupt controllers found on Power Macintosh,
 *  currently Apple's "Grand Central" interrupt controller in all
 *  it's incarnations. OpenPIC support used on newer machines is
 *  in a separate file
 *
 *  Copyright (C) 1997 Paul Mackerras (paulus@samba.org)
8 9
 *  Copyright (C) 2005 Benjamin Herrenschmidt (benh@kernel.crashing.org)
 *                     IBM, Corp.
10 11 12 13 14 15 16 17 18 19 20 21 22 23
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version
 *  2 of the License, or (at your option) any later version.
 *
 */

#include <linux/stddef.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
24
#include <linux/syscore_ops.h>
25 26 27 28 29 30 31 32 33 34 35
#include <linux/adb.h>
#include <linux/pmu.h>

#include <asm/sections.h>
#include <asm/io.h>
#include <asm/smp.h>
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#include <asm/time.h>
#include <asm/pmac_feature.h>
#include <asm/mpic.h>
36
#include <asm/xmon.h>
37

38
#include "pmac.h"
39

40
#ifdef CONFIG_PPC32
41 42 43 44 45 46 47
struct pmac_irq_hw {
        unsigned int    event;
        unsigned int    enable;
        unsigned int    ack;
        unsigned int    level;
};

48 49 50 51
/* Workaround flags for 32bit powermac machines */
unsigned int of_irq_workarounds;
struct device_node *of_irq_dflt_pic;

52
/* Default addresses */
53
static volatile struct pmac_irq_hw __iomem *pmac_irq_hw[4];
54 55 56 57 58 59 60 61 62

#define GC_LEVEL_MASK		0x3ff00000
#define OHARE_LEVEL_MASK	0x1ff00000
#define HEATHROW_LEVEL_MASK	0x1ff00000

static int max_irqs;
static int max_real_irqs;
static u32 level_mask[4];

63
static DEFINE_RAW_SPINLOCK(pmac_pic_lock);
64

S
Stephen Rothwell 已提交
65 66
#define NR_MASK_WORDS	((NR_IRQS + 31) / 32)
static unsigned long ppc_lost_interrupts[NR_MASK_WORDS];
67 68
static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
static int pmac_irq_cascade = -1;
69
static struct irq_host *pmac_pic_host;
S
Stephen Rothwell 已提交
70

71
static void __pmac_retrigger(unsigned int irq_nr)
72
{
73 74 75 76 77 78
	if (irq_nr >= max_real_irqs && pmac_irq_cascade > 0) {
		__set_bit(irq_nr, ppc_lost_interrupts);
		irq_nr = pmac_irq_cascade;
		mb();
	}
	if (!__test_and_set_bit(irq_nr, ppc_lost_interrupts)) {
79
		atomic_inc(&ppc_n_lost_interrupts);
80
		set_dec(1);
81 82 83
	}
}

84
static void pmac_mask_and_ack_irq(struct irq_data *d)
85
{
86
	unsigned int src = irqd_to_hwirq(d);
87 88
        unsigned long bit = 1UL << (src & 0x1f);
        int i = src >> 5;
89 90
        unsigned long flags;

91
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
92 93
        __clear_bit(src, ppc_cached_irq_mask);
        if (__test_and_clear_bit(src, ppc_lost_interrupts))
94
                atomic_dec(&ppc_n_lost_interrupts);
95 96 97 98 99 100 101 102
        out_le32(&pmac_irq_hw[i]->enable, ppc_cached_irq_mask[i]);
        out_le32(&pmac_irq_hw[i]->ack, bit);
        do {
                /* make sure ack gets to controller before we enable
                   interrupts */
                mb();
        } while((in_le32(&pmac_irq_hw[i]->enable) & bit)
                != (ppc_cached_irq_mask[i] & bit));
103
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
104 105
}

106
static void pmac_ack_irq(struct irq_data *d)
107
{
108
	unsigned int src = irqd_to_hwirq(d);
109 110
        unsigned long bit = 1UL << (src & 0x1f);
        int i = src >> 5;
111 112
        unsigned long flags;

113
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
114
	if (__test_and_clear_bit(src, ppc_lost_interrupts))
115 116 117
                atomic_dec(&ppc_n_lost_interrupts);
        out_le32(&pmac_irq_hw[i]->ack, bit);
        (void)in_le32(&pmac_irq_hw[i]->ack);
118
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
119 120 121 122 123 124 125 126 127 128
}

static void __pmac_set_irq_mask(unsigned int irq_nr, int nokicklost)
{
        unsigned long bit = 1UL << (irq_nr & 0x1f);
        int i = irq_nr >> 5;

        if ((unsigned)irq_nr >= max_irqs)
                return;

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
        /* enable unmasked interrupts */
        out_le32(&pmac_irq_hw[i]->enable, ppc_cached_irq_mask[i]);

        do {
                /* make sure mask gets to controller before we
                   return to user */
                mb();
        } while((in_le32(&pmac_irq_hw[i]->enable) & bit)
                != (ppc_cached_irq_mask[i] & bit));

        /*
         * Unfortunately, setting the bit in the enable register
         * when the device interrupt is already on *doesn't* set
         * the bit in the flag register or request another interrupt.
         */
        if (bit & ppc_cached_irq_mask[i] & in_le32(&pmac_irq_hw[i]->level))
145
		__pmac_retrigger(irq_nr);
146 147 148 149 150
}

/* When an irq gets requested for the first client, if it's an
 * edge interrupt, we clear any previous one on the controller
 */
151
static unsigned int pmac_startup_irq(struct irq_data *d)
152
{
153
	unsigned long flags;
154
	unsigned int src = irqd_to_hwirq(d);
155 156
        unsigned long bit = 1UL << (src & 0x1f);
        int i = src >> 5;
157

158
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
159
	if (!irqd_is_level_type(d))
160
		out_le32(&pmac_irq_hw[i]->ack, bit);
161 162
        __set_bit(src, ppc_cached_irq_mask);
        __pmac_set_irq_mask(src, 0);
163
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
164 165 166 167

	return 0;
}

168
static void pmac_mask_irq(struct irq_data *d)
169
{
170
	unsigned long flags;
171
	unsigned int src = irqd_to_hwirq(d);
172

173
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
174
        __clear_bit(src, ppc_cached_irq_mask);
175
        __pmac_set_irq_mask(src, 1);
176
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
177 178
}

179
static void pmac_unmask_irq(struct irq_data *d)
180
{
181
	unsigned long flags;
182
	unsigned int src = irqd_to_hwirq(d);
183

184
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
185 186
	__set_bit(src, ppc_cached_irq_mask);
        __pmac_set_irq_mask(src, 0);
187
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
188 189
}

190
static int pmac_retrigger(struct irq_data *d)
191
{
192
	unsigned long flags;
193

194
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
195
	__pmac_retrigger(irqd_to_hwirq(d));
196
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
197 198
	return 1;
}
199

200
static struct irq_chip pmac_pic = {
201
	.name		= "PMAC-PIC",
202 203 204 205 206 207
	.irq_startup	= pmac_startup_irq,
	.irq_mask	= pmac_mask_irq,
	.irq_ack	= pmac_ack_irq,
	.irq_mask_ack	= pmac_mask_and_ack_irq,
	.irq_unmask	= pmac_unmask_irq,
	.irq_retrigger	= pmac_retrigger,
208 209
};

O
Olaf Hering 已提交
210
static irqreturn_t gatwick_action(int cpl, void *dev_id)
211
{
212
	unsigned long flags;
213
	int irq, bits;
214
	int rc = IRQ_NONE;
215

216
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
217 218 219 220 221 222 223 224 225
	for (irq = max_irqs; (irq -= 32) >= max_real_irqs; ) {
		int i = irq >> 5;
		bits = in_le32(&pmac_irq_hw[i]->event) | ppc_lost_interrupts[i];
		/* We must read level interrupts from the level register */
		bits |= (in_le32(&pmac_irq_hw[i]->level) & level_mask[i]);
		bits &= ppc_cached_irq_mask[i];
		if (bits == 0)
			continue;
		irq += __ilog2(bits);
226
		raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
227
		generic_handle_irq(irq);
228
		raw_spin_lock_irqsave(&pmac_pic_lock, flags);
229
		rc = IRQ_HANDLED;
230
	}
231
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
232
	return rc;
233 234
}

O
Olaf Hering 已提交
235
static unsigned int pmac_pic_get_irq(void)
236 237 238
{
	int irq;
	unsigned long bits = 0;
239
	unsigned long flags;
240

241
#ifdef CONFIG_PPC_PMAC32_PSURGE
242 243 244
	/* IPI's are a hack on the powersurge -- Cort */
	if (smp_processor_id() != 0) {
		return  psurge_secondary_virq;
245
        }
246
#endif /* CONFIG_PPC_PMAC32_PSURGE */
247
	raw_spin_lock_irqsave(&pmac_pic_lock, flags);
248 249 250 251 252 253 254 255 256 257 258
	for (irq = max_real_irqs; (irq -= 32) >= 0; ) {
		int i = irq >> 5;
		bits = in_le32(&pmac_irq_hw[i]->event) | ppc_lost_interrupts[i];
		/* We must read level interrupts from the level register */
		bits |= (in_le32(&pmac_irq_hw[i]->level) & level_mask[i]);
		bits &= ppc_cached_irq_mask[i];
		if (bits == 0)
			continue;
		irq += __ilog2(bits);
		break;
	}
259
	raw_spin_unlock_irqrestore(&pmac_pic_lock, flags);
260 261 262
	if (unlikely(irq < 0))
		return NO_IRQ;
	return irq_linear_revmap(pmac_pic_host, irq);
263 264 265 266 267 268 269 270 271 272 273 274 275 276
}

#ifdef CONFIG_XMON
static struct irqaction xmon_action = {
	.handler	= xmon_irq,
	.flags		= 0,
	.name		= "NMI - XMON"
};
#endif

static struct irqaction gatwick_cascade_action = {
	.handler	= gatwick_action,
	.name		= "cascade",
};
277

278 279 280 281 282 283 284
static int pmac_pic_host_match(struct irq_host *h, struct device_node *node)
{
	/* We match all, we don't always have a node anyway */
	return 1;
}

static int pmac_pic_host_map(struct irq_host *h, unsigned int virq,
285
			     irq_hw_number_t hw)
286 287 288 289 290 291 292 293 294 295 296
{
	int level;

	if (hw >= max_irqs)
		return -EINVAL;

	/* Mark level interrupts, set delayed disable for edge ones and set
	 * handlers
	 */
	level = !!(level_mask[hw >> 5] & (1UL << (hw & 0x1f)));
	if (level)
297
		irq_set_status_flags(virq, IRQ_LEVEL);
298 299
	irq_set_chip_and_handler(virq, &pmac_pic,
				 level ? handle_level_irq : handle_edge_irq);
300 301 302 303
	return 0;
}

static int pmac_pic_host_xlate(struct irq_host *h, struct device_node *ct,
304
			       const u32 *intspec, unsigned int intsize,
305 306 307 308
			       irq_hw_number_t *out_hwirq,
			       unsigned int *out_flags)

{
309
	*out_flags = IRQ_TYPE_NONE;
310 311 312 313 314 315 316 317 318 319
	*out_hwirq = *intspec;
	return 0;
}

static struct irq_host_ops pmac_pic_host_ops = {
	.match = pmac_pic_host_match,
	.map = pmac_pic_host_map,
	.xlate = pmac_pic_host_xlate,
};

320
static void __init pmac_pic_probe_oldstyle(void)
321 322
{
        int i;
323 324 325 326
        struct device_node *master = NULL;
	struct device_node *slave = NULL;
	u8 __iomem *addr;
	struct resource r;
327

328
	/* Set our get_irq function */
329
	ppc_md.get_irq = pmac_pic_get_irq;
330

331 332
	/*
	 * Find the interrupt controller type & node
333
	 */
334 335 336

	if ((master = of_find_node_by_name(NULL, "gc")) != NULL) {
		max_irqs = max_real_irqs = 32;
337
		level_mask[0] = GC_LEVEL_MASK;
338 339
	} else if ((master = of_find_node_by_name(NULL, "ohare")) != NULL) {
		max_irqs = max_real_irqs = 32;
340
		level_mask[0] = OHARE_LEVEL_MASK;
341

342
		/* We might have a second cascaded ohare */
343 344 345 346 347 348 349
		slave = of_find_node_by_name(NULL, "pci106b,7");
		if (slave) {
			max_irqs = 64;
			level_mask[1] = OHARE_LEVEL_MASK;
		}
	} else if ((master = of_find_node_by_name(NULL, "mac-io")) != NULL) {
		max_irqs = max_real_irqs = 64;
350 351
		level_mask[0] = HEATHROW_LEVEL_MASK;
		level_mask[1] = 0;
352

353
		/* We might have a second cascaded heathrow */
354 355 356
		slave = of_find_node_by_name(master, "mac-io");

		/* Check ordering of master & slave */
357
		if (of_device_is_compatible(master, "gatwick")) {
358 359 360 361 362 363
			struct device_node *tmp;
			BUG_ON(slave == NULL);
			tmp = master;
			master = slave;
			slave = tmp;
		}
364

365 366
		/* We found a slave */
		if (slave) {
367
			max_irqs = 128;
368 369 370
			level_mask[2] = HEATHROW_LEVEL_MASK;
			level_mask[3] = 0;
		}
371
	}
372 373
	BUG_ON(master == NULL);

374 375 376
	/*
	 * Allocate an irq host
	 */
377
	pmac_pic_host = irq_alloc_host(master, IRQ_HOST_MAP_LINEAR, max_irqs,
378 379 380 381
				       &pmac_pic_host_ops,
				       max_irqs);
	BUG_ON(pmac_pic_host == NULL);
	irq_set_default_host(pmac_pic_host);
382

383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
	/* Get addresses of first controller if we have a node for it */
	BUG_ON(of_address_to_resource(master, 0, &r));

	/* Map interrupts of primary controller */
	addr = (u8 __iomem *) ioremap(r.start, 0x40);
	i = 0;
	pmac_irq_hw[i++] = (volatile struct pmac_irq_hw __iomem *)
		(addr + 0x20);
	if (max_real_irqs > 32)
		pmac_irq_hw[i++] = (volatile struct pmac_irq_hw __iomem *)
			(addr + 0x10);
	of_node_put(master);

	printk(KERN_INFO "irq: Found primary Apple PIC %s for %d irqs\n",
	       master->full_name, max_real_irqs);

	/* Map interrupts of cascaded controller */
	if (slave && !of_address_to_resource(slave, 0, &r)) {
		addr = (u8 __iomem *)ioremap(r.start, 0x40);
		pmac_irq_hw[i++] = (volatile struct pmac_irq_hw __iomem *)
			(addr + 0x20);
		if (max_irqs > 64)
			pmac_irq_hw[i++] =
				(volatile struct pmac_irq_hw __iomem *)
				(addr + 0x10);
408
		pmac_irq_cascade = irq_of_parse_and_map(slave, 0);
409 410 411

		printk(KERN_INFO "irq: Found slave Apple PIC %s for %d irqs"
		       " cascade: %d\n", slave->full_name,
412
		       max_irqs - max_real_irqs, pmac_irq_cascade);
413
	}
414
	of_node_put(slave);
415

416
	/* Disable all interrupts in all controllers */
417 418
	for (i = 0; i * 32 < max_irqs; ++i)
		out_le32(&pmac_irq_hw[i]->enable, 0);
419

420
	/* Hookup cascade irq */
421
	if (slave && pmac_irq_cascade != NO_IRQ)
422
		setup_irq(pmac_irq_cascade, &gatwick_cascade_action);
423

424
	printk(KERN_INFO "irq: System has %d possible interrupts\n", max_irqs);
425
#ifdef CONFIG_XMON
426
	setup_irq(irq_create_mapping(NULL, 20), &xmon_action);
427 428
#endif
}
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464

int of_irq_map_oldworld(struct device_node *device, int index,
			struct of_irq *out_irq)
{
	const u32 *ints = NULL;
	int intlen;

	/*
	 * Old machines just have a list of interrupt numbers
	 * and no interrupt-controller nodes. We also have dodgy
	 * cases where the APPL,interrupts property is completely
	 * missing behind pci-pci bridges and we have to get it
	 * from the parent (the bridge itself, as apple just wired
	 * everything together on these)
	 */
	while (device) {
		ints = of_get_property(device, "AAPL,interrupts", &intlen);
		if (ints != NULL)
			break;
		device = device->parent;
		if (device && strcmp(device->type, "pci") != 0)
			break;
	}
	if (ints == NULL)
		return -EINVAL;
	intlen /= sizeof(u32);

	if (index >= intlen)
		return -EINVAL;

	out_irq->controller = NULL;
	out_irq->specifier[0] = ints[index];
	out_irq->size = 1;

	return 0;
}
465 466 467 468 469 470 471 472 473
#endif /* CONFIG_PPC32 */

static void __init pmac_pic_setup_mpic_nmi(struct mpic *mpic)
{
#if defined(CONFIG_XMON) && defined(CONFIG_PPC32)
	struct device_node* pswitch;
	int nmi_irq;

	pswitch = of_find_node_by_name(NULL, "programmer-switch");
474 475 476 477 478 479 480
	if (pswitch) {
		nmi_irq = irq_of_parse_and_map(pswitch, 0);
		if (nmi_irq != NO_IRQ) {
			mpic_irq_set_priority(nmi_irq, 9);
			setup_irq(nmi_irq, &xmon_action);
		}
		of_node_put(pswitch);
481 482 483 484
	}
#endif	/* defined(CONFIG_XMON) && defined(CONFIG_PPC32) */
}

485 486 487 488 489
static struct mpic * __init pmac_setup_one_mpic(struct device_node *np,
						int master)
{
	const char *name = master ? " MPIC 1   " : " MPIC 2   ";
	struct mpic *mpic;
490
	unsigned int flags = master ? 0 : MPIC_SECONDARY;
491 492 493 494

	pmac_call_feature(PMAC_FTR_ENABLE_MPIC, np, 0, 0);

	flags |= MPIC_WANTS_RESET;
495
	if (of_get_property(np, "big-endian", NULL))
496 497 498 499 500 501
		flags |= MPIC_BIG_ENDIAN;

	/* Primary Big Endian means HT interrupts. This is quite dodgy
	 * but works until I find a better way
	 */
	if (master && (flags & MPIC_BIG_ENDIAN))
502
		flags |= MPIC_U3_HT_IRQS;
503

504
	mpic = mpic_alloc(np, 0, flags, 0, 0, name);
505 506 507 508 509 510 511 512
	if (mpic == NULL)
		return NULL;

	mpic_init(mpic);

	return mpic;
 }

513 514 515 516 517 518 519 520 521
static int __init pmac_pic_probe_mpic(void)
{
	struct mpic *mpic1, *mpic2;
	struct device_node *np, *master = NULL, *slave = NULL;

	/* We can have up to 2 MPICs cascaded */
	for (np = NULL; (np = of_find_node_by_type(np, "open-pic"))
		     != NULL;) {
		if (master == NULL &&
522
		    of_get_property(np, "interrupts", NULL) == NULL)
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
			master = of_node_get(np);
		else if (slave == NULL)
			slave = of_node_get(np);
		if (master && slave)
			break;
	}

	/* Check for bogus setups */
	if (master == NULL && slave != NULL) {
		master = slave;
		slave = NULL;
	}

	/* Not found, default to good old pmac pic */
	if (master == NULL)
		return -ENODEV;

	/* Set master handler */
	ppc_md.get_irq = mpic_get_irq;

	/* Setup master */
544
	mpic1 = pmac_setup_one_mpic(master, 1);
545 546 547 548 549 550 551
	BUG_ON(mpic1 == NULL);

	/* Install NMI if any */
	pmac_pic_setup_mpic_nmi(mpic1);

	of_node_put(master);

552 553 554 555 556
	/* Set up a cascaded controller, if present */
	if (slave) {
		mpic2 = pmac_setup_one_mpic(slave, 0);
		if (mpic2 == NULL)
			printk(KERN_ERR "Failed to setup slave MPIC\n");
557
		of_node_put(slave);
558 559 560 561 562 563 564 565
	}

	return 0;
}


void __init pmac_pic_init(void)
{
566 567 568 569 570
	/* We configure the OF parsing based on our oldworld vs. newworld
	 * platform type and wether we were booted by BootX.
	 */
#ifdef CONFIG_PPC32
	if (!pmac_newworld)
571
		of_irq_workarounds |= OF_IMAP_OLDWORLD_MAC;
572
	if (of_get_property(of_chosen, "linux,bootx", NULL) != NULL)
573
		of_irq_workarounds |= OF_IMAP_NO_PHANDLE;
574

575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
	/* If we don't have phandles on a newworld, then try to locate a
	 * default interrupt controller (happens when booting with BootX).
	 * We do a first match here, hopefully, that only ever happens on
	 * machines with one controller.
	 */
	if (pmac_newworld && (of_irq_workarounds & OF_IMAP_NO_PHANDLE)) {
		struct device_node *np;

		for_each_node_with_property(np, "interrupt-controller") {
			/* Skip /chosen/interrupt-controller */
			if (strcmp(np->name, "chosen") == 0)
				continue;
			/* It seems like at least one person wants
			 * to use BootX on a machine with an AppleKiwi
			 * controller which happens to pretend to be an
			 * interrupt controller too. */
			if (strcmp(np->name, "AppleKiwi") == 0)
				continue;
			/* I think we found one ! */
			of_irq_dflt_pic = np;
			break;
		}
	}
#endif /* CONFIG_PPC32 */
599

600 601 602 603 604 605 606 607 608
	/* We first try to detect Apple's new Core99 chipset, since mac-io
	 * is quite different on those machines and contains an IBM MPIC2.
	 */
	if (pmac_pic_probe_mpic() == 0)
		return;

#ifdef CONFIG_PPC32
	pmac_pic_probe_oldstyle();
#endif
609 610
}

611
#if defined(CONFIG_PM) && defined(CONFIG_PPC32)
612 613 614 615 616 617 618 619 620 621
/*
 * These procedures are used in implementing sleep on the powerbooks.
 * sleep_save_intrs() saves the states of all interrupt enables
 * and disables all interrupts except for the nominated one.
 * sleep_restore_intrs() restores the states of all interrupt enables.
 */
unsigned long sleep_save_mask[2];

/* This used to be passed by the PMU driver but that link got
 * broken with the new driver model. We use this tweak for now...
622
 * We really want to do things differently though...
623 624 625 626 627 628 629 630 631 632 633 634 635
 */
static int pmacpic_find_viaint(void)
{
	int viaint = -1;

#ifdef CONFIG_ADB_PMU
	struct device_node *np;

	if (pmu_get_model() != PMU_OHARE_BASED)
		goto not_found;
	np = of_find_node_by_name(NULL, "via-pmu");
	if (np == NULL)
		goto not_found;
636
	viaint = irq_of_parse_and_map(np, 0);
637 638

not_found:
639
#endif /* CONFIG_ADB_PMU */
640 641 642
	return viaint;
}

643
static int pmacpic_suspend(void)
644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
{
	int viaint = pmacpic_find_viaint();

	sleep_save_mask[0] = ppc_cached_irq_mask[0];
	sleep_save_mask[1] = ppc_cached_irq_mask[1];
	ppc_cached_irq_mask[0] = 0;
	ppc_cached_irq_mask[1] = 0;
	if (viaint > 0)
		set_bit(viaint, ppc_cached_irq_mask);
	out_le32(&pmac_irq_hw[0]->enable, ppc_cached_irq_mask[0]);
	if (max_real_irqs > 32)
		out_le32(&pmac_irq_hw[1]->enable, ppc_cached_irq_mask[1]);
	(void)in_le32(&pmac_irq_hw[0]->event);
	/* make sure mask gets to controller before we return to caller */
	mb();
        (void)in_le32(&pmac_irq_hw[0]->enable);

        return 0;
}

664
static void pmacpic_resume(void)
665 666 667 668 669 670 671 672 673
{
	int i;

	out_le32(&pmac_irq_hw[0]->enable, 0);
	if (max_real_irqs > 32)
		out_le32(&pmac_irq_hw[1]->enable, 0);
	mb();
	for (i = 0; i < max_real_irqs; ++i)
		if (test_bit(i, sleep_save_mask))
674
			pmac_unmask_irq(irq_get_irq_data(i));
675 676
}

677 678 679
static struct syscore_ops pmacpic_syscore_ops = {
	.suspend	= pmacpic_suspend,
	.resume		= pmacpic_resume,
680 681
};

682
static int __init init_pmacpic_syscore(void)
683
{
684 685
	if (pmac_irq_hw[0])
		register_syscore_ops(&pmacpic_syscore_ops);
686 687 688
	return 0;
}

689 690 691
machine_subsys_initcall(powermac, init_pmacpic_syscore);

#endif /* CONFIG_PM && CONFIG_PPC32 */