Linux Audio

Check our new training course

Yocto distribution development and maintenance

Need a Yocto distribution for your embedded project?
Loading...
v3.5.6
 
   1/*
   2 *  Copyright (C) 1996-2001 Paul Mackerras (paulus@cs.anu.edu.au)
   3 *                          Ben. Herrenschmidt (benh@kernel.crashing.org)
   4 *
   5 *  This program is free software; you can redistribute it and/or
   6 *  modify it under the terms of the GNU General Public License
   7 *  as published by the Free Software Foundation; either version
   8 *  2 of the License, or (at your option) any later version.
   9 *
  10 *  TODO:
  11 *
  12 *   - Replace mdelay with some schedule loop if possible
  13 *   - Shorten some obfuscated delays on some routines (like modem
  14 *     power)
  15 *   - Refcount some clocks (see darwin)
  16 *   - Split split split...
  17 *
  18 */
  19#include <linux/types.h>
  20#include <linux/init.h>
  21#include <linux/delay.h>
  22#include <linux/kernel.h>
  23#include <linux/sched.h>
  24#include <linux/of.h>
  25#include <linux/of_address.h>
  26#include <linux/spinlock.h>
  27#include <linux/adb.h>
  28#include <linux/pmu.h>
  29#include <linux/ioport.h>
  30#include <linux/export.h>
  31#include <linux/pci.h>
  32#include <asm/sections.h>
  33#include <asm/errno.h>
  34#include <asm/ohare.h>
  35#include <asm/heathrow.h>
  36#include <asm/keylargo.h>
  37#include <asm/uninorth.h>
  38#include <asm/io.h>
  39#include <asm/prom.h>
  40#include <asm/machdep.h>
  41#include <asm/pmac_feature.h>
  42#include <asm/dbdma.h>
  43#include <asm/pci-bridge.h>
  44#include <asm/pmac_low_i2c.h>
  45
 
 
  46#undef DEBUG_FEATURE
  47
  48#ifdef DEBUG_FEATURE
  49#define DBG(fmt...) printk(KERN_DEBUG fmt)
  50#else
  51#define DBG(fmt...)
  52#endif
  53
  54#ifdef CONFIG_6xx
  55extern int powersave_lowspeed;
  56#endif
  57
  58extern int powersave_nap;
  59extern struct device_node *k2_skiplist[2];
  60
  61/*
  62 * We use a single global lock to protect accesses. Each driver has
  63 * to take care of its own locking
  64 */
  65DEFINE_RAW_SPINLOCK(feature_lock);
  66
  67#define LOCK(flags)	raw_spin_lock_irqsave(&feature_lock, flags);
  68#define UNLOCK(flags)	raw_spin_unlock_irqrestore(&feature_lock, flags);
  69
  70
  71/*
  72 * Instance of some macio stuffs
  73 */
  74struct macio_chip macio_chips[MAX_MACIO_CHIPS];
  75
  76struct macio_chip *macio_find(struct device_node *child, int type)
  77{
  78	while(child) {
  79		int	i;
  80
  81		for (i=0; i < MAX_MACIO_CHIPS && macio_chips[i].of_node; i++)
  82			if (child == macio_chips[i].of_node &&
  83			    (!type || macio_chips[i].type == type))
  84				return &macio_chips[i];
  85		child = child->parent;
  86	}
  87	return NULL;
  88}
  89EXPORT_SYMBOL_GPL(macio_find);
  90
  91static const char *macio_names[] =
  92{
  93	"Unknown",
  94	"Grand Central",
  95	"OHare",
  96	"OHareII",
  97	"Heathrow",
  98	"Gatwick",
  99	"Paddington",
 100	"Keylargo",
 101	"Pangea",
 102	"Intrepid",
 103	"K2",
 104	"Shasta",
 105};
 106
 107
 108struct device_node *uninorth_node;
 109u32 __iomem *uninorth_base;
 110
 111static u32 uninorth_rev;
 112static int uninorth_maj;
 113static void __iomem *u3_ht_base;
 114
 115/*
 116 * For each motherboard family, we have a table of functions pointers
 117 * that handle the various features.
 118 */
 119
 120typedef long (*feature_call)(struct device_node *node, long param, long value);
 121
 122struct feature_table_entry {
 123	unsigned int	selector;
 124	feature_call	function;
 125};
 126
 127struct pmac_mb_def
 128{
 129	const char*			model_string;
 130	const char*			model_name;
 131	int				model_id;
 132	struct feature_table_entry*	features;
 133	unsigned long			board_flags;
 134};
 135static struct pmac_mb_def pmac_mb;
 136
 137/*
 138 * Here are the chip specific feature functions
 139 */
 140
 141static inline int simple_feature_tweak(struct device_node *node, int type,
 142				       int reg, u32 mask, int value)
 
 
 143{
 144	struct macio_chip*	macio;
 145	unsigned long		flags;
 146
 147	macio = macio_find(node, type);
 148	if (!macio)
 149		return -ENODEV;
 150	LOCK(flags);
 151	if (value)
 152		MACIO_BIS(reg, mask);
 153	else
 154		MACIO_BIC(reg, mask);
 155	(void)MACIO_IN32(reg);
 156	UNLOCK(flags);
 157
 158	return 0;
 159}
 160
 161#ifndef CONFIG_POWER4
 162
 163static long ohare_htw_scc_enable(struct device_node *node, long param,
 164				 long value)
 165{
 166	struct macio_chip*	macio;
 167	unsigned long		chan_mask;
 168	unsigned long		fcr;
 169	unsigned long		flags;
 170	int			htw, trans;
 171	unsigned long		rmask;
 172
 173	macio = macio_find(node, 0);
 174	if (!macio)
 175		return -ENODEV;
 176	if (!strcmp(node->name, "ch-a"))
 177		chan_mask = MACIO_FLAG_SCCA_ON;
 178	else if (!strcmp(node->name, "ch-b"))
 179		chan_mask = MACIO_FLAG_SCCB_ON;
 180	else
 181		return -ENODEV;
 182
 183	htw = (macio->type == macio_heathrow || macio->type == macio_paddington
 184		|| macio->type == macio_gatwick);
 185	/* On these machines, the HRW_SCC_TRANS_EN_N bit mustn't be touched */
 186	trans = (pmac_mb.model_id != PMAC_TYPE_YOSEMITE &&
 187		 pmac_mb.model_id != PMAC_TYPE_YIKES);
 188	if (value) {
 189#ifdef CONFIG_ADB_PMU
 190		if ((param & 0xfff) == PMAC_SCC_IRDA)
 191			pmu_enable_irled(1);
 192#endif /* CONFIG_ADB_PMU */
 193		LOCK(flags);
 194		fcr = MACIO_IN32(OHARE_FCR);
 195		/* Check if scc cell need enabling */
 196		if (!(fcr & OH_SCC_ENABLE)) {
 197			fcr |= OH_SCC_ENABLE;
 198			if (htw) {
 199				/* Side effect: this will also power up the
 200				 * modem, but it's too messy to figure out on which
 201				 * ports this controls the tranceiver and on which
 202				 * it controls the modem
 203				 */
 204				if (trans)
 205					fcr &= ~HRW_SCC_TRANS_EN_N;
 206				MACIO_OUT32(OHARE_FCR, fcr);
 207				fcr |= (rmask = HRW_RESET_SCC);
 208				MACIO_OUT32(OHARE_FCR, fcr);
 209			} else {
 210				fcr |= (rmask = OH_SCC_RESET);
 211				MACIO_OUT32(OHARE_FCR, fcr);
 212			}
 213			UNLOCK(flags);
 214			(void)MACIO_IN32(OHARE_FCR);
 215			mdelay(15);
 216			LOCK(flags);
 217			fcr &= ~rmask;
 218			MACIO_OUT32(OHARE_FCR, fcr);
 219		}
 220		if (chan_mask & MACIO_FLAG_SCCA_ON)
 221			fcr |= OH_SCCA_IO;
 222		if (chan_mask & MACIO_FLAG_SCCB_ON)
 223			fcr |= OH_SCCB_IO;
 224		MACIO_OUT32(OHARE_FCR, fcr);
 225		macio->flags |= chan_mask;
 226		UNLOCK(flags);
 227		if (param & PMAC_SCC_FLAG_XMON)
 228			macio->flags |= MACIO_FLAG_SCC_LOCKED;
 229	} else {
 230		if (macio->flags & MACIO_FLAG_SCC_LOCKED)
 231			return -EPERM;
 232		LOCK(flags);
 233		fcr = MACIO_IN32(OHARE_FCR);
 234		if (chan_mask & MACIO_FLAG_SCCA_ON)
 235			fcr &= ~OH_SCCA_IO;
 236		if (chan_mask & MACIO_FLAG_SCCB_ON)
 237			fcr &= ~OH_SCCB_IO;
 238		MACIO_OUT32(OHARE_FCR, fcr);
 239		if ((fcr & (OH_SCCA_IO | OH_SCCB_IO)) == 0) {
 240			fcr &= ~OH_SCC_ENABLE;
 241			if (htw && trans)
 242				fcr |= HRW_SCC_TRANS_EN_N;
 243			MACIO_OUT32(OHARE_FCR, fcr);
 244		}
 245		macio->flags &= ~(chan_mask);
 246		UNLOCK(flags);
 247		mdelay(10);
 248#ifdef CONFIG_ADB_PMU
 249		if ((param & 0xfff) == PMAC_SCC_IRDA)
 250			pmu_enable_irled(0);
 251#endif /* CONFIG_ADB_PMU */
 252	}
 253	return 0;
 254}
 255
 256static long ohare_floppy_enable(struct device_node *node, long param,
 257				long value)
 258{
 259	return simple_feature_tweak(node, macio_ohare,
 260		OHARE_FCR, OH_FLOPPY_ENABLE, value);
 261}
 262
 263static long ohare_mesh_enable(struct device_node *node, long param, long value)
 264{
 265	return simple_feature_tweak(node, macio_ohare,
 266		OHARE_FCR, OH_MESH_ENABLE, value);
 267}
 268
 269static long ohare_ide_enable(struct device_node *node, long param, long value)
 270{
 271	switch(param) {
 272	case 0:
 273		/* For some reason, setting the bit in set_initial_features()
 274		 * doesn't stick. I'm still investigating... --BenH.
 275		 */
 276		if (value)
 277			simple_feature_tweak(node, macio_ohare,
 278				OHARE_FCR, OH_IOBUS_ENABLE, 1);
 279		return simple_feature_tweak(node, macio_ohare,
 280			OHARE_FCR, OH_IDE0_ENABLE, value);
 281	case 1:
 282		return simple_feature_tweak(node, macio_ohare,
 283			OHARE_FCR, OH_BAY_IDE_ENABLE, value);
 284	default:
 285		return -ENODEV;
 286	}
 287}
 288
 289static long ohare_ide_reset(struct device_node *node, long param, long value)
 290{
 291	switch(param) {
 292	case 0:
 293		return simple_feature_tweak(node, macio_ohare,
 294			OHARE_FCR, OH_IDE0_RESET_N, !value);
 295	case 1:
 296		return simple_feature_tweak(node, macio_ohare,
 297			OHARE_FCR, OH_IDE1_RESET_N, !value);
 298	default:
 299		return -ENODEV;
 300	}
 301}
 302
 303static long ohare_sleep_state(struct device_node *node, long param, long value)
 304{
 305	struct macio_chip*	macio = &macio_chips[0];
 306
 307	if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0)
 308		return -EPERM;
 309	if (value == 1) {
 310		MACIO_BIC(OHARE_FCR, OH_IOBUS_ENABLE);
 311	} else if (value == 0) {
 312		MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE);
 313	}
 314
 315	return 0;
 316}
 317
 318static long heathrow_modem_enable(struct device_node *node, long param,
 319				  long value)
 320{
 321	struct macio_chip*	macio;
 322	u8			gpio;
 323	unsigned long		flags;
 324
 325	macio = macio_find(node, macio_unknown);
 326	if (!macio)
 327		return -ENODEV;
 328	gpio = MACIO_IN8(HRW_GPIO_MODEM_RESET) & ~1;
 329	if (!value) {
 330		LOCK(flags);
 331		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio);
 332		UNLOCK(flags);
 333		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 334		mdelay(250);
 335	}
 336	if (pmac_mb.model_id != PMAC_TYPE_YOSEMITE &&
 337	    pmac_mb.model_id != PMAC_TYPE_YIKES) {
 338		LOCK(flags);
 339		if (value)
 340			MACIO_BIC(HEATHROW_FCR, HRW_SCC_TRANS_EN_N);
 341		else
 342			MACIO_BIS(HEATHROW_FCR, HRW_SCC_TRANS_EN_N);
 343		UNLOCK(flags);
 344		(void)MACIO_IN32(HEATHROW_FCR);
 345		mdelay(250);
 346	}
 347	if (value) {
 348		LOCK(flags);
 349		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1);
 350		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 351		UNLOCK(flags); mdelay(250); LOCK(flags);
 352		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio);
 353		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 354		UNLOCK(flags); mdelay(250); LOCK(flags);
 355		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1);
 356		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 357		UNLOCK(flags); mdelay(250);
 358	}
 359	return 0;
 360}
 361
 362static long heathrow_floppy_enable(struct device_node *node, long param,
 363				   long value)
 364{
 365	return simple_feature_tweak(node, macio_unknown,
 366		HEATHROW_FCR,
 367		HRW_SWIM_ENABLE|HRW_BAY_FLOPPY_ENABLE,
 368		value);
 369}
 370
 371static long heathrow_mesh_enable(struct device_node *node, long param,
 372				 long value)
 373{
 374	struct macio_chip*	macio;
 375	unsigned long		flags;
 376
 377	macio = macio_find(node, macio_unknown);
 378	if (!macio)
 379		return -ENODEV;
 380	LOCK(flags);
 381	/* Set clear mesh cell enable */
 382	if (value)
 383		MACIO_BIS(HEATHROW_FCR, HRW_MESH_ENABLE);
 384	else
 385		MACIO_BIC(HEATHROW_FCR, HRW_MESH_ENABLE);
 386	(void)MACIO_IN32(HEATHROW_FCR);
 387	udelay(10);
 388	/* Set/Clear termination power */
 389	if (value)
 390		MACIO_BIC(HEATHROW_MBCR, 0x04000000);
 391	else
 392		MACIO_BIS(HEATHROW_MBCR, 0x04000000);
 393	(void)MACIO_IN32(HEATHROW_MBCR);
 394	udelay(10);
 395	UNLOCK(flags);
 396
 397	return 0;
 398}
 399
 400static long heathrow_ide_enable(struct device_node *node, long param,
 401				long value)
 402{
 403	switch(param) {
 404	case 0:
 405		return simple_feature_tweak(node, macio_unknown,
 406			HEATHROW_FCR, HRW_IDE0_ENABLE, value);
 407	case 1:
 408		return simple_feature_tweak(node, macio_unknown,
 409			HEATHROW_FCR, HRW_BAY_IDE_ENABLE, value);
 410	default:
 411		return -ENODEV;
 412	}
 413}
 414
 415static long heathrow_ide_reset(struct device_node *node, long param,
 416			       long value)
 417{
 418	switch(param) {
 419	case 0:
 420		return simple_feature_tweak(node, macio_unknown,
 421			HEATHROW_FCR, HRW_IDE0_RESET_N, !value);
 422	case 1:
 423		return simple_feature_tweak(node, macio_unknown,
 424			HEATHROW_FCR, HRW_IDE1_RESET_N, !value);
 425	default:
 426		return -ENODEV;
 427	}
 428}
 429
 430static long heathrow_bmac_enable(struct device_node *node, long param,
 431				 long value)
 432{
 433	struct macio_chip*	macio;
 434	unsigned long		flags;
 435
 436	macio = macio_find(node, 0);
 437	if (!macio)
 438		return -ENODEV;
 439	if (value) {
 440		LOCK(flags);
 441		MACIO_BIS(HEATHROW_FCR, HRW_BMAC_IO_ENABLE);
 442		MACIO_BIS(HEATHROW_FCR, HRW_BMAC_RESET);
 443		UNLOCK(flags);
 444		(void)MACIO_IN32(HEATHROW_FCR);
 445		mdelay(10);
 446		LOCK(flags);
 447		MACIO_BIC(HEATHROW_FCR, HRW_BMAC_RESET);
 448		UNLOCK(flags);
 449		(void)MACIO_IN32(HEATHROW_FCR);
 450		mdelay(10);
 451	} else {
 452		LOCK(flags);
 453		MACIO_BIC(HEATHROW_FCR, HRW_BMAC_IO_ENABLE);
 454		UNLOCK(flags);
 455	}
 456	return 0;
 457}
 458
 459static long heathrow_sound_enable(struct device_node *node, long param,
 460				  long value)
 461{
 462	struct macio_chip*	macio;
 463	unsigned long		flags;
 464
 465	/* B&W G3 and Yikes don't support that properly (the
 466	 * sound appear to never come back after beeing shut down).
 467	 */
 468	if (pmac_mb.model_id == PMAC_TYPE_YOSEMITE ||
 469	    pmac_mb.model_id == PMAC_TYPE_YIKES)
 470		return 0;
 471
 472	macio = macio_find(node, 0);
 473	if (!macio)
 474		return -ENODEV;
 475	if (value) {
 476		LOCK(flags);
 477		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
 478		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_POWER_N);
 479		UNLOCK(flags);
 480		(void)MACIO_IN32(HEATHROW_FCR);
 481	} else {
 482		LOCK(flags);
 483		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_POWER_N);
 484		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
 485		UNLOCK(flags);
 486	}
 487	return 0;
 488}
 489
 490static u32 save_fcr[6];
 491static u32 save_mbcr;
 492static struct dbdma_regs save_dbdma[13];
 493static struct dbdma_regs save_alt_dbdma[13];
 494
 495static void dbdma_save(struct macio_chip *macio, struct dbdma_regs *save)
 496{
 497	int i;
 498
 499	/* Save state & config of DBDMA channels */
 500	for (i = 0; i < 13; i++) {
 501		volatile struct dbdma_regs __iomem * chan = (void __iomem *)
 502			(macio->base + ((0x8000+i*0x100)>>2));
 503		save[i].cmdptr_hi = in_le32(&chan->cmdptr_hi);
 504		save[i].cmdptr = in_le32(&chan->cmdptr);
 505		save[i].intr_sel = in_le32(&chan->intr_sel);
 506		save[i].br_sel = in_le32(&chan->br_sel);
 507		save[i].wait_sel = in_le32(&chan->wait_sel);
 508	}
 509}
 510
 511static void dbdma_restore(struct macio_chip *macio, struct dbdma_regs *save)
 512{
 513	int i;
 514
 515	/* Save state & config of DBDMA channels */
 516	for (i = 0; i < 13; i++) {
 517		volatile struct dbdma_regs __iomem * chan = (void __iomem *)
 518			(macio->base + ((0x8000+i*0x100)>>2));
 519		out_le32(&chan->control, (ACTIVE|DEAD|WAKE|FLUSH|PAUSE|RUN)<<16);
 520		while (in_le32(&chan->status) & ACTIVE)
 521			mb();
 522		out_le32(&chan->cmdptr_hi, save[i].cmdptr_hi);
 523		out_le32(&chan->cmdptr, save[i].cmdptr);
 524		out_le32(&chan->intr_sel, save[i].intr_sel);
 525		out_le32(&chan->br_sel, save[i].br_sel);
 526		out_le32(&chan->wait_sel, save[i].wait_sel);
 527	}
 528}
 529
 530static void heathrow_sleep(struct macio_chip *macio, int secondary)
 531{
 532	if (secondary) {
 533		dbdma_save(macio, save_alt_dbdma);
 534		save_fcr[2] = MACIO_IN32(0x38);
 535		save_fcr[3] = MACIO_IN32(0x3c);
 536	} else {
 537		dbdma_save(macio, save_dbdma);
 538		save_fcr[0] = MACIO_IN32(0x38);
 539		save_fcr[1] = MACIO_IN32(0x3c);
 540		save_mbcr = MACIO_IN32(0x34);
 541		/* Make sure sound is shut down */
 542		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_POWER_N);
 543		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
 544		/* This seems to be necessary as well or the fan
 545		 * keeps coming up and battery drains fast */
 546		MACIO_BIC(HEATHROW_FCR, HRW_IOBUS_ENABLE);
 547		MACIO_BIC(HEATHROW_FCR, HRW_IDE0_RESET_N);
 548		/* Make sure eth is down even if module or sleep
 549		 * won't work properly */
 550		MACIO_BIC(HEATHROW_FCR, HRW_BMAC_IO_ENABLE | HRW_BMAC_RESET);
 551	}
 552	/* Make sure modem is shut down */
 553	MACIO_OUT8(HRW_GPIO_MODEM_RESET,
 554		MACIO_IN8(HRW_GPIO_MODEM_RESET) & ~1);
 555	MACIO_BIS(HEATHROW_FCR, HRW_SCC_TRANS_EN_N);
 556	MACIO_BIC(HEATHROW_FCR, OH_SCCA_IO|OH_SCCB_IO|HRW_SCC_ENABLE);
 557
 558	/* Let things settle */
 559	(void)MACIO_IN32(HEATHROW_FCR);
 560}
 561
 562static void heathrow_wakeup(struct macio_chip *macio, int secondary)
 563{
 564	if (secondary) {
 565		MACIO_OUT32(0x38, save_fcr[2]);
 566		(void)MACIO_IN32(0x38);
 567		mdelay(1);
 568		MACIO_OUT32(0x3c, save_fcr[3]);
 569		(void)MACIO_IN32(0x38);
 570		mdelay(10);
 571		dbdma_restore(macio, save_alt_dbdma);
 572	} else {
 573		MACIO_OUT32(0x38, save_fcr[0] | HRW_IOBUS_ENABLE);
 574		(void)MACIO_IN32(0x38);
 575		mdelay(1);
 576		MACIO_OUT32(0x3c, save_fcr[1]);
 577		(void)MACIO_IN32(0x38);
 578		mdelay(1);
 579		MACIO_OUT32(0x34, save_mbcr);
 580		(void)MACIO_IN32(0x38);
 581		mdelay(10);
 582		dbdma_restore(macio, save_dbdma);
 583	}
 584}
 585
 586static long heathrow_sleep_state(struct device_node *node, long param,
 587				 long value)
 588{
 589	if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0)
 590		return -EPERM;
 591	if (value == 1) {
 592		if (macio_chips[1].type == macio_gatwick)
 593			heathrow_sleep(&macio_chips[0], 1);
 594		heathrow_sleep(&macio_chips[0], 0);
 595	} else if (value == 0) {
 596		heathrow_wakeup(&macio_chips[0], 0);
 597		if (macio_chips[1].type == macio_gatwick)
 598			heathrow_wakeup(&macio_chips[0], 1);
 599	}
 600	return 0;
 601}
 602
 603static long core99_scc_enable(struct device_node *node, long param, long value)
 604{
 605	struct macio_chip*	macio;
 606	unsigned long		flags;
 607	unsigned long		chan_mask;
 608	u32			fcr;
 609
 610	macio = macio_find(node, 0);
 611	if (!macio)
 612		return -ENODEV;
 613	if (!strcmp(node->name, "ch-a"))
 614		chan_mask = MACIO_FLAG_SCCA_ON;
 615	else if (!strcmp(node->name, "ch-b"))
 616		chan_mask = MACIO_FLAG_SCCB_ON;
 617	else
 618		return -ENODEV;
 619
 620	if (value) {
 621		int need_reset_scc = 0;
 622		int need_reset_irda = 0;
 623
 624		LOCK(flags);
 625		fcr = MACIO_IN32(KEYLARGO_FCR0);
 626		/* Check if scc cell need enabling */
 627		if (!(fcr & KL0_SCC_CELL_ENABLE)) {
 628			fcr |= KL0_SCC_CELL_ENABLE;
 629			need_reset_scc = 1;
 630		}
 631		if (chan_mask & MACIO_FLAG_SCCA_ON) {
 632			fcr |= KL0_SCCA_ENABLE;
 633			/* Don't enable line drivers for I2S modem */
 634			if ((param & 0xfff) == PMAC_SCC_I2S1)
 635				fcr &= ~KL0_SCC_A_INTF_ENABLE;
 636			else
 637				fcr |= KL0_SCC_A_INTF_ENABLE;
 638		}
 639		if (chan_mask & MACIO_FLAG_SCCB_ON) {
 640			fcr |= KL0_SCCB_ENABLE;
 641			/* Perform irda specific inits */
 642			if ((param & 0xfff) == PMAC_SCC_IRDA) {
 643				fcr &= ~KL0_SCC_B_INTF_ENABLE;
 644				fcr |= KL0_IRDA_ENABLE;
 645				fcr |= KL0_IRDA_CLK32_ENABLE | KL0_IRDA_CLK19_ENABLE;
 646				fcr |= KL0_IRDA_SOURCE1_SEL;
 647				fcr &= ~(KL0_IRDA_FAST_CONNECT|KL0_IRDA_DEFAULT1|KL0_IRDA_DEFAULT0);
 648				fcr &= ~(KL0_IRDA_SOURCE2_SEL|KL0_IRDA_HIGH_BAND);
 649				need_reset_irda = 1;
 650			} else
 651				fcr |= KL0_SCC_B_INTF_ENABLE;
 652		}
 653		MACIO_OUT32(KEYLARGO_FCR0, fcr);
 654		macio->flags |= chan_mask;
 655		if (need_reset_scc)  {
 656			MACIO_BIS(KEYLARGO_FCR0, KL0_SCC_RESET);
 657			(void)MACIO_IN32(KEYLARGO_FCR0);
 658			UNLOCK(flags);
 659			mdelay(15);
 660			LOCK(flags);
 661			MACIO_BIC(KEYLARGO_FCR0, KL0_SCC_RESET);
 662		}
 663		if (need_reset_irda)  {
 664			MACIO_BIS(KEYLARGO_FCR0, KL0_IRDA_RESET);
 665			(void)MACIO_IN32(KEYLARGO_FCR0);
 666			UNLOCK(flags);
 667			mdelay(15);
 668			LOCK(flags);
 669			MACIO_BIC(KEYLARGO_FCR0, KL0_IRDA_RESET);
 670		}
 671		UNLOCK(flags);
 672		if (param & PMAC_SCC_FLAG_XMON)
 673			macio->flags |= MACIO_FLAG_SCC_LOCKED;
 674	} else {
 675		if (macio->flags & MACIO_FLAG_SCC_LOCKED)
 676			return -EPERM;
 677		LOCK(flags);
 678		fcr = MACIO_IN32(KEYLARGO_FCR0);
 679		if (chan_mask & MACIO_FLAG_SCCA_ON)
 680			fcr &= ~KL0_SCCA_ENABLE;
 681		if (chan_mask & MACIO_FLAG_SCCB_ON) {
 682			fcr &= ~KL0_SCCB_ENABLE;
 683			/* Perform irda specific clears */
 684			if ((param & 0xfff) == PMAC_SCC_IRDA) {
 685				fcr &= ~KL0_IRDA_ENABLE;
 686				fcr &= ~(KL0_IRDA_CLK32_ENABLE | KL0_IRDA_CLK19_ENABLE);
 687				fcr &= ~(KL0_IRDA_FAST_CONNECT|KL0_IRDA_DEFAULT1|KL0_IRDA_DEFAULT0);
 688				fcr &= ~(KL0_IRDA_SOURCE1_SEL|KL0_IRDA_SOURCE2_SEL|KL0_IRDA_HIGH_BAND);
 689			}
 690		}
 691		MACIO_OUT32(KEYLARGO_FCR0, fcr);
 692		if ((fcr & (KL0_SCCA_ENABLE | KL0_SCCB_ENABLE)) == 0) {
 693			fcr &= ~KL0_SCC_CELL_ENABLE;
 694			MACIO_OUT32(KEYLARGO_FCR0, fcr);
 695		}
 696		macio->flags &= ~(chan_mask);
 697		UNLOCK(flags);
 698		mdelay(10);
 699	}
 700	return 0;
 701}
 702
 703static long
 704core99_modem_enable(struct device_node *node, long param, long value)
 705{
 706	struct macio_chip*	macio;
 707	u8			gpio;
 708	unsigned long		flags;
 709
 710	/* Hack for internal USB modem */
 711	if (node == NULL) {
 712		if (macio_chips[0].type != macio_keylargo)
 713			return -ENODEV;
 714		node = macio_chips[0].of_node;
 715	}
 716	macio = macio_find(node, 0);
 717	if (!macio)
 718		return -ENODEV;
 719	gpio = MACIO_IN8(KL_GPIO_MODEM_RESET);
 720	gpio |= KEYLARGO_GPIO_OUTPUT_ENABLE;
 721	gpio &= ~KEYLARGO_GPIO_OUTOUT_DATA;
 722
 723	if (!value) {
 724		LOCK(flags);
 725		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 726		UNLOCK(flags);
 727		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 728		mdelay(250);
 729	}
 730	LOCK(flags);
 731	if (value) {
 732		MACIO_BIC(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
 733		UNLOCK(flags);
 734		(void)MACIO_IN32(KEYLARGO_FCR2);
 735		mdelay(250);
 736	} else {
 737		MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
 738		UNLOCK(flags);
 739	}
 740	if (value) {
 741		LOCK(flags);
 742		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 743		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 744		UNLOCK(flags); mdelay(250); LOCK(flags);
 745		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 746		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 747		UNLOCK(flags); mdelay(250); LOCK(flags);
 748		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 749		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 750		UNLOCK(flags); mdelay(250);
 751	}
 752	return 0;
 753}
 754
 755static long
 756pangea_modem_enable(struct device_node *node, long param, long value)
 757{
 758	struct macio_chip*	macio;
 759	u8			gpio;
 760	unsigned long		flags;
 761
 762	/* Hack for internal USB modem */
 763	if (node == NULL) {
 764		if (macio_chips[0].type != macio_pangea &&
 765		    macio_chips[0].type != macio_intrepid)
 766			return -ENODEV;
 767		node = macio_chips[0].of_node;
 768	}
 769	macio = macio_find(node, 0);
 770	if (!macio)
 771		return -ENODEV;
 772	gpio = MACIO_IN8(KL_GPIO_MODEM_RESET);
 773	gpio |= KEYLARGO_GPIO_OUTPUT_ENABLE;
 774	gpio &= ~KEYLARGO_GPIO_OUTOUT_DATA;
 775
 776	if (!value) {
 777		LOCK(flags);
 778		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 779		UNLOCK(flags);
 780		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 781		mdelay(250);
 782	}
 783	LOCK(flags);
 784	if (value) {
 785		MACIO_OUT8(KL_GPIO_MODEM_POWER,
 786			KEYLARGO_GPIO_OUTPUT_ENABLE);
 787		UNLOCK(flags);
 788		(void)MACIO_IN32(KEYLARGO_FCR2);
 789		mdelay(250);
 790	} else {
 791		MACIO_OUT8(KL_GPIO_MODEM_POWER,
 792			KEYLARGO_GPIO_OUTPUT_ENABLE | KEYLARGO_GPIO_OUTOUT_DATA);
 793		UNLOCK(flags);
 794	}
 795	if (value) {
 796		LOCK(flags);
 797		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 798		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 799		UNLOCK(flags); mdelay(250); LOCK(flags);
 800		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 801		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 802		UNLOCK(flags); mdelay(250); LOCK(flags);
 803		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 804		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 805		UNLOCK(flags); mdelay(250);
 806	}
 807	return 0;
 808}
 809
 810static long
 811core99_ata100_enable(struct device_node *node, long value)
 812{
 813	unsigned long flags;
 814	struct pci_dev *pdev = NULL;
 815	u8 pbus, pid;
 816	int rc;
 817
 818	if (uninorth_rev < 0x24)
 819		return -ENODEV;
 820
 821	LOCK(flags);
 822	if (value)
 823		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_ATA100);
 824	else
 825		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_ATA100);
 826	(void)UN_IN(UNI_N_CLOCK_CNTL);
 827	UNLOCK(flags);
 828	udelay(20);
 829
 830	if (value) {
 831		if (pci_device_from_OF_node(node, &pbus, &pid) == 0)
 832			pdev = pci_get_bus_and_slot(pbus, pid);
 833		if (pdev == NULL)
 834			return 0;
 835		rc = pci_enable_device(pdev);
 836		if (rc == 0)
 837			pci_set_master(pdev);
 838		pci_dev_put(pdev);
 839		if (rc)
 840			return rc;
 841	}
 842	return 0;
 843}
 844
 845static long
 846core99_ide_enable(struct device_node *node, long param, long value)
 847{
 848	/* Bus ID 0 to 2 are KeyLargo based IDE, busID 3 is U2
 849	 * based ata-100
 850	 */
 851	switch(param) {
 852	    case 0:
 853		return simple_feature_tweak(node, macio_unknown,
 854			KEYLARGO_FCR1, KL1_EIDE0_ENABLE, value);
 855	    case 1:
 856		return simple_feature_tweak(node, macio_unknown,
 857			KEYLARGO_FCR1, KL1_EIDE1_ENABLE, value);
 858	    case 2:
 859		return simple_feature_tweak(node, macio_unknown,
 860			KEYLARGO_FCR1, KL1_UIDE_ENABLE, value);
 861	    case 3:
 862		return core99_ata100_enable(node, value);
 863	    default:
 864		return -ENODEV;
 865	}
 866}
 867
 868static long
 869core99_ide_reset(struct device_node *node, long param, long value)
 870{
 871	switch(param) {
 872	    case 0:
 873		return simple_feature_tweak(node, macio_unknown,
 874			KEYLARGO_FCR1, KL1_EIDE0_RESET_N, !value);
 875	    case 1:
 876		return simple_feature_tweak(node, macio_unknown,
 877			KEYLARGO_FCR1, KL1_EIDE1_RESET_N, !value);
 878	    case 2:
 879		return simple_feature_tweak(node, macio_unknown,
 880			KEYLARGO_FCR1, KL1_UIDE_RESET_N, !value);
 881	    default:
 882		return -ENODEV;
 883	}
 884}
 885
 886static long
 887core99_gmac_enable(struct device_node *node, long param, long value)
 888{
 889	unsigned long flags;
 890
 891	LOCK(flags);
 892	if (value)
 893		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_GMAC);
 894	else
 895		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_GMAC);
 896	(void)UN_IN(UNI_N_CLOCK_CNTL);
 897	UNLOCK(flags);
 898	udelay(20);
 899
 900	return 0;
 901}
 902
 903static long
 904core99_gmac_phy_reset(struct device_node *node, long param, long value)
 905{
 906	unsigned long flags;
 907	struct macio_chip *macio;
 908
 909	macio = &macio_chips[0];
 910	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
 911	    macio->type != macio_intrepid)
 912		return -ENODEV;
 913
 914	LOCK(flags);
 915	MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);
 916	(void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);
 917	UNLOCK(flags);
 918	mdelay(10);
 919	LOCK(flags);
 920	MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */
 921		KEYLARGO_GPIO_OUTOUT_DATA);
 922	UNLOCK(flags);
 923	mdelay(10);
 924
 925	return 0;
 926}
 927
 928static long
 929core99_sound_chip_enable(struct device_node *node, long param, long value)
 930{
 931	struct macio_chip*	macio;
 932	unsigned long		flags;
 933
 934	macio = macio_find(node, 0);
 935	if (!macio)
 936		return -ENODEV;
 937
 938	/* Do a better probe code, screamer G4 desktops &
 939	 * iMacs can do that too, add a recalibrate  in
 940	 * the driver as well
 941	 */
 942	if (pmac_mb.model_id == PMAC_TYPE_PISMO ||
 943	    pmac_mb.model_id == PMAC_TYPE_TITANIUM) {
 944		LOCK(flags);
 945		if (value)
 946			MACIO_OUT8(KL_GPIO_SOUND_POWER,
 947				KEYLARGO_GPIO_OUTPUT_ENABLE |
 948				KEYLARGO_GPIO_OUTOUT_DATA);
 949		else
 950			MACIO_OUT8(KL_GPIO_SOUND_POWER,
 951				KEYLARGO_GPIO_OUTPUT_ENABLE);
 952		(void)MACIO_IN8(KL_GPIO_SOUND_POWER);
 953		UNLOCK(flags);
 954	}
 955	return 0;
 956}
 957
 958static long
 959core99_airport_enable(struct device_node *node, long param, long value)
 960{
 961	struct macio_chip*	macio;
 962	unsigned long		flags;
 963	int			state;
 964
 965	macio = macio_find(node, 0);
 966	if (!macio)
 967		return -ENODEV;
 968
 969	/* Hint: we allow passing of macio itself for the sake of the
 970	 * sleep code
 971	 */
 972	if (node != macio->of_node &&
 973	    (!node->parent || node->parent != macio->of_node))
 974		return -ENODEV;
 975	state = (macio->flags & MACIO_FLAG_AIRPORT_ON) != 0;
 976	if (value == state)
 977		return 0;
 978	if (value) {
 979		/* This code is a reproduction of OF enable-cardslot
 980		 * and init-wireless methods, slightly hacked until
 981		 * I got it working.
 982		 */
 983		LOCK(flags);
 984		MACIO_OUT8(KEYLARGO_GPIO_0+0xf, 5);
 985		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xf);
 986		UNLOCK(flags);
 987		mdelay(10);
 988		LOCK(flags);
 989		MACIO_OUT8(KEYLARGO_GPIO_0+0xf, 4);
 990		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xf);
 991		UNLOCK(flags);
 992
 993		mdelay(10);
 994
 995		LOCK(flags);
 996		MACIO_BIC(KEYLARGO_FCR2, KL2_CARDSEL_16);
 997		(void)MACIO_IN32(KEYLARGO_FCR2);
 998		udelay(10);
 999		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xb, 0);
1000		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xb);
1001		udelay(10);
1002		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xa, 0x28);
1003		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xa);
1004		udelay(10);
1005		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xd, 0x28);
1006		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xd);
1007		udelay(10);
1008		MACIO_OUT8(KEYLARGO_GPIO_0+0xd, 0x28);
1009		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xd);
1010		udelay(10);
1011		MACIO_OUT8(KEYLARGO_GPIO_0+0xe, 0x28);
1012		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xe);
1013		UNLOCK(flags);
1014		udelay(10);
1015		MACIO_OUT32(0x1c000, 0);
1016		mdelay(1);
1017		MACIO_OUT8(0x1a3e0, 0x41);
1018		(void)MACIO_IN8(0x1a3e0);
1019		udelay(10);
1020		LOCK(flags);
1021		MACIO_BIS(KEYLARGO_FCR2, KL2_CARDSEL_16);
1022		(void)MACIO_IN32(KEYLARGO_FCR2);
1023		UNLOCK(flags);
1024		mdelay(100);
1025
1026		macio->flags |= MACIO_FLAG_AIRPORT_ON;
1027	} else {
1028		LOCK(flags);
1029		MACIO_BIC(KEYLARGO_FCR2, KL2_CARDSEL_16);
1030		(void)MACIO_IN32(KEYLARGO_FCR2);
1031		MACIO_OUT8(KL_GPIO_AIRPORT_0, 0);
1032		MACIO_OUT8(KL_GPIO_AIRPORT_1, 0);
1033		MACIO_OUT8(KL_GPIO_AIRPORT_2, 0);
1034		MACIO_OUT8(KL_GPIO_AIRPORT_3, 0);
1035		MACIO_OUT8(KL_GPIO_AIRPORT_4, 0);
1036		(void)MACIO_IN8(KL_GPIO_AIRPORT_4);
1037		UNLOCK(flags);
1038
1039		macio->flags &= ~MACIO_FLAG_AIRPORT_ON;
1040	}
1041	return 0;
1042}
1043
1044#ifdef CONFIG_SMP
1045static long
1046core99_reset_cpu(struct device_node *node, long param, long value)
1047{
1048	unsigned int reset_io = 0;
1049	unsigned long flags;
1050	struct macio_chip *macio;
1051	struct device_node *np;
1052	struct device_node *cpus;
1053	const int dflt_reset_lines[] = {	KL_GPIO_RESET_CPU0,
1054						KL_GPIO_RESET_CPU1,
1055						KL_GPIO_RESET_CPU2,
1056						KL_GPIO_RESET_CPU3 };
1057
1058	macio = &macio_chips[0];
1059	if (macio->type != macio_keylargo)
1060		return -ENODEV;
1061
1062	cpus = of_find_node_by_path("/cpus");
1063	if (cpus == NULL)
1064		return -ENODEV;
1065	for (np = cpus->child; np != NULL; np = np->sibling) {
1066		const u32 *num = of_get_property(np, "reg", NULL);
1067		const u32 *rst = of_get_property(np, "soft-reset", NULL);
1068		if (num == NULL || rst == NULL)
1069			continue;
1070		if (param == *num) {
 
1071			reset_io = *rst;
1072			break;
1073		}
1074	}
1075	of_node_put(cpus);
1076	if (np == NULL || reset_io == 0)
1077		reset_io = dflt_reset_lines[param];
1078
1079	LOCK(flags);
1080	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE);
1081	(void)MACIO_IN8(reset_io);
1082	udelay(1);
1083	MACIO_OUT8(reset_io, 0);
1084	(void)MACIO_IN8(reset_io);
1085	UNLOCK(flags);
1086
1087	return 0;
1088}
1089#endif /* CONFIG_SMP */
1090
1091static long
1092core99_usb_enable(struct device_node *node, long param, long value)
1093{
1094	struct macio_chip *macio;
1095	unsigned long flags;
1096	const char *prop;
1097	int number;
1098	u32 reg;
1099
1100	macio = &macio_chips[0];
1101	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1102	    macio->type != macio_intrepid)
1103		return -ENODEV;
1104
1105	prop = of_get_property(node, "AAPL,clock-id", NULL);
1106	if (!prop)
1107		return -ENODEV;
1108	if (strncmp(prop, "usb0u048", 8) == 0)
1109		number = 0;
1110	else if (strncmp(prop, "usb1u148", 8) == 0)
1111		number = 2;
1112	else if (strncmp(prop, "usb2u248", 8) == 0)
1113		number = 4;
1114	else
1115		return -ENODEV;
1116
1117	/* Sorry for the brute-force locking, but this is only used during
1118	 * sleep and the timing seem to be critical
1119	 */
1120	LOCK(flags);
1121	if (value) {
1122		/* Turn ON */
1123		if (number == 0) {
1124			MACIO_BIC(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1));
1125			(void)MACIO_IN32(KEYLARGO_FCR0);
1126			UNLOCK(flags);
1127			mdelay(1);
1128			LOCK(flags);
1129			MACIO_BIS(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE);
1130		} else if (number == 2) {
1131			MACIO_BIC(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1));
1132			UNLOCK(flags);
1133			(void)MACIO_IN32(KEYLARGO_FCR0);
1134			mdelay(1);
1135			LOCK(flags);
1136			MACIO_BIS(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE);
1137		} else if (number == 4) {
1138			MACIO_BIC(KEYLARGO_FCR1, (KL1_USB2_PAD_SUSPEND0 | KL1_USB2_PAD_SUSPEND1));
1139			UNLOCK(flags);
1140			(void)MACIO_IN32(KEYLARGO_FCR1);
1141			mdelay(1);
1142			LOCK(flags);
1143			MACIO_BIS(KEYLARGO_FCR1, KL1_USB2_CELL_ENABLE);
1144		}
1145		if (number < 4) {
1146			reg = MACIO_IN32(KEYLARGO_FCR4);
1147			reg &=	~(KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) |
1148				KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number));
1149			reg &=	~(KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) |
1150				KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1));
1151			MACIO_OUT32(KEYLARGO_FCR4, reg);
1152			(void)MACIO_IN32(KEYLARGO_FCR4);
1153			udelay(10);
1154		} else {
1155			reg = MACIO_IN32(KEYLARGO_FCR3);
1156			reg &=	~(KL3_IT_PORT_WAKEUP_ENABLE(0) | KL3_IT_PORT_RESUME_WAKE_EN(0) |
1157				KL3_IT_PORT_CONNECT_WAKE_EN(0) | KL3_IT_PORT_DISCONNECT_WAKE_EN(0));
1158			reg &=	~(KL3_IT_PORT_WAKEUP_ENABLE(1) | KL3_IT_PORT_RESUME_WAKE_EN(1) |
1159				KL3_IT_PORT_CONNECT_WAKE_EN(1) | KL3_IT_PORT_DISCONNECT_WAKE_EN(1));
1160			MACIO_OUT32(KEYLARGO_FCR3, reg);
1161			(void)MACIO_IN32(KEYLARGO_FCR3);
1162			udelay(10);
1163		}
1164		if (macio->type == macio_intrepid) {
1165			/* wait for clock stopped bits to clear */
1166			u32 test0 = 0, test1 = 0;
1167			u32 status0, status1;
1168			int timeout = 1000;
1169
1170			UNLOCK(flags);
1171			switch (number) {
1172			case 0:
1173				test0 = UNI_N_CLOCK_STOPPED_USB0;
1174				test1 = UNI_N_CLOCK_STOPPED_USB0PCI;
1175				break;
1176			case 2:
1177				test0 = UNI_N_CLOCK_STOPPED_USB1;
1178				test1 = UNI_N_CLOCK_STOPPED_USB1PCI;
1179				break;
1180			case 4:
1181				test0 = UNI_N_CLOCK_STOPPED_USB2;
1182				test1 = UNI_N_CLOCK_STOPPED_USB2PCI;
1183				break;
1184			}
1185			do {
1186				if (--timeout <= 0) {
1187					printk(KERN_ERR "core99_usb_enable: "
1188					       "Timeout waiting for clocks\n");
1189					break;
1190				}
1191				mdelay(1);
1192				status0 = UN_IN(UNI_N_CLOCK_STOP_STATUS0);
1193				status1 = UN_IN(UNI_N_CLOCK_STOP_STATUS1);
1194			} while ((status0 & test0) | (status1 & test1));
1195			LOCK(flags);
1196		}
1197	} else {
1198		/* Turn OFF */
1199		if (number < 4) {
1200			reg = MACIO_IN32(KEYLARGO_FCR4);
1201			reg |=	KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) |
1202				KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number);
1203			reg |=	KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) |
1204				KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1);
1205			MACIO_OUT32(KEYLARGO_FCR4, reg);
1206			(void)MACIO_IN32(KEYLARGO_FCR4);
1207			udelay(1);
1208		} else {
1209			reg = MACIO_IN32(KEYLARGO_FCR3);
1210			reg |=	KL3_IT_PORT_WAKEUP_ENABLE(0) | KL3_IT_PORT_RESUME_WAKE_EN(0) |
1211				KL3_IT_PORT_CONNECT_WAKE_EN(0) | KL3_IT_PORT_DISCONNECT_WAKE_EN(0);
1212			reg |=	KL3_IT_PORT_WAKEUP_ENABLE(1) | KL3_IT_PORT_RESUME_WAKE_EN(1) |
1213				KL3_IT_PORT_CONNECT_WAKE_EN(1) | KL3_IT_PORT_DISCONNECT_WAKE_EN(1);
1214			MACIO_OUT32(KEYLARGO_FCR3, reg);
1215			(void)MACIO_IN32(KEYLARGO_FCR3);
1216			udelay(1);
1217		}
1218		if (number == 0) {
1219			if (macio->type != macio_intrepid)
1220				MACIO_BIC(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE);
1221			(void)MACIO_IN32(KEYLARGO_FCR0);
1222			udelay(1);
1223			MACIO_BIS(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1));
1224			(void)MACIO_IN32(KEYLARGO_FCR0);
1225		} else if (number == 2) {
1226			if (macio->type != macio_intrepid)
1227				MACIO_BIC(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE);
1228			(void)MACIO_IN32(KEYLARGO_FCR0);
1229			udelay(1);
1230			MACIO_BIS(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1));
1231			(void)MACIO_IN32(KEYLARGO_FCR0);
1232		} else if (number == 4) {
1233			udelay(1);
1234			MACIO_BIS(KEYLARGO_FCR1, (KL1_USB2_PAD_SUSPEND0 | KL1_USB2_PAD_SUSPEND1));
1235			(void)MACIO_IN32(KEYLARGO_FCR1);
1236		}
1237		udelay(1);
1238	}
1239	UNLOCK(flags);
1240
1241	return 0;
1242}
1243
1244static long
1245core99_firewire_enable(struct device_node *node, long param, long value)
1246{
1247	unsigned long flags;
1248	struct macio_chip *macio;
1249
1250	macio = &macio_chips[0];
1251	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1252	    macio->type != macio_intrepid)
1253		return -ENODEV;
1254	if (!(macio->flags & MACIO_FLAG_FW_SUPPORTED))
1255		return -ENODEV;
1256
1257	LOCK(flags);
1258	if (value) {
1259		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_FW);
1260		(void)UN_IN(UNI_N_CLOCK_CNTL);
1261	} else {
1262		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_FW);
1263		(void)UN_IN(UNI_N_CLOCK_CNTL);
1264	}
1265	UNLOCK(flags);
1266	mdelay(1);
1267
1268	return 0;
1269}
1270
1271static long
1272core99_firewire_cable_power(struct device_node *node, long param, long value)
1273{
1274	unsigned long flags;
1275	struct macio_chip *macio;
1276
1277	/* Trick: we allow NULL node */
1278	if ((pmac_mb.board_flags & PMAC_MB_HAS_FW_POWER) == 0)
1279		return -ENODEV;
1280	macio = &macio_chips[0];
1281	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1282	    macio->type != macio_intrepid)
1283		return -ENODEV;
1284	if (!(macio->flags & MACIO_FLAG_FW_SUPPORTED))
1285		return -ENODEV;
1286
1287	LOCK(flags);
1288	if (value) {
1289		MACIO_OUT8(KL_GPIO_FW_CABLE_POWER , 0);
1290		MACIO_IN8(KL_GPIO_FW_CABLE_POWER);
1291		udelay(10);
1292	} else {
1293		MACIO_OUT8(KL_GPIO_FW_CABLE_POWER , 4);
1294		MACIO_IN8(KL_GPIO_FW_CABLE_POWER); udelay(10);
1295	}
1296	UNLOCK(flags);
1297	mdelay(1);
1298
1299	return 0;
1300}
1301
1302static long
1303intrepid_aack_delay_enable(struct device_node *node, long param, long value)
1304{
1305	unsigned long flags;
1306
1307	if (uninorth_rev < 0xd2)
1308		return -ENODEV;
1309
1310	LOCK(flags);
1311	if (param)
1312		UN_BIS(UNI_N_AACK_DELAY, UNI_N_AACK_DELAY_ENABLE);
1313	else
1314		UN_BIC(UNI_N_AACK_DELAY, UNI_N_AACK_DELAY_ENABLE);
1315	UNLOCK(flags);
1316
1317	return 0;
1318}
1319
1320
1321#endif /* CONFIG_POWER4 */
1322
1323static long
1324core99_read_gpio(struct device_node *node, long param, long value)
1325{
1326	struct macio_chip *macio = &macio_chips[0];
1327
1328	return MACIO_IN8(param);
1329}
1330
1331
1332static long
1333core99_write_gpio(struct device_node *node, long param, long value)
1334{
1335	struct macio_chip *macio = &macio_chips[0];
1336
1337	MACIO_OUT8(param, (u8)(value & 0xff));
1338	return 0;
1339}
1340
1341#ifdef CONFIG_POWER4
1342static long g5_gmac_enable(struct device_node *node, long param, long value)
1343{
1344	struct macio_chip *macio = &macio_chips[0];
1345	unsigned long flags;
1346
1347	if (node == NULL)
1348		return -ENODEV;
1349
1350	LOCK(flags);
1351	if (value) {
1352		MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE);
1353		mb();
1354		k2_skiplist[0] = NULL;
1355	} else {
1356		k2_skiplist[0] = node;
1357		mb();
1358		MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE);
1359	}
1360	
1361	UNLOCK(flags);
1362	mdelay(1);
1363
1364	return 0;
1365}
1366
1367static long g5_fw_enable(struct device_node *node, long param, long value)
1368{
1369	struct macio_chip *macio = &macio_chips[0];
1370	unsigned long flags;
1371
1372	if (node == NULL)
1373		return -ENODEV;
1374
1375	LOCK(flags);
1376	if (value) {
1377		MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE);
1378		mb();
1379		k2_skiplist[1] = NULL;
1380	} else {
1381		k2_skiplist[1] = node;
1382		mb();
1383		MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE);
1384	}
1385	
1386	UNLOCK(flags);
1387	mdelay(1);
1388
1389	return 0;
1390}
1391
1392static long g5_mpic_enable(struct device_node *node, long param, long value)
1393{
1394	unsigned long flags;
1395	struct device_node *parent = of_get_parent(node);
1396	int is_u3;
1397
1398	if (parent == NULL)
1399		return 0;
1400	is_u3 = strcmp(parent->name, "u3") == 0 ||
1401		strcmp(parent->name, "u4") == 0;
1402	of_node_put(parent);
1403	if (!is_u3)
1404		return 0;
1405
1406	LOCK(flags);
1407	UN_BIS(U3_TOGGLE_REG, U3_MPIC_RESET | U3_MPIC_OUTPUT_ENABLE);
1408	UNLOCK(flags);
1409
1410	return 0;
1411}
1412
1413static long g5_eth_phy_reset(struct device_node *node, long param, long value)
1414{
1415	struct macio_chip *macio = &macio_chips[0];
1416	struct device_node *phy;
1417	int need_reset;
1418
1419	/*
1420	 * We must not reset the combo PHYs, only the BCM5221 found in
1421	 * the iMac G5.
1422	 */
1423	phy = of_get_next_child(node, NULL);
1424	if (!phy)
1425		return -ENODEV;
1426	need_reset = of_device_is_compatible(phy, "B5221");
1427	of_node_put(phy);
1428	if (!need_reset)
1429		return 0;
1430
1431	/* PHY reset is GPIO 29, not in device-tree unfortunately */
1432	MACIO_OUT8(K2_GPIO_EXTINT_0 + 29,
1433		   KEYLARGO_GPIO_OUTPUT_ENABLE | KEYLARGO_GPIO_OUTOUT_DATA);
1434	/* Thankfully, this is now always called at a time when we can
1435	 * schedule by sungem.
1436	 */
1437	msleep(10);
1438	MACIO_OUT8(K2_GPIO_EXTINT_0 + 29, 0);
1439
1440	return 0;
1441}
1442
1443static long g5_i2s_enable(struct device_node *node, long param, long value)
1444{
1445	/* Very crude implementation for now */
1446	struct macio_chip *macio = &macio_chips[0];
1447	unsigned long flags;
1448	int cell;
1449	u32 fcrs[3][3] = {
1450		{ 0,
1451		  K2_FCR1_I2S0_CELL_ENABLE |
1452		  K2_FCR1_I2S0_CLK_ENABLE_BIT | K2_FCR1_I2S0_ENABLE,
1453		  KL3_I2S0_CLK18_ENABLE
1454		},
1455		{ KL0_SCC_A_INTF_ENABLE,
1456		  K2_FCR1_I2S1_CELL_ENABLE |
1457		  K2_FCR1_I2S1_CLK_ENABLE_BIT | K2_FCR1_I2S1_ENABLE,
1458		  KL3_I2S1_CLK18_ENABLE
1459		},
1460		{ KL0_SCC_B_INTF_ENABLE,
1461		  SH_FCR1_I2S2_CELL_ENABLE |
1462		  SH_FCR1_I2S2_CLK_ENABLE_BIT | SH_FCR1_I2S2_ENABLE,
1463		  SH_FCR3_I2S2_CLK18_ENABLE
1464		},
1465	};
1466
1467	if (macio->type != macio_keylargo2 && macio->type != macio_shasta)
1468		return -ENODEV;
1469	if (strncmp(node->name, "i2s-", 4))
1470		return -ENODEV;
1471	cell = node->name[4] - 'a';
1472	switch(cell) {
1473	case 0:
1474	case 1:
1475		break;
1476	case 2:
1477		if (macio->type == macio_shasta)
1478			break;
 
1479	default:
1480		return -ENODEV;
1481	}
1482
1483	LOCK(flags);
1484	if (value) {
1485		MACIO_BIC(KEYLARGO_FCR0, fcrs[cell][0]);
1486		MACIO_BIS(KEYLARGO_FCR1, fcrs[cell][1]);
1487		MACIO_BIS(KEYLARGO_FCR3, fcrs[cell][2]);
1488	} else {
1489		MACIO_BIC(KEYLARGO_FCR3, fcrs[cell][2]);
1490		MACIO_BIC(KEYLARGO_FCR1, fcrs[cell][1]);
1491		MACIO_BIS(KEYLARGO_FCR0, fcrs[cell][0]);
1492	}
1493	udelay(10);
1494	UNLOCK(flags);
1495
1496	return 0;
1497}
1498
1499
1500#ifdef CONFIG_SMP
1501static long g5_reset_cpu(struct device_node *node, long param, long value)
1502{
1503	unsigned int reset_io = 0;
1504	unsigned long flags;
1505	struct macio_chip *macio;
1506	struct device_node *np;
1507	struct device_node *cpus;
1508
1509	macio = &macio_chips[0];
1510	if (macio->type != macio_keylargo2 && macio->type != macio_shasta)
1511		return -ENODEV;
1512
1513	cpus = of_find_node_by_path("/cpus");
1514	if (cpus == NULL)
1515		return -ENODEV;
1516	for (np = cpus->child; np != NULL; np = np->sibling) {
1517		const u32 *num = of_get_property(np, "reg", NULL);
1518		const u32 *rst = of_get_property(np, "soft-reset", NULL);
1519		if (num == NULL || rst == NULL)
1520			continue;
1521		if (param == *num) {
 
1522			reset_io = *rst;
1523			break;
1524		}
1525	}
1526	of_node_put(cpus);
1527	if (np == NULL || reset_io == 0)
1528		return -ENODEV;
1529
1530	LOCK(flags);
1531	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE);
1532	(void)MACIO_IN8(reset_io);
1533	udelay(1);
1534	MACIO_OUT8(reset_io, 0);
1535	(void)MACIO_IN8(reset_io);
1536	UNLOCK(flags);
1537
1538	return 0;
1539}
1540#endif /* CONFIG_SMP */
1541
1542/*
1543 * This can be called from pmac_smp so isn't static
1544 *
1545 * This takes the second CPU off the bus on dual CPU machines
1546 * running UP
1547 */
1548void g5_phy_disable_cpu1(void)
1549{
1550	if (uninorth_maj == 3)
1551		UN_OUT(U3_API_PHY_CONFIG_1, 0);
1552}
1553#endif /* CONFIG_POWER4 */
1554
1555#ifndef CONFIG_POWER4
1556
1557
1558#ifdef CONFIG_PM
1559static u32 save_gpio_levels[2];
1560static u8 save_gpio_extint[KEYLARGO_GPIO_EXTINT_CNT];
1561static u8 save_gpio_normal[KEYLARGO_GPIO_CNT];
1562static u32 save_unin_clock_ctl;
1563
1564static void keylargo_shutdown(struct macio_chip *macio, int sleep_mode)
1565{
1566	u32 temp;
1567
1568	if (sleep_mode) {
1569		mdelay(1);
1570		MACIO_BIS(KEYLARGO_FCR0, KL0_USB_REF_SUSPEND);
1571		(void)MACIO_IN32(KEYLARGO_FCR0);
1572		mdelay(1);
1573	}
1574
1575	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |
1576				KL0_SCC_CELL_ENABLE |
1577				KL0_IRDA_ENABLE | KL0_IRDA_CLK32_ENABLE |
1578				KL0_IRDA_CLK19_ENABLE);
1579
1580	MACIO_BIC(KEYLARGO_MBCR, KL_MBCR_MB0_DEV_MASK);
1581	MACIO_BIS(KEYLARGO_MBCR, KL_MBCR_MB0_IDE_ENABLE);
1582
1583	MACIO_BIC(KEYLARGO_FCR1,
1584		KL1_AUDIO_SEL_22MCLK | KL1_AUDIO_CLK_ENABLE_BIT |
1585		KL1_AUDIO_CLK_OUT_ENABLE | KL1_AUDIO_CELL_ENABLE |
1586		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |
1587		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |
1588		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |
1589		KL1_EIDE0_ENABLE | KL1_EIDE0_RESET_N |
1590		KL1_EIDE1_ENABLE | KL1_EIDE1_RESET_N |
1591		KL1_UIDE_ENABLE);
1592
1593	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
1594	MACIO_BIC(KEYLARGO_FCR2, KL2_IOBUS_ENABLE);
1595
1596	temp = MACIO_IN32(KEYLARGO_FCR3);
1597	if (macio->rev >= 2) {
1598		temp |= KL3_SHUTDOWN_PLL2X;
1599		if (sleep_mode)
1600			temp |= KL3_SHUTDOWN_PLL_TOTAL;
1601	}
1602
1603	temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |
1604		KL3_SHUTDOWN_PLLKW35;
1605	if (sleep_mode)
1606		temp |= KL3_SHUTDOWN_PLLKW12;
1607	temp &= ~(KL3_CLK66_ENABLE | KL3_CLK49_ENABLE | KL3_CLK45_ENABLE
1608		| KL3_CLK31_ENABLE | KL3_I2S1_CLK18_ENABLE | KL3_I2S0_CLK18_ENABLE);
1609	if (sleep_mode)
1610		temp &= ~(KL3_TIMER_CLK18_ENABLE | KL3_VIA_CLK16_ENABLE);
1611	MACIO_OUT32(KEYLARGO_FCR3, temp);
1612
1613	/* Flush posted writes & wait a bit */
1614	(void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1);
1615}
1616
1617static void pangea_shutdown(struct macio_chip *macio, int sleep_mode)
1618{
1619	u32 temp;
1620
1621	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |
1622				KL0_SCC_CELL_ENABLE |
1623				KL0_USB0_CELL_ENABLE | KL0_USB1_CELL_ENABLE);
1624
1625	MACIO_BIC(KEYLARGO_FCR1,
1626		KL1_AUDIO_SEL_22MCLK | KL1_AUDIO_CLK_ENABLE_BIT |
1627		KL1_AUDIO_CLK_OUT_ENABLE | KL1_AUDIO_CELL_ENABLE |
1628		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |
1629		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |
1630		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |
1631		KL1_UIDE_ENABLE);
1632	if (pmac_mb.board_flags & PMAC_MB_MOBILE)
1633		MACIO_BIC(KEYLARGO_FCR1, KL1_UIDE_RESET_N);
1634
1635	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
1636
1637	temp = MACIO_IN32(KEYLARGO_FCR3);
1638	temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |
1639		KL3_SHUTDOWN_PLLKW35;
1640	temp &= ~(KL3_CLK49_ENABLE | KL3_CLK45_ENABLE | KL3_CLK31_ENABLE
1641		| KL3_I2S0_CLK18_ENABLE | KL3_I2S1_CLK18_ENABLE);
1642	if (sleep_mode)
1643		temp &= ~(KL3_VIA_CLK16_ENABLE | KL3_TIMER_CLK18_ENABLE);
1644	MACIO_OUT32(KEYLARGO_FCR3, temp);
1645
1646	/* Flush posted writes & wait a bit */
1647	(void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1);
1648}
1649
1650static void intrepid_shutdown(struct macio_chip *macio, int sleep_mode)
1651{
1652	u32 temp;
1653
1654	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |
1655		  KL0_SCC_CELL_ENABLE);
1656
1657	MACIO_BIC(KEYLARGO_FCR1,
1658		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |
1659		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |
1660		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |
1661		KL1_EIDE0_ENABLE);
1662	if (pmac_mb.board_flags & PMAC_MB_MOBILE)
1663		MACIO_BIC(KEYLARGO_FCR1, KL1_UIDE_RESET_N);
1664
1665	temp = MACIO_IN32(KEYLARGO_FCR3);
1666	temp &= ~(KL3_CLK49_ENABLE | KL3_CLK45_ENABLE |
1667		  KL3_I2S1_CLK18_ENABLE | KL3_I2S0_CLK18_ENABLE);
1668	if (sleep_mode)
1669		temp &= ~(KL3_TIMER_CLK18_ENABLE | KL3_IT_VIA_CLK32_ENABLE);
1670	MACIO_OUT32(KEYLARGO_FCR3, temp);
1671
1672	/* Flush posted writes & wait a bit */
1673	(void)MACIO_IN32(KEYLARGO_FCR0);
1674	mdelay(10);
1675}
1676
1677
1678static int
1679core99_sleep(void)
1680{
1681	struct macio_chip *macio;
1682	int i;
1683
1684	macio = &macio_chips[0];
1685	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1686	    macio->type != macio_intrepid)
1687		return -ENODEV;
1688
1689	/* We power off the wireless slot in case it was not done
1690	 * by the driver. We don't power it on automatically however
1691	 */
1692	if (macio->flags & MACIO_FLAG_AIRPORT_ON)
1693		core99_airport_enable(macio->of_node, 0, 0);
1694
1695	/* We power off the FW cable. Should be done by the driver... */
1696	if (macio->flags & MACIO_FLAG_FW_SUPPORTED) {
1697		core99_firewire_enable(NULL, 0, 0);
1698		core99_firewire_cable_power(NULL, 0, 0);
1699	}
1700
1701	/* We make sure int. modem is off (in case driver lost it) */
1702	if (macio->type == macio_keylargo)
1703		core99_modem_enable(macio->of_node, 0, 0);
1704	else
1705		pangea_modem_enable(macio->of_node, 0, 0);
1706
1707	/* We make sure the sound is off as well */
1708	core99_sound_chip_enable(macio->of_node, 0, 0);
1709
1710	/*
1711	 * Save various bits of KeyLargo
1712	 */
1713
1714	/* Save the state of the various GPIOs */
1715	save_gpio_levels[0] = MACIO_IN32(KEYLARGO_GPIO_LEVELS0);
1716	save_gpio_levels[1] = MACIO_IN32(KEYLARGO_GPIO_LEVELS1);
1717	for (i=0; i<KEYLARGO_GPIO_EXTINT_CNT; i++)
1718		save_gpio_extint[i] = MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+i);
1719	for (i=0; i<KEYLARGO_GPIO_CNT; i++)
1720		save_gpio_normal[i] = MACIO_IN8(KEYLARGO_GPIO_0+i);
1721
1722	/* Save the FCRs */
1723	if (macio->type == macio_keylargo)
1724		save_mbcr = MACIO_IN32(KEYLARGO_MBCR);
1725	save_fcr[0] = MACIO_IN32(KEYLARGO_FCR0);
1726	save_fcr[1] = MACIO_IN32(KEYLARGO_FCR1);
1727	save_fcr[2] = MACIO_IN32(KEYLARGO_FCR2);
1728	save_fcr[3] = MACIO_IN32(KEYLARGO_FCR3);
1729	save_fcr[4] = MACIO_IN32(KEYLARGO_FCR4);
1730	if (macio->type == macio_pangea || macio->type == macio_intrepid)
1731		save_fcr[5] = MACIO_IN32(KEYLARGO_FCR5);
1732
1733	/* Save state & config of DBDMA channels */
1734	dbdma_save(macio, save_dbdma);
1735
1736	/*
1737	 * Turn off as much as we can
1738	 */
1739	if (macio->type == macio_pangea)
1740		pangea_shutdown(macio, 1);
1741	else if (macio->type == macio_intrepid)
1742		intrepid_shutdown(macio, 1);
1743	else if (macio->type == macio_keylargo)
1744		keylargo_shutdown(macio, 1);
1745
1746	/*
1747	 * Put the host bridge to sleep
1748	 */
1749
1750	save_unin_clock_ctl = UN_IN(UNI_N_CLOCK_CNTL);
1751	/* Note: do not switch GMAC off, driver does it when necessary, WOL must keep it
1752	 * enabled !
1753	 */
1754	UN_OUT(UNI_N_CLOCK_CNTL, save_unin_clock_ctl &
1755	       ~(/*UNI_N_CLOCK_CNTL_GMAC|*/UNI_N_CLOCK_CNTL_FW/*|UNI_N_CLOCK_CNTL_PCI*/));
1756	udelay(100);
1757	UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_SLEEPING);
1758	UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_SLEEP);
1759	mdelay(10);
1760
1761	/*
1762	 * FIXME: A bit of black magic with OpenPIC (don't ask me why)
1763	 */
1764	if (pmac_mb.model_id == PMAC_TYPE_SAWTOOTH) {
1765		MACIO_BIS(0x506e0, 0x00400000);
1766		MACIO_BIS(0x506e0, 0x80000000);
1767	}
1768	return 0;
1769}
1770
1771static int
1772core99_wake_up(void)
1773{
1774	struct macio_chip *macio;
1775	int i;
1776
1777	macio = &macio_chips[0];
1778	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1779	    macio->type != macio_intrepid)
1780		return -ENODEV;
1781
1782	/*
1783	 * Wakeup the host bridge
1784	 */
1785	UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_NORMAL);
1786	udelay(10);
1787	UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_RUNNING);
1788	udelay(10);
1789
1790	/*
1791	 * Restore KeyLargo
1792	 */
1793
1794	if (macio->type == macio_keylargo) {
1795		MACIO_OUT32(KEYLARGO_MBCR, save_mbcr);
1796		(void)MACIO_IN32(KEYLARGO_MBCR); udelay(10);
1797	}
1798	MACIO_OUT32(KEYLARGO_FCR0, save_fcr[0]);
1799	(void)MACIO_IN32(KEYLARGO_FCR0); udelay(10);
1800	MACIO_OUT32(KEYLARGO_FCR1, save_fcr[1]);
1801	(void)MACIO_IN32(KEYLARGO_FCR1); udelay(10);
1802	MACIO_OUT32(KEYLARGO_FCR2, save_fcr[2]);
1803	(void)MACIO_IN32(KEYLARGO_FCR2); udelay(10);
1804	MACIO_OUT32(KEYLARGO_FCR3, save_fcr[3]);
1805	(void)MACIO_IN32(KEYLARGO_FCR3); udelay(10);
1806	MACIO_OUT32(KEYLARGO_FCR4, save_fcr[4]);
1807	(void)MACIO_IN32(KEYLARGO_FCR4); udelay(10);
1808	if (macio->type == macio_pangea || macio->type == macio_intrepid) {
1809		MACIO_OUT32(KEYLARGO_FCR5, save_fcr[5]);
1810		(void)MACIO_IN32(KEYLARGO_FCR5); udelay(10);
1811	}
1812
1813	dbdma_restore(macio, save_dbdma);
1814
1815	MACIO_OUT32(KEYLARGO_GPIO_LEVELS0, save_gpio_levels[0]);
1816	MACIO_OUT32(KEYLARGO_GPIO_LEVELS1, save_gpio_levels[1]);
1817	for (i=0; i<KEYLARGO_GPIO_EXTINT_CNT; i++)
1818		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+i, save_gpio_extint[i]);
1819	for (i=0; i<KEYLARGO_GPIO_CNT; i++)
1820		MACIO_OUT8(KEYLARGO_GPIO_0+i, save_gpio_normal[i]);
1821
1822	/* FIXME more black magic with OpenPIC ... */
1823	if (pmac_mb.model_id == PMAC_TYPE_SAWTOOTH) {
1824		MACIO_BIC(0x506e0, 0x00400000);
1825		MACIO_BIC(0x506e0, 0x80000000);
1826	}
1827
1828	UN_OUT(UNI_N_CLOCK_CNTL, save_unin_clock_ctl);
1829	udelay(100);
1830
1831	return 0;
1832}
1833
1834#endif /* CONFIG_PM */
1835
1836static long
1837core99_sleep_state(struct device_node *node, long param, long value)
1838{
1839	/* Param == 1 means to enter the "fake sleep" mode that is
1840	 * used for CPU speed switch
1841	 */
1842	if (param == 1) {
1843		if (value == 1) {
1844			UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_SLEEPING);
1845			UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_IDLE2);
1846		} else {
1847			UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_NORMAL);
1848			udelay(10);
1849			UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_RUNNING);
1850			udelay(10);
1851		}
1852		return 0;
1853	}
1854	if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0)
1855		return -EPERM;
1856
1857#ifdef CONFIG_PM
1858	if (value == 1)
1859		return core99_sleep();
1860	else if (value == 0)
1861		return core99_wake_up();
1862
1863#endif /* CONFIG_PM */
1864	return 0;
1865}
1866
1867#endif /* CONFIG_POWER4 */
1868
1869static long
1870generic_dev_can_wake(struct device_node *node, long param, long value)
1871{
1872	/* Todo: eventually check we are really dealing with on-board
1873	 * video device ...
1874	 */
1875
1876	if (pmac_mb.board_flags & PMAC_MB_MAY_SLEEP)
1877		pmac_mb.board_flags |= PMAC_MB_CAN_SLEEP;
1878	return 0;
1879}
1880
1881static long generic_get_mb_info(struct device_node *node, long param, long value)
1882{
1883	switch(param) {
1884		case PMAC_MB_INFO_MODEL:
1885			return pmac_mb.model_id;
1886		case PMAC_MB_INFO_FLAGS:
1887			return pmac_mb.board_flags;
1888		case PMAC_MB_INFO_NAME:
1889			/* hack hack hack... but should work */
1890			*((const char **)value) = pmac_mb.model_name;
1891			return 0;
1892	}
1893	return -EINVAL;
1894}
1895
1896
1897/*
1898 * Table definitions
1899 */
1900
1901/* Used on any machine
1902 */
1903static struct feature_table_entry any_features[] = {
1904	{ PMAC_FTR_GET_MB_INFO,		generic_get_mb_info },
1905	{ PMAC_FTR_DEVICE_CAN_WAKE,	generic_dev_can_wake },
1906	{ 0, NULL }
1907};
1908
1909#ifndef CONFIG_POWER4
1910
1911/* OHare based motherboards. Currently, we only use these on the
1912 * 2400,3400 and 3500 series powerbooks. Some older desktops seem
1913 * to have issues with turning on/off those asic cells
1914 */
1915static struct feature_table_entry ohare_features[] = {
1916	{ PMAC_FTR_SCC_ENABLE,		ohare_htw_scc_enable },
1917	{ PMAC_FTR_SWIM3_ENABLE,	ohare_floppy_enable },
1918	{ PMAC_FTR_MESH_ENABLE,		ohare_mesh_enable },
1919	{ PMAC_FTR_IDE_ENABLE,		ohare_ide_enable},
1920	{ PMAC_FTR_IDE_RESET,		ohare_ide_reset},
1921	{ PMAC_FTR_SLEEP_STATE,		ohare_sleep_state },
1922	{ 0, NULL }
1923};
1924
1925/* Heathrow desktop machines (Beige G3).
1926 * Separated as some features couldn't be properly tested
1927 * and the serial port control bits appear to confuse it.
1928 */
1929static struct feature_table_entry heathrow_desktop_features[] = {
1930	{ PMAC_FTR_SWIM3_ENABLE,	heathrow_floppy_enable },
1931	{ PMAC_FTR_MESH_ENABLE,		heathrow_mesh_enable },
1932	{ PMAC_FTR_IDE_ENABLE,		heathrow_ide_enable },
1933	{ PMAC_FTR_IDE_RESET,		heathrow_ide_reset },
1934	{ PMAC_FTR_BMAC_ENABLE,		heathrow_bmac_enable },
1935	{ 0, NULL }
1936};
1937
1938/* Heathrow based laptop, that is the Wallstreet and mainstreet
1939 * powerbooks.
1940 */
1941static struct feature_table_entry heathrow_laptop_features[] = {
1942	{ PMAC_FTR_SCC_ENABLE,		ohare_htw_scc_enable },
1943	{ PMAC_FTR_MODEM_ENABLE,	heathrow_modem_enable },
1944	{ PMAC_FTR_SWIM3_ENABLE,	heathrow_floppy_enable },
1945	{ PMAC_FTR_MESH_ENABLE,		heathrow_mesh_enable },
1946	{ PMAC_FTR_IDE_ENABLE,		heathrow_ide_enable },
1947	{ PMAC_FTR_IDE_RESET,		heathrow_ide_reset },
1948	{ PMAC_FTR_BMAC_ENABLE,		heathrow_bmac_enable },
1949	{ PMAC_FTR_SOUND_CHIP_ENABLE,	heathrow_sound_enable },
1950	{ PMAC_FTR_SLEEP_STATE,		heathrow_sleep_state },
1951	{ 0, NULL }
1952};
1953
1954/* Paddington based machines
1955 * The lombard (101) powerbook, first iMac models, B&W G3 and Yikes G4.
1956 */
1957static struct feature_table_entry paddington_features[] = {
1958	{ PMAC_FTR_SCC_ENABLE,		ohare_htw_scc_enable },
1959	{ PMAC_FTR_MODEM_ENABLE,	heathrow_modem_enable },
1960	{ PMAC_FTR_SWIM3_ENABLE,	heathrow_floppy_enable },
1961	{ PMAC_FTR_MESH_ENABLE,		heathrow_mesh_enable },
1962	{ PMAC_FTR_IDE_ENABLE,		heathrow_ide_enable },
1963	{ PMAC_FTR_IDE_RESET,		heathrow_ide_reset },
1964	{ PMAC_FTR_BMAC_ENABLE,		heathrow_bmac_enable },
1965	{ PMAC_FTR_SOUND_CHIP_ENABLE,	heathrow_sound_enable },
1966	{ PMAC_FTR_SLEEP_STATE,		heathrow_sleep_state },
1967	{ 0, NULL }
1968};
1969
1970/* Core99 & MacRISC 2 machines (all machines released since the
1971 * iBook (included), that is all AGP machines, except pangea
1972 * chipset. The pangea chipset is the "combo" UniNorth/KeyLargo
1973 * used on iBook2 & iMac "flow power".
1974 */
1975static struct feature_table_entry core99_features[] = {
1976	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
1977	{ PMAC_FTR_MODEM_ENABLE,	core99_modem_enable },
1978	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
1979	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
1980	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
1981	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
1982	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },
1983	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },
1984	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
1985	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
1986	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
1987#ifdef CONFIG_PM
1988	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
1989#endif
1990#ifdef CONFIG_SMP
1991	{ PMAC_FTR_RESET_CPU,		core99_reset_cpu },
1992#endif /* CONFIG_SMP */
1993	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
1994	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
1995	{ 0, NULL }
1996};
1997
1998/* RackMac
1999 */
2000static struct feature_table_entry rackmac_features[] = {
2001	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
2002	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
2003	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
2004	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
2005	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
2006	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
2007	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
2008	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
2009	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
2010#ifdef CONFIG_SMP
2011	{ PMAC_FTR_RESET_CPU,		core99_reset_cpu },
2012#endif /* CONFIG_SMP */
2013	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2014	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2015	{ 0, NULL }
2016};
2017
2018/* Pangea features
2019 */
2020static struct feature_table_entry pangea_features[] = {
2021	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
2022	{ PMAC_FTR_MODEM_ENABLE,	pangea_modem_enable },
2023	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
2024	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
2025	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
2026	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
2027	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },
2028	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },
2029	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
2030	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
2031	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
2032	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
2033	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2034	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2035	{ 0, NULL }
2036};
2037
2038/* Intrepid features
2039 */
2040static struct feature_table_entry intrepid_features[] = {
2041	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
2042	{ PMAC_FTR_MODEM_ENABLE,	pangea_modem_enable },
2043	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
2044	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
2045	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
2046	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
2047	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },
2048	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },
2049	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
2050	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
2051	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
2052	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
2053	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2054	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2055	{ PMAC_FTR_AACK_DELAY_ENABLE,	intrepid_aack_delay_enable },
2056	{ 0, NULL }
2057};
2058
2059#else /* CONFIG_POWER4 */
2060
2061/* G5 features
2062 */
2063static struct feature_table_entry g5_features[] = {
2064	{ PMAC_FTR_GMAC_ENABLE,		g5_gmac_enable },
2065	{ PMAC_FTR_1394_ENABLE,		g5_fw_enable },
2066	{ PMAC_FTR_ENABLE_MPIC,		g5_mpic_enable },
2067	{ PMAC_FTR_GMAC_PHY_RESET,	g5_eth_phy_reset },
2068	{ PMAC_FTR_SOUND_CHIP_ENABLE,	g5_i2s_enable },
2069#ifdef CONFIG_SMP
2070	{ PMAC_FTR_RESET_CPU,		g5_reset_cpu },
2071#endif /* CONFIG_SMP */
2072	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2073	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2074	{ 0, NULL }
2075};
2076
2077#endif /* CONFIG_POWER4 */
2078
2079static struct pmac_mb_def pmac_mb_defs[] = {
2080#ifndef CONFIG_POWER4
2081	/*
2082	 * Desktops
2083	 */
2084
2085	{	"AAPL,8500",			"PowerMac 8500/8600",
2086		PMAC_TYPE_PSURGE,		NULL,
2087		0
2088	},
2089	{	"AAPL,9500",			"PowerMac 9500/9600",
2090		PMAC_TYPE_PSURGE,		NULL,
2091		0
2092	},
2093	{	"AAPL,7200",			"PowerMac 7200",
2094		PMAC_TYPE_PSURGE,		NULL,
2095		0
2096	},
2097	{	"AAPL,7300",			"PowerMac 7200/7300",
2098		PMAC_TYPE_PSURGE,		NULL,
2099		0
2100	},
2101	{	"AAPL,7500",			"PowerMac 7500",
2102		PMAC_TYPE_PSURGE,		NULL,
2103		0
2104	},
2105	{	"AAPL,ShinerESB",		"Apple Network Server",
2106		PMAC_TYPE_ANS,			NULL,
2107		0
2108	},
2109	{	"AAPL,e407",			"Alchemy",
2110		PMAC_TYPE_ALCHEMY,		NULL,
2111		0
2112	},
2113	{	"AAPL,e411",			"Gazelle",
2114		PMAC_TYPE_GAZELLE,		NULL,
2115		0
2116	},
2117	{	"AAPL,Gossamer",		"PowerMac G3 (Gossamer)",
2118		PMAC_TYPE_GOSSAMER,		heathrow_desktop_features,
2119		0
2120	},
2121	{	"AAPL,PowerMac G3",		"PowerMac G3 (Silk)",
2122		PMAC_TYPE_SILK,			heathrow_desktop_features,
2123		0
2124	},
2125	{	"PowerMac1,1",			"Blue&White G3",
2126		PMAC_TYPE_YOSEMITE,		paddington_features,
2127		0
2128	},
2129	{	"PowerMac1,2",			"PowerMac G4 PCI Graphics",
2130		PMAC_TYPE_YIKES,		paddington_features,
2131		0
2132	},
2133	{	"PowerMac2,1",			"iMac FireWire",
2134		PMAC_TYPE_FW_IMAC,		core99_features,
2135		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2136	},
2137	{	"PowerMac2,2",			"iMac FireWire",
2138		PMAC_TYPE_FW_IMAC,		core99_features,
2139		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2140	},
2141	{	"PowerMac3,1",			"PowerMac G4 AGP Graphics",
2142		PMAC_TYPE_SAWTOOTH,		core99_features,
2143		PMAC_MB_OLD_CORE99
2144	},
2145	{	"PowerMac3,2",			"PowerMac G4 AGP Graphics",
2146		PMAC_TYPE_SAWTOOTH,		core99_features,
2147		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2148	},
2149	{	"PowerMac3,3",			"PowerMac G4 AGP Graphics",
2150		PMAC_TYPE_SAWTOOTH,		core99_features,
2151		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2152	},
2153	{	"PowerMac3,4",			"PowerMac G4 Silver",
2154		PMAC_TYPE_QUICKSILVER,		core99_features,
2155		PMAC_MB_MAY_SLEEP
2156	},
2157	{	"PowerMac3,5",			"PowerMac G4 Silver",
2158		PMAC_TYPE_QUICKSILVER,		core99_features,
2159		PMAC_MB_MAY_SLEEP
2160	},
2161	{	"PowerMac3,6",			"PowerMac G4 Windtunnel",
2162		PMAC_TYPE_WINDTUNNEL,		core99_features,
2163		PMAC_MB_MAY_SLEEP,
2164	},
2165	{	"PowerMac4,1",			"iMac \"Flower Power\"",
2166		PMAC_TYPE_PANGEA_IMAC,		pangea_features,
2167		PMAC_MB_MAY_SLEEP
2168	},
2169	{	"PowerMac4,2",			"Flat panel iMac",
2170		PMAC_TYPE_FLAT_PANEL_IMAC,	pangea_features,
2171		PMAC_MB_CAN_SLEEP
2172	},
2173	{	"PowerMac4,4",			"eMac",
2174		PMAC_TYPE_EMAC,			core99_features,
2175		PMAC_MB_MAY_SLEEP
2176	},
2177	{	"PowerMac5,1",			"PowerMac G4 Cube",
2178		PMAC_TYPE_CUBE,			core99_features,
2179		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2180	},
2181	{	"PowerMac6,1",			"Flat panel iMac",
2182		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2183		PMAC_MB_MAY_SLEEP,
2184	},
2185	{	"PowerMac6,3",			"Flat panel iMac",
2186		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2187		PMAC_MB_MAY_SLEEP,
2188	},
2189	{	"PowerMac6,4",			"eMac",
2190		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2191		PMAC_MB_MAY_SLEEP,
2192	},
2193	{	"PowerMac10,1",			"Mac mini",
2194		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2195		PMAC_MB_MAY_SLEEP,
2196	},
2197	{       "PowerMac10,2",                 "Mac mini (Late 2005)",
2198		PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
2199		PMAC_MB_MAY_SLEEP,
2200	},
2201 	{	"iMac,1",			"iMac (first generation)",
2202		PMAC_TYPE_ORIG_IMAC,		paddington_features,
2203		0
2204	},
2205
2206	/*
2207	 * Xserve's
2208	 */
2209
2210	{	"RackMac1,1",			"XServe",
2211		PMAC_TYPE_RACKMAC,		rackmac_features,
2212		0,
2213	},
2214	{	"RackMac1,2",			"XServe rev. 2",
2215		PMAC_TYPE_RACKMAC,		rackmac_features,
2216		0,
2217	},
2218
2219	/*
2220	 * Laptops
2221	 */
2222
2223	{	"AAPL,3400/2400",		"PowerBook 3400",
2224		PMAC_TYPE_HOOPER,		ohare_features,
2225		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2226	},
2227	{	"AAPL,3500",			"PowerBook 3500",
2228		PMAC_TYPE_KANGA,		ohare_features,
2229		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2230	},
2231	{	"AAPL,PowerBook1998",		"PowerBook Wallstreet",
2232		PMAC_TYPE_WALLSTREET,		heathrow_laptop_features,
2233		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2234	},
2235	{	"PowerBook1,1",			"PowerBook 101 (Lombard)",
2236		PMAC_TYPE_101_PBOOK,		paddington_features,
2237		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2238	},
2239	{	"PowerBook2,1",			"iBook (first generation)",
2240		PMAC_TYPE_ORIG_IBOOK,		core99_features,
2241		PMAC_MB_CAN_SLEEP | PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE
2242	},
2243	{	"PowerBook2,2",			"iBook FireWire",
2244		PMAC_TYPE_FW_IBOOK,		core99_features,
2245		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER |
2246		PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE
2247	},
2248	{	"PowerBook3,1",			"PowerBook Pismo",
2249		PMAC_TYPE_PISMO,		core99_features,
2250		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER |
2251		PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE
2252	},
2253	{	"PowerBook3,2",			"PowerBook Titanium",
2254		PMAC_TYPE_TITANIUM,		core99_features,
2255		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2256	},
2257	{	"PowerBook3,3",			"PowerBook Titanium II",
2258		PMAC_TYPE_TITANIUM2,		core99_features,
2259		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2260	},
2261	{	"PowerBook3,4",			"PowerBook Titanium III",
2262		PMAC_TYPE_TITANIUM3,		core99_features,
2263		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2264	},
2265	{	"PowerBook3,5",			"PowerBook Titanium IV",
2266		PMAC_TYPE_TITANIUM4,		core99_features,
2267		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2268	},
2269	{	"PowerBook4,1",			"iBook 2",
2270		PMAC_TYPE_IBOOK2,		pangea_features,
2271		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2272	},
2273	{	"PowerBook4,2",			"iBook 2",
2274		PMAC_TYPE_IBOOK2,		pangea_features,
2275		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2276	},
2277	{	"PowerBook4,3",			"iBook 2 rev. 2",
2278		PMAC_TYPE_IBOOK2,		pangea_features,
2279		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2280	},
2281	{	"PowerBook5,1",			"PowerBook G4 17\"",
2282		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2283		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2284	},
2285	{	"PowerBook5,2",			"PowerBook G4 15\"",
2286		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2287		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2288	},
2289	{	"PowerBook5,3",			"PowerBook G4 17\"",
2290		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2291		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2292	},
2293	{	"PowerBook5,4",			"PowerBook G4 15\"",
2294		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2295		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2296	},
2297	{	"PowerBook5,5",			"PowerBook G4 17\"",
2298		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2299		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2300	},
2301	{	"PowerBook5,6",			"PowerBook G4 15\"",
2302		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2303		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2304	},
2305	{	"PowerBook5,7",			"PowerBook G4 17\"",
2306		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2307		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2308	},
2309	{	"PowerBook5,8",			"PowerBook G4 15\"",
2310		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2311		PMAC_MB_MAY_SLEEP  | PMAC_MB_MOBILE,
2312	},
2313	{	"PowerBook5,9",			"PowerBook G4 17\"",
2314		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2315		PMAC_MB_MAY_SLEEP | PMAC_MB_MOBILE,
2316	},
2317	{	"PowerBook6,1",			"PowerBook G4 12\"",
2318		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2319		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2320	},
2321	{	"PowerBook6,2",			"PowerBook G4",
2322		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2323		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2324	},
2325	{	"PowerBook6,3",			"iBook G4",
2326		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2327		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2328	},
2329	{	"PowerBook6,4",			"PowerBook G4 12\"",
2330		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2331		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2332	},
2333	{	"PowerBook6,5",			"iBook G4",
2334		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2335		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2336	},
2337	{	"PowerBook6,7",			"iBook G4",
2338		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2339		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2340	},
2341	{	"PowerBook6,8",			"PowerBook G4 12\"",
2342		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2343		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2344	},
2345#else /* CONFIG_POWER4 */
2346	{	"PowerMac7,2",			"PowerMac G5",
2347		PMAC_TYPE_POWERMAC_G5,		g5_features,
2348		0,
2349	},
2350#ifdef CONFIG_PPC64
2351	{	"PowerMac7,3",			"PowerMac G5",
2352		PMAC_TYPE_POWERMAC_G5,		g5_features,
2353		0,
2354	},
2355	{	"PowerMac8,1",			"iMac G5",
2356		PMAC_TYPE_IMAC_G5,		g5_features,
2357		0,
2358	},
2359	{	"PowerMac9,1",			"PowerMac G5",
2360		PMAC_TYPE_POWERMAC_G5_U3L,	g5_features,
2361		0,
2362	},
2363	{	"PowerMac11,2",			"PowerMac G5 Dual Core",
2364		PMAC_TYPE_POWERMAC_G5_U3L,	g5_features,
2365		0,
2366	},
2367	{	"PowerMac12,1",			"iMac G5 (iSight)",
2368		PMAC_TYPE_POWERMAC_G5_U3L,	g5_features,
2369		0,
2370	},
2371	{       "RackMac3,1",                   "XServe G5",
2372		PMAC_TYPE_XSERVE_G5,		g5_features,
2373		0,
2374	},
2375#endif /* CONFIG_PPC64 */
2376#endif /* CONFIG_POWER4 */
2377};
2378
2379/*
2380 * The toplevel feature_call callback
2381 */
2382long pmac_do_feature_call(unsigned int selector, ...)
2383{
2384	struct device_node *node;
2385	long param, value;
2386	int i;
2387	feature_call func = NULL;
2388	va_list args;
2389
2390	if (pmac_mb.features)
2391		for (i=0; pmac_mb.features[i].function; i++)
2392			if (pmac_mb.features[i].selector == selector) {
2393				func = pmac_mb.features[i].function;
2394				break;
2395			}
2396	if (!func)
2397		for (i=0; any_features[i].function; i++)
2398			if (any_features[i].selector == selector) {
2399				func = any_features[i].function;
2400				break;
2401			}
2402	if (!func)
2403		return -ENODEV;
2404
2405	va_start(args, selector);
2406	node = (struct device_node*)va_arg(args, void*);
2407	param = va_arg(args, long);
2408	value = va_arg(args, long);
2409	va_end(args);
2410
2411	return func(node, param, value);
2412}
2413
2414static int __init probe_motherboard(void)
2415{
2416	int i;
2417	struct macio_chip *macio = &macio_chips[0];
2418	const char *model = NULL;
2419	struct device_node *dt;
2420	int ret = 0;
2421
2422	/* Lookup known motherboard type in device-tree. First try an
2423	 * exact match on the "model" property, then try a "compatible"
2424	 * match is none is found.
2425	 */
2426	dt = of_find_node_by_name(NULL, "device-tree");
2427	if (dt != NULL)
2428		model = of_get_property(dt, "model", NULL);
2429	for(i=0; model && i<ARRAY_SIZE(pmac_mb_defs); i++) {
2430	    if (strcmp(model, pmac_mb_defs[i].model_string) == 0) {
2431		pmac_mb = pmac_mb_defs[i];
2432		goto found;
2433	    }
2434	}
2435	for(i=0; i<ARRAY_SIZE(pmac_mb_defs); i++) {
2436	    if (of_machine_is_compatible(pmac_mb_defs[i].model_string)) {
2437		pmac_mb = pmac_mb_defs[i];
2438		goto found;
2439	    }
2440	}
2441
2442	/* Fallback to selection depending on mac-io chip type */
2443	switch(macio->type) {
2444#ifndef CONFIG_POWER4
2445	    case macio_grand_central:
2446		pmac_mb.model_id = PMAC_TYPE_PSURGE;
2447		pmac_mb.model_name = "Unknown PowerSurge";
2448		break;
2449	    case macio_ohare:
2450		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_OHARE;
2451		pmac_mb.model_name = "Unknown OHare-based";
2452		break;
2453	    case macio_heathrow:
2454		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_HEATHROW;
2455		pmac_mb.model_name = "Unknown Heathrow-based";
2456		pmac_mb.features = heathrow_desktop_features;
2457		break;
2458	    case macio_paddington:
2459		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_PADDINGTON;
2460		pmac_mb.model_name = "Unknown Paddington-based";
2461		pmac_mb.features = paddington_features;
2462		break;
2463	    case macio_keylargo:
2464		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_CORE99;
2465		pmac_mb.model_name = "Unknown Keylargo-based";
2466		pmac_mb.features = core99_features;
2467		break;
2468	    case macio_pangea:
2469		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_PANGEA;
2470		pmac_mb.model_name = "Unknown Pangea-based";
2471		pmac_mb.features = pangea_features;
2472		break;
2473	    case macio_intrepid:
2474		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_INTREPID;
2475		pmac_mb.model_name = "Unknown Intrepid-based";
2476		pmac_mb.features = intrepid_features;
2477		break;
2478#else /* CONFIG_POWER4 */
2479	case macio_keylargo2:
2480		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_K2;
2481		pmac_mb.model_name = "Unknown K2-based";
2482		pmac_mb.features = g5_features;
2483		break;
2484	case macio_shasta:
2485		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_SHASTA;
2486		pmac_mb.model_name = "Unknown Shasta-based";
2487		pmac_mb.features = g5_features;
2488		break;
2489#endif /* CONFIG_POWER4 */
2490	default:
2491		ret = -ENODEV;
2492		goto done;
2493	}
2494found:
2495#ifndef CONFIG_POWER4
2496	/* Fixup Hooper vs. Comet */
2497	if (pmac_mb.model_id == PMAC_TYPE_HOOPER) {
2498		u32 __iomem * mach_id_ptr = ioremap(0xf3000034, 4);
2499		if (!mach_id_ptr) {
2500			ret = -ENODEV;
2501			goto done;
2502		}
2503		/* Here, I used to disable the media-bay on comet. It
2504		 * appears this is wrong, the floppy connector is actually
2505		 * a kind of media-bay and works with the current driver.
2506		 */
2507		if (__raw_readl(mach_id_ptr) & 0x20000000UL)
2508			pmac_mb.model_id = PMAC_TYPE_COMET;
2509		iounmap(mach_id_ptr);
2510	}
2511
2512	/* Set default value of powersave_nap on machines that support it.
2513	 * It appears that uninorth rev 3 has a problem with it, we don't
2514	 * enable it on those. In theory, the flush-on-lock property is
2515	 * supposed to be set when not supported, but I'm not very confident
2516	 * that all Apple OF revs did it properly, I do it the paranoid way.
2517	 */
2518	while (uninorth_base && uninorth_rev > 3) {
2519		struct device_node *cpus = of_find_node_by_path("/cpus");
2520		struct device_node *np;
2521
2522		if (!cpus || !cpus->child) {
2523			printk(KERN_WARNING "Can't find CPU(s) in device tree !\n");
2524			of_node_put(cpus);
2525			break;
2526		}
2527		np = cpus->child;
2528		/* Nap mode not supported on SMP */
2529		if (np->sibling) {
2530			of_node_put(cpus);
2531			break;
2532		}
2533		/* Nap mode not supported if flush-on-lock property is present */
2534		if (of_get_property(np, "flush-on-lock", NULL)) {
2535			of_node_put(cpus);
2536			break;
2537		}
2538		of_node_put(cpus);
2539		powersave_nap = 1;
2540		printk(KERN_DEBUG "Processor NAP mode on idle enabled.\n");
2541		break;
2542	}
 
 
2543
2544	/* On CPUs that support it (750FX), lowspeed by default during
2545	 * NAP mode
2546	 */
2547	powersave_lowspeed = 1;
2548
2549#else /* CONFIG_POWER4 */
2550	powersave_nap = 1;
2551#endif  /* CONFIG_POWER4 */
2552
2553	/* Check for "mobile" machine */
2554	if (model && (strncmp(model, "PowerBook", 9) == 0
2555		   || strncmp(model, "iBook", 5) == 0))
2556		pmac_mb.board_flags |= PMAC_MB_MOBILE;
2557
2558
2559	printk(KERN_INFO "PowerMac motherboard: %s\n", pmac_mb.model_name);
2560done:
2561	of_node_put(dt);
2562	return ret;
2563}
2564
2565/* Initialize the Core99 UniNorth host bridge and memory controller
2566 */
2567static void __init probe_uninorth(void)
2568{
2569	const u32 *addrp;
2570	phys_addr_t address;
2571	unsigned long actrl;
2572
2573	/* Locate core99 Uni-N */
2574	uninorth_node = of_find_node_by_name(NULL, "uni-n");
2575	uninorth_maj = 1;
2576
2577	/* Locate G5 u3 */
2578	if (uninorth_node == NULL) {
2579		uninorth_node = of_find_node_by_name(NULL, "u3");
2580		uninorth_maj = 3;
2581	}
2582	/* Locate G5 u4 */
2583	if (uninorth_node == NULL) {
2584		uninorth_node = of_find_node_by_name(NULL, "u4");
2585		uninorth_maj = 4;
2586	}
2587	if (uninorth_node == NULL) {
2588		uninorth_maj = 0;
2589		return;
2590	}
2591
2592	addrp = of_get_property(uninorth_node, "reg", NULL);
2593	if (addrp == NULL)
2594		return;
2595	address = of_translate_address(uninorth_node, addrp);
2596	if (address == 0)
2597		return;
2598	uninorth_base = ioremap(address, 0x40000);
2599	if (uninorth_base == NULL)
2600		return;
2601	uninorth_rev = in_be32(UN_REG(UNI_N_VERSION));
2602	if (uninorth_maj == 3 || uninorth_maj == 4) {
2603		u3_ht_base = ioremap(address + U3_HT_CONFIG_BASE, 0x1000);
2604		if (u3_ht_base == NULL) {
2605			iounmap(uninorth_base);
2606			return;
2607		}
2608	}
2609
2610	printk(KERN_INFO "Found %s memory controller & host bridge"
2611	       " @ 0x%08x revision: 0x%02x\n", uninorth_maj == 3 ? "U3" :
2612	       uninorth_maj == 4 ? "U4" : "UniNorth",
2613	       (unsigned int)address, uninorth_rev);
2614	printk(KERN_INFO "Mapped at 0x%08lx\n", (unsigned long)uninorth_base);
2615
2616	/* Set the arbitrer QAck delay according to what Apple does
2617	 */
2618	if (uninorth_rev < 0x11) {
2619		actrl = UN_IN(UNI_N_ARB_CTRL) & ~UNI_N_ARB_CTRL_QACK_DELAY_MASK;
2620		actrl |= ((uninorth_rev < 3) ? UNI_N_ARB_CTRL_QACK_DELAY105 :
2621			UNI_N_ARB_CTRL_QACK_DELAY) <<
2622			UNI_N_ARB_CTRL_QACK_DELAY_SHIFT;
2623		UN_OUT(UNI_N_ARB_CTRL, actrl);
2624	}
2625
2626	/* Some more magic as done by them in recent MacOS X on UniNorth
2627	 * revs 1.5 to 2.O and Pangea. Seem to toggle the UniN Maxbus/PCI
2628	 * memory timeout
2629	 */
2630	if ((uninorth_rev >= 0x11 && uninorth_rev <= 0x24) ||
2631	    uninorth_rev == 0xc0)
2632		UN_OUT(0x2160, UN_IN(0x2160) & 0x00ffffff);
2633}
2634
2635static void __init probe_one_macio(const char *name, const char *compat, int type)
2636{
2637	struct device_node*	node;
2638	int			i;
2639	volatile u32 __iomem	*base;
2640	const u32		*addrp, *revp;
 
2641	phys_addr_t		addr;
2642	u64			size;
2643
2644	for (node = NULL; (node = of_find_node_by_name(node, name)) != NULL;) {
2645		if (!compat)
2646			break;
2647		if (of_device_is_compatible(node, compat))
2648			break;
2649	}
2650	if (!node)
2651		return;
2652	for(i=0; i<MAX_MACIO_CHIPS; i++) {
2653		if (!macio_chips[i].of_node)
2654			break;
2655		if (macio_chips[i].of_node == node)
2656			return;
2657	}
2658
2659	if (i >= MAX_MACIO_CHIPS) {
2660		printk(KERN_ERR "pmac_feature: Please increase MAX_MACIO_CHIPS !\n");
2661		printk(KERN_ERR "pmac_feature: %s skipped\n", node->full_name);
2662		return;
2663	}
2664	addrp = of_get_pci_address(node, 0, &size, NULL);
2665	if (addrp == NULL) {
2666		printk(KERN_ERR "pmac_feature: %s: can't find base !\n",
2667		       node->full_name);
2668		return;
2669	}
2670	addr = of_translate_address(node, addrp);
2671	if (addr == 0) {
2672		printk(KERN_ERR "pmac_feature: %s, can't translate base !\n",
2673		       node->full_name);
2674		return;
2675	}
2676	base = ioremap(addr, (unsigned long)size);
2677	if (!base) {
2678		printk(KERN_ERR "pmac_feature: %s, can't map mac-io chip !\n",
2679		       node->full_name);
2680		return;
2681	}
2682	if (type == macio_keylargo || type == macio_keylargo2) {
2683		const u32 *did = of_get_property(node, "device-id", NULL);
2684		if (*did == 0x00000025)
2685			type = macio_pangea;
2686		if (*did == 0x0000003e)
2687			type = macio_intrepid;
2688		if (*did == 0x0000004f)
2689			type = macio_shasta;
2690	}
2691	macio_chips[i].of_node	= node;
2692	macio_chips[i].type	= type;
2693	macio_chips[i].base	= base;
2694	macio_chips[i].flags	= MACIO_FLAG_SCCA_ON | MACIO_FLAG_SCCB_ON;
2695	macio_chips[i].name	= macio_names[type];
2696	revp = of_get_property(node, "revision-id", NULL);
2697	if (revp)
2698		macio_chips[i].rev = *revp;
2699	printk(KERN_INFO "Found a %s mac-io controller, rev: %d, mapped at 0x%p\n",
2700		macio_names[type], macio_chips[i].rev, macio_chips[i].base);
 
 
 
 
 
2701}
2702
2703static int __init
2704probe_macios(void)
2705{
2706	/* Warning, ordering is important */
2707	probe_one_macio("gc", NULL, macio_grand_central);
2708	probe_one_macio("ohare", NULL, macio_ohare);
2709	probe_one_macio("pci106b,7", NULL, macio_ohareII);
2710	probe_one_macio("mac-io", "keylargo", macio_keylargo);
2711	probe_one_macio("mac-io", "paddington", macio_paddington);
2712	probe_one_macio("mac-io", "gatwick", macio_gatwick);
2713	probe_one_macio("mac-io", "heathrow", macio_heathrow);
2714	probe_one_macio("mac-io", "K2-Keylargo", macio_keylargo2);
2715
2716	/* Make sure the "main" macio chip appear first */
2717	if (macio_chips[0].type == macio_gatwick
2718	    && macio_chips[1].type == macio_heathrow) {
2719		struct macio_chip temp = macio_chips[0];
2720		macio_chips[0] = macio_chips[1];
2721		macio_chips[1] = temp;
2722	}
2723	if (macio_chips[0].type == macio_ohareII
2724	    && macio_chips[1].type == macio_ohare) {
2725		struct macio_chip temp = macio_chips[0];
2726		macio_chips[0] = macio_chips[1];
2727		macio_chips[1] = temp;
2728	}
2729	macio_chips[0].lbus.index = 0;
2730	macio_chips[1].lbus.index = 1;
2731
2732	return (macio_chips[0].of_node == NULL) ? -ENODEV : 0;
2733}
2734
2735static void __init
2736initial_serial_shutdown(struct device_node *np)
2737{
2738	int len;
2739	const struct slot_names_prop {
2740		int	count;
2741		char	name[1];
2742	} *slots;
2743	const char *conn;
2744	int port_type = PMAC_SCC_ASYNC;
2745	int modem = 0;
2746
2747	slots = of_get_property(np, "slot-names", &len);
2748	conn = of_get_property(np, "AAPL,connector", &len);
2749	if (conn && (strcmp(conn, "infrared") == 0))
2750		port_type = PMAC_SCC_IRDA;
2751	else if (of_device_is_compatible(np, "cobalt"))
2752		modem = 1;
2753	else if (slots && slots->count > 0) {
2754		if (strcmp(slots->name, "IrDA") == 0)
2755			port_type = PMAC_SCC_IRDA;
2756		else if (strcmp(slots->name, "Modem") == 0)
2757			modem = 1;
2758	}
2759	if (modem)
2760		pmac_call_feature(PMAC_FTR_MODEM_ENABLE, np, 0, 0);
2761	pmac_call_feature(PMAC_FTR_SCC_ENABLE, np, port_type, 0);
2762}
2763
2764static void __init
2765set_initial_features(void)
2766{
2767	struct device_node *np;
2768
2769	/* That hack appears to be necessary for some StarMax motherboards
2770	 * but I'm not too sure it was audited for side-effects on other
2771	 * ohare based machines...
2772	 * Since I still have difficulties figuring the right way to
2773	 * differenciate them all and since that hack was there for a long
2774	 * time, I'll keep it around
2775	 */
2776	if (macio_chips[0].type == macio_ohare) {
2777		struct macio_chip *macio = &macio_chips[0];
2778		np = of_find_node_by_name(NULL, "via-pmu");
2779		if (np)
2780			MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE);
2781		else
2782			MACIO_OUT32(OHARE_FCR, STARMAX_FEATURES);
2783		of_node_put(np);
2784	} else if (macio_chips[1].type == macio_ohare) {
2785		struct macio_chip *macio = &macio_chips[1];
2786		MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE);
2787	}
2788
2789#ifdef CONFIG_POWER4
2790	if (macio_chips[0].type == macio_keylargo2 ||
2791	    macio_chips[0].type == macio_shasta) {
2792#ifndef CONFIG_SMP
2793		/* On SMP machines running UP, we have the second CPU eating
2794		 * bus cycles. We need to take it off the bus. This is done
2795		 * from pmac_smp for SMP kernels running on one CPU
2796		 */
2797		np = of_find_node_by_type(NULL, "cpu");
2798		if (np != NULL)
2799			np = of_find_node_by_type(np, "cpu");
2800		if (np != NULL) {
2801			g5_phy_disable_cpu1();
2802			of_node_put(np);
2803		}
2804#endif /* CONFIG_SMP */
2805		/* Enable GMAC for now for PCI probing. It will be disabled
2806		 * later on after PCI probe
2807		 */
2808		np = of_find_node_by_name(NULL, "ethernet");
2809		while(np) {
2810			if (of_device_is_compatible(np, "K2-GMAC"))
2811				g5_gmac_enable(np, 0, 1);
2812			np = of_find_node_by_name(np, "ethernet");
2813		}
2814
2815		/* Enable FW before PCI probe. Will be disabled later on
2816		 * Note: We should have a batter way to check that we are
2817		 * dealing with uninorth internal cell and not a PCI cell
2818		 * on the external PCI. The code below works though.
2819		 */
2820		np = of_find_node_by_name(NULL, "firewire");
2821		while(np) {
2822			if (of_device_is_compatible(np, "pci106b,5811")) {
2823				macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
2824				g5_fw_enable(np, 0, 1);
2825			}
2826			np = of_find_node_by_name(np, "firewire");
2827		}
2828	}
2829#else /* CONFIG_POWER4 */
2830
2831	if (macio_chips[0].type == macio_keylargo ||
2832	    macio_chips[0].type == macio_pangea ||
2833	    macio_chips[0].type == macio_intrepid) {
2834		/* Enable GMAC for now for PCI probing. It will be disabled
2835		 * later on after PCI probe
2836		 */
2837		np = of_find_node_by_name(NULL, "ethernet");
2838		while(np) {
2839			if (np->parent
2840			    && of_device_is_compatible(np->parent, "uni-north")
2841			    && of_device_is_compatible(np, "gmac"))
2842				core99_gmac_enable(np, 0, 1);
2843			np = of_find_node_by_name(np, "ethernet");
2844		}
2845
2846		/* Enable FW before PCI probe. Will be disabled later on
2847		 * Note: We should have a batter way to check that we are
2848		 * dealing with uninorth internal cell and not a PCI cell
2849		 * on the external PCI. The code below works though.
2850		 */
2851		np = of_find_node_by_name(NULL, "firewire");
2852		while(np) {
2853			if (np->parent
2854			    && of_device_is_compatible(np->parent, "uni-north")
2855			    && (of_device_is_compatible(np, "pci106b,18") ||
2856			        of_device_is_compatible(np, "pci106b,30") ||
2857			        of_device_is_compatible(np, "pci11c1,5811"))) {
2858				macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
2859				core99_firewire_enable(np, 0, 1);
2860			}
2861			np = of_find_node_by_name(np, "firewire");
2862		}
2863
2864		/* Enable ATA-100 before PCI probe. */
2865		np = of_find_node_by_name(NULL, "ata-6");
2866		while(np) {
2867			if (np->parent
2868			    && of_device_is_compatible(np->parent, "uni-north")
2869			    && of_device_is_compatible(np, "kauai-ata")) {
2870				core99_ata100_enable(np, 1);
2871			}
2872			np = of_find_node_by_name(np, "ata-6");
2873		}
2874
2875		/* Switch airport off */
2876		for_each_node_by_name(np, "radio") {
2877			if (np->parent == macio_chips[0].of_node) {
2878				macio_chips[0].flags |= MACIO_FLAG_AIRPORT_ON;
2879				core99_airport_enable(np, 0, 0);
2880			}
2881		}
2882	}
2883
2884	/* On all machines that support sound PM, switch sound off */
2885	if (macio_chips[0].of_node)
2886		pmac_do_feature_call(PMAC_FTR_SOUND_CHIP_ENABLE,
2887			macio_chips[0].of_node, 0, 0);
2888
2889	/* While on some desktop G3s, we turn it back on */
2890	if (macio_chips[0].of_node && macio_chips[0].type == macio_heathrow
2891		&& (pmac_mb.model_id == PMAC_TYPE_GOSSAMER ||
2892		    pmac_mb.model_id == PMAC_TYPE_SILK)) {
2893		struct macio_chip *macio = &macio_chips[0];
2894		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
2895		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_POWER_N);
2896	}
2897
2898#endif /* CONFIG_POWER4 */
2899
2900	/* On all machines, switch modem & serial ports off */
2901	for_each_node_by_name(np, "ch-a")
2902		initial_serial_shutdown(np);
2903	of_node_put(np);
2904	for_each_node_by_name(np, "ch-b")
2905		initial_serial_shutdown(np);
2906	of_node_put(np);
2907}
2908
2909void __init
2910pmac_feature_init(void)
2911{
2912	/* Detect the UniNorth memory controller */
2913	probe_uninorth();
2914
2915	/* Probe mac-io controllers */
2916	if (probe_macios()) {
2917		printk(KERN_WARNING "No mac-io chip found\n");
2918		return;
2919	}
2920
2921	/* Probe machine type */
2922	if (probe_motherboard())
2923		printk(KERN_WARNING "Unknown PowerMac !\n");
2924
2925	/* Set some initial features (turn off some chips that will
2926	 * be later turned on)
2927	 */
2928	set_initial_features();
2929}
2930
2931#if 0
2932static void dump_HT_speeds(char *name, u32 cfg, u32 frq)
2933{
2934	int	freqs[16] = { 200,300,400,500,600,800,1000,0,0,0,0,0,0,0,0,0 };
2935	int	bits[8] = { 8,16,0,32,2,4,0,0 };
2936	int	freq = (frq >> 8) & 0xf;
2937
2938	if (freqs[freq] == 0)
2939		printk("%s: Unknown HT link frequency %x\n", name, freq);
2940	else
2941		printk("%s: %d MHz on main link, (%d in / %d out) bits width\n",
2942		       name, freqs[freq],
2943		       bits[(cfg >> 28) & 0x7], bits[(cfg >> 24) & 0x7]);
2944}
2945
2946void __init pmac_check_ht_link(void)
2947{
2948	u32	ufreq, freq, ucfg, cfg;
2949	struct device_node *pcix_node;
2950	u8	px_bus, px_devfn;
2951	struct pci_controller *px_hose;
2952
2953	(void)in_be32(u3_ht_base + U3_HT_LINK_COMMAND);
2954	ucfg = cfg = in_be32(u3_ht_base + U3_HT_LINK_CONFIG);
2955	ufreq = freq = in_be32(u3_ht_base + U3_HT_LINK_FREQ);
2956	dump_HT_speeds("U3 HyperTransport", cfg, freq);
2957
2958	pcix_node = of_find_compatible_node(NULL, "pci", "pci-x");
2959	if (pcix_node == NULL) {
2960		printk("No PCI-X bridge found\n");
2961		return;
2962	}
2963	if (pci_device_from_OF_node(pcix_node, &px_bus, &px_devfn) != 0) {
2964		printk("PCI-X bridge found but not matched to pci\n");
2965		return;
2966	}
2967	px_hose = pci_find_hose_for_OF_device(pcix_node);
2968	if (px_hose == NULL) {
2969		printk("PCI-X bridge found but not matched to host\n");
2970		return;
2971	}	
2972	early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg);
2973	early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq);
2974	dump_HT_speeds("PCI-X HT Uplink", cfg, freq);
2975	early_read_config_dword(px_hose, px_bus, px_devfn, 0xc8, &cfg);
2976	early_read_config_dword(px_hose, px_bus, px_devfn, 0xd0, &freq);
2977	dump_HT_speeds("PCI-X HT Downlink", cfg, freq);
2978}
2979#endif /* 0 */
2980
2981/*
2982 * Early video resume hook
2983 */
2984
2985static void (*pmac_early_vresume_proc)(void *data);
2986static void *pmac_early_vresume_data;
2987
2988void pmac_set_early_video_resume(void (*proc)(void *data), void *data)
2989{
2990	if (!machine_is(powermac))
2991		return;
2992	preempt_disable();
2993	pmac_early_vresume_proc = proc;
2994	pmac_early_vresume_data = data;
2995	preempt_enable();
2996}
2997EXPORT_SYMBOL(pmac_set_early_video_resume);
2998
2999void pmac_call_early_video_resume(void)
3000{
3001	if (pmac_early_vresume_proc)
3002		pmac_early_vresume_proc(pmac_early_vresume_data);
3003}
3004
3005/*
3006 * AGP related suspend/resume code
3007 */
3008
3009static struct pci_dev *pmac_agp_bridge;
3010static int (*pmac_agp_suspend)(struct pci_dev *bridge);
3011static int (*pmac_agp_resume)(struct pci_dev *bridge);
3012
3013void pmac_register_agp_pm(struct pci_dev *bridge,
3014				 int (*suspend)(struct pci_dev *bridge),
3015				 int (*resume)(struct pci_dev *bridge))
3016{
3017	if (suspend || resume) {
3018		pmac_agp_bridge = bridge;
3019		pmac_agp_suspend = suspend;
3020		pmac_agp_resume = resume;
3021		return;
3022	}
3023	if (bridge != pmac_agp_bridge)
3024		return;
3025	pmac_agp_suspend = pmac_agp_resume = NULL;
3026	return;
3027}
3028EXPORT_SYMBOL(pmac_register_agp_pm);
3029
3030void pmac_suspend_agp_for_card(struct pci_dev *dev)
3031{
3032	if (pmac_agp_bridge == NULL || pmac_agp_suspend == NULL)
3033		return;
3034	if (pmac_agp_bridge->bus != dev->bus)
3035		return;
3036	pmac_agp_suspend(pmac_agp_bridge);
3037}
3038EXPORT_SYMBOL(pmac_suspend_agp_for_card);
3039
3040void pmac_resume_agp_for_card(struct pci_dev *dev)
3041{
3042	if (pmac_agp_bridge == NULL || pmac_agp_resume == NULL)
3043		return;
3044	if (pmac_agp_bridge->bus != dev->bus)
3045		return;
3046	pmac_agp_resume(pmac_agp_bridge);
3047}
3048EXPORT_SYMBOL(pmac_resume_agp_for_card);
3049
3050int pmac_get_uninorth_variant(void)
3051{
3052	return uninorth_maj;
3053}
v6.8
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Copyright (C) 1996-2001 Paul Mackerras (paulus@cs.anu.edu.au)
   4 *                          Ben. Herrenschmidt (benh@kernel.crashing.org)
   5 *
 
 
 
 
 
   6 *  TODO:
   7 *
   8 *   - Replace mdelay with some schedule loop if possible
   9 *   - Shorten some obfuscated delays on some routines (like modem
  10 *     power)
  11 *   - Refcount some clocks (see darwin)
  12 *   - Split split split...
 
  13 */
  14#include <linux/types.h>
  15#include <linux/init.h>
  16#include <linux/delay.h>
  17#include <linux/kernel.h>
  18#include <linux/sched.h>
  19#include <linux/of.h>
  20#include <linux/of_address.h>
  21#include <linux/spinlock.h>
  22#include <linux/adb.h>
  23#include <linux/pmu.h>
  24#include <linux/ioport.h>
  25#include <linux/export.h>
  26#include <linux/pci.h>
  27#include <asm/sections.h>
  28#include <asm/errno.h>
  29#include <asm/ohare.h>
  30#include <asm/heathrow.h>
  31#include <asm/keylargo.h>
  32#include <asm/uninorth.h>
  33#include <asm/io.h>
 
  34#include <asm/machdep.h>
  35#include <asm/pmac_feature.h>
  36#include <asm/dbdma.h>
  37#include <asm/pci-bridge.h>
  38#include <asm/pmac_low_i2c.h>
  39
  40#include "pmac.h"
  41
  42#undef DEBUG_FEATURE
  43
  44#ifdef DEBUG_FEATURE
  45#define DBG(fmt...) printk(KERN_DEBUG fmt)
  46#else
  47#define DBG(fmt...)
  48#endif
  49
  50#ifdef CONFIG_PPC_BOOK3S_32
  51extern int powersave_lowspeed;
  52#endif
  53
  54extern int powersave_nap;
  55extern struct device_node *k2_skiplist[2];
  56
  57/*
  58 * We use a single global lock to protect accesses. Each driver has
  59 * to take care of its own locking
  60 */
  61DEFINE_RAW_SPINLOCK(feature_lock);
  62
  63#define LOCK(flags)	raw_spin_lock_irqsave(&feature_lock, flags);
  64#define UNLOCK(flags)	raw_spin_unlock_irqrestore(&feature_lock, flags);
  65
  66
  67/*
  68 * Instance of some macio stuffs
  69 */
  70struct macio_chip macio_chips[MAX_MACIO_CHIPS];
  71
  72struct macio_chip *macio_find(struct device_node *child, int type)
  73{
  74	while(child) {
  75		int	i;
  76
  77		for (i=0; i < MAX_MACIO_CHIPS && macio_chips[i].of_node; i++)
  78			if (child == macio_chips[i].of_node &&
  79			    (!type || macio_chips[i].type == type))
  80				return &macio_chips[i];
  81		child = child->parent;
  82	}
  83	return NULL;
  84}
  85EXPORT_SYMBOL_GPL(macio_find);
  86
  87static const char *macio_names[] =
  88{
  89	"Unknown",
  90	"Grand Central",
  91	"OHare",
  92	"OHareII",
  93	"Heathrow",
  94	"Gatwick",
  95	"Paddington",
  96	"Keylargo",
  97	"Pangea",
  98	"Intrepid",
  99	"K2",
 100	"Shasta",
 101};
 102
 103
 104struct device_node *uninorth_node;
 105u32 __iomem *uninorth_base;
 106
 107static u32 uninorth_rev;
 108static int uninorth_maj;
 109static void __iomem *u3_ht_base;
 110
 111/*
 112 * For each motherboard family, we have a table of functions pointers
 113 * that handle the various features.
 114 */
 115
 116typedef long (*feature_call)(struct device_node *node, long param, long value);
 117
 118struct feature_table_entry {
 119	unsigned int	selector;
 120	feature_call	function;
 121};
 122
 123struct pmac_mb_def
 124{
 125	const char*			model_string;
 126	const char*			model_name;
 127	int				model_id;
 128	struct feature_table_entry*	features;
 129	unsigned long			board_flags;
 130};
 131static struct pmac_mb_def pmac_mb;
 132
 133/*
 134 * Here are the chip specific feature functions
 135 */
 136
 137#ifndef CONFIG_PPC64
 138
 139static int simple_feature_tweak(struct device_node *node, int type, int reg,
 140				u32 mask, int value)
 141{
 142	struct macio_chip*	macio;
 143	unsigned long		flags;
 144
 145	macio = macio_find(node, type);
 146	if (!macio)
 147		return -ENODEV;
 148	LOCK(flags);
 149	if (value)
 150		MACIO_BIS(reg, mask);
 151	else
 152		MACIO_BIC(reg, mask);
 153	(void)MACIO_IN32(reg);
 154	UNLOCK(flags);
 155
 156	return 0;
 157}
 158
 
 
 159static long ohare_htw_scc_enable(struct device_node *node, long param,
 160				 long value)
 161{
 162	struct macio_chip*	macio;
 163	unsigned long		chan_mask;
 164	unsigned long		fcr;
 165	unsigned long		flags;
 166	int			htw, trans;
 167	unsigned long		rmask;
 168
 169	macio = macio_find(node, 0);
 170	if (!macio)
 171		return -ENODEV;
 172	if (of_node_name_eq(node, "ch-a"))
 173		chan_mask = MACIO_FLAG_SCCA_ON;
 174	else if (of_node_name_eq(node, "ch-b"))
 175		chan_mask = MACIO_FLAG_SCCB_ON;
 176	else
 177		return -ENODEV;
 178
 179	htw = (macio->type == macio_heathrow || macio->type == macio_paddington
 180		|| macio->type == macio_gatwick);
 181	/* On these machines, the HRW_SCC_TRANS_EN_N bit mustn't be touched */
 182	trans = (pmac_mb.model_id != PMAC_TYPE_YOSEMITE &&
 183		 pmac_mb.model_id != PMAC_TYPE_YIKES);
 184	if (value) {
 185#ifdef CONFIG_ADB_PMU
 186		if ((param & 0xfff) == PMAC_SCC_IRDA)
 187			pmu_enable_irled(1);
 188#endif /* CONFIG_ADB_PMU */
 189		LOCK(flags);
 190		fcr = MACIO_IN32(OHARE_FCR);
 191		/* Check if scc cell need enabling */
 192		if (!(fcr & OH_SCC_ENABLE)) {
 193			fcr |= OH_SCC_ENABLE;
 194			if (htw) {
 195				/* Side effect: this will also power up the
 196				 * modem, but it's too messy to figure out on which
 197				 * ports this controls the transceiver and on which
 198				 * it controls the modem
 199				 */
 200				if (trans)
 201					fcr &= ~HRW_SCC_TRANS_EN_N;
 202				MACIO_OUT32(OHARE_FCR, fcr);
 203				fcr |= (rmask = HRW_RESET_SCC);
 204				MACIO_OUT32(OHARE_FCR, fcr);
 205			} else {
 206				fcr |= (rmask = OH_SCC_RESET);
 207				MACIO_OUT32(OHARE_FCR, fcr);
 208			}
 209			UNLOCK(flags);
 210			(void)MACIO_IN32(OHARE_FCR);
 211			mdelay(15);
 212			LOCK(flags);
 213			fcr &= ~rmask;
 214			MACIO_OUT32(OHARE_FCR, fcr);
 215		}
 216		if (chan_mask & MACIO_FLAG_SCCA_ON)
 217			fcr |= OH_SCCA_IO;
 218		if (chan_mask & MACIO_FLAG_SCCB_ON)
 219			fcr |= OH_SCCB_IO;
 220		MACIO_OUT32(OHARE_FCR, fcr);
 221		macio->flags |= chan_mask;
 222		UNLOCK(flags);
 223		if (param & PMAC_SCC_FLAG_XMON)
 224			macio->flags |= MACIO_FLAG_SCC_LOCKED;
 225	} else {
 226		if (macio->flags & MACIO_FLAG_SCC_LOCKED)
 227			return -EPERM;
 228		LOCK(flags);
 229		fcr = MACIO_IN32(OHARE_FCR);
 230		if (chan_mask & MACIO_FLAG_SCCA_ON)
 231			fcr &= ~OH_SCCA_IO;
 232		if (chan_mask & MACIO_FLAG_SCCB_ON)
 233			fcr &= ~OH_SCCB_IO;
 234		MACIO_OUT32(OHARE_FCR, fcr);
 235		if ((fcr & (OH_SCCA_IO | OH_SCCB_IO)) == 0) {
 236			fcr &= ~OH_SCC_ENABLE;
 237			if (htw && trans)
 238				fcr |= HRW_SCC_TRANS_EN_N;
 239			MACIO_OUT32(OHARE_FCR, fcr);
 240		}
 241		macio->flags &= ~(chan_mask);
 242		UNLOCK(flags);
 243		mdelay(10);
 244#ifdef CONFIG_ADB_PMU
 245		if ((param & 0xfff) == PMAC_SCC_IRDA)
 246			pmu_enable_irled(0);
 247#endif /* CONFIG_ADB_PMU */
 248	}
 249	return 0;
 250}
 251
 252static long ohare_floppy_enable(struct device_node *node, long param,
 253				long value)
 254{
 255	return simple_feature_tweak(node, macio_ohare,
 256		OHARE_FCR, OH_FLOPPY_ENABLE, value);
 257}
 258
 259static long ohare_mesh_enable(struct device_node *node, long param, long value)
 260{
 261	return simple_feature_tweak(node, macio_ohare,
 262		OHARE_FCR, OH_MESH_ENABLE, value);
 263}
 264
 265static long ohare_ide_enable(struct device_node *node, long param, long value)
 266{
 267	switch(param) {
 268	case 0:
 269		/* For some reason, setting the bit in set_initial_features()
 270		 * doesn't stick. I'm still investigating... --BenH.
 271		 */
 272		if (value)
 273			simple_feature_tweak(node, macio_ohare,
 274				OHARE_FCR, OH_IOBUS_ENABLE, 1);
 275		return simple_feature_tweak(node, macio_ohare,
 276			OHARE_FCR, OH_IDE0_ENABLE, value);
 277	case 1:
 278		return simple_feature_tweak(node, macio_ohare,
 279			OHARE_FCR, OH_BAY_IDE_ENABLE, value);
 280	default:
 281		return -ENODEV;
 282	}
 283}
 284
 285static long ohare_ide_reset(struct device_node *node, long param, long value)
 286{
 287	switch(param) {
 288	case 0:
 289		return simple_feature_tweak(node, macio_ohare,
 290			OHARE_FCR, OH_IDE0_RESET_N, !value);
 291	case 1:
 292		return simple_feature_tweak(node, macio_ohare,
 293			OHARE_FCR, OH_IDE1_RESET_N, !value);
 294	default:
 295		return -ENODEV;
 296	}
 297}
 298
 299static long ohare_sleep_state(struct device_node *node, long param, long value)
 300{
 301	struct macio_chip*	macio = &macio_chips[0];
 302
 303	if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0)
 304		return -EPERM;
 305	if (value == 1) {
 306		MACIO_BIC(OHARE_FCR, OH_IOBUS_ENABLE);
 307	} else if (value == 0) {
 308		MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE);
 309	}
 310
 311	return 0;
 312}
 313
 314static long heathrow_modem_enable(struct device_node *node, long param,
 315				  long value)
 316{
 317	struct macio_chip*	macio;
 318	u8			gpio;
 319	unsigned long		flags;
 320
 321	macio = macio_find(node, macio_unknown);
 322	if (!macio)
 323		return -ENODEV;
 324	gpio = MACIO_IN8(HRW_GPIO_MODEM_RESET) & ~1;
 325	if (!value) {
 326		LOCK(flags);
 327		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio);
 328		UNLOCK(flags);
 329		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 330		mdelay(250);
 331	}
 332	if (pmac_mb.model_id != PMAC_TYPE_YOSEMITE &&
 333	    pmac_mb.model_id != PMAC_TYPE_YIKES) {
 334		LOCK(flags);
 335		if (value)
 336			MACIO_BIC(HEATHROW_FCR, HRW_SCC_TRANS_EN_N);
 337		else
 338			MACIO_BIS(HEATHROW_FCR, HRW_SCC_TRANS_EN_N);
 339		UNLOCK(flags);
 340		(void)MACIO_IN32(HEATHROW_FCR);
 341		mdelay(250);
 342	}
 343	if (value) {
 344		LOCK(flags);
 345		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1);
 346		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 347		UNLOCK(flags); mdelay(250); LOCK(flags);
 348		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio);
 349		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 350		UNLOCK(flags); mdelay(250); LOCK(flags);
 351		MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1);
 352		(void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
 353		UNLOCK(flags); mdelay(250);
 354	}
 355	return 0;
 356}
 357
 358static long heathrow_floppy_enable(struct device_node *node, long param,
 359				   long value)
 360{
 361	return simple_feature_tweak(node, macio_unknown,
 362		HEATHROW_FCR,
 363		HRW_SWIM_ENABLE|HRW_BAY_FLOPPY_ENABLE,
 364		value);
 365}
 366
 367static long heathrow_mesh_enable(struct device_node *node, long param,
 368				 long value)
 369{
 370	struct macio_chip*	macio;
 371	unsigned long		flags;
 372
 373	macio = macio_find(node, macio_unknown);
 374	if (!macio)
 375		return -ENODEV;
 376	LOCK(flags);
 377	/* Set clear mesh cell enable */
 378	if (value)
 379		MACIO_BIS(HEATHROW_FCR, HRW_MESH_ENABLE);
 380	else
 381		MACIO_BIC(HEATHROW_FCR, HRW_MESH_ENABLE);
 382	(void)MACIO_IN32(HEATHROW_FCR);
 383	udelay(10);
 384	/* Set/Clear termination power */
 385	if (value)
 386		MACIO_BIC(HEATHROW_MBCR, 0x04000000);
 387	else
 388		MACIO_BIS(HEATHROW_MBCR, 0x04000000);
 389	(void)MACIO_IN32(HEATHROW_MBCR);
 390	udelay(10);
 391	UNLOCK(flags);
 392
 393	return 0;
 394}
 395
 396static long heathrow_ide_enable(struct device_node *node, long param,
 397				long value)
 398{
 399	switch(param) {
 400	case 0:
 401		return simple_feature_tweak(node, macio_unknown,
 402			HEATHROW_FCR, HRW_IDE0_ENABLE, value);
 403	case 1:
 404		return simple_feature_tweak(node, macio_unknown,
 405			HEATHROW_FCR, HRW_BAY_IDE_ENABLE, value);
 406	default:
 407		return -ENODEV;
 408	}
 409}
 410
 411static long heathrow_ide_reset(struct device_node *node, long param,
 412			       long value)
 413{
 414	switch(param) {
 415	case 0:
 416		return simple_feature_tweak(node, macio_unknown,
 417			HEATHROW_FCR, HRW_IDE0_RESET_N, !value);
 418	case 1:
 419		return simple_feature_tweak(node, macio_unknown,
 420			HEATHROW_FCR, HRW_IDE1_RESET_N, !value);
 421	default:
 422		return -ENODEV;
 423	}
 424}
 425
 426static long heathrow_bmac_enable(struct device_node *node, long param,
 427				 long value)
 428{
 429	struct macio_chip*	macio;
 430	unsigned long		flags;
 431
 432	macio = macio_find(node, 0);
 433	if (!macio)
 434		return -ENODEV;
 435	if (value) {
 436		LOCK(flags);
 437		MACIO_BIS(HEATHROW_FCR, HRW_BMAC_IO_ENABLE);
 438		MACIO_BIS(HEATHROW_FCR, HRW_BMAC_RESET);
 439		UNLOCK(flags);
 440		(void)MACIO_IN32(HEATHROW_FCR);
 441		mdelay(10);
 442		LOCK(flags);
 443		MACIO_BIC(HEATHROW_FCR, HRW_BMAC_RESET);
 444		UNLOCK(flags);
 445		(void)MACIO_IN32(HEATHROW_FCR);
 446		mdelay(10);
 447	} else {
 448		LOCK(flags);
 449		MACIO_BIC(HEATHROW_FCR, HRW_BMAC_IO_ENABLE);
 450		UNLOCK(flags);
 451	}
 452	return 0;
 453}
 454
 455static long heathrow_sound_enable(struct device_node *node, long param,
 456				  long value)
 457{
 458	struct macio_chip*	macio;
 459	unsigned long		flags;
 460
 461	/* B&W G3 and Yikes don't support that properly (the
 462	 * sound appear to never come back after being shut down).
 463	 */
 464	if (pmac_mb.model_id == PMAC_TYPE_YOSEMITE ||
 465	    pmac_mb.model_id == PMAC_TYPE_YIKES)
 466		return 0;
 467
 468	macio = macio_find(node, 0);
 469	if (!macio)
 470		return -ENODEV;
 471	if (value) {
 472		LOCK(flags);
 473		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
 474		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_POWER_N);
 475		UNLOCK(flags);
 476		(void)MACIO_IN32(HEATHROW_FCR);
 477	} else {
 478		LOCK(flags);
 479		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_POWER_N);
 480		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
 481		UNLOCK(flags);
 482	}
 483	return 0;
 484}
 485
 486static u32 save_fcr[6];
 487static u32 save_mbcr;
 488static struct dbdma_regs save_dbdma[13];
 489static struct dbdma_regs save_alt_dbdma[13];
 490
 491static void dbdma_save(struct macio_chip *macio, struct dbdma_regs *save)
 492{
 493	int i;
 494
 495	/* Save state & config of DBDMA channels */
 496	for (i = 0; i < 13; i++) {
 497		volatile struct dbdma_regs __iomem * chan = (void __iomem *)
 498			(macio->base + ((0x8000+i*0x100)>>2));
 499		save[i].cmdptr_hi = in_le32(&chan->cmdptr_hi);
 500		save[i].cmdptr = in_le32(&chan->cmdptr);
 501		save[i].intr_sel = in_le32(&chan->intr_sel);
 502		save[i].br_sel = in_le32(&chan->br_sel);
 503		save[i].wait_sel = in_le32(&chan->wait_sel);
 504	}
 505}
 506
 507static void dbdma_restore(struct macio_chip *macio, struct dbdma_regs *save)
 508{
 509	int i;
 510
 511	/* Save state & config of DBDMA channels */
 512	for (i = 0; i < 13; i++) {
 513		volatile struct dbdma_regs __iomem * chan = (void __iomem *)
 514			(macio->base + ((0x8000+i*0x100)>>2));
 515		out_le32(&chan->control, (ACTIVE|DEAD|WAKE|FLUSH|PAUSE|RUN)<<16);
 516		while (in_le32(&chan->status) & ACTIVE)
 517			mb();
 518		out_le32(&chan->cmdptr_hi, save[i].cmdptr_hi);
 519		out_le32(&chan->cmdptr, save[i].cmdptr);
 520		out_le32(&chan->intr_sel, save[i].intr_sel);
 521		out_le32(&chan->br_sel, save[i].br_sel);
 522		out_le32(&chan->wait_sel, save[i].wait_sel);
 523	}
 524}
 525
 526static void heathrow_sleep(struct macio_chip *macio, int secondary)
 527{
 528	if (secondary) {
 529		dbdma_save(macio, save_alt_dbdma);
 530		save_fcr[2] = MACIO_IN32(0x38);
 531		save_fcr[3] = MACIO_IN32(0x3c);
 532	} else {
 533		dbdma_save(macio, save_dbdma);
 534		save_fcr[0] = MACIO_IN32(0x38);
 535		save_fcr[1] = MACIO_IN32(0x3c);
 536		save_mbcr = MACIO_IN32(0x34);
 537		/* Make sure sound is shut down */
 538		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_POWER_N);
 539		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
 540		/* This seems to be necessary as well or the fan
 541		 * keeps coming up and battery drains fast */
 542		MACIO_BIC(HEATHROW_FCR, HRW_IOBUS_ENABLE);
 543		MACIO_BIC(HEATHROW_FCR, HRW_IDE0_RESET_N);
 544		/* Make sure eth is down even if module or sleep
 545		 * won't work properly */
 546		MACIO_BIC(HEATHROW_FCR, HRW_BMAC_IO_ENABLE | HRW_BMAC_RESET);
 547	}
 548	/* Make sure modem is shut down */
 549	MACIO_OUT8(HRW_GPIO_MODEM_RESET,
 550		MACIO_IN8(HRW_GPIO_MODEM_RESET) & ~1);
 551	MACIO_BIS(HEATHROW_FCR, HRW_SCC_TRANS_EN_N);
 552	MACIO_BIC(HEATHROW_FCR, OH_SCCA_IO|OH_SCCB_IO|HRW_SCC_ENABLE);
 553
 554	/* Let things settle */
 555	(void)MACIO_IN32(HEATHROW_FCR);
 556}
 557
 558static void heathrow_wakeup(struct macio_chip *macio, int secondary)
 559{
 560	if (secondary) {
 561		MACIO_OUT32(0x38, save_fcr[2]);
 562		(void)MACIO_IN32(0x38);
 563		mdelay(1);
 564		MACIO_OUT32(0x3c, save_fcr[3]);
 565		(void)MACIO_IN32(0x38);
 566		mdelay(10);
 567		dbdma_restore(macio, save_alt_dbdma);
 568	} else {
 569		MACIO_OUT32(0x38, save_fcr[0] | HRW_IOBUS_ENABLE);
 570		(void)MACIO_IN32(0x38);
 571		mdelay(1);
 572		MACIO_OUT32(0x3c, save_fcr[1]);
 573		(void)MACIO_IN32(0x38);
 574		mdelay(1);
 575		MACIO_OUT32(0x34, save_mbcr);
 576		(void)MACIO_IN32(0x38);
 577		mdelay(10);
 578		dbdma_restore(macio, save_dbdma);
 579	}
 580}
 581
 582static long heathrow_sleep_state(struct device_node *node, long param,
 583				 long value)
 584{
 585	if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0)
 586		return -EPERM;
 587	if (value == 1) {
 588		if (macio_chips[1].type == macio_gatwick)
 589			heathrow_sleep(&macio_chips[0], 1);
 590		heathrow_sleep(&macio_chips[0], 0);
 591	} else if (value == 0) {
 592		heathrow_wakeup(&macio_chips[0], 0);
 593		if (macio_chips[1].type == macio_gatwick)
 594			heathrow_wakeup(&macio_chips[0], 1);
 595	}
 596	return 0;
 597}
 598
 599static long core99_scc_enable(struct device_node *node, long param, long value)
 600{
 601	struct macio_chip*	macio;
 602	unsigned long		flags;
 603	unsigned long		chan_mask;
 604	u32			fcr;
 605
 606	macio = macio_find(node, 0);
 607	if (!macio)
 608		return -ENODEV;
 609	if (of_node_name_eq(node, "ch-a"))
 610		chan_mask = MACIO_FLAG_SCCA_ON;
 611	else if (of_node_name_eq(node, "ch-b"))
 612		chan_mask = MACIO_FLAG_SCCB_ON;
 613	else
 614		return -ENODEV;
 615
 616	if (value) {
 617		int need_reset_scc = 0;
 618		int need_reset_irda = 0;
 619
 620		LOCK(flags);
 621		fcr = MACIO_IN32(KEYLARGO_FCR0);
 622		/* Check if scc cell need enabling */
 623		if (!(fcr & KL0_SCC_CELL_ENABLE)) {
 624			fcr |= KL0_SCC_CELL_ENABLE;
 625			need_reset_scc = 1;
 626		}
 627		if (chan_mask & MACIO_FLAG_SCCA_ON) {
 628			fcr |= KL0_SCCA_ENABLE;
 629			/* Don't enable line drivers for I2S modem */
 630			if ((param & 0xfff) == PMAC_SCC_I2S1)
 631				fcr &= ~KL0_SCC_A_INTF_ENABLE;
 632			else
 633				fcr |= KL0_SCC_A_INTF_ENABLE;
 634		}
 635		if (chan_mask & MACIO_FLAG_SCCB_ON) {
 636			fcr |= KL0_SCCB_ENABLE;
 637			/* Perform irda specific inits */
 638			if ((param & 0xfff) == PMAC_SCC_IRDA) {
 639				fcr &= ~KL0_SCC_B_INTF_ENABLE;
 640				fcr |= KL0_IRDA_ENABLE;
 641				fcr |= KL0_IRDA_CLK32_ENABLE | KL0_IRDA_CLK19_ENABLE;
 642				fcr |= KL0_IRDA_SOURCE1_SEL;
 643				fcr &= ~(KL0_IRDA_FAST_CONNECT|KL0_IRDA_DEFAULT1|KL0_IRDA_DEFAULT0);
 644				fcr &= ~(KL0_IRDA_SOURCE2_SEL|KL0_IRDA_HIGH_BAND);
 645				need_reset_irda = 1;
 646			} else
 647				fcr |= KL0_SCC_B_INTF_ENABLE;
 648		}
 649		MACIO_OUT32(KEYLARGO_FCR0, fcr);
 650		macio->flags |= chan_mask;
 651		if (need_reset_scc)  {
 652			MACIO_BIS(KEYLARGO_FCR0, KL0_SCC_RESET);
 653			(void)MACIO_IN32(KEYLARGO_FCR0);
 654			UNLOCK(flags);
 655			mdelay(15);
 656			LOCK(flags);
 657			MACIO_BIC(KEYLARGO_FCR0, KL0_SCC_RESET);
 658		}
 659		if (need_reset_irda)  {
 660			MACIO_BIS(KEYLARGO_FCR0, KL0_IRDA_RESET);
 661			(void)MACIO_IN32(KEYLARGO_FCR0);
 662			UNLOCK(flags);
 663			mdelay(15);
 664			LOCK(flags);
 665			MACIO_BIC(KEYLARGO_FCR0, KL0_IRDA_RESET);
 666		}
 667		UNLOCK(flags);
 668		if (param & PMAC_SCC_FLAG_XMON)
 669			macio->flags |= MACIO_FLAG_SCC_LOCKED;
 670	} else {
 671		if (macio->flags & MACIO_FLAG_SCC_LOCKED)
 672			return -EPERM;
 673		LOCK(flags);
 674		fcr = MACIO_IN32(KEYLARGO_FCR0);
 675		if (chan_mask & MACIO_FLAG_SCCA_ON)
 676			fcr &= ~KL0_SCCA_ENABLE;
 677		if (chan_mask & MACIO_FLAG_SCCB_ON) {
 678			fcr &= ~KL0_SCCB_ENABLE;
 679			/* Perform irda specific clears */
 680			if ((param & 0xfff) == PMAC_SCC_IRDA) {
 681				fcr &= ~KL0_IRDA_ENABLE;
 682				fcr &= ~(KL0_IRDA_CLK32_ENABLE | KL0_IRDA_CLK19_ENABLE);
 683				fcr &= ~(KL0_IRDA_FAST_CONNECT|KL0_IRDA_DEFAULT1|KL0_IRDA_DEFAULT0);
 684				fcr &= ~(KL0_IRDA_SOURCE1_SEL|KL0_IRDA_SOURCE2_SEL|KL0_IRDA_HIGH_BAND);
 685			}
 686		}
 687		MACIO_OUT32(KEYLARGO_FCR0, fcr);
 688		if ((fcr & (KL0_SCCA_ENABLE | KL0_SCCB_ENABLE)) == 0) {
 689			fcr &= ~KL0_SCC_CELL_ENABLE;
 690			MACIO_OUT32(KEYLARGO_FCR0, fcr);
 691		}
 692		macio->flags &= ~(chan_mask);
 693		UNLOCK(flags);
 694		mdelay(10);
 695	}
 696	return 0;
 697}
 698
 699static long
 700core99_modem_enable(struct device_node *node, long param, long value)
 701{
 702	struct macio_chip*	macio;
 703	u8			gpio;
 704	unsigned long		flags;
 705
 706	/* Hack for internal USB modem */
 707	if (node == NULL) {
 708		if (macio_chips[0].type != macio_keylargo)
 709			return -ENODEV;
 710		node = macio_chips[0].of_node;
 711	}
 712	macio = macio_find(node, 0);
 713	if (!macio)
 714		return -ENODEV;
 715	gpio = MACIO_IN8(KL_GPIO_MODEM_RESET);
 716	gpio |= KEYLARGO_GPIO_OUTPUT_ENABLE;
 717	gpio &= ~KEYLARGO_GPIO_OUTOUT_DATA;
 718
 719	if (!value) {
 720		LOCK(flags);
 721		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 722		UNLOCK(flags);
 723		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 724		mdelay(250);
 725	}
 726	LOCK(flags);
 727	if (value) {
 728		MACIO_BIC(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
 729		UNLOCK(flags);
 730		(void)MACIO_IN32(KEYLARGO_FCR2);
 731		mdelay(250);
 732	} else {
 733		MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
 734		UNLOCK(flags);
 735	}
 736	if (value) {
 737		LOCK(flags);
 738		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 739		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 740		UNLOCK(flags); mdelay(250); LOCK(flags);
 741		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 742		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 743		UNLOCK(flags); mdelay(250); LOCK(flags);
 744		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 745		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 746		UNLOCK(flags); mdelay(250);
 747	}
 748	return 0;
 749}
 750
 751static long
 752pangea_modem_enable(struct device_node *node, long param, long value)
 753{
 754	struct macio_chip*	macio;
 755	u8			gpio;
 756	unsigned long		flags;
 757
 758	/* Hack for internal USB modem */
 759	if (node == NULL) {
 760		if (macio_chips[0].type != macio_pangea &&
 761		    macio_chips[0].type != macio_intrepid)
 762			return -ENODEV;
 763		node = macio_chips[0].of_node;
 764	}
 765	macio = macio_find(node, 0);
 766	if (!macio)
 767		return -ENODEV;
 768	gpio = MACIO_IN8(KL_GPIO_MODEM_RESET);
 769	gpio |= KEYLARGO_GPIO_OUTPUT_ENABLE;
 770	gpio &= ~KEYLARGO_GPIO_OUTOUT_DATA;
 771
 772	if (!value) {
 773		LOCK(flags);
 774		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 775		UNLOCK(flags);
 776		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 777		mdelay(250);
 778	}
 779	LOCK(flags);
 780	if (value) {
 781		MACIO_OUT8(KL_GPIO_MODEM_POWER,
 782			KEYLARGO_GPIO_OUTPUT_ENABLE);
 783		UNLOCK(flags);
 784		(void)MACIO_IN32(KEYLARGO_FCR2);
 785		mdelay(250);
 786	} else {
 787		MACIO_OUT8(KL_GPIO_MODEM_POWER,
 788			KEYLARGO_GPIO_OUTPUT_ENABLE | KEYLARGO_GPIO_OUTOUT_DATA);
 789		UNLOCK(flags);
 790	}
 791	if (value) {
 792		LOCK(flags);
 793		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 794		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 795		UNLOCK(flags); mdelay(250); LOCK(flags);
 796		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio);
 797		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 798		UNLOCK(flags); mdelay(250); LOCK(flags);
 799		MACIO_OUT8(KL_GPIO_MODEM_RESET, gpio | KEYLARGO_GPIO_OUTOUT_DATA);
 800		(void)MACIO_IN8(KL_GPIO_MODEM_RESET);
 801		UNLOCK(flags); mdelay(250);
 802	}
 803	return 0;
 804}
 805
 806static long
 807core99_ata100_enable(struct device_node *node, long value)
 808{
 809	unsigned long flags;
 810	struct pci_dev *pdev = NULL;
 811	u8 pbus, pid;
 812	int rc;
 813
 814	if (uninorth_rev < 0x24)
 815		return -ENODEV;
 816
 817	LOCK(flags);
 818	if (value)
 819		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_ATA100);
 820	else
 821		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_ATA100);
 822	(void)UN_IN(UNI_N_CLOCK_CNTL);
 823	UNLOCK(flags);
 824	udelay(20);
 825
 826	if (value) {
 827		if (pci_device_from_OF_node(node, &pbus, &pid) == 0)
 828			pdev = pci_get_domain_bus_and_slot(0, pbus, pid);
 829		if (pdev == NULL)
 830			return 0;
 831		rc = pci_enable_device(pdev);
 832		if (rc == 0)
 833			pci_set_master(pdev);
 834		pci_dev_put(pdev);
 835		if (rc)
 836			return rc;
 837	}
 838	return 0;
 839}
 840
 841static long
 842core99_ide_enable(struct device_node *node, long param, long value)
 843{
 844	/* Bus ID 0 to 2 are KeyLargo based IDE, busID 3 is U2
 845	 * based ata-100
 846	 */
 847	switch(param) {
 848	    case 0:
 849		return simple_feature_tweak(node, macio_unknown,
 850			KEYLARGO_FCR1, KL1_EIDE0_ENABLE, value);
 851	    case 1:
 852		return simple_feature_tweak(node, macio_unknown,
 853			KEYLARGO_FCR1, KL1_EIDE1_ENABLE, value);
 854	    case 2:
 855		return simple_feature_tweak(node, macio_unknown,
 856			KEYLARGO_FCR1, KL1_UIDE_ENABLE, value);
 857	    case 3:
 858		return core99_ata100_enable(node, value);
 859	    default:
 860		return -ENODEV;
 861	}
 862}
 863
 864static long
 865core99_ide_reset(struct device_node *node, long param, long value)
 866{
 867	switch(param) {
 868	    case 0:
 869		return simple_feature_tweak(node, macio_unknown,
 870			KEYLARGO_FCR1, KL1_EIDE0_RESET_N, !value);
 871	    case 1:
 872		return simple_feature_tweak(node, macio_unknown,
 873			KEYLARGO_FCR1, KL1_EIDE1_RESET_N, !value);
 874	    case 2:
 875		return simple_feature_tweak(node, macio_unknown,
 876			KEYLARGO_FCR1, KL1_UIDE_RESET_N, !value);
 877	    default:
 878		return -ENODEV;
 879	}
 880}
 881
 882static long
 883core99_gmac_enable(struct device_node *node, long param, long value)
 884{
 885	unsigned long flags;
 886
 887	LOCK(flags);
 888	if (value)
 889		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_GMAC);
 890	else
 891		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_GMAC);
 892	(void)UN_IN(UNI_N_CLOCK_CNTL);
 893	UNLOCK(flags);
 894	udelay(20);
 895
 896	return 0;
 897}
 898
 899static long
 900core99_gmac_phy_reset(struct device_node *node, long param, long value)
 901{
 902	unsigned long flags;
 903	struct macio_chip *macio;
 904
 905	macio = &macio_chips[0];
 906	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
 907	    macio->type != macio_intrepid)
 908		return -ENODEV;
 909
 910	LOCK(flags);
 911	MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);
 912	(void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);
 913	UNLOCK(flags);
 914	mdelay(10);
 915	LOCK(flags);
 916	MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */
 917		KEYLARGO_GPIO_OUTOUT_DATA);
 918	UNLOCK(flags);
 919	mdelay(10);
 920
 921	return 0;
 922}
 923
 924static long
 925core99_sound_chip_enable(struct device_node *node, long param, long value)
 926{
 927	struct macio_chip*	macio;
 928	unsigned long		flags;
 929
 930	macio = macio_find(node, 0);
 931	if (!macio)
 932		return -ENODEV;
 933
 934	/* Do a better probe code, screamer G4 desktops &
 935	 * iMacs can do that too, add a recalibrate  in
 936	 * the driver as well
 937	 */
 938	if (pmac_mb.model_id == PMAC_TYPE_PISMO ||
 939	    pmac_mb.model_id == PMAC_TYPE_TITANIUM) {
 940		LOCK(flags);
 941		if (value)
 942			MACIO_OUT8(KL_GPIO_SOUND_POWER,
 943				KEYLARGO_GPIO_OUTPUT_ENABLE |
 944				KEYLARGO_GPIO_OUTOUT_DATA);
 945		else
 946			MACIO_OUT8(KL_GPIO_SOUND_POWER,
 947				KEYLARGO_GPIO_OUTPUT_ENABLE);
 948		(void)MACIO_IN8(KL_GPIO_SOUND_POWER);
 949		UNLOCK(flags);
 950	}
 951	return 0;
 952}
 953
 954static long
 955core99_airport_enable(struct device_node *node, long param, long value)
 956{
 957	struct macio_chip*	macio;
 958	unsigned long		flags;
 959	int			state;
 960
 961	macio = macio_find(node, 0);
 962	if (!macio)
 963		return -ENODEV;
 964
 965	/* Hint: we allow passing of macio itself for the sake of the
 966	 * sleep code
 967	 */
 968	if (node != macio->of_node &&
 969	    (!node->parent || node->parent != macio->of_node))
 970		return -ENODEV;
 971	state = (macio->flags & MACIO_FLAG_AIRPORT_ON) != 0;
 972	if (value == state)
 973		return 0;
 974	if (value) {
 975		/* This code is a reproduction of OF enable-cardslot
 976		 * and init-wireless methods, slightly hacked until
 977		 * I got it working.
 978		 */
 979		LOCK(flags);
 980		MACIO_OUT8(KEYLARGO_GPIO_0+0xf, 5);
 981		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xf);
 982		UNLOCK(flags);
 983		mdelay(10);
 984		LOCK(flags);
 985		MACIO_OUT8(KEYLARGO_GPIO_0+0xf, 4);
 986		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xf);
 987		UNLOCK(flags);
 988
 989		mdelay(10);
 990
 991		LOCK(flags);
 992		MACIO_BIC(KEYLARGO_FCR2, KL2_CARDSEL_16);
 993		(void)MACIO_IN32(KEYLARGO_FCR2);
 994		udelay(10);
 995		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xb, 0);
 996		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xb);
 997		udelay(10);
 998		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xa, 0x28);
 999		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xa);
1000		udelay(10);
1001		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+0xd, 0x28);
1002		(void)MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+0xd);
1003		udelay(10);
1004		MACIO_OUT8(KEYLARGO_GPIO_0+0xd, 0x28);
1005		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xd);
1006		udelay(10);
1007		MACIO_OUT8(KEYLARGO_GPIO_0+0xe, 0x28);
1008		(void)MACIO_IN8(KEYLARGO_GPIO_0+0xe);
1009		UNLOCK(flags);
1010		udelay(10);
1011		MACIO_OUT32(0x1c000, 0);
1012		mdelay(1);
1013		MACIO_OUT8(0x1a3e0, 0x41);
1014		(void)MACIO_IN8(0x1a3e0);
1015		udelay(10);
1016		LOCK(flags);
1017		MACIO_BIS(KEYLARGO_FCR2, KL2_CARDSEL_16);
1018		(void)MACIO_IN32(KEYLARGO_FCR2);
1019		UNLOCK(flags);
1020		mdelay(100);
1021
1022		macio->flags |= MACIO_FLAG_AIRPORT_ON;
1023	} else {
1024		LOCK(flags);
1025		MACIO_BIC(KEYLARGO_FCR2, KL2_CARDSEL_16);
1026		(void)MACIO_IN32(KEYLARGO_FCR2);
1027		MACIO_OUT8(KL_GPIO_AIRPORT_0, 0);
1028		MACIO_OUT8(KL_GPIO_AIRPORT_1, 0);
1029		MACIO_OUT8(KL_GPIO_AIRPORT_2, 0);
1030		MACIO_OUT8(KL_GPIO_AIRPORT_3, 0);
1031		MACIO_OUT8(KL_GPIO_AIRPORT_4, 0);
1032		(void)MACIO_IN8(KL_GPIO_AIRPORT_4);
1033		UNLOCK(flags);
1034
1035		macio->flags &= ~MACIO_FLAG_AIRPORT_ON;
1036	}
1037	return 0;
1038}
1039
1040#ifdef CONFIG_SMP
1041static long
1042core99_reset_cpu(struct device_node *node, long param, long value)
1043{
1044	unsigned int reset_io = 0;
1045	unsigned long flags;
1046	struct macio_chip *macio;
1047	struct device_node *np;
 
1048	const int dflt_reset_lines[] = {	KL_GPIO_RESET_CPU0,
1049						KL_GPIO_RESET_CPU1,
1050						KL_GPIO_RESET_CPU2,
1051						KL_GPIO_RESET_CPU3 };
1052
1053	macio = &macio_chips[0];
1054	if (macio->type != macio_keylargo)
1055		return -ENODEV;
1056
1057	for_each_of_cpu_node(np) {
 
 
 
 
1058		const u32 *rst = of_get_property(np, "soft-reset", NULL);
1059		if (!rst)
1060			continue;
1061		if (param == of_get_cpu_hwid(np, 0)) {
1062			of_node_put(np);
1063			reset_io = *rst;
1064			break;
1065		}
1066	}
 
1067	if (np == NULL || reset_io == 0)
1068		reset_io = dflt_reset_lines[param];
1069
1070	LOCK(flags);
1071	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE);
1072	(void)MACIO_IN8(reset_io);
1073	udelay(1);
1074	MACIO_OUT8(reset_io, 0);
1075	(void)MACIO_IN8(reset_io);
1076	UNLOCK(flags);
1077
1078	return 0;
1079}
1080#endif /* CONFIG_SMP */
1081
1082static long
1083core99_usb_enable(struct device_node *node, long param, long value)
1084{
1085	struct macio_chip *macio;
1086	unsigned long flags;
1087	const char *prop;
1088	int number;
1089	u32 reg;
1090
1091	macio = &macio_chips[0];
1092	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1093	    macio->type != macio_intrepid)
1094		return -ENODEV;
1095
1096	prop = of_get_property(node, "AAPL,clock-id", NULL);
1097	if (!prop)
1098		return -ENODEV;
1099	if (strncmp(prop, "usb0u048", 8) == 0)
1100		number = 0;
1101	else if (strncmp(prop, "usb1u148", 8) == 0)
1102		number = 2;
1103	else if (strncmp(prop, "usb2u248", 8) == 0)
1104		number = 4;
1105	else
1106		return -ENODEV;
1107
1108	/* Sorry for the brute-force locking, but this is only used during
1109	 * sleep and the timing seem to be critical
1110	 */
1111	LOCK(flags);
1112	if (value) {
1113		/* Turn ON */
1114		if (number == 0) {
1115			MACIO_BIC(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1));
1116			(void)MACIO_IN32(KEYLARGO_FCR0);
1117			UNLOCK(flags);
1118			mdelay(1);
1119			LOCK(flags);
1120			MACIO_BIS(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE);
1121		} else if (number == 2) {
1122			MACIO_BIC(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1));
1123			UNLOCK(flags);
1124			(void)MACIO_IN32(KEYLARGO_FCR0);
1125			mdelay(1);
1126			LOCK(flags);
1127			MACIO_BIS(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE);
1128		} else if (number == 4) {
1129			MACIO_BIC(KEYLARGO_FCR1, (KL1_USB2_PAD_SUSPEND0 | KL1_USB2_PAD_SUSPEND1));
1130			UNLOCK(flags);
1131			(void)MACIO_IN32(KEYLARGO_FCR1);
1132			mdelay(1);
1133			LOCK(flags);
1134			MACIO_BIS(KEYLARGO_FCR1, KL1_USB2_CELL_ENABLE);
1135		}
1136		if (number < 4) {
1137			reg = MACIO_IN32(KEYLARGO_FCR4);
1138			reg &=	~(KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) |
1139				KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number));
1140			reg &=	~(KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) |
1141				KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1));
1142			MACIO_OUT32(KEYLARGO_FCR4, reg);
1143			(void)MACIO_IN32(KEYLARGO_FCR4);
1144			udelay(10);
1145		} else {
1146			reg = MACIO_IN32(KEYLARGO_FCR3);
1147			reg &=	~(KL3_IT_PORT_WAKEUP_ENABLE(0) | KL3_IT_PORT_RESUME_WAKE_EN(0) |
1148				KL3_IT_PORT_CONNECT_WAKE_EN(0) | KL3_IT_PORT_DISCONNECT_WAKE_EN(0));
1149			reg &=	~(KL3_IT_PORT_WAKEUP_ENABLE(1) | KL3_IT_PORT_RESUME_WAKE_EN(1) |
1150				KL3_IT_PORT_CONNECT_WAKE_EN(1) | KL3_IT_PORT_DISCONNECT_WAKE_EN(1));
1151			MACIO_OUT32(KEYLARGO_FCR3, reg);
1152			(void)MACIO_IN32(KEYLARGO_FCR3);
1153			udelay(10);
1154		}
1155		if (macio->type == macio_intrepid) {
1156			/* wait for clock stopped bits to clear */
1157			u32 test0 = 0, test1 = 0;
1158			u32 status0, status1;
1159			int timeout = 1000;
1160
1161			UNLOCK(flags);
1162			switch (number) {
1163			case 0:
1164				test0 = UNI_N_CLOCK_STOPPED_USB0;
1165				test1 = UNI_N_CLOCK_STOPPED_USB0PCI;
1166				break;
1167			case 2:
1168				test0 = UNI_N_CLOCK_STOPPED_USB1;
1169				test1 = UNI_N_CLOCK_STOPPED_USB1PCI;
1170				break;
1171			case 4:
1172				test0 = UNI_N_CLOCK_STOPPED_USB2;
1173				test1 = UNI_N_CLOCK_STOPPED_USB2PCI;
1174				break;
1175			}
1176			do {
1177				if (--timeout <= 0) {
1178					printk(KERN_ERR "core99_usb_enable: "
1179					       "Timeout waiting for clocks\n");
1180					break;
1181				}
1182				mdelay(1);
1183				status0 = UN_IN(UNI_N_CLOCK_STOP_STATUS0);
1184				status1 = UN_IN(UNI_N_CLOCK_STOP_STATUS1);
1185			} while ((status0 & test0) | (status1 & test1));
1186			LOCK(flags);
1187		}
1188	} else {
1189		/* Turn OFF */
1190		if (number < 4) {
1191			reg = MACIO_IN32(KEYLARGO_FCR4);
1192			reg |=	KL4_PORT_WAKEUP_ENABLE(number) | KL4_PORT_RESUME_WAKE_EN(number) |
1193				KL4_PORT_CONNECT_WAKE_EN(number) | KL4_PORT_DISCONNECT_WAKE_EN(number);
1194			reg |=	KL4_PORT_WAKEUP_ENABLE(number+1) | KL4_PORT_RESUME_WAKE_EN(number+1) |
1195				KL4_PORT_CONNECT_WAKE_EN(number+1) | KL4_PORT_DISCONNECT_WAKE_EN(number+1);
1196			MACIO_OUT32(KEYLARGO_FCR4, reg);
1197			(void)MACIO_IN32(KEYLARGO_FCR4);
1198			udelay(1);
1199		} else {
1200			reg = MACIO_IN32(KEYLARGO_FCR3);
1201			reg |=	KL3_IT_PORT_WAKEUP_ENABLE(0) | KL3_IT_PORT_RESUME_WAKE_EN(0) |
1202				KL3_IT_PORT_CONNECT_WAKE_EN(0) | KL3_IT_PORT_DISCONNECT_WAKE_EN(0);
1203			reg |=	KL3_IT_PORT_WAKEUP_ENABLE(1) | KL3_IT_PORT_RESUME_WAKE_EN(1) |
1204				KL3_IT_PORT_CONNECT_WAKE_EN(1) | KL3_IT_PORT_DISCONNECT_WAKE_EN(1);
1205			MACIO_OUT32(KEYLARGO_FCR3, reg);
1206			(void)MACIO_IN32(KEYLARGO_FCR3);
1207			udelay(1);
1208		}
1209		if (number == 0) {
1210			if (macio->type != macio_intrepid)
1211				MACIO_BIC(KEYLARGO_FCR0, KL0_USB0_CELL_ENABLE);
1212			(void)MACIO_IN32(KEYLARGO_FCR0);
1213			udelay(1);
1214			MACIO_BIS(KEYLARGO_FCR0, (KL0_USB0_PAD_SUSPEND0 | KL0_USB0_PAD_SUSPEND1));
1215			(void)MACIO_IN32(KEYLARGO_FCR0);
1216		} else if (number == 2) {
1217			if (macio->type != macio_intrepid)
1218				MACIO_BIC(KEYLARGO_FCR0, KL0_USB1_CELL_ENABLE);
1219			(void)MACIO_IN32(KEYLARGO_FCR0);
1220			udelay(1);
1221			MACIO_BIS(KEYLARGO_FCR0, (KL0_USB1_PAD_SUSPEND0 | KL0_USB1_PAD_SUSPEND1));
1222			(void)MACIO_IN32(KEYLARGO_FCR0);
1223		} else if (number == 4) {
1224			udelay(1);
1225			MACIO_BIS(KEYLARGO_FCR1, (KL1_USB2_PAD_SUSPEND0 | KL1_USB2_PAD_SUSPEND1));
1226			(void)MACIO_IN32(KEYLARGO_FCR1);
1227		}
1228		udelay(1);
1229	}
1230	UNLOCK(flags);
1231
1232	return 0;
1233}
1234
1235static long
1236core99_firewire_enable(struct device_node *node, long param, long value)
1237{
1238	unsigned long flags;
1239	struct macio_chip *macio;
1240
1241	macio = &macio_chips[0];
1242	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1243	    macio->type != macio_intrepid)
1244		return -ENODEV;
1245	if (!(macio->flags & MACIO_FLAG_FW_SUPPORTED))
1246		return -ENODEV;
1247
1248	LOCK(flags);
1249	if (value) {
1250		UN_BIS(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_FW);
1251		(void)UN_IN(UNI_N_CLOCK_CNTL);
1252	} else {
1253		UN_BIC(UNI_N_CLOCK_CNTL, UNI_N_CLOCK_CNTL_FW);
1254		(void)UN_IN(UNI_N_CLOCK_CNTL);
1255	}
1256	UNLOCK(flags);
1257	mdelay(1);
1258
1259	return 0;
1260}
1261
1262static long
1263core99_firewire_cable_power(struct device_node *node, long param, long value)
1264{
1265	unsigned long flags;
1266	struct macio_chip *macio;
1267
1268	/* Trick: we allow NULL node */
1269	if ((pmac_mb.board_flags & PMAC_MB_HAS_FW_POWER) == 0)
1270		return -ENODEV;
1271	macio = &macio_chips[0];
1272	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1273	    macio->type != macio_intrepid)
1274		return -ENODEV;
1275	if (!(macio->flags & MACIO_FLAG_FW_SUPPORTED))
1276		return -ENODEV;
1277
1278	LOCK(flags);
1279	if (value) {
1280		MACIO_OUT8(KL_GPIO_FW_CABLE_POWER , 0);
1281		MACIO_IN8(KL_GPIO_FW_CABLE_POWER);
1282		udelay(10);
1283	} else {
1284		MACIO_OUT8(KL_GPIO_FW_CABLE_POWER , 4);
1285		MACIO_IN8(KL_GPIO_FW_CABLE_POWER); udelay(10);
1286	}
1287	UNLOCK(flags);
1288	mdelay(1);
1289
1290	return 0;
1291}
1292
1293static long
1294intrepid_aack_delay_enable(struct device_node *node, long param, long value)
1295{
1296	unsigned long flags;
1297
1298	if (uninorth_rev < 0xd2)
1299		return -ENODEV;
1300
1301	LOCK(flags);
1302	if (param)
1303		UN_BIS(UNI_N_AACK_DELAY, UNI_N_AACK_DELAY_ENABLE);
1304	else
1305		UN_BIC(UNI_N_AACK_DELAY, UNI_N_AACK_DELAY_ENABLE);
1306	UNLOCK(flags);
1307
1308	return 0;
1309}
1310
1311
1312#endif /* CONFIG_PPC64 */
1313
1314static long
1315core99_read_gpio(struct device_node *node, long param, long value)
1316{
1317	struct macio_chip *macio = &macio_chips[0];
1318
1319	return MACIO_IN8(param);
1320}
1321
1322
1323static long
1324core99_write_gpio(struct device_node *node, long param, long value)
1325{
1326	struct macio_chip *macio = &macio_chips[0];
1327
1328	MACIO_OUT8(param, (u8)(value & 0xff));
1329	return 0;
1330}
1331
1332#ifdef CONFIG_PPC64
1333static long g5_gmac_enable(struct device_node *node, long param, long value)
1334{
1335	struct macio_chip *macio = &macio_chips[0];
1336	unsigned long flags;
1337
1338	if (node == NULL)
1339		return -ENODEV;
1340
1341	LOCK(flags);
1342	if (value) {
1343		MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE);
1344		mb();
1345		k2_skiplist[0] = NULL;
1346	} else {
1347		k2_skiplist[0] = node;
1348		mb();
1349		MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_GMAC_CLK_ENABLE);
1350	}
1351	
1352	UNLOCK(flags);
1353	mdelay(1);
1354
1355	return 0;
1356}
1357
1358static long g5_fw_enable(struct device_node *node, long param, long value)
1359{
1360	struct macio_chip *macio = &macio_chips[0];
1361	unsigned long flags;
1362
1363	if (node == NULL)
1364		return -ENODEV;
1365
1366	LOCK(flags);
1367	if (value) {
1368		MACIO_BIS(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE);
1369		mb();
1370		k2_skiplist[1] = NULL;
1371	} else {
1372		k2_skiplist[1] = node;
1373		mb();
1374		MACIO_BIC(KEYLARGO_FCR1, K2_FCR1_FW_CLK_ENABLE);
1375	}
1376	
1377	UNLOCK(flags);
1378	mdelay(1);
1379
1380	return 0;
1381}
1382
1383static long g5_mpic_enable(struct device_node *node, long param, long value)
1384{
1385	unsigned long flags;
1386	struct device_node *parent = of_get_parent(node);
1387	int is_u3;
1388
1389	if (parent == NULL)
1390		return 0;
1391	is_u3 = of_node_name_eq(parent, "u3") || of_node_name_eq(parent, "u4");
 
1392	of_node_put(parent);
1393	if (!is_u3)
1394		return 0;
1395
1396	LOCK(flags);
1397	UN_BIS(U3_TOGGLE_REG, U3_MPIC_RESET | U3_MPIC_OUTPUT_ENABLE);
1398	UNLOCK(flags);
1399
1400	return 0;
1401}
1402
1403static long g5_eth_phy_reset(struct device_node *node, long param, long value)
1404{
1405	struct macio_chip *macio = &macio_chips[0];
1406	struct device_node *phy;
1407	int need_reset;
1408
1409	/*
1410	 * We must not reset the combo PHYs, only the BCM5221 found in
1411	 * the iMac G5.
1412	 */
1413	phy = of_get_next_child(node, NULL);
1414	if (!phy)
1415		return -ENODEV;
1416	need_reset = of_device_is_compatible(phy, "B5221");
1417	of_node_put(phy);
1418	if (!need_reset)
1419		return 0;
1420
1421	/* PHY reset is GPIO 29, not in device-tree unfortunately */
1422	MACIO_OUT8(K2_GPIO_EXTINT_0 + 29,
1423		   KEYLARGO_GPIO_OUTPUT_ENABLE | KEYLARGO_GPIO_OUTOUT_DATA);
1424	/* Thankfully, this is now always called at a time when we can
1425	 * schedule by sungem.
1426	 */
1427	msleep(10);
1428	MACIO_OUT8(K2_GPIO_EXTINT_0 + 29, 0);
1429
1430	return 0;
1431}
1432
1433static long g5_i2s_enable(struct device_node *node, long param, long value)
1434{
1435	/* Very crude implementation for now */
1436	struct macio_chip *macio = &macio_chips[0];
1437	unsigned long flags;
1438	int cell;
1439	u32 fcrs[3][3] = {
1440		{ 0,
1441		  K2_FCR1_I2S0_CELL_ENABLE |
1442		  K2_FCR1_I2S0_CLK_ENABLE_BIT | K2_FCR1_I2S0_ENABLE,
1443		  KL3_I2S0_CLK18_ENABLE
1444		},
1445		{ KL0_SCC_A_INTF_ENABLE,
1446		  K2_FCR1_I2S1_CELL_ENABLE |
1447		  K2_FCR1_I2S1_CLK_ENABLE_BIT | K2_FCR1_I2S1_ENABLE,
1448		  KL3_I2S1_CLK18_ENABLE
1449		},
1450		{ KL0_SCC_B_INTF_ENABLE,
1451		  SH_FCR1_I2S2_CELL_ENABLE |
1452		  SH_FCR1_I2S2_CLK_ENABLE_BIT | SH_FCR1_I2S2_ENABLE,
1453		  SH_FCR3_I2S2_CLK18_ENABLE
1454		},
1455	};
1456
1457	if (macio->type != macio_keylargo2 && macio->type != macio_shasta)
1458		return -ENODEV;
1459	if (strncmp(node->name, "i2s-", 4))
1460		return -ENODEV;
1461	cell = node->name[4] - 'a';
1462	switch(cell) {
1463	case 0:
1464	case 1:
1465		break;
1466	case 2:
1467		if (macio->type == macio_shasta)
1468			break;
1469		fallthrough;
1470	default:
1471		return -ENODEV;
1472	}
1473
1474	LOCK(flags);
1475	if (value) {
1476		MACIO_BIC(KEYLARGO_FCR0, fcrs[cell][0]);
1477		MACIO_BIS(KEYLARGO_FCR1, fcrs[cell][1]);
1478		MACIO_BIS(KEYLARGO_FCR3, fcrs[cell][2]);
1479	} else {
1480		MACIO_BIC(KEYLARGO_FCR3, fcrs[cell][2]);
1481		MACIO_BIC(KEYLARGO_FCR1, fcrs[cell][1]);
1482		MACIO_BIS(KEYLARGO_FCR0, fcrs[cell][0]);
1483	}
1484	udelay(10);
1485	UNLOCK(flags);
1486
1487	return 0;
1488}
1489
1490
1491#ifdef CONFIG_SMP
1492static long g5_reset_cpu(struct device_node *node, long param, long value)
1493{
1494	unsigned int reset_io = 0;
1495	unsigned long flags;
1496	struct macio_chip *macio;
1497	struct device_node *np;
 
1498
1499	macio = &macio_chips[0];
1500	if (macio->type != macio_keylargo2 && macio->type != macio_shasta)
1501		return -ENODEV;
1502
1503	for_each_of_cpu_node(np) {
 
 
 
 
1504		const u32 *rst = of_get_property(np, "soft-reset", NULL);
1505		if (!rst)
1506			continue;
1507		if (param == of_get_cpu_hwid(np, 0)) {
1508			of_node_put(np);
1509			reset_io = *rst;
1510			break;
1511		}
1512	}
 
1513	if (np == NULL || reset_io == 0)
1514		return -ENODEV;
1515
1516	LOCK(flags);
1517	MACIO_OUT8(reset_io, KEYLARGO_GPIO_OUTPUT_ENABLE);
1518	(void)MACIO_IN8(reset_io);
1519	udelay(1);
1520	MACIO_OUT8(reset_io, 0);
1521	(void)MACIO_IN8(reset_io);
1522	UNLOCK(flags);
1523
1524	return 0;
1525}
1526#endif /* CONFIG_SMP */
1527
1528/*
1529 * This can be called from pmac_smp so isn't static
1530 *
1531 * This takes the second CPU off the bus on dual CPU machines
1532 * running UP
1533 */
1534void __init g5_phy_disable_cpu1(void)
1535{
1536	if (uninorth_maj == 3)
1537		UN_OUT(U3_API_PHY_CONFIG_1, 0);
1538}
1539#endif /* CONFIG_PPC64 */
1540
1541#ifndef CONFIG_PPC64
1542
1543
1544#ifdef CONFIG_PM
1545static u32 save_gpio_levels[2];
1546static u8 save_gpio_extint[KEYLARGO_GPIO_EXTINT_CNT];
1547static u8 save_gpio_normal[KEYLARGO_GPIO_CNT];
1548static u32 save_unin_clock_ctl;
1549
1550static void keylargo_shutdown(struct macio_chip *macio, int sleep_mode)
1551{
1552	u32 temp;
1553
1554	if (sleep_mode) {
1555		mdelay(1);
1556		MACIO_BIS(KEYLARGO_FCR0, KL0_USB_REF_SUSPEND);
1557		(void)MACIO_IN32(KEYLARGO_FCR0);
1558		mdelay(1);
1559	}
1560
1561	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |
1562				KL0_SCC_CELL_ENABLE |
1563				KL0_IRDA_ENABLE | KL0_IRDA_CLK32_ENABLE |
1564				KL0_IRDA_CLK19_ENABLE);
1565
1566	MACIO_BIC(KEYLARGO_MBCR, KL_MBCR_MB0_DEV_MASK);
1567	MACIO_BIS(KEYLARGO_MBCR, KL_MBCR_MB0_IDE_ENABLE);
1568
1569	MACIO_BIC(KEYLARGO_FCR1,
1570		KL1_AUDIO_SEL_22MCLK | KL1_AUDIO_CLK_ENABLE_BIT |
1571		KL1_AUDIO_CLK_OUT_ENABLE | KL1_AUDIO_CELL_ENABLE |
1572		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |
1573		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |
1574		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |
1575		KL1_EIDE0_ENABLE | KL1_EIDE0_RESET_N |
1576		KL1_EIDE1_ENABLE | KL1_EIDE1_RESET_N |
1577		KL1_UIDE_ENABLE);
1578
1579	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
1580	MACIO_BIC(KEYLARGO_FCR2, KL2_IOBUS_ENABLE);
1581
1582	temp = MACIO_IN32(KEYLARGO_FCR3);
1583	if (macio->rev >= 2) {
1584		temp |= KL3_SHUTDOWN_PLL2X;
1585		if (sleep_mode)
1586			temp |= KL3_SHUTDOWN_PLL_TOTAL;
1587	}
1588
1589	temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |
1590		KL3_SHUTDOWN_PLLKW35;
1591	if (sleep_mode)
1592		temp |= KL3_SHUTDOWN_PLLKW12;
1593	temp &= ~(KL3_CLK66_ENABLE | KL3_CLK49_ENABLE | KL3_CLK45_ENABLE
1594		| KL3_CLK31_ENABLE | KL3_I2S1_CLK18_ENABLE | KL3_I2S0_CLK18_ENABLE);
1595	if (sleep_mode)
1596		temp &= ~(KL3_TIMER_CLK18_ENABLE | KL3_VIA_CLK16_ENABLE);
1597	MACIO_OUT32(KEYLARGO_FCR3, temp);
1598
1599	/* Flush posted writes & wait a bit */
1600	(void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1);
1601}
1602
1603static void pangea_shutdown(struct macio_chip *macio, int sleep_mode)
1604{
1605	u32 temp;
1606
1607	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |
1608				KL0_SCC_CELL_ENABLE |
1609				KL0_USB0_CELL_ENABLE | KL0_USB1_CELL_ENABLE);
1610
1611	MACIO_BIC(KEYLARGO_FCR1,
1612		KL1_AUDIO_SEL_22MCLK | KL1_AUDIO_CLK_ENABLE_BIT |
1613		KL1_AUDIO_CLK_OUT_ENABLE | KL1_AUDIO_CELL_ENABLE |
1614		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |
1615		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |
1616		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |
1617		KL1_UIDE_ENABLE);
1618	if (pmac_mb.board_flags & PMAC_MB_MOBILE)
1619		MACIO_BIC(KEYLARGO_FCR1, KL1_UIDE_RESET_N);
1620
1621	MACIO_BIS(KEYLARGO_FCR2, KL2_ALT_DATA_OUT);
1622
1623	temp = MACIO_IN32(KEYLARGO_FCR3);
1624	temp |= KL3_SHUTDOWN_PLLKW6 | KL3_SHUTDOWN_PLLKW4 |
1625		KL3_SHUTDOWN_PLLKW35;
1626	temp &= ~(KL3_CLK49_ENABLE | KL3_CLK45_ENABLE | KL3_CLK31_ENABLE
1627		| KL3_I2S0_CLK18_ENABLE | KL3_I2S1_CLK18_ENABLE);
1628	if (sleep_mode)
1629		temp &= ~(KL3_VIA_CLK16_ENABLE | KL3_TIMER_CLK18_ENABLE);
1630	MACIO_OUT32(KEYLARGO_FCR3, temp);
1631
1632	/* Flush posted writes & wait a bit */
1633	(void)MACIO_IN32(KEYLARGO_FCR0); mdelay(1);
1634}
1635
1636static void intrepid_shutdown(struct macio_chip *macio, int sleep_mode)
1637{
1638	u32 temp;
1639
1640	MACIO_BIC(KEYLARGO_FCR0,KL0_SCCA_ENABLE | KL0_SCCB_ENABLE |
1641		  KL0_SCC_CELL_ENABLE);
1642
1643	MACIO_BIC(KEYLARGO_FCR1,
1644		KL1_I2S0_CELL_ENABLE | KL1_I2S0_CLK_ENABLE_BIT |
1645		KL1_I2S0_ENABLE | KL1_I2S1_CELL_ENABLE |
1646		KL1_I2S1_CLK_ENABLE_BIT | KL1_I2S1_ENABLE |
1647		KL1_EIDE0_ENABLE);
1648	if (pmac_mb.board_flags & PMAC_MB_MOBILE)
1649		MACIO_BIC(KEYLARGO_FCR1, KL1_UIDE_RESET_N);
1650
1651	temp = MACIO_IN32(KEYLARGO_FCR3);
1652	temp &= ~(KL3_CLK49_ENABLE | KL3_CLK45_ENABLE |
1653		  KL3_I2S1_CLK18_ENABLE | KL3_I2S0_CLK18_ENABLE);
1654	if (sleep_mode)
1655		temp &= ~(KL3_TIMER_CLK18_ENABLE | KL3_IT_VIA_CLK32_ENABLE);
1656	MACIO_OUT32(KEYLARGO_FCR3, temp);
1657
1658	/* Flush posted writes & wait a bit */
1659	(void)MACIO_IN32(KEYLARGO_FCR0);
1660	mdelay(10);
1661}
1662
1663
1664static int
1665core99_sleep(void)
1666{
1667	struct macio_chip *macio;
1668	int i;
1669
1670	macio = &macio_chips[0];
1671	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1672	    macio->type != macio_intrepid)
1673		return -ENODEV;
1674
1675	/* We power off the wireless slot in case it was not done
1676	 * by the driver. We don't power it on automatically however
1677	 */
1678	if (macio->flags & MACIO_FLAG_AIRPORT_ON)
1679		core99_airport_enable(macio->of_node, 0, 0);
1680
1681	/* We power off the FW cable. Should be done by the driver... */
1682	if (macio->flags & MACIO_FLAG_FW_SUPPORTED) {
1683		core99_firewire_enable(NULL, 0, 0);
1684		core99_firewire_cable_power(NULL, 0, 0);
1685	}
1686
1687	/* We make sure int. modem is off (in case driver lost it) */
1688	if (macio->type == macio_keylargo)
1689		core99_modem_enable(macio->of_node, 0, 0);
1690	else
1691		pangea_modem_enable(macio->of_node, 0, 0);
1692
1693	/* We make sure the sound is off as well */
1694	core99_sound_chip_enable(macio->of_node, 0, 0);
1695
1696	/*
1697	 * Save various bits of KeyLargo
1698	 */
1699
1700	/* Save the state of the various GPIOs */
1701	save_gpio_levels[0] = MACIO_IN32(KEYLARGO_GPIO_LEVELS0);
1702	save_gpio_levels[1] = MACIO_IN32(KEYLARGO_GPIO_LEVELS1);
1703	for (i=0; i<KEYLARGO_GPIO_EXTINT_CNT; i++)
1704		save_gpio_extint[i] = MACIO_IN8(KEYLARGO_GPIO_EXTINT_0+i);
1705	for (i=0; i<KEYLARGO_GPIO_CNT; i++)
1706		save_gpio_normal[i] = MACIO_IN8(KEYLARGO_GPIO_0+i);
1707
1708	/* Save the FCRs */
1709	if (macio->type == macio_keylargo)
1710		save_mbcr = MACIO_IN32(KEYLARGO_MBCR);
1711	save_fcr[0] = MACIO_IN32(KEYLARGO_FCR0);
1712	save_fcr[1] = MACIO_IN32(KEYLARGO_FCR1);
1713	save_fcr[2] = MACIO_IN32(KEYLARGO_FCR2);
1714	save_fcr[3] = MACIO_IN32(KEYLARGO_FCR3);
1715	save_fcr[4] = MACIO_IN32(KEYLARGO_FCR4);
1716	if (macio->type == macio_pangea || macio->type == macio_intrepid)
1717		save_fcr[5] = MACIO_IN32(KEYLARGO_FCR5);
1718
1719	/* Save state & config of DBDMA channels */
1720	dbdma_save(macio, save_dbdma);
1721
1722	/*
1723	 * Turn off as much as we can
1724	 */
1725	if (macio->type == macio_pangea)
1726		pangea_shutdown(macio, 1);
1727	else if (macio->type == macio_intrepid)
1728		intrepid_shutdown(macio, 1);
1729	else if (macio->type == macio_keylargo)
1730		keylargo_shutdown(macio, 1);
1731
1732	/*
1733	 * Put the host bridge to sleep
1734	 */
1735
1736	save_unin_clock_ctl = UN_IN(UNI_N_CLOCK_CNTL);
1737	/* Note: do not switch GMAC off, driver does it when necessary, WOL must keep it
1738	 * enabled !
1739	 */
1740	UN_OUT(UNI_N_CLOCK_CNTL, save_unin_clock_ctl &
1741	       ~(/*UNI_N_CLOCK_CNTL_GMAC|*/UNI_N_CLOCK_CNTL_FW/*|UNI_N_CLOCK_CNTL_PCI*/));
1742	udelay(100);
1743	UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_SLEEPING);
1744	UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_SLEEP);
1745	mdelay(10);
1746
1747	/*
1748	 * FIXME: A bit of black magic with OpenPIC (don't ask me why)
1749	 */
1750	if (pmac_mb.model_id == PMAC_TYPE_SAWTOOTH) {
1751		MACIO_BIS(0x506e0, 0x00400000);
1752		MACIO_BIS(0x506e0, 0x80000000);
1753	}
1754	return 0;
1755}
1756
1757static int
1758core99_wake_up(void)
1759{
1760	struct macio_chip *macio;
1761	int i;
1762
1763	macio = &macio_chips[0];
1764	if (macio->type != macio_keylargo && macio->type != macio_pangea &&
1765	    macio->type != macio_intrepid)
1766		return -ENODEV;
1767
1768	/*
1769	 * Wakeup the host bridge
1770	 */
1771	UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_NORMAL);
1772	udelay(10);
1773	UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_RUNNING);
1774	udelay(10);
1775
1776	/*
1777	 * Restore KeyLargo
1778	 */
1779
1780	if (macio->type == macio_keylargo) {
1781		MACIO_OUT32(KEYLARGO_MBCR, save_mbcr);
1782		(void)MACIO_IN32(KEYLARGO_MBCR); udelay(10);
1783	}
1784	MACIO_OUT32(KEYLARGO_FCR0, save_fcr[0]);
1785	(void)MACIO_IN32(KEYLARGO_FCR0); udelay(10);
1786	MACIO_OUT32(KEYLARGO_FCR1, save_fcr[1]);
1787	(void)MACIO_IN32(KEYLARGO_FCR1); udelay(10);
1788	MACIO_OUT32(KEYLARGO_FCR2, save_fcr[2]);
1789	(void)MACIO_IN32(KEYLARGO_FCR2); udelay(10);
1790	MACIO_OUT32(KEYLARGO_FCR3, save_fcr[3]);
1791	(void)MACIO_IN32(KEYLARGO_FCR3); udelay(10);
1792	MACIO_OUT32(KEYLARGO_FCR4, save_fcr[4]);
1793	(void)MACIO_IN32(KEYLARGO_FCR4); udelay(10);
1794	if (macio->type == macio_pangea || macio->type == macio_intrepid) {
1795		MACIO_OUT32(KEYLARGO_FCR5, save_fcr[5]);
1796		(void)MACIO_IN32(KEYLARGO_FCR5); udelay(10);
1797	}
1798
1799	dbdma_restore(macio, save_dbdma);
1800
1801	MACIO_OUT32(KEYLARGO_GPIO_LEVELS0, save_gpio_levels[0]);
1802	MACIO_OUT32(KEYLARGO_GPIO_LEVELS1, save_gpio_levels[1]);
1803	for (i=0; i<KEYLARGO_GPIO_EXTINT_CNT; i++)
1804		MACIO_OUT8(KEYLARGO_GPIO_EXTINT_0+i, save_gpio_extint[i]);
1805	for (i=0; i<KEYLARGO_GPIO_CNT; i++)
1806		MACIO_OUT8(KEYLARGO_GPIO_0+i, save_gpio_normal[i]);
1807
1808	/* FIXME more black magic with OpenPIC ... */
1809	if (pmac_mb.model_id == PMAC_TYPE_SAWTOOTH) {
1810		MACIO_BIC(0x506e0, 0x00400000);
1811		MACIO_BIC(0x506e0, 0x80000000);
1812	}
1813
1814	UN_OUT(UNI_N_CLOCK_CNTL, save_unin_clock_ctl);
1815	udelay(100);
1816
1817	return 0;
1818}
1819
1820#endif /* CONFIG_PM */
1821
1822static long
1823core99_sleep_state(struct device_node *node, long param, long value)
1824{
1825	/* Param == 1 means to enter the "fake sleep" mode that is
1826	 * used for CPU speed switch
1827	 */
1828	if (param == 1) {
1829		if (value == 1) {
1830			UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_SLEEPING);
1831			UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_IDLE2);
1832		} else {
1833			UN_OUT(UNI_N_POWER_MGT, UNI_N_POWER_MGT_NORMAL);
1834			udelay(10);
1835			UN_OUT(UNI_N_HWINIT_STATE, UNI_N_HWINIT_STATE_RUNNING);
1836			udelay(10);
1837		}
1838		return 0;
1839	}
1840	if ((pmac_mb.board_flags & PMAC_MB_CAN_SLEEP) == 0)
1841		return -EPERM;
1842
1843#ifdef CONFIG_PM
1844	if (value == 1)
1845		return core99_sleep();
1846	else if (value == 0)
1847		return core99_wake_up();
1848
1849#endif /* CONFIG_PM */
1850	return 0;
1851}
1852
1853#endif /* CONFIG_PPC64 */
1854
1855static long
1856generic_dev_can_wake(struct device_node *node, long param, long value)
1857{
1858	/* Todo: eventually check we are really dealing with on-board
1859	 * video device ...
1860	 */
1861
1862	if (pmac_mb.board_flags & PMAC_MB_MAY_SLEEP)
1863		pmac_mb.board_flags |= PMAC_MB_CAN_SLEEP;
1864	return 0;
1865}
1866
1867static long generic_get_mb_info(struct device_node *node, long param, long value)
1868{
1869	switch(param) {
1870		case PMAC_MB_INFO_MODEL:
1871			return pmac_mb.model_id;
1872		case PMAC_MB_INFO_FLAGS:
1873			return pmac_mb.board_flags;
1874		case PMAC_MB_INFO_NAME:
1875			/* hack hack hack... but should work */
1876			*((const char **)value) = pmac_mb.model_name;
1877			return 0;
1878	}
1879	return -EINVAL;
1880}
1881
1882
1883/*
1884 * Table definitions
1885 */
1886
1887/* Used on any machine
1888 */
1889static struct feature_table_entry any_features[] = {
1890	{ PMAC_FTR_GET_MB_INFO,		generic_get_mb_info },
1891	{ PMAC_FTR_DEVICE_CAN_WAKE,	generic_dev_can_wake },
1892	{ 0, NULL }
1893};
1894
1895#ifndef CONFIG_PPC64
1896
1897/* OHare based motherboards. Currently, we only use these on the
1898 * 2400,3400 and 3500 series powerbooks. Some older desktops seem
1899 * to have issues with turning on/off those asic cells
1900 */
1901static struct feature_table_entry ohare_features[] = {
1902	{ PMAC_FTR_SCC_ENABLE,		ohare_htw_scc_enable },
1903	{ PMAC_FTR_SWIM3_ENABLE,	ohare_floppy_enable },
1904	{ PMAC_FTR_MESH_ENABLE,		ohare_mesh_enable },
1905	{ PMAC_FTR_IDE_ENABLE,		ohare_ide_enable},
1906	{ PMAC_FTR_IDE_RESET,		ohare_ide_reset},
1907	{ PMAC_FTR_SLEEP_STATE,		ohare_sleep_state },
1908	{ 0, NULL }
1909};
1910
1911/* Heathrow desktop machines (Beige G3).
1912 * Separated as some features couldn't be properly tested
1913 * and the serial port control bits appear to confuse it.
1914 */
1915static struct feature_table_entry heathrow_desktop_features[] = {
1916	{ PMAC_FTR_SWIM3_ENABLE,	heathrow_floppy_enable },
1917	{ PMAC_FTR_MESH_ENABLE,		heathrow_mesh_enable },
1918	{ PMAC_FTR_IDE_ENABLE,		heathrow_ide_enable },
1919	{ PMAC_FTR_IDE_RESET,		heathrow_ide_reset },
1920	{ PMAC_FTR_BMAC_ENABLE,		heathrow_bmac_enable },
1921	{ 0, NULL }
1922};
1923
1924/* Heathrow based laptop, that is the Wallstreet and mainstreet
1925 * powerbooks.
1926 */
1927static struct feature_table_entry heathrow_laptop_features[] = {
1928	{ PMAC_FTR_SCC_ENABLE,		ohare_htw_scc_enable },
1929	{ PMAC_FTR_MODEM_ENABLE,	heathrow_modem_enable },
1930	{ PMAC_FTR_SWIM3_ENABLE,	heathrow_floppy_enable },
1931	{ PMAC_FTR_MESH_ENABLE,		heathrow_mesh_enable },
1932	{ PMAC_FTR_IDE_ENABLE,		heathrow_ide_enable },
1933	{ PMAC_FTR_IDE_RESET,		heathrow_ide_reset },
1934	{ PMAC_FTR_BMAC_ENABLE,		heathrow_bmac_enable },
1935	{ PMAC_FTR_SOUND_CHIP_ENABLE,	heathrow_sound_enable },
1936	{ PMAC_FTR_SLEEP_STATE,		heathrow_sleep_state },
1937	{ 0, NULL }
1938};
1939
1940/* Paddington based machines
1941 * The lombard (101) powerbook, first iMac models, B&W G3 and Yikes G4.
1942 */
1943static struct feature_table_entry paddington_features[] = {
1944	{ PMAC_FTR_SCC_ENABLE,		ohare_htw_scc_enable },
1945	{ PMAC_FTR_MODEM_ENABLE,	heathrow_modem_enable },
1946	{ PMAC_FTR_SWIM3_ENABLE,	heathrow_floppy_enable },
1947	{ PMAC_FTR_MESH_ENABLE,		heathrow_mesh_enable },
1948	{ PMAC_FTR_IDE_ENABLE,		heathrow_ide_enable },
1949	{ PMAC_FTR_IDE_RESET,		heathrow_ide_reset },
1950	{ PMAC_FTR_BMAC_ENABLE,		heathrow_bmac_enable },
1951	{ PMAC_FTR_SOUND_CHIP_ENABLE,	heathrow_sound_enable },
1952	{ PMAC_FTR_SLEEP_STATE,		heathrow_sleep_state },
1953	{ 0, NULL }
1954};
1955
1956/* Core99 & MacRISC 2 machines (all machines released since the
1957 * iBook (included), that is all AGP machines, except pangea
1958 * chipset. The pangea chipset is the "combo" UniNorth/KeyLargo
1959 * used on iBook2 & iMac "flow power".
1960 */
1961static struct feature_table_entry core99_features[] = {
1962	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
1963	{ PMAC_FTR_MODEM_ENABLE,	core99_modem_enable },
1964	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
1965	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
1966	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
1967	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
1968	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },
1969	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },
1970	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
1971	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
1972	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
1973#ifdef CONFIG_PM
1974	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
1975#endif
1976#ifdef CONFIG_SMP
1977	{ PMAC_FTR_RESET_CPU,		core99_reset_cpu },
1978#endif /* CONFIG_SMP */
1979	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
1980	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
1981	{ 0, NULL }
1982};
1983
1984/* RackMac
1985 */
1986static struct feature_table_entry rackmac_features[] = {
1987	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
1988	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
1989	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
1990	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
1991	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
1992	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
1993	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
1994	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
1995	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
1996#ifdef CONFIG_SMP
1997	{ PMAC_FTR_RESET_CPU,		core99_reset_cpu },
1998#endif /* CONFIG_SMP */
1999	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2000	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2001	{ 0, NULL }
2002};
2003
2004/* Pangea features
2005 */
2006static struct feature_table_entry pangea_features[] = {
2007	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
2008	{ PMAC_FTR_MODEM_ENABLE,	pangea_modem_enable },
2009	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
2010	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
2011	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
2012	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
2013	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },
2014	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },
2015	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
2016	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
2017	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
2018	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
2019	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2020	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2021	{ 0, NULL }
2022};
2023
2024/* Intrepid features
2025 */
2026static struct feature_table_entry intrepid_features[] = {
2027	{ PMAC_FTR_SCC_ENABLE,		core99_scc_enable },
2028	{ PMAC_FTR_MODEM_ENABLE,	pangea_modem_enable },
2029	{ PMAC_FTR_IDE_ENABLE,		core99_ide_enable },
2030	{ PMAC_FTR_IDE_RESET,		core99_ide_reset },
2031	{ PMAC_FTR_GMAC_ENABLE,		core99_gmac_enable },
2032	{ PMAC_FTR_GMAC_PHY_RESET,	core99_gmac_phy_reset },
2033	{ PMAC_FTR_SOUND_CHIP_ENABLE,	core99_sound_chip_enable },
2034	{ PMAC_FTR_AIRPORT_ENABLE,	core99_airport_enable },
2035	{ PMAC_FTR_USB_ENABLE,		core99_usb_enable },
2036	{ PMAC_FTR_1394_ENABLE,		core99_firewire_enable },
2037	{ PMAC_FTR_1394_CABLE_POWER,	core99_firewire_cable_power },
2038	{ PMAC_FTR_SLEEP_STATE,		core99_sleep_state },
2039	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2040	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2041	{ PMAC_FTR_AACK_DELAY_ENABLE,	intrepid_aack_delay_enable },
2042	{ 0, NULL }
2043};
2044
2045#else /* CONFIG_PPC64 */
2046
2047/* G5 features
2048 */
2049static struct feature_table_entry g5_features[] = {
2050	{ PMAC_FTR_GMAC_ENABLE,		g5_gmac_enable },
2051	{ PMAC_FTR_1394_ENABLE,		g5_fw_enable },
2052	{ PMAC_FTR_ENABLE_MPIC,		g5_mpic_enable },
2053	{ PMAC_FTR_GMAC_PHY_RESET,	g5_eth_phy_reset },
2054	{ PMAC_FTR_SOUND_CHIP_ENABLE,	g5_i2s_enable },
2055#ifdef CONFIG_SMP
2056	{ PMAC_FTR_RESET_CPU,		g5_reset_cpu },
2057#endif /* CONFIG_SMP */
2058	{ PMAC_FTR_READ_GPIO,		core99_read_gpio },
2059	{ PMAC_FTR_WRITE_GPIO,		core99_write_gpio },
2060	{ 0, NULL }
2061};
2062
2063#endif /* CONFIG_PPC64 */
2064
2065static struct pmac_mb_def pmac_mb_defs[] = {
2066#ifndef CONFIG_PPC64
2067	/*
2068	 * Desktops
2069	 */
2070
2071	{	"AAPL,8500",			"PowerMac 8500/8600",
2072		PMAC_TYPE_PSURGE,		NULL,
2073		0
2074	},
2075	{	"AAPL,9500",			"PowerMac 9500/9600",
2076		PMAC_TYPE_PSURGE,		NULL,
2077		0
2078	},
2079	{	"AAPL,7200",			"PowerMac 7200",
2080		PMAC_TYPE_PSURGE,		NULL,
2081		0
2082	},
2083	{	"AAPL,7300",			"PowerMac 7200/7300",
2084		PMAC_TYPE_PSURGE,		NULL,
2085		0
2086	},
2087	{	"AAPL,7500",			"PowerMac 7500",
2088		PMAC_TYPE_PSURGE,		NULL,
2089		0
2090	},
2091	{	"AAPL,ShinerESB",		"Apple Network Server",
2092		PMAC_TYPE_ANS,			NULL,
2093		0
2094	},
2095	{	"AAPL,e407",			"Alchemy",
2096		PMAC_TYPE_ALCHEMY,		NULL,
2097		0
2098	},
2099	{	"AAPL,e411",			"Gazelle",
2100		PMAC_TYPE_GAZELLE,		NULL,
2101		0
2102	},
2103	{	"AAPL,Gossamer",		"PowerMac G3 (Gossamer)",
2104		PMAC_TYPE_GOSSAMER,		heathrow_desktop_features,
2105		0
2106	},
2107	{	"AAPL,PowerMac G3",		"PowerMac G3 (Silk)",
2108		PMAC_TYPE_SILK,			heathrow_desktop_features,
2109		0
2110	},
2111	{	"PowerMac1,1",			"Blue&White G3",
2112		PMAC_TYPE_YOSEMITE,		paddington_features,
2113		0
2114	},
2115	{	"PowerMac1,2",			"PowerMac G4 PCI Graphics",
2116		PMAC_TYPE_YIKES,		paddington_features,
2117		0
2118	},
2119	{	"PowerMac2,1",			"iMac FireWire",
2120		PMAC_TYPE_FW_IMAC,		core99_features,
2121		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2122	},
2123	{	"PowerMac2,2",			"iMac FireWire",
2124		PMAC_TYPE_FW_IMAC,		core99_features,
2125		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2126	},
2127	{	"PowerMac3,1",			"PowerMac G4 AGP Graphics",
2128		PMAC_TYPE_SAWTOOTH,		core99_features,
2129		PMAC_MB_OLD_CORE99
2130	},
2131	{	"PowerMac3,2",			"PowerMac G4 AGP Graphics",
2132		PMAC_TYPE_SAWTOOTH,		core99_features,
2133		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2134	},
2135	{	"PowerMac3,3",			"PowerMac G4 AGP Graphics",
2136		PMAC_TYPE_SAWTOOTH,		core99_features,
2137		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2138	},
2139	{	"PowerMac3,4",			"PowerMac G4 Silver",
2140		PMAC_TYPE_QUICKSILVER,		core99_features,
2141		PMAC_MB_MAY_SLEEP
2142	},
2143	{	"PowerMac3,5",			"PowerMac G4 Silver",
2144		PMAC_TYPE_QUICKSILVER,		core99_features,
2145		PMAC_MB_MAY_SLEEP
2146	},
2147	{	"PowerMac3,6",			"PowerMac G4 Windtunnel",
2148		PMAC_TYPE_WINDTUNNEL,		core99_features,
2149		PMAC_MB_MAY_SLEEP,
2150	},
2151	{	"PowerMac4,1",			"iMac \"Flower Power\"",
2152		PMAC_TYPE_PANGEA_IMAC,		pangea_features,
2153		PMAC_MB_MAY_SLEEP
2154	},
2155	{	"PowerMac4,2",			"Flat panel iMac",
2156		PMAC_TYPE_FLAT_PANEL_IMAC,	pangea_features,
2157		PMAC_MB_CAN_SLEEP
2158	},
2159	{	"PowerMac4,4",			"eMac",
2160		PMAC_TYPE_EMAC,			core99_features,
2161		PMAC_MB_MAY_SLEEP
2162	},
2163	{	"PowerMac5,1",			"PowerMac G4 Cube",
2164		PMAC_TYPE_CUBE,			core99_features,
2165		PMAC_MB_MAY_SLEEP | PMAC_MB_OLD_CORE99
2166	},
2167	{	"PowerMac6,1",			"Flat panel iMac",
2168		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2169		PMAC_MB_MAY_SLEEP,
2170	},
2171	{	"PowerMac6,3",			"Flat panel iMac",
2172		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2173		PMAC_MB_MAY_SLEEP,
2174	},
2175	{	"PowerMac6,4",			"eMac",
2176		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2177		PMAC_MB_MAY_SLEEP,
2178	},
2179	{	"PowerMac10,1",			"Mac mini",
2180		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2181		PMAC_MB_MAY_SLEEP,
2182	},
2183	{       "PowerMac10,2",                 "Mac mini (Late 2005)",
2184		PMAC_TYPE_UNKNOWN_INTREPID,     intrepid_features,
2185		PMAC_MB_MAY_SLEEP,
2186	},
2187 	{	"iMac,1",			"iMac (first generation)",
2188		PMAC_TYPE_ORIG_IMAC,		paddington_features,
2189		0
2190	},
2191
2192	/*
2193	 * Xserve's
2194	 */
2195
2196	{	"RackMac1,1",			"XServe",
2197		PMAC_TYPE_RACKMAC,		rackmac_features,
2198		0,
2199	},
2200	{	"RackMac1,2",			"XServe rev. 2",
2201		PMAC_TYPE_RACKMAC,		rackmac_features,
2202		0,
2203	},
2204
2205	/*
2206	 * Laptops
2207	 */
2208
2209	{	"AAPL,3400/2400",		"PowerBook 3400",
2210		PMAC_TYPE_HOOPER,		ohare_features,
2211		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2212	},
2213	{	"AAPL,3500",			"PowerBook 3500",
2214		PMAC_TYPE_KANGA,		ohare_features,
2215		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2216	},
2217	{	"AAPL,PowerBook1998",		"PowerBook Wallstreet",
2218		PMAC_TYPE_WALLSTREET,		heathrow_laptop_features,
2219		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2220	},
2221	{	"PowerBook1,1",			"PowerBook 101 (Lombard)",
2222		PMAC_TYPE_101_PBOOK,		paddington_features,
2223		PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
2224	},
2225	{	"PowerBook2,1",			"iBook (first generation)",
2226		PMAC_TYPE_ORIG_IBOOK,		core99_features,
2227		PMAC_MB_CAN_SLEEP | PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE
2228	},
2229	{	"PowerBook2,2",			"iBook FireWire",
2230		PMAC_TYPE_FW_IBOOK,		core99_features,
2231		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER |
2232		PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE
2233	},
2234	{	"PowerBook3,1",			"PowerBook Pismo",
2235		PMAC_TYPE_PISMO,		core99_features,
2236		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER |
2237		PMAC_MB_OLD_CORE99 | PMAC_MB_MOBILE
2238	},
2239	{	"PowerBook3,2",			"PowerBook Titanium",
2240		PMAC_TYPE_TITANIUM,		core99_features,
2241		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2242	},
2243	{	"PowerBook3,3",			"PowerBook Titanium II",
2244		PMAC_TYPE_TITANIUM2,		core99_features,
2245		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2246	},
2247	{	"PowerBook3,4",			"PowerBook Titanium III",
2248		PMAC_TYPE_TITANIUM3,		core99_features,
2249		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2250	},
2251	{	"PowerBook3,5",			"PowerBook Titanium IV",
2252		PMAC_TYPE_TITANIUM4,		core99_features,
2253		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2254	},
2255	{	"PowerBook4,1",			"iBook 2",
2256		PMAC_TYPE_IBOOK2,		pangea_features,
2257		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2258	},
2259	{	"PowerBook4,2",			"iBook 2",
2260		PMAC_TYPE_IBOOK2,		pangea_features,
2261		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2262	},
2263	{	"PowerBook4,3",			"iBook 2 rev. 2",
2264		PMAC_TYPE_IBOOK2,		pangea_features,
2265		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE
2266	},
2267	{	"PowerBook5,1",			"PowerBook G4 17\"",
2268		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2269		PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2270	},
2271	{	"PowerBook5,2",			"PowerBook G4 15\"",
2272		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2273		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2274	},
2275	{	"PowerBook5,3",			"PowerBook G4 17\"",
2276		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2277		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2278	},
2279	{	"PowerBook5,4",			"PowerBook G4 15\"",
2280		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2281		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2282	},
2283	{	"PowerBook5,5",			"PowerBook G4 17\"",
2284		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2285		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2286	},
2287	{	"PowerBook5,6",			"PowerBook G4 15\"",
2288		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2289		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2290	},
2291	{	"PowerBook5,7",			"PowerBook G4 17\"",
2292		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2293		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2294	},
2295	{	"PowerBook5,8",			"PowerBook G4 15\"",
2296		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2297		PMAC_MB_MAY_SLEEP  | PMAC_MB_MOBILE,
2298	},
2299	{	"PowerBook5,9",			"PowerBook G4 17\"",
2300		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2301		PMAC_MB_MAY_SLEEP | PMAC_MB_MOBILE,
2302	},
2303	{	"PowerBook6,1",			"PowerBook G4 12\"",
2304		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2305		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2306	},
2307	{	"PowerBook6,2",			"PowerBook G4",
2308		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2309		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2310	},
2311	{	"PowerBook6,3",			"iBook G4",
2312		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2313		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2314	},
2315	{	"PowerBook6,4",			"PowerBook G4 12\"",
2316		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2317		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2318	},
2319	{	"PowerBook6,5",			"iBook G4",
2320		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2321		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2322	},
2323	{	"PowerBook6,7",			"iBook G4",
2324		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2325		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2326	},
2327	{	"PowerBook6,8",			"PowerBook G4 12\"",
2328		PMAC_TYPE_UNKNOWN_INTREPID,	intrepid_features,
2329		PMAC_MB_MAY_SLEEP | PMAC_MB_HAS_FW_POWER | PMAC_MB_MOBILE,
2330	},
2331#else /* CONFIG_PPC64 */
2332	{	"PowerMac7,2",			"PowerMac G5",
2333		PMAC_TYPE_POWERMAC_G5,		g5_features,
2334		0,
2335	},
2336#ifdef CONFIG_PPC64
2337	{	"PowerMac7,3",			"PowerMac G5",
2338		PMAC_TYPE_POWERMAC_G5,		g5_features,
2339		0,
2340	},
2341	{	"PowerMac8,1",			"iMac G5",
2342		PMAC_TYPE_IMAC_G5,		g5_features,
2343		0,
2344	},
2345	{	"PowerMac9,1",			"PowerMac G5",
2346		PMAC_TYPE_POWERMAC_G5_U3L,	g5_features,
2347		0,
2348	},
2349	{	"PowerMac11,2",			"PowerMac G5 Dual Core",
2350		PMAC_TYPE_POWERMAC_G5_U3L,	g5_features,
2351		0,
2352	},
2353	{	"PowerMac12,1",			"iMac G5 (iSight)",
2354		PMAC_TYPE_POWERMAC_G5_U3L,	g5_features,
2355		0,
2356	},
2357	{       "RackMac3,1",                   "XServe G5",
2358		PMAC_TYPE_XSERVE_G5,		g5_features,
2359		0,
2360	},
2361#endif /* CONFIG_PPC64 */
2362#endif /* CONFIG_PPC64 */
2363};
2364
2365/*
2366 * The toplevel feature_call callback
2367 */
2368long pmac_do_feature_call(unsigned int selector, ...)
2369{
2370	struct device_node *node;
2371	long param, value;
2372	int i;
2373	feature_call func = NULL;
2374	va_list args;
2375
2376	if (pmac_mb.features)
2377		for (i=0; pmac_mb.features[i].function; i++)
2378			if (pmac_mb.features[i].selector == selector) {
2379				func = pmac_mb.features[i].function;
2380				break;
2381			}
2382	if (!func)
2383		for (i=0; any_features[i].function; i++)
2384			if (any_features[i].selector == selector) {
2385				func = any_features[i].function;
2386				break;
2387			}
2388	if (!func)
2389		return -ENODEV;
2390
2391	va_start(args, selector);
2392	node = (struct device_node*)va_arg(args, void*);
2393	param = va_arg(args, long);
2394	value = va_arg(args, long);
2395	va_end(args);
2396
2397	return func(node, param, value);
2398}
2399
2400static int __init probe_motherboard(void)
2401{
2402	int i;
2403	struct macio_chip *macio = &macio_chips[0];
2404	const char *model = NULL;
2405	struct device_node *dt;
2406	int ret = 0;
2407
2408	/* Lookup known motherboard type in device-tree. First try an
2409	 * exact match on the "model" property, then try a "compatible"
2410	 * match is none is found.
2411	 */
2412	dt = of_find_node_by_name(NULL, "device-tree");
2413	if (dt != NULL)
2414		model = of_get_property(dt, "model", NULL);
2415	for(i=0; model && i<ARRAY_SIZE(pmac_mb_defs); i++) {
2416	    if (strcmp(model, pmac_mb_defs[i].model_string) == 0) {
2417		pmac_mb = pmac_mb_defs[i];
2418		goto found;
2419	    }
2420	}
2421	for(i=0; i<ARRAY_SIZE(pmac_mb_defs); i++) {
2422	    if (of_machine_is_compatible(pmac_mb_defs[i].model_string)) {
2423		pmac_mb = pmac_mb_defs[i];
2424		goto found;
2425	    }
2426	}
2427
2428	/* Fallback to selection depending on mac-io chip type */
2429	switch(macio->type) {
2430#ifndef CONFIG_PPC64
2431	    case macio_grand_central:
2432		pmac_mb.model_id = PMAC_TYPE_PSURGE;
2433		pmac_mb.model_name = "Unknown PowerSurge";
2434		break;
2435	    case macio_ohare:
2436		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_OHARE;
2437		pmac_mb.model_name = "Unknown OHare-based";
2438		break;
2439	    case macio_heathrow:
2440		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_HEATHROW;
2441		pmac_mb.model_name = "Unknown Heathrow-based";
2442		pmac_mb.features = heathrow_desktop_features;
2443		break;
2444	    case macio_paddington:
2445		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_PADDINGTON;
2446		pmac_mb.model_name = "Unknown Paddington-based";
2447		pmac_mb.features = paddington_features;
2448		break;
2449	    case macio_keylargo:
2450		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_CORE99;
2451		pmac_mb.model_name = "Unknown Keylargo-based";
2452		pmac_mb.features = core99_features;
2453		break;
2454	    case macio_pangea:
2455		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_PANGEA;
2456		pmac_mb.model_name = "Unknown Pangea-based";
2457		pmac_mb.features = pangea_features;
2458		break;
2459	    case macio_intrepid:
2460		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_INTREPID;
2461		pmac_mb.model_name = "Unknown Intrepid-based";
2462		pmac_mb.features = intrepid_features;
2463		break;
2464#else /* CONFIG_PPC64 */
2465	case macio_keylargo2:
2466		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_K2;
2467		pmac_mb.model_name = "Unknown K2-based";
2468		pmac_mb.features = g5_features;
2469		break;
2470	case macio_shasta:
2471		pmac_mb.model_id = PMAC_TYPE_UNKNOWN_SHASTA;
2472		pmac_mb.model_name = "Unknown Shasta-based";
2473		pmac_mb.features = g5_features;
2474		break;
2475#endif /* CONFIG_PPC64 */
2476	default:
2477		ret = -ENODEV;
2478		goto done;
2479	}
2480found:
2481#ifndef CONFIG_PPC64
2482	/* Fixup Hooper vs. Comet */
2483	if (pmac_mb.model_id == PMAC_TYPE_HOOPER) {
2484		u32 __iomem * mach_id_ptr = ioremap(0xf3000034, 4);
2485		if (!mach_id_ptr) {
2486			ret = -ENODEV;
2487			goto done;
2488		}
2489		/* Here, I used to disable the media-bay on comet. It
2490		 * appears this is wrong, the floppy connector is actually
2491		 * a kind of media-bay and works with the current driver.
2492		 */
2493		if (__raw_readl(mach_id_ptr) & 0x20000000UL)
2494			pmac_mb.model_id = PMAC_TYPE_COMET;
2495		iounmap(mach_id_ptr);
2496	}
2497
2498	/* Set default value of powersave_nap on machines that support it.
2499	 * It appears that uninorth rev 3 has a problem with it, we don't
2500	 * enable it on those. In theory, the flush-on-lock property is
2501	 * supposed to be set when not supported, but I'm not very confident
2502	 * that all Apple OF revs did it properly, I do it the paranoid way.
2503	 */
2504	if (uninorth_base && uninorth_rev > 3) {
 
2505		struct device_node *np;
2506
2507		for_each_of_cpu_node(np) {
2508			int cpu_count = 1;
2509
2510			/* Nap mode not supported on SMP */
2511			if (of_property_read_bool(np, "flush-on-lock") ||
2512			    (cpu_count > 1)) {
2513				powersave_nap = 0;
2514				of_node_put(np);
2515				break;
2516			}
2517
2518			cpu_count++;
2519			powersave_nap = 1;
 
 
2520		}
 
 
 
 
2521	}
2522	if (powersave_nap)
2523		printk(KERN_DEBUG "Processor NAP mode on idle enabled.\n");
2524
2525	/* On CPUs that support it (750FX), lowspeed by default during
2526	 * NAP mode
2527	 */
2528	powersave_lowspeed = 1;
2529
2530#else /* CONFIG_PPC64 */
2531	powersave_nap = 1;
2532#endif  /* CONFIG_PPC64 */
2533
2534	/* Check for "mobile" machine */
2535	if (model && (strncmp(model, "PowerBook", 9) == 0
2536		   || strncmp(model, "iBook", 5) == 0))
2537		pmac_mb.board_flags |= PMAC_MB_MOBILE;
2538
2539
2540	printk(KERN_INFO "PowerMac motherboard: %s\n", pmac_mb.model_name);
2541done:
2542	of_node_put(dt);
2543	return ret;
2544}
2545
2546/* Initialize the Core99 UniNorth host bridge and memory controller
2547 */
2548static void __init probe_uninorth(void)
2549{
2550	struct resource res;
 
2551	unsigned long actrl;
2552
2553	/* Locate core99 Uni-N */
2554	uninorth_node = of_find_node_by_name(NULL, "uni-n");
2555	uninorth_maj = 1;
2556
2557	/* Locate G5 u3 */
2558	if (uninorth_node == NULL) {
2559		uninorth_node = of_find_node_by_name(NULL, "u3");
2560		uninorth_maj = 3;
2561	}
2562	/* Locate G5 u4 */
2563	if (uninorth_node == NULL) {
2564		uninorth_node = of_find_node_by_name(NULL, "u4");
2565		uninorth_maj = 4;
2566	}
2567	if (uninorth_node == NULL) {
2568		uninorth_maj = 0;
2569		return;
2570	}
2571
2572	if (of_address_to_resource(uninorth_node, 0, &res))
 
2573		return;
2574
2575	uninorth_base = ioremap(res.start, 0x40000);
 
 
2576	if (uninorth_base == NULL)
2577		return;
2578	uninorth_rev = in_be32(UN_REG(UNI_N_VERSION));
2579	if (uninorth_maj == 3 || uninorth_maj == 4) {
2580		u3_ht_base = ioremap(res.start + U3_HT_CONFIG_BASE, 0x1000);
2581		if (u3_ht_base == NULL) {
2582			iounmap(uninorth_base);
2583			return;
2584		}
2585	}
2586
2587	printk(KERN_INFO "Found %s memory controller & host bridge"
2588	       " @ 0x%08x revision: 0x%02x\n", uninorth_maj == 3 ? "U3" :
2589	       uninorth_maj == 4 ? "U4" : "UniNorth",
2590	       (unsigned int)res.start, uninorth_rev);
2591	printk(KERN_INFO "Mapped at 0x%08lx\n", (unsigned long)uninorth_base);
2592
2593	/* Set the arbitrer QAck delay according to what Apple does
2594	 */
2595	if (uninorth_rev < 0x11) {
2596		actrl = UN_IN(UNI_N_ARB_CTRL) & ~UNI_N_ARB_CTRL_QACK_DELAY_MASK;
2597		actrl |= ((uninorth_rev < 3) ? UNI_N_ARB_CTRL_QACK_DELAY105 :
2598			UNI_N_ARB_CTRL_QACK_DELAY) <<
2599			UNI_N_ARB_CTRL_QACK_DELAY_SHIFT;
2600		UN_OUT(UNI_N_ARB_CTRL, actrl);
2601	}
2602
2603	/* Some more magic as done by them in recent MacOS X on UniNorth
2604	 * revs 1.5 to 2.O and Pangea. Seem to toggle the UniN Maxbus/PCI
2605	 * memory timeout
2606	 */
2607	if ((uninorth_rev >= 0x11 && uninorth_rev <= 0x24) ||
2608	    uninorth_rev == 0xc0)
2609		UN_OUT(0x2160, UN_IN(0x2160) & 0x00ffffff);
2610}
2611
2612static void __init probe_one_macio(const char *name, const char *compat, int type)
2613{
2614	struct device_node*	node;
2615	int			i;
2616	volatile u32 __iomem	*base;
2617	const __be32		*addrp;
2618	const u32		*revp;
2619	phys_addr_t		addr;
2620	u64			size;
2621
2622	for_each_node_by_name(node, name) {
2623		if (!compat)
2624			break;
2625		if (of_device_is_compatible(node, compat))
2626			break;
2627	}
2628	if (!node)
2629		return;
2630	for(i=0; i<MAX_MACIO_CHIPS; i++) {
2631		if (!macio_chips[i].of_node)
2632			break;
2633		if (macio_chips[i].of_node == node)
2634			goto out_put;
2635	}
2636
2637	if (i >= MAX_MACIO_CHIPS) {
2638		printk(KERN_ERR "pmac_feature: Please increase MAX_MACIO_CHIPS !\n");
2639		printk(KERN_ERR "pmac_feature: %pOF skipped\n", node);
2640		goto out_put;
2641	}
2642	addrp = of_get_pci_address(node, 0, &size, NULL);
2643	if (addrp == NULL) {
2644		printk(KERN_ERR "pmac_feature: %pOF: can't find base !\n",
2645		       node);
2646		goto out_put;
2647	}
2648	addr = of_translate_address(node, addrp);
2649	if (addr == 0) {
2650		printk(KERN_ERR "pmac_feature: %pOF, can't translate base !\n",
2651		       node);
2652		goto out_put;
2653	}
2654	base = ioremap(addr, (unsigned long)size);
2655	if (!base) {
2656		printk(KERN_ERR "pmac_feature: %pOF, can't map mac-io chip !\n",
2657		       node);
2658		goto out_put;
2659	}
2660	if (type == macio_keylargo || type == macio_keylargo2) {
2661		const u32 *did = of_get_property(node, "device-id", NULL);
2662		if (*did == 0x00000025)
2663			type = macio_pangea;
2664		if (*did == 0x0000003e)
2665			type = macio_intrepid;
2666		if (*did == 0x0000004f)
2667			type = macio_shasta;
2668	}
2669	macio_chips[i].of_node	= node;
2670	macio_chips[i].type	= type;
2671	macio_chips[i].base	= base;
2672	macio_chips[i].flags	= MACIO_FLAG_SCCA_ON | MACIO_FLAG_SCCB_ON;
2673	macio_chips[i].name	= macio_names[type];
2674	revp = of_get_property(node, "revision-id", NULL);
2675	if (revp)
2676		macio_chips[i].rev = *revp;
2677	printk(KERN_INFO "Found a %s mac-io controller, rev: %d, mapped at 0x%p\n",
2678		macio_names[type], macio_chips[i].rev, macio_chips[i].base);
2679
2680	return;
2681
2682out_put:
2683	of_node_put(node);
2684}
2685
2686static int __init
2687probe_macios(void)
2688{
2689	/* Warning, ordering is important */
2690	probe_one_macio("gc", NULL, macio_grand_central);
2691	probe_one_macio("ohare", NULL, macio_ohare);
2692	probe_one_macio("pci106b,7", NULL, macio_ohareII);
2693	probe_one_macio("mac-io", "keylargo", macio_keylargo);
2694	probe_one_macio("mac-io", "paddington", macio_paddington);
2695	probe_one_macio("mac-io", "gatwick", macio_gatwick);
2696	probe_one_macio("mac-io", "heathrow", macio_heathrow);
2697	probe_one_macio("mac-io", "K2-Keylargo", macio_keylargo2);
2698
2699	/* Make sure the "main" macio chip appear first */
2700	if (macio_chips[0].type == macio_gatwick
2701	    && macio_chips[1].type == macio_heathrow) {
2702		struct macio_chip temp = macio_chips[0];
2703		macio_chips[0] = macio_chips[1];
2704		macio_chips[1] = temp;
2705	}
2706	if (macio_chips[0].type == macio_ohareII
2707	    && macio_chips[1].type == macio_ohare) {
2708		struct macio_chip temp = macio_chips[0];
2709		macio_chips[0] = macio_chips[1];
2710		macio_chips[1] = temp;
2711	}
2712	macio_chips[0].lbus.index = 0;
2713	macio_chips[1].lbus.index = 1;
2714
2715	return (macio_chips[0].of_node == NULL) ? -ENODEV : 0;
2716}
2717
2718static void __init
2719initial_serial_shutdown(struct device_node *np)
2720{
2721	int len;
2722	const struct slot_names_prop {
2723		int	count;
2724		char	name[1];
2725	} *slots;
2726	const char *conn;
2727	int port_type = PMAC_SCC_ASYNC;
2728	int modem = 0;
2729
2730	slots = of_get_property(np, "slot-names", &len);
2731	conn = of_get_property(np, "AAPL,connector", &len);
2732	if (conn && (strcmp(conn, "infrared") == 0))
2733		port_type = PMAC_SCC_IRDA;
2734	else if (of_device_is_compatible(np, "cobalt"))
2735		modem = 1;
2736	else if (slots && slots->count > 0) {
2737		if (strcmp(slots->name, "IrDA") == 0)
2738			port_type = PMAC_SCC_IRDA;
2739		else if (strcmp(slots->name, "Modem") == 0)
2740			modem = 1;
2741	}
2742	if (modem)
2743		pmac_call_feature(PMAC_FTR_MODEM_ENABLE, np, 0, 0);
2744	pmac_call_feature(PMAC_FTR_SCC_ENABLE, np, port_type, 0);
2745}
2746
2747static void __init
2748set_initial_features(void)
2749{
2750	struct device_node *np;
2751
2752	/* That hack appears to be necessary for some StarMax motherboards
2753	 * but I'm not too sure it was audited for side-effects on other
2754	 * ohare based machines...
2755	 * Since I still have difficulties figuring the right way to
2756	 * differentiate them all and since that hack was there for a long
2757	 * time, I'll keep it around
2758	 */
2759	if (macio_chips[0].type == macio_ohare) {
2760		struct macio_chip *macio = &macio_chips[0];
2761		np = of_find_node_by_name(NULL, "via-pmu");
2762		if (np)
2763			MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE);
2764		else
2765			MACIO_OUT32(OHARE_FCR, STARMAX_FEATURES);
2766		of_node_put(np);
2767	} else if (macio_chips[1].type == macio_ohare) {
2768		struct macio_chip *macio = &macio_chips[1];
2769		MACIO_BIS(OHARE_FCR, OH_IOBUS_ENABLE);
2770	}
2771
2772#ifdef CONFIG_PPC64
2773	if (macio_chips[0].type == macio_keylargo2 ||
2774	    macio_chips[0].type == macio_shasta) {
2775#ifndef CONFIG_SMP
2776		/* On SMP machines running UP, we have the second CPU eating
2777		 * bus cycles. We need to take it off the bus. This is done
2778		 * from pmac_smp for SMP kernels running on one CPU
2779		 */
2780		np = of_find_node_by_type(NULL, "cpu");
2781		if (np != NULL)
2782			np = of_find_node_by_type(np, "cpu");
2783		if (np != NULL) {
2784			g5_phy_disable_cpu1();
2785			of_node_put(np);
2786		}
2787#endif /* CONFIG_SMP */
2788		/* Enable GMAC for now for PCI probing. It will be disabled
2789		 * later on after PCI probe
2790		 */
2791		for_each_node_by_name(np, "ethernet")
 
2792			if (of_device_is_compatible(np, "K2-GMAC"))
2793				g5_gmac_enable(np, 0, 1);
 
 
2794
2795		/* Enable FW before PCI probe. Will be disabled later on
2796		 * Note: We should have a batter way to check that we are
2797		 * dealing with uninorth internal cell and not a PCI cell
2798		 * on the external PCI. The code below works though.
2799		 */
2800		for_each_node_by_name(np, "firewire") {
 
2801			if (of_device_is_compatible(np, "pci106b,5811")) {
2802				macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
2803				g5_fw_enable(np, 0, 1);
2804			}
 
2805		}
2806	}
2807#else /* CONFIG_PPC64 */
2808
2809	if (macio_chips[0].type == macio_keylargo ||
2810	    macio_chips[0].type == macio_pangea ||
2811	    macio_chips[0].type == macio_intrepid) {
2812		/* Enable GMAC for now for PCI probing. It will be disabled
2813		 * later on after PCI probe
2814		 */
2815		for_each_node_by_name(np, "ethernet") {
 
2816			if (np->parent
2817			    && of_device_is_compatible(np->parent, "uni-north")
2818			    && of_device_is_compatible(np, "gmac"))
2819				core99_gmac_enable(np, 0, 1);
 
2820		}
2821
2822		/* Enable FW before PCI probe. Will be disabled later on
2823		 * Note: We should have a batter way to check that we are
2824		 * dealing with uninorth internal cell and not a PCI cell
2825		 * on the external PCI. The code below works though.
2826		 */
2827		for_each_node_by_name(np, "firewire") {
 
2828			if (np->parent
2829			    && of_device_is_compatible(np->parent, "uni-north")
2830			    && (of_device_is_compatible(np, "pci106b,18") ||
2831			        of_device_is_compatible(np, "pci106b,30") ||
2832			        of_device_is_compatible(np, "pci11c1,5811"))) {
2833				macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
2834				core99_firewire_enable(np, 0, 1);
2835			}
 
2836		}
2837
2838		/* Enable ATA-100 before PCI probe. */
2839		for_each_node_by_name(np, "ata-6") {
 
2840			if (np->parent
2841			    && of_device_is_compatible(np->parent, "uni-north")
2842			    && of_device_is_compatible(np, "kauai-ata")) {
2843				core99_ata100_enable(np, 1);
2844			}
 
2845		}
2846
2847		/* Switch airport off */
2848		for_each_node_by_name(np, "radio") {
2849			if (np->parent == macio_chips[0].of_node) {
2850				macio_chips[0].flags |= MACIO_FLAG_AIRPORT_ON;
2851				core99_airport_enable(np, 0, 0);
2852			}
2853		}
2854	}
2855
2856	/* On all machines that support sound PM, switch sound off */
2857	if (macio_chips[0].of_node)
2858		pmac_do_feature_call(PMAC_FTR_SOUND_CHIP_ENABLE,
2859			macio_chips[0].of_node, 0, 0);
2860
2861	/* While on some desktop G3s, we turn it back on */
2862	if (macio_chips[0].of_node && macio_chips[0].type == macio_heathrow
2863		&& (pmac_mb.model_id == PMAC_TYPE_GOSSAMER ||
2864		    pmac_mb.model_id == PMAC_TYPE_SILK)) {
2865		struct macio_chip *macio = &macio_chips[0];
2866		MACIO_BIS(HEATHROW_FCR, HRW_SOUND_CLK_ENABLE);
2867		MACIO_BIC(HEATHROW_FCR, HRW_SOUND_POWER_N);
2868	}
2869
2870#endif /* CONFIG_PPC64 */
2871
2872	/* On all machines, switch modem & serial ports off */
2873	for_each_node_by_name(np, "ch-a")
2874		initial_serial_shutdown(np);
 
2875	for_each_node_by_name(np, "ch-b")
2876		initial_serial_shutdown(np);
 
2877}
2878
2879void __init
2880pmac_feature_init(void)
2881{
2882	/* Detect the UniNorth memory controller */
2883	probe_uninorth();
2884
2885	/* Probe mac-io controllers */
2886	if (probe_macios()) {
2887		printk(KERN_WARNING "No mac-io chip found\n");
2888		return;
2889	}
2890
2891	/* Probe machine type */
2892	if (probe_motherboard())
2893		printk(KERN_WARNING "Unknown PowerMac !\n");
2894
2895	/* Set some initial features (turn off some chips that will
2896	 * be later turned on)
2897	 */
2898	set_initial_features();
2899}
2900
2901#if 0
2902static void dump_HT_speeds(char *name, u32 cfg, u32 frq)
2903{
2904	int	freqs[16] = { 200,300,400,500,600,800,1000,0,0,0,0,0,0,0,0,0 };
2905	int	bits[8] = { 8,16,0,32,2,4,0,0 };
2906	int	freq = (frq >> 8) & 0xf;
2907
2908	if (freqs[freq] == 0)
2909		printk("%s: Unknown HT link frequency %x\n", name, freq);
2910	else
2911		printk("%s: %d MHz on main link, (%d in / %d out) bits width\n",
2912		       name, freqs[freq],
2913		       bits[(cfg >> 28) & 0x7], bits[(cfg >> 24) & 0x7]);
2914}
2915
2916void __init pmac_check_ht_link(void)
2917{
2918	u32	ufreq, freq, ucfg, cfg;
2919	struct device_node *pcix_node;
2920	u8	px_bus, px_devfn;
2921	struct pci_controller *px_hose;
2922
2923	(void)in_be32(u3_ht_base + U3_HT_LINK_COMMAND);
2924	ucfg = cfg = in_be32(u3_ht_base + U3_HT_LINK_CONFIG);
2925	ufreq = freq = in_be32(u3_ht_base + U3_HT_LINK_FREQ);
2926	dump_HT_speeds("U3 HyperTransport", cfg, freq);
2927
2928	pcix_node = of_find_compatible_node(NULL, "pci", "pci-x");
2929	if (pcix_node == NULL) {
2930		printk("No PCI-X bridge found\n");
2931		return;
2932	}
2933	if (pci_device_from_OF_node(pcix_node, &px_bus, &px_devfn) != 0) {
2934		printk("PCI-X bridge found but not matched to pci\n");
2935		return;
2936	}
2937	px_hose = pci_find_hose_for_OF_device(pcix_node);
2938	if (px_hose == NULL) {
2939		printk("PCI-X bridge found but not matched to host\n");
2940		return;
2941	}	
2942	early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg);
2943	early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq);
2944	dump_HT_speeds("PCI-X HT Uplink", cfg, freq);
2945	early_read_config_dword(px_hose, px_bus, px_devfn, 0xc8, &cfg);
2946	early_read_config_dword(px_hose, px_bus, px_devfn, 0xd0, &freq);
2947	dump_HT_speeds("PCI-X HT Downlink", cfg, freq);
2948}
2949#endif /* 0 */
2950
2951/*
2952 * Early video resume hook
2953 */
2954
2955static void (*pmac_early_vresume_proc)(void *data);
2956static void *pmac_early_vresume_data;
2957
2958void pmac_set_early_video_resume(void (*proc)(void *data), void *data)
2959{
2960	if (!machine_is(powermac))
2961		return;
2962	preempt_disable();
2963	pmac_early_vresume_proc = proc;
2964	pmac_early_vresume_data = data;
2965	preempt_enable();
2966}
2967EXPORT_SYMBOL(pmac_set_early_video_resume);
2968
2969void pmac_call_early_video_resume(void)
2970{
2971	if (pmac_early_vresume_proc)
2972		pmac_early_vresume_proc(pmac_early_vresume_data);
2973}
2974
2975/*
2976 * AGP related suspend/resume code
2977 */
2978
2979static struct pci_dev *pmac_agp_bridge;
2980static int (*pmac_agp_suspend)(struct pci_dev *bridge);
2981static int (*pmac_agp_resume)(struct pci_dev *bridge);
2982
2983void pmac_register_agp_pm(struct pci_dev *bridge,
2984				 int (*suspend)(struct pci_dev *bridge),
2985				 int (*resume)(struct pci_dev *bridge))
2986{
2987	if (suspend || resume) {
2988		pmac_agp_bridge = bridge;
2989		pmac_agp_suspend = suspend;
2990		pmac_agp_resume = resume;
2991		return;
2992	}
2993	if (bridge != pmac_agp_bridge)
2994		return;
2995	pmac_agp_suspend = pmac_agp_resume = NULL;
2996	return;
2997}
2998EXPORT_SYMBOL(pmac_register_agp_pm);
2999
3000void pmac_suspend_agp_for_card(struct pci_dev *dev)
3001{
3002	if (pmac_agp_bridge == NULL || pmac_agp_suspend == NULL)
3003		return;
3004	if (pmac_agp_bridge->bus != dev->bus)
3005		return;
3006	pmac_agp_suspend(pmac_agp_bridge);
3007}
3008EXPORT_SYMBOL(pmac_suspend_agp_for_card);
3009
3010void pmac_resume_agp_for_card(struct pci_dev *dev)
3011{
3012	if (pmac_agp_bridge == NULL || pmac_agp_resume == NULL)
3013		return;
3014	if (pmac_agp_bridge->bus != dev->bus)
3015		return;
3016	pmac_agp_resume(pmac_agp_bridge);
3017}
3018EXPORT_SYMBOL(pmac_resume_agp_for_card);
3019
3020int pmac_get_uninorth_variant(void)
3021{
3022	return uninorth_maj;
3023}