Linux Audio

Check our new training course

Loading...
   1/*
   2 *  linux/arch/m68k/mac/config.c
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file COPYING in the main directory of this archive
   6 * for more details.
   7 */
   8
   9/*
  10 * Miscellaneous linux stuff
  11 */
  12
  13#include <linux/errno.h>
  14#include <linux/module.h>
  15#include <linux/reboot.h>
  16#include <linux/types.h>
  17#include <linux/mm.h>
  18#include <linux/tty.h>
  19#include <linux/console.h>
  20#include <linux/interrupt.h>
  21/* keyb */
  22#include <linux/random.h>
  23#include <linux/delay.h>
  24/* keyb */
  25#include <linux/init.h>
  26#include <linux/vt_kern.h>
  27#include <linux/platform_device.h>
  28#include <linux/ata_platform.h>
  29#include <linux/adb.h>
  30#include <linux/cuda.h>
  31#include <linux/pmu.h>
  32#include <linux/rtc.h>
  33
  34#include <asm/setup.h>
  35#include <asm/bootinfo.h>
  36#include <asm/bootinfo-mac.h>
  37#include <asm/byteorder.h>
  38
  39#include <asm/io.h>
  40#include <asm/irq.h>
 
 
  41#include <asm/machdep.h>
  42
  43#include <asm/macintosh.h>
  44#include <asm/macints.h>
  45#include <asm/machw.h>
  46
  47#include <asm/mac_iop.h>
  48#include <asm/mac_via.h>
  49#include <asm/mac_oss.h>
  50#include <asm/mac_psc.h>
  51#include <asm/config.h>
  52
  53#include "mac.h"
  54
  55/* Mac bootinfo struct */
  56struct mac_booter_data mac_bi_data;
  57
  58/* The phys. video addr. - might be bogus on some machines */
  59static unsigned long mac_orig_videoaddr;
  60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  61static void mac_get_model(char *str);
  62static void mac_identify(void);
  63static void mac_report_hardware(void);
  64
  65static void __init mac_sched_init(void)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  66{
  67	via_init_clock();
  68}
  69
  70/*
  71 * Parse a Macintosh-specific record in the bootinfo
  72 */
  73
  74int __init mac_parse_bootinfo(const struct bi_record *record)
  75{
  76	int unknown = 0;
  77	const void *data = record->data;
  78
  79	switch (be16_to_cpu(record->tag)) {
  80	case BI_MAC_MODEL:
  81		mac_bi_data.id = be32_to_cpup(data);
  82		break;
  83	case BI_MAC_VADDR:
  84		mac_bi_data.videoaddr = be32_to_cpup(data);
  85		break;
  86	case BI_MAC_VDEPTH:
  87		mac_bi_data.videodepth = be32_to_cpup(data);
  88		break;
  89	case BI_MAC_VROW:
  90		mac_bi_data.videorow = be32_to_cpup(data);
  91		break;
  92	case BI_MAC_VDIM:
  93		mac_bi_data.dimensions = be32_to_cpup(data);
  94		break;
  95	case BI_MAC_VLOGICAL:
  96		mac_orig_videoaddr = be32_to_cpup(data);
  97		mac_bi_data.videological =
  98			VIDEOMEMBASE + (mac_orig_videoaddr & ~VIDEOMEMMASK);
  99		break;
 100	case BI_MAC_SCCBASE:
 101		mac_bi_data.sccbase = be32_to_cpup(data);
 102		break;
 103	case BI_MAC_BTIME:
 104		mac_bi_data.boottime = be32_to_cpup(data);
 105		break;
 106	case BI_MAC_GMTBIAS:
 107		mac_bi_data.gmtbias = be32_to_cpup(data);
 108		break;
 109	case BI_MAC_MEMSIZE:
 110		mac_bi_data.memsize = be32_to_cpup(data);
 111		break;
 112	case BI_MAC_CPUID:
 113		mac_bi_data.cpuid = be32_to_cpup(data);
 114		break;
 115	case BI_MAC_ROMBASE:
 116		mac_bi_data.rombase = be32_to_cpup(data);
 117		break;
 118	default:
 119		unknown = 1;
 120		break;
 121	}
 122	return unknown;
 123}
 124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 125void __init config_mac(void)
 126{
 127	if (!MACH_IS_MAC)
 128		pr_err("ERROR: no Mac, but config_mac() called!!\n");
 129
 130	mach_sched_init = mac_sched_init;
 131	mach_init_IRQ = mac_init_IRQ;
 132	mach_get_model = mac_get_model;
 
 133	mach_hwclk = mac_hwclk;
 
 134	mach_reset = mac_reset;
 135	mach_halt = mac_poweroff;
 136#if IS_ENABLED(CONFIG_INPUT_M68K_BEEP)
 
 
 137	mach_beep = mac_mksound;
 138#endif
 139
 
 
 
 
 140	/*
 141	 * Determine hardware present
 142	 */
 143
 144	mac_identify();
 145	mac_report_hardware();
 146
 147	/*
 148	 * AFAIK only the IIci takes a cache card.  The IIfx has onboard
 149	 * cache ... someone needs to figure out how to tell if it's on or
 150	 * not.
 151	 */
 152
 153	if (macintosh_config->ident == MAC_MODEL_IICI)
 154		mach_l2_flush = via_l2_flush;
 155
 156	register_platform_power_off(mac_poweroff);
 157}
 158
 159
 160/*
 161 * Macintosh Table: hardcoded model configuration data.
 162 *
 163 * Much of this was defined by Alan, based on who knows what docs.
 164 * I've added a lot more, and some of that was pure guesswork based
 165 * on hardware pages present on the Mac web site. Possibly wildly
 166 * inaccurate, so look here if a new Mac model won't run. Example: if
 167 * a Mac crashes immediately after the VIA1 registers have been dumped
 168 * to the screen, it probably died attempting to read DirB on a RBV.
 169 * Meaning it should have MAC_VIA_IICI here :-)
 170 */
 171
 172struct mac_model *macintosh_config;
 173EXPORT_SYMBOL(macintosh_config);
 174
 175static struct mac_model mac_data_table[] = {
 176	/*
 177	 * We'll pretend to be a Macintosh II, that's pretty safe.
 178	 */
 179
 180	{
 181		.ident		= MAC_MODEL_II,
 182		.name		= "Unknown",
 183		.adb_type	= MAC_ADB_II,
 184		.via_type	= MAC_VIA_II,
 185		.scsi_type	= MAC_SCSI_OLD,
 186		.scc_type	= MAC_SCC_II,
 187		.expansion_type	= MAC_EXP_NUBUS,
 188		.floppy_type	= MAC_FLOPPY_UNSUPPORTED, /* IWM */
 189	},
 190
 191	/*
 192	 * Original Mac II hardware
 193	 */
 194
 195	{
 196		.ident		= MAC_MODEL_II,
 197		.name		= "II",
 198		.adb_type	= MAC_ADB_II,
 199		.via_type	= MAC_VIA_II,
 200		.scsi_type	= MAC_SCSI_OLD,
 201		.scc_type	= MAC_SCC_II,
 202		.expansion_type	= MAC_EXP_NUBUS,
 203		.floppy_type	= MAC_FLOPPY_UNSUPPORTED, /* IWM */
 204	}, {
 205		.ident		= MAC_MODEL_IIX,
 206		.name		= "IIx",
 207		.adb_type	= MAC_ADB_II,
 208		.via_type	= MAC_VIA_II,
 209		.scsi_type	= MAC_SCSI_OLD,
 210		.scc_type	= MAC_SCC_II,
 211		.expansion_type	= MAC_EXP_NUBUS,
 212		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 213	}, {
 214		.ident		= MAC_MODEL_IICX,
 215		.name		= "IIcx",
 216		.adb_type	= MAC_ADB_II,
 217		.via_type	= MAC_VIA_II,
 218		.scsi_type	= MAC_SCSI_OLD,
 219		.scc_type	= MAC_SCC_II,
 220		.expansion_type	= MAC_EXP_NUBUS,
 221		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 222	}, {
 223		.ident		= MAC_MODEL_SE30,
 224		.name		= "SE/30",
 225		.adb_type	= MAC_ADB_II,
 226		.via_type	= MAC_VIA_II,
 227		.scsi_type	= MAC_SCSI_OLD,
 228		.scc_type	= MAC_SCC_II,
 229		.expansion_type	= MAC_EXP_PDS,
 230		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 231	},
 232
 233	/*
 234	 * Weirdified Mac II hardware - all subtly different. Gee thanks
 235	 * Apple. All these boxes seem to have VIA2 in a different place to
 236	 * the Mac II (+1A000 rather than +4000)
 237	 * CSA: see http://developer.apple.com/technotes/hw/hw_09.html
 238	 */
 239
 240	{
 241		.ident		= MAC_MODEL_IICI,
 242		.name		= "IIci",
 243		.adb_type	= MAC_ADB_II,
 244		.via_type	= MAC_VIA_IICI,
 245		.scsi_type	= MAC_SCSI_OLD,
 246		.scc_type	= MAC_SCC_II,
 247		.expansion_type	= MAC_EXP_NUBUS,
 248		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 249	}, {
 250		.ident		= MAC_MODEL_IIFX,
 251		.name		= "IIfx",
 252		.adb_type	= MAC_ADB_IOP,
 253		.via_type	= MAC_VIA_IICI,
 254		.scsi_type	= MAC_SCSI_IIFX,
 255		.scc_type	= MAC_SCC_IOP,
 256		.expansion_type	= MAC_EXP_PDS_NUBUS,
 257		.floppy_type	= MAC_FLOPPY_SWIM_IOP, /* SWIM */
 258	}, {
 259		.ident		= MAC_MODEL_IISI,
 260		.name		= "IIsi",
 261		.adb_type	= MAC_ADB_EGRET,
 262		.via_type	= MAC_VIA_IICI,
 263		.scsi_type	= MAC_SCSI_OLD,
 264		.scc_type	= MAC_SCC_II,
 265		.expansion_type	= MAC_EXP_PDS_NUBUS,
 266		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 267	}, {
 268		.ident		= MAC_MODEL_IIVI,
 269		.name		= "IIvi",
 270		.adb_type	= MAC_ADB_EGRET,
 271		.via_type	= MAC_VIA_IICI,
 272		.scsi_type	= MAC_SCSI_LC,
 273		.scc_type	= MAC_SCC_II,
 274		.expansion_type	= MAC_EXP_NUBUS,
 275		.floppy_type	= MAC_FLOPPY_LC, /* SWIM */
 276	}, {
 277		.ident		= MAC_MODEL_IIVX,
 278		.name		= "IIvx",
 279		.adb_type	= MAC_ADB_EGRET,
 280		.via_type	= MAC_VIA_IICI,
 281		.scsi_type	= MAC_SCSI_LC,
 282		.scc_type	= MAC_SCC_II,
 283		.expansion_type	= MAC_EXP_NUBUS,
 284		.floppy_type	= MAC_FLOPPY_LC, /* SWIM */
 285	},
 286
 287	/*
 288	 * Classic models (guessing: similar to SE/30? Nope, similar to LC...)
 289	 */
 290
 291	{
 292		.ident		= MAC_MODEL_CLII,
 293		.name		= "Classic II",
 294		.adb_type	= MAC_ADB_EGRET,
 295		.via_type	= MAC_VIA_IICI,
 296		.scsi_type	= MAC_SCSI_LC,
 297		.scc_type	= MAC_SCC_II,
 298		.floppy_type	= MAC_FLOPPY_LC, /* SWIM */
 
 299	}, {
 300		.ident		= MAC_MODEL_CCL,
 301		.name		= "Color Classic",
 302		.adb_type	= MAC_ADB_CUDA,
 303		.via_type	= MAC_VIA_IICI,
 304		.scsi_type	= MAC_SCSI_LC,
 305		.scc_type	= MAC_SCC_II,
 306		.expansion_type	= MAC_EXP_PDS,
 307		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 308	}, {
 309		.ident		= MAC_MODEL_CCLII,
 310		.name		= "Color Classic II",
 311		.adb_type	= MAC_ADB_CUDA,
 312		.via_type	= MAC_VIA_IICI,
 313		.scsi_type	= MAC_SCSI_LC,
 314		.scc_type	= MAC_SCC_II,
 315		.expansion_type	= MAC_EXP_PDS,
 316		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 317	},
 318
 319	/*
 320	 * Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
 321	 */
 322
 323	{
 324		.ident		= MAC_MODEL_LC,
 325		.name		= "LC",
 326		.adb_type	= MAC_ADB_EGRET,
 327		.via_type	= MAC_VIA_IICI,
 328		.scsi_type	= MAC_SCSI_LC,
 329		.scc_type	= MAC_SCC_II,
 330		.expansion_type	= MAC_EXP_PDS,
 331		.floppy_type	= MAC_FLOPPY_LC, /* SWIM */
 332	}, {
 333		.ident		= MAC_MODEL_LCII,
 334		.name		= "LC II",
 335		.adb_type	= MAC_ADB_EGRET,
 336		.via_type	= MAC_VIA_IICI,
 337		.scsi_type	= MAC_SCSI_LC,
 338		.scc_type	= MAC_SCC_II,
 339		.expansion_type	= MAC_EXP_PDS,
 340		.floppy_type	= MAC_FLOPPY_LC, /* SWIM */
 341	}, {
 342		.ident		= MAC_MODEL_LCIII,
 343		.name		= "LC III",
 344		.adb_type	= MAC_ADB_EGRET,
 345		.via_type	= MAC_VIA_IICI,
 346		.scsi_type	= MAC_SCSI_LC,
 347		.scc_type	= MAC_SCC_II,
 348		.expansion_type	= MAC_EXP_PDS,
 349		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 350	},
 351
 352	/*
 353	 * Quadra. Video is at 0xF9000000, via is like a MacII. We label it
 354	 * differently as some of the stuff connected to VIA2 seems different.
 355	 * Better SCSI chip and onboard ethernet using a NatSemi SONIC except
 356	 * the 660AV and 840AV which use an AMD 79C940 (MACE).
 357	 * The 700, 900 and 950 have some I/O chips in the wrong place to
 358	 * confuse us. The 840AV has a SCSI location of its own (same as
 359	 * the 660AV).
 360	 */
 361
 362	{
 363		.ident		= MAC_MODEL_Q605,
 364		.name		= "Quadra 605",
 365		.adb_type	= MAC_ADB_CUDA,
 366		.via_type	= MAC_VIA_QUADRA,
 367		.scsi_type	= MAC_SCSI_QUADRA,
 368		.scc_type	= MAC_SCC_QUADRA,
 369		.expansion_type	= MAC_EXP_PDS,
 370		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 371	}, {
 372		.ident		= MAC_MODEL_Q605_ACC,
 373		.name		= "Quadra 605",
 374		.adb_type	= MAC_ADB_CUDA,
 375		.via_type	= MAC_VIA_QUADRA,
 376		.scsi_type	= MAC_SCSI_QUADRA,
 377		.scc_type	= MAC_SCC_QUADRA,
 378		.expansion_type	= MAC_EXP_PDS,
 379		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 380	}, {
 381		.ident		= MAC_MODEL_Q610,
 382		.name		= "Quadra 610",
 383		.adb_type	= MAC_ADB_II,
 384		.via_type	= MAC_VIA_QUADRA,
 385		.scsi_type	= MAC_SCSI_QUADRA,
 386		.scc_type	= MAC_SCC_QUADRA,
 387		.ether_type	= MAC_ETHER_SONIC,
 388		.expansion_type	= MAC_EXP_PDS_NUBUS,
 389		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 390	}, {
 391		.ident		= MAC_MODEL_Q630,
 392		.name		= "Quadra 630",
 393		.adb_type	= MAC_ADB_CUDA,
 394		.via_type	= MAC_VIA_QUADRA,
 395		.scsi_type	= MAC_SCSI_QUADRA,
 396		.ide_type	= MAC_IDE_QUADRA,
 397		.scc_type	= MAC_SCC_QUADRA,
 398		.expansion_type	= MAC_EXP_PDS_COMM,
 399		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 
 400	}, {
 401		.ident		= MAC_MODEL_Q650,
 402		.name		= "Quadra 650",
 403		.adb_type	= MAC_ADB_II,
 404		.via_type	= MAC_VIA_QUADRA,
 405		.scsi_type	= MAC_SCSI_QUADRA,
 406		.scc_type	= MAC_SCC_QUADRA,
 407		.ether_type	= MAC_ETHER_SONIC,
 408		.expansion_type	= MAC_EXP_PDS_NUBUS,
 409		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 410	},
 411	/* The Q700 does have a NS Sonic */
 412	{
 413		.ident		= MAC_MODEL_Q700,
 414		.name		= "Quadra 700",
 415		.adb_type	= MAC_ADB_II,
 416		.via_type	= MAC_VIA_QUADRA,
 417		.scsi_type	= MAC_SCSI_QUADRA2,
 418		.scc_type	= MAC_SCC_QUADRA,
 419		.ether_type	= MAC_ETHER_SONIC,
 420		.expansion_type	= MAC_EXP_PDS_NUBUS,
 421		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM */
 422	}, {
 423		.ident		= MAC_MODEL_Q800,
 424		.name		= "Quadra 800",
 425		.adb_type	= MAC_ADB_II,
 426		.via_type	= MAC_VIA_QUADRA,
 427		.scsi_type	= MAC_SCSI_QUADRA,
 428		.scc_type	= MAC_SCC_QUADRA,
 429		.ether_type	= MAC_ETHER_SONIC,
 430		.expansion_type	= MAC_EXP_PDS_NUBUS,
 431		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 432	}, {
 433		.ident		= MAC_MODEL_Q840,
 434		.name		= "Quadra 840AV",
 435		.adb_type	= MAC_ADB_CUDA,
 436		.via_type	= MAC_VIA_QUADRA,
 437		.scsi_type	= MAC_SCSI_QUADRA3,
 438		.scc_type	= MAC_SCC_PSC,
 439		.ether_type	= MAC_ETHER_MACE,
 440		.expansion_type	= MAC_EXP_NUBUS,
 441		.floppy_type	= MAC_FLOPPY_UNSUPPORTED, /* New Age */
 442	}, {
 443		.ident		= MAC_MODEL_Q900,
 444		.name		= "Quadra 900",
 445		.adb_type	= MAC_ADB_IOP,
 446		.via_type	= MAC_VIA_QUADRA,
 447		.scsi_type	= MAC_SCSI_QUADRA2,
 448		.scc_type	= MAC_SCC_IOP,
 449		.ether_type	= MAC_ETHER_SONIC,
 450		.expansion_type	= MAC_EXP_PDS_NUBUS,
 451		.floppy_type	= MAC_FLOPPY_SWIM_IOP, /* SWIM */
 452	}, {
 453		.ident		= MAC_MODEL_Q950,
 454		.name		= "Quadra 950",
 455		.adb_type	= MAC_ADB_IOP,
 456		.via_type	= MAC_VIA_QUADRA,
 457		.scsi_type	= MAC_SCSI_QUADRA2,
 458		.scc_type	= MAC_SCC_IOP,
 459		.ether_type	= MAC_ETHER_SONIC,
 460		.expansion_type	= MAC_EXP_PDS_NUBUS,
 461		.floppy_type	= MAC_FLOPPY_SWIM_IOP, /* SWIM */
 462	},
 463
 464	/*
 465	 * Performa - more LC type machines
 466	 */
 467
 468	{
 469		.ident		= MAC_MODEL_P460,
 470		.name		= "Performa 460",
 471		.adb_type	= MAC_ADB_EGRET,
 472		.via_type	= MAC_VIA_IICI,
 473		.scsi_type	= MAC_SCSI_LC,
 474		.scc_type	= MAC_SCC_II,
 475		.expansion_type	= MAC_EXP_PDS,
 476		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 477	}, {
 478		.ident		= MAC_MODEL_P475,
 479		.name		= "Performa 475",
 480		.adb_type	= MAC_ADB_CUDA,
 481		.via_type	= MAC_VIA_QUADRA,
 482		.scsi_type	= MAC_SCSI_QUADRA,
 483		.scc_type	= MAC_SCC_II,
 484		.expansion_type	= MAC_EXP_PDS,
 485		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 486	}, {
 487		.ident		= MAC_MODEL_P475F,
 488		.name		= "Performa 475",
 489		.adb_type	= MAC_ADB_CUDA,
 490		.via_type	= MAC_VIA_QUADRA,
 491		.scsi_type	= MAC_SCSI_QUADRA,
 492		.scc_type	= MAC_SCC_II,
 493		.expansion_type	= MAC_EXP_PDS,
 494		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 495	}, {
 496		.ident		= MAC_MODEL_P520,
 497		.name		= "Performa 520",
 498		.adb_type	= MAC_ADB_CUDA,
 499		.via_type	= MAC_VIA_IICI,
 500		.scsi_type	= MAC_SCSI_LC,
 501		.scc_type	= MAC_SCC_II,
 502		.expansion_type	= MAC_EXP_PDS,
 503		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 504	}, {
 505		.ident		= MAC_MODEL_P550,
 506		.name		= "Performa 550",
 507		.adb_type	= MAC_ADB_CUDA,
 508		.via_type	= MAC_VIA_IICI,
 509		.scsi_type	= MAC_SCSI_LC,
 510		.scc_type	= MAC_SCC_II,
 511		.expansion_type	= MAC_EXP_PDS,
 512		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 513	},
 514	/* These have the comm slot, and therefore possibly SONIC ethernet */
 515	{
 516		.ident		= MAC_MODEL_P575,
 517		.name		= "Performa 575",
 518		.adb_type	= MAC_ADB_CUDA,
 519		.via_type	= MAC_VIA_QUADRA,
 520		.scsi_type	= MAC_SCSI_QUADRA,
 521		.scc_type	= MAC_SCC_II,
 522		.expansion_type	= MAC_EXP_PDS_COMM,
 523		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 
 524	}, {
 525		.ident		= MAC_MODEL_P588,
 526		.name		= "Performa 588",
 527		.adb_type	= MAC_ADB_CUDA,
 528		.via_type	= MAC_VIA_QUADRA,
 529		.scsi_type	= MAC_SCSI_QUADRA,
 530		.ide_type	= MAC_IDE_QUADRA,
 531		.scc_type	= MAC_SCC_II,
 532		.expansion_type	= MAC_EXP_PDS_COMM,
 533		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 
 534	}, {
 535		.ident		= MAC_MODEL_TV,
 536		.name		= "TV",
 537		.adb_type	= MAC_ADB_CUDA,
 538		.via_type	= MAC_VIA_IICI,
 539		.scsi_type	= MAC_SCSI_LC,
 540		.scc_type	= MAC_SCC_II,
 541		.floppy_type	= MAC_FLOPPY_LC, /* SWIM 2 */
 
 542	}, {
 543		.ident		= MAC_MODEL_P600,
 544		.name		= "Performa 600",
 545		.adb_type	= MAC_ADB_EGRET,
 546		.via_type	= MAC_VIA_IICI,
 547		.scsi_type	= MAC_SCSI_LC,
 548		.scc_type	= MAC_SCC_II,
 549		.expansion_type	= MAC_EXP_NUBUS,
 550		.floppy_type	= MAC_FLOPPY_LC, /* SWIM */
 551	},
 552
 553	/*
 554	 * Centris - just guessing again; maybe like Quadra.
 555	 * The C610 may or may not have SONIC. We probe to make sure.
 556	 */
 557
 558	{
 559		.ident		= MAC_MODEL_C610,
 560		.name		= "Centris 610",
 561		.adb_type	= MAC_ADB_II,
 562		.via_type	= MAC_VIA_QUADRA,
 563		.scsi_type	= MAC_SCSI_QUADRA,
 564		.scc_type	= MAC_SCC_QUADRA,
 565		.ether_type	= MAC_ETHER_SONIC,
 566		.expansion_type	= MAC_EXP_PDS_NUBUS,
 567		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 568	}, {
 569		.ident		= MAC_MODEL_C650,
 570		.name		= "Centris 650",
 571		.adb_type	= MAC_ADB_II,
 572		.via_type	= MAC_VIA_QUADRA,
 573		.scsi_type	= MAC_SCSI_QUADRA,
 574		.scc_type	= MAC_SCC_QUADRA,
 575		.ether_type	= MAC_ETHER_SONIC,
 576		.expansion_type	= MAC_EXP_PDS_NUBUS,
 577		.floppy_type	= MAC_FLOPPY_QUADRA, /* SWIM 2 */
 578	}, {
 579		.ident		= MAC_MODEL_C660,
 580		.name		= "Centris 660AV",
 581		.adb_type	= MAC_ADB_CUDA,
 582		.via_type	= MAC_VIA_QUADRA,
 583		.scsi_type	= MAC_SCSI_QUADRA3,
 584		.scc_type	= MAC_SCC_PSC,
 585		.ether_type	= MAC_ETHER_MACE,
 586		.expansion_type	= MAC_EXP_PDS_NUBUS,
 587		.floppy_type	= MAC_FLOPPY_UNSUPPORTED, /* New Age */
 588	},
 589
 590	/*
 591	 * The PowerBooks all the same "Combo" custom IC for SCSI and SCC
 592	 * and a PMU (in two variations?) for ADB. Most of them use the
 593	 * Quadra-style VIAs. A few models also have IDE from hell.
 594	 */
 595
 596	{
 597		.ident		= MAC_MODEL_PB140,
 598		.name		= "PowerBook 140",
 599		.adb_type	= MAC_ADB_PB1,
 600		.via_type	= MAC_VIA_QUADRA,
 601		.scsi_type	= MAC_SCSI_OLD,
 602		.scc_type	= MAC_SCC_QUADRA,
 603		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 604	}, {
 605		.ident		= MAC_MODEL_PB145,
 606		.name		= "PowerBook 145",
 607		.adb_type	= MAC_ADB_PB1,
 608		.via_type	= MAC_VIA_QUADRA,
 609		.scsi_type	= MAC_SCSI_OLD,
 610		.scc_type	= MAC_SCC_QUADRA,
 611		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 612	}, {
 613		.ident		= MAC_MODEL_PB150,
 614		.name		= "PowerBook 150",
 615		.adb_type	= MAC_ADB_PB2,
 616		.via_type	= MAC_VIA_IICI,
 617		.scsi_type	= MAC_SCSI_OLD,
 618		.ide_type	= MAC_IDE_PB,
 619		.scc_type	= MAC_SCC_QUADRA,
 620		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 621	}, {
 622		.ident		= MAC_MODEL_PB160,
 623		.name		= "PowerBook 160",
 624		.adb_type	= MAC_ADB_PB1,
 625		.via_type	= MAC_VIA_QUADRA,
 626		.scsi_type	= MAC_SCSI_OLD,
 627		.scc_type	= MAC_SCC_QUADRA,
 628		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 629	}, {
 630		.ident		= MAC_MODEL_PB165,
 631		.name		= "PowerBook 165",
 632		.adb_type	= MAC_ADB_PB1,
 633		.via_type	= MAC_VIA_QUADRA,
 634		.scsi_type	= MAC_SCSI_OLD,
 635		.scc_type	= MAC_SCC_QUADRA,
 636		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 637	}, {
 638		.ident		= MAC_MODEL_PB165C,
 639		.name		= "PowerBook 165c",
 640		.adb_type	= MAC_ADB_PB1,
 641		.via_type	= MAC_VIA_QUADRA,
 642		.scsi_type	= MAC_SCSI_OLD,
 643		.scc_type	= MAC_SCC_QUADRA,
 644		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 645	}, {
 646		.ident		= MAC_MODEL_PB170,
 647		.name		= "PowerBook 170",
 648		.adb_type	= MAC_ADB_PB1,
 649		.via_type	= MAC_VIA_QUADRA,
 650		.scsi_type	= MAC_SCSI_OLD,
 651		.scc_type	= MAC_SCC_QUADRA,
 652		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 653	}, {
 654		.ident		= MAC_MODEL_PB180,
 655		.name		= "PowerBook 180",
 656		.adb_type	= MAC_ADB_PB1,
 657		.via_type	= MAC_VIA_QUADRA,
 658		.scsi_type	= MAC_SCSI_OLD,
 659		.scc_type	= MAC_SCC_QUADRA,
 660		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 661	}, {
 662		.ident		= MAC_MODEL_PB180C,
 663		.name		= "PowerBook 180c",
 664		.adb_type	= MAC_ADB_PB1,
 665		.via_type	= MAC_VIA_QUADRA,
 666		.scsi_type	= MAC_SCSI_OLD,
 667		.scc_type	= MAC_SCC_QUADRA,
 668		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 
 669	}, {
 670		.ident		= MAC_MODEL_PB190,
 671		.name		= "PowerBook 190",
 672		.adb_type	= MAC_ADB_PB2,
 673		.via_type	= MAC_VIA_QUADRA,
 674		.scsi_type	= MAC_SCSI_OLD,
 675		.ide_type	= MAC_IDE_BABOON,
 676		.scc_type	= MAC_SCC_QUADRA,
 677		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM 2 */
 
 678	}, {
 679		.ident		= MAC_MODEL_PB520,
 680		.name		= "PowerBook 520",
 681		.adb_type	= MAC_ADB_PB2,
 682		.via_type	= MAC_VIA_QUADRA,
 683		.scsi_type	= MAC_SCSI_OLD,
 684		.scc_type	= MAC_SCC_QUADRA,
 685		.ether_type	= MAC_ETHER_SONIC,
 686		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM 2 */
 
 687	},
 688
 689	/*
 690	 * PowerBook Duos are pretty much like normal PowerBooks
 691	 * All of these probably have onboard SONIC in the Dock which
 692	 * means we'll have to probe for it eventually.
 693	 */
 694
 695	{
 696		.ident		= MAC_MODEL_PB210,
 697		.name		= "PowerBook Duo 210",
 698		.adb_type	= MAC_ADB_PB2,
 699		.via_type	= MAC_VIA_IICI,
 700		.scsi_type	= MAC_SCSI_DUO,
 701		.scc_type	= MAC_SCC_QUADRA,
 702		.expansion_type	= MAC_EXP_NUBUS,
 703		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 704	}, {
 705		.ident		= MAC_MODEL_PB230,
 706		.name		= "PowerBook Duo 230",
 707		.adb_type	= MAC_ADB_PB2,
 708		.via_type	= MAC_VIA_IICI,
 709		.scsi_type	= MAC_SCSI_DUO,
 710		.scc_type	= MAC_SCC_QUADRA,
 711		.expansion_type	= MAC_EXP_NUBUS,
 712		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 713	}, {
 714		.ident		= MAC_MODEL_PB250,
 715		.name		= "PowerBook Duo 250",
 716		.adb_type	= MAC_ADB_PB2,
 717		.via_type	= MAC_VIA_IICI,
 718		.scsi_type	= MAC_SCSI_DUO,
 719		.scc_type	= MAC_SCC_QUADRA,
 720		.expansion_type	= MAC_EXP_NUBUS,
 721		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 722	}, {
 723		.ident		= MAC_MODEL_PB270C,
 724		.name		= "PowerBook Duo 270c",
 725		.adb_type	= MAC_ADB_PB2,
 726		.via_type	= MAC_VIA_IICI,
 727		.scsi_type	= MAC_SCSI_DUO,
 728		.scc_type	= MAC_SCC_QUADRA,
 729		.expansion_type	= MAC_EXP_NUBUS,
 730		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 731	}, {
 732		.ident		= MAC_MODEL_PB280,
 733		.name		= "PowerBook Duo 280",
 734		.adb_type	= MAC_ADB_PB2,
 735		.via_type	= MAC_VIA_IICI,
 736		.scsi_type	= MAC_SCSI_DUO,
 737		.scc_type	= MAC_SCC_QUADRA,
 738		.expansion_type	= MAC_EXP_NUBUS,
 739		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 740	}, {
 741		.ident		= MAC_MODEL_PB280C,
 742		.name		= "PowerBook Duo 280c",
 743		.adb_type	= MAC_ADB_PB2,
 744		.via_type	= MAC_VIA_IICI,
 745		.scsi_type	= MAC_SCSI_DUO,
 746		.scc_type	= MAC_SCC_QUADRA,
 747		.expansion_type	= MAC_EXP_NUBUS,
 748		.floppy_type	= MAC_FLOPPY_OLD, /* SWIM */
 749	},
 750
 751	/*
 752	 * Other stuff?
 753	 */
 754
 755	{
 756		.ident		= -1
 757	}
 758};
 759
 760static struct resource scc_a_rsrcs[] = {
 761	{ .flags = IORESOURCE_MEM },
 762	{ .flags = IORESOURCE_IRQ },
 763};
 764
 765static struct resource scc_b_rsrcs[] = {
 766	{ .flags = IORESOURCE_MEM },
 767	{ .flags = IORESOURCE_IRQ },
 768};
 769
 770struct platform_device scc_a_pdev = {
 771	.name           = "scc",
 772	.id             = 0,
 
 
 773};
 774EXPORT_SYMBOL(scc_a_pdev);
 775
 776struct platform_device scc_b_pdev = {
 777	.name           = "scc",
 778	.id             = 1,
 
 
 779};
 780EXPORT_SYMBOL(scc_b_pdev);
 781
 782static void __init mac_identify(void)
 783{
 784	struct mac_model *m;
 785
 786	/* Penguin data useful? */
 787	int model = mac_bi_data.id;
 788	if (!model) {
 789		/* no bootinfo model id -> NetBSD booter was used! */
 790		/* XXX FIXME: breaks for model > 31 */
 791		model = (mac_bi_data.cpuid >> 2) & 63;
 792		pr_warn("No bootinfo model ID, using cpuid instead (obsolete bootloader?)\n");
 
 793	}
 794
 795	macintosh_config = mac_data_table;
 796	for (m = macintosh_config; m->ident != -1; m++) {
 797		if (m->ident == model) {
 798			macintosh_config = m;
 799			break;
 800		}
 801	}
 802
 803	/* Set up serial port resources for the console initcall. */
 804
 805	scc_a_rsrcs[0].start     = (resource_size_t)mac_bi_data.sccbase + 2;
 806	scc_a_rsrcs[0].end       = scc_a_rsrcs[0].start;
 807	scc_a_pdev.num_resources = ARRAY_SIZE(scc_a_rsrcs);
 808	scc_a_pdev.resource      = scc_a_rsrcs;
 809
 810	scc_b_rsrcs[0].start     = (resource_size_t)mac_bi_data.sccbase;
 811	scc_b_rsrcs[0].end       = scc_b_rsrcs[0].start;
 812	scc_b_pdev.num_resources = ARRAY_SIZE(scc_b_rsrcs);
 813	scc_b_pdev.resource      = scc_b_rsrcs;
 814
 815	switch (macintosh_config->scc_type) {
 816	case MAC_SCC_PSC:
 817		scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A;
 818		scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B;
 819		break;
 820	default:
 821		/* On non-PSC machines, the serial ports share an IRQ. */
 822		if (macintosh_config->ident == MAC_MODEL_IIFX) {
 823			scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC;
 824			scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC;
 825		} else {
 826			scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_AUTO_4;
 827			scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_AUTO_4;
 828		}
 829		break;
 830	}
 831
 832	pr_info("Detected Macintosh model: %d\n", model);
 
 
 
 
 
 
 
 833
 834	/*
 835	 * Report booter data:
 836	 */
 837	printk(KERN_DEBUG " Penguin bootinfo data:\n");
 838	printk(KERN_DEBUG " Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ld\n",
 
 839		mac_bi_data.videoaddr, mac_bi_data.videorow,
 840		mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
 841		mac_bi_data.dimensions >> 16);
 842	printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n",
 843		mac_bi_data.videological, mac_orig_videoaddr,
 844		mac_bi_data.sccbase);
 845	printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n",
 846		mac_bi_data.boottime, mac_bi_data.gmtbias);
 847	printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n",
 848		mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
 849
 850	iop_init();
 851	oss_init();
 852	via_init();
 
 853	psc_init();
 854	baboon_init();
 855
 856#ifdef CONFIG_ADB_CUDA
 857	find_via_cuda();
 858#endif
 859#ifdef CONFIG_ADB_PMU
 860	find_via_pmu();
 861#endif
 862}
 863
 864static void __init mac_report_hardware(void)
 865{
 866	pr_info("Apple Macintosh %s\n", macintosh_config->name);
 867}
 868
 869static void mac_get_model(char *str)
 870{
 871	strcpy(str, "Macintosh ");
 872	strcat(str, macintosh_config->name);
 873}
 874
 875static const struct resource mac_scsi_iifx_rsrc[] __initconst = {
 876	{
 877		.flags = IORESOURCE_IRQ,
 878		.start = IRQ_MAC_SCSI,
 879		.end   = IRQ_MAC_SCSI,
 880	}, {
 881		.flags = IORESOURCE_MEM,
 882		.start = 0x50008000,
 883		.end   = 0x50009FFF,
 884	}, {
 885		.flags = IORESOURCE_MEM,
 886		.start = 0x50008000,
 887		.end   = 0x50009FFF,
 888	},
 889};
 890
 891static const struct resource mac_scsi_duo_rsrc[] __initconst = {
 892	{
 893		.flags = IORESOURCE_MEM,
 894		.start = 0xFEE02000,
 895		.end   = 0xFEE03FFF,
 896	},
 897};
 898
 899static const struct resource mac_scsi_old_rsrc[] __initconst = {
 900	{
 901		.flags = IORESOURCE_IRQ,
 902		.start = IRQ_MAC_SCSI,
 903		.end   = IRQ_MAC_SCSI,
 904	}, {
 905		.flags = IORESOURCE_MEM,
 906		.start = 0x50010000,
 907		.end   = 0x50011FFF,
 908	}, {
 909		.flags = IORESOURCE_MEM,
 910		.start = 0x50006000,
 911		.end   = 0x50007FFF,
 912	},
 913};
 914
 915static const struct resource mac_scsi_ccl_rsrc[] __initconst = {
 916	{
 917		.flags = IORESOURCE_IRQ,
 918		.start = IRQ_MAC_SCSI,
 919		.end   = IRQ_MAC_SCSI,
 920	}, {
 921		.flags = IORESOURCE_MEM,
 922		.start = 0x50F10000,
 923		.end   = 0x50F11FFF,
 924	}, {
 925		.flags = IORESOURCE_MEM,
 926		.start = 0x50F06000,
 927		.end   = 0x50F07FFF,
 928	},
 929};
 930
 931static const struct resource mac_pata_quadra_rsrc[] __initconst = {
 932	DEFINE_RES_MEM(0x50F1A000, 0x38),
 933	DEFINE_RES_MEM(0x50F1A038, 0x04),
 934	DEFINE_RES_IRQ(IRQ_NUBUS_F),
 935};
 936
 937static const struct resource mac_pata_pb_rsrc[] __initconst = {
 938	DEFINE_RES_MEM(0x50F1A000, 0x38),
 939	DEFINE_RES_MEM(0x50F1A038, 0x04),
 940	DEFINE_RES_IRQ(IRQ_NUBUS_C),
 941};
 942
 943static const struct resource mac_pata_baboon_rsrc[] __initconst = {
 944	DEFINE_RES_MEM(0x50F1A000, 0x38),
 945	DEFINE_RES_MEM(0x50F1A038, 0x04),
 946	DEFINE_RES_IRQ(IRQ_BABOON_1),
 947};
 948
 949static const struct pata_platform_info mac_pata_data __initconst = {
 950	.ioport_shift = 2,
 
 951};
 952
 953static int __init mac_platform_init(void)
 954{
 955	phys_addr_t swim_base = 0;
 956
 957	if (!MACH_IS_MAC)
 958		return -ENODEV;
 959
 960	/*
 961	 * Serial devices
 962	 */
 963
 964	platform_device_register(&scc_a_pdev);
 965	platform_device_register(&scc_b_pdev);
 966
 967	/*
 968	 * Floppy device
 969	 */
 970
 971	switch (macintosh_config->floppy_type) {
 972	case MAC_FLOPPY_QUADRA:
 973		swim_base = 0x5001E000;
 974		break;
 975	case MAC_FLOPPY_OLD:
 976		swim_base = 0x50016000;
 977		break;
 978	case MAC_FLOPPY_LC:
 979		swim_base = 0x50F16000;
 980		break;
 981	}
 982
 983	if (swim_base) {
 984		struct resource swim_rsrc = {
 985			.flags = IORESOURCE_MEM,
 986			.start = swim_base,
 987			.end   = swim_base + 0x1FFF,
 988		};
 989
 990		platform_device_register_simple("swim", -1, &swim_rsrc, 1);
 991	}
 992
 993	/*
 994	 * SCSI device(s)
 995	 */
 996
 997	switch (macintosh_config->scsi_type) {
 998	case MAC_SCSI_QUADRA:
 999	case MAC_SCSI_QUADRA3:
1000		platform_device_register_simple("mac_esp", 0, NULL, 0);
1001		break;
1002	case MAC_SCSI_QUADRA2:
1003		platform_device_register_simple("mac_esp", 0, NULL, 0);
1004		if ((macintosh_config->ident == MAC_MODEL_Q900) ||
1005		    (macintosh_config->ident == MAC_MODEL_Q950))
1006			platform_device_register_simple("mac_esp", 1, NULL, 0);
1007		break;
1008	case MAC_SCSI_IIFX:
1009		/* Addresses from The Guide to Mac Family Hardware.
1010		 * $5000 8000 - $5000 9FFF: SCSI DMA
1011		 * $5000 A000 - $5000 BFFF: Alternate SCSI
1012		 * $5000 C000 - $5000 DFFF: Alternate SCSI (DMA)
1013		 * $5000 E000 - $5000 FFFF: Alternate SCSI (Hsk)
1014		 * The A/UX header file sys/uconfig.h says $50F0 8000.
1015		 * The "SCSI DMA" custom IC embeds the 53C80 core and
1016		 * supports Programmed IO, DMA and PDMA (hardware handshake).
1017		 */
1018		platform_device_register_simple("mac_scsi", 0,
1019			mac_scsi_iifx_rsrc, ARRAY_SIZE(mac_scsi_iifx_rsrc));
1020		break;
1021	case MAC_SCSI_DUO:
1022		/* Addresses from the Duo Dock II Developer Note.
1023		 * $FEE0 2000 - $FEE0 3FFF: normal mode
1024		 * $FEE0 4000 - $FEE0 5FFF: pseudo DMA without /DRQ
1025		 * $FEE0 6000 - $FEE0 7FFF: pseudo DMA with /DRQ
1026		 * The NetBSD code indicates that both 5380 chips share
1027		 * an IRQ (?) which would need careful handling (see mac_esp).
1028		 */
1029		platform_device_register_simple("mac_scsi", 1,
1030			mac_scsi_duo_rsrc, ARRAY_SIZE(mac_scsi_duo_rsrc));
1031		fallthrough;
1032	case MAC_SCSI_OLD:
1033		/* Addresses from Developer Notes for Duo System,
1034		 * PowerBook 180 & 160, 140 & 170, Macintosh IIsi
1035		 * and also from The Guide to Mac Family Hardware for
1036		 * SE/30, II, IIx, IIcx, IIci.
1037		 * $5000 6000 - $5000 7FFF: pseudo-DMA with /DRQ
1038		 * $5001 0000 - $5001 1FFF: normal mode
1039		 * $5001 2000 - $5001 3FFF: pseudo-DMA without /DRQ
1040		 * GMFH says that $5000 0000 - $50FF FFFF "wraps
1041		 * $5000 0000 - $5001 FFFF eight times" (!)
1042		 * mess.org says IIci and Color Classic do not alias
1043		 * I/O address space.
1044		 */
1045		platform_device_register_simple("mac_scsi", 0,
1046			mac_scsi_old_rsrc, ARRAY_SIZE(mac_scsi_old_rsrc));
1047		break;
1048	case MAC_SCSI_LC:
1049		/* Addresses from Mac LC data in Designing Cards & Drivers 3ed.
1050		 * Also from the Developer Notes for Classic II, LC III,
1051		 * Color Classic and IIvx.
1052		 * $50F0 6000 - $50F0 7FFF: SCSI handshake
1053		 * $50F1 0000 - $50F1 1FFF: SCSI
1054		 * $50F1 2000 - $50F1 3FFF: SCSI DMA
1055		 */
1056		platform_device_register_simple("mac_scsi", 0,
1057			mac_scsi_ccl_rsrc, ARRAY_SIZE(mac_scsi_ccl_rsrc));
1058		break;
1059	}
1060
1061	/*
1062	 * IDE device
1063	 */
1064
1065	switch (macintosh_config->ide_type) {
1066	case MAC_IDE_QUADRA:
1067		platform_device_register_resndata(NULL, "pata_platform", -1,
1068			mac_pata_quadra_rsrc, ARRAY_SIZE(mac_pata_quadra_rsrc),
1069			&mac_pata_data, sizeof(mac_pata_data));
1070		break;
1071	case MAC_IDE_PB:
1072		platform_device_register_resndata(NULL, "pata_platform", -1,
1073			mac_pata_pb_rsrc, ARRAY_SIZE(mac_pata_pb_rsrc),
1074			&mac_pata_data, sizeof(mac_pata_data));
1075		break;
1076	case MAC_IDE_BABOON:
1077		platform_device_register_resndata(NULL, "pata_platform", -1,
1078			mac_pata_baboon_rsrc, ARRAY_SIZE(mac_pata_baboon_rsrc),
1079			&mac_pata_data, sizeof(mac_pata_data));
1080		break;
1081	}
1082
1083	/*
1084	 * Ethernet device
1085	 */
1086
1087	if (macintosh_config->ether_type == MAC_ETHER_SONIC ||
1088	    macintosh_config->expansion_type == MAC_EXP_PDS_COMM)
1089		platform_device_register_simple("macsonic", -1, NULL, 0);
1090
1091	if (macintosh_config->expansion_type == MAC_EXP_PDS ||
1092	    macintosh_config->expansion_type == MAC_EXP_PDS_COMM)
1093		platform_device_register_simple("mac89x0", -1, NULL, 0);
1094
1095	if (macintosh_config->ether_type == MAC_ETHER_MACE)
1096		platform_device_register_simple("macmace", -1, NULL, 0);
1097
1098	return 0;
1099}
1100
1101arch_initcall(mac_platform_init);
   1/*
   2 *  linux/arch/m68k/mac/config.c
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file COPYING in the main directory of this archive
   6 * for more details.
   7 */
   8
   9/*
  10 * Miscellaneous linux stuff
  11 */
  12
 
  13#include <linux/module.h>
 
  14#include <linux/types.h>
  15#include <linux/mm.h>
  16#include <linux/tty.h>
  17#include <linux/console.h>
  18#include <linux/interrupt.h>
  19/* keyb */
  20#include <linux/random.h>
  21#include <linux/delay.h>
  22/* keyb */
  23#include <linux/init.h>
  24#include <linux/vt_kern.h>
  25#include <linux/platform_device.h>
 
  26#include <linux/adb.h>
  27#include <linux/cuda.h>
 
 
  28
  29#include <asm/setup.h>
  30#include <asm/bootinfo.h>
  31#include <asm/bootinfo-mac.h>
  32#include <asm/byteorder.h>
  33
  34#include <asm/io.h>
  35#include <asm/irq.h>
  36#include <asm/pgtable.h>
  37#include <asm/rtc.h>
  38#include <asm/machdep.h>
  39
  40#include <asm/macintosh.h>
  41#include <asm/macints.h>
  42#include <asm/machw.h>
  43
  44#include <asm/mac_iop.h>
  45#include <asm/mac_via.h>
  46#include <asm/mac_oss.h>
  47#include <asm/mac_psc.h>
 
 
 
  48
  49/* Mac bootinfo struct */
  50struct mac_booter_data mac_bi_data;
  51
  52/* The phys. video addr. - might be bogus on some machines */
  53static unsigned long mac_orig_videoaddr;
  54
  55/* Mac specific timer functions */
  56extern u32 mac_gettimeoffset(void);
  57extern int mac_hwclk(int, struct rtc_time *);
  58extern int mac_set_clock_mmss(unsigned long);
  59extern void iop_preinit(void);
  60extern void iop_init(void);
  61extern void via_init(void);
  62extern void via_init_clock(irq_handler_t func);
  63extern void via_flush_cache(void);
  64extern void oss_init(void);
  65extern void psc_init(void);
  66extern void baboon_init(void);
  67
  68extern void mac_mksound(unsigned int, unsigned int);
  69
  70static void mac_get_model(char *str);
  71static void mac_identify(void);
  72static void mac_report_hardware(void);
  73
  74#ifdef CONFIG_EARLY_PRINTK
  75asmlinkage void __init mac_early_print(const char *s, unsigned n);
  76
  77static void __init mac_early_cons_write(struct console *con,
  78                                 const char *s, unsigned n)
  79{
  80	mac_early_print(s, n);
  81}
  82
  83static struct console __initdata mac_early_cons = {
  84	.name  = "early",
  85	.write = mac_early_cons_write,
  86	.flags = CON_PRINTBUFFER | CON_BOOT,
  87	.index = -1
  88};
  89
  90int __init mac_unregister_early_cons(void)
  91{
  92	/* mac_early_print can't be used after init sections are discarded */
  93	return unregister_console(&mac_early_cons);
  94}
  95
  96late_initcall(mac_unregister_early_cons);
  97#endif
  98
  99static void __init mac_sched_init(irq_handler_t vector)
 100{
 101	via_init_clock(vector);
 102}
 103
 104/*
 105 * Parse a Macintosh-specific record in the bootinfo
 106 */
 107
 108int __init mac_parse_bootinfo(const struct bi_record *record)
 109{
 110	int unknown = 0;
 111	const void *data = record->data;
 112
 113	switch (be16_to_cpu(record->tag)) {
 114	case BI_MAC_MODEL:
 115		mac_bi_data.id = be32_to_cpup(data);
 116		break;
 117	case BI_MAC_VADDR:
 118		mac_bi_data.videoaddr = be32_to_cpup(data);
 119		break;
 120	case BI_MAC_VDEPTH:
 121		mac_bi_data.videodepth = be32_to_cpup(data);
 122		break;
 123	case BI_MAC_VROW:
 124		mac_bi_data.videorow = be32_to_cpup(data);
 125		break;
 126	case BI_MAC_VDIM:
 127		mac_bi_data.dimensions = be32_to_cpup(data);
 128		break;
 129	case BI_MAC_VLOGICAL:
 130		mac_orig_videoaddr = be32_to_cpup(data);
 131		mac_bi_data.videological =
 132			VIDEOMEMBASE + (mac_orig_videoaddr & ~VIDEOMEMMASK);
 133		break;
 134	case BI_MAC_SCCBASE:
 135		mac_bi_data.sccbase = be32_to_cpup(data);
 136		break;
 137	case BI_MAC_BTIME:
 138		mac_bi_data.boottime = be32_to_cpup(data);
 139		break;
 140	case BI_MAC_GMTBIAS:
 141		mac_bi_data.gmtbias = be32_to_cpup(data);
 142		break;
 143	case BI_MAC_MEMSIZE:
 144		mac_bi_data.memsize = be32_to_cpup(data);
 145		break;
 146	case BI_MAC_CPUID:
 147		mac_bi_data.cpuid = be32_to_cpup(data);
 148		break;
 149	case BI_MAC_ROMBASE:
 150		mac_bi_data.rombase = be32_to_cpup(data);
 151		break;
 152	default:
 153		unknown = 1;
 154		break;
 155	}
 156	return unknown;
 157}
 158
 159/*
 160 * Flip into 24bit mode for an instant - flushes the L2 cache card. We
 161 * have to disable interrupts for this. Our IRQ handlers will crap
 162 * themselves if they take an IRQ in 24bit mode!
 163 */
 164
 165static void mac_cache_card_flush(int writeback)
 166{
 167	unsigned long flags;
 168
 169	local_irq_save(flags);
 170	via_flush_cache();
 171	local_irq_restore(flags);
 172}
 173
 174void __init config_mac(void)
 175{
 176	if (!MACH_IS_MAC)
 177		printk(KERN_ERR "ERROR: no Mac, but config_mac() called!!\n");
 178
 179	mach_sched_init = mac_sched_init;
 180	mach_init_IRQ = mac_init_IRQ;
 181	mach_get_model = mac_get_model;
 182	arch_gettimeoffset = mac_gettimeoffset;
 183	mach_hwclk = mac_hwclk;
 184	mach_set_clock_mmss = mac_set_clock_mmss;
 185	mach_reset = mac_reset;
 186	mach_halt = mac_poweroff;
 187	mach_power_off = mac_poweroff;
 188	mach_max_dma_address = 0xffffffff;
 189#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
 190	mach_beep = mac_mksound;
 191#endif
 192
 193#ifdef CONFIG_EARLY_PRINTK
 194	register_console(&mac_early_cons);
 195#endif
 196
 197	/*
 198	 * Determine hardware present
 199	 */
 200
 201	mac_identify();
 202	mac_report_hardware();
 203
 204	/*
 205	 * AFAIK only the IIci takes a cache card.  The IIfx has onboard
 206	 * cache ... someone needs to figure out how to tell if it's on or
 207	 * not.
 208	 */
 209
 210	if (macintosh_config->ident == MAC_MODEL_IICI
 211	    || macintosh_config->ident == MAC_MODEL_IIFX)
 212		mach_l2_flush = mac_cache_card_flush;
 
 213}
 214
 215
 216/*
 217 * Macintosh Table: hardcoded model configuration data.
 218 *
 219 * Much of this was defined by Alan, based on who knows what docs.
 220 * I've added a lot more, and some of that was pure guesswork based
 221 * on hardware pages present on the Mac web site. Possibly wildly
 222 * inaccurate, so look here if a new Mac model won't run. Example: if
 223 * a Mac crashes immediately after the VIA1 registers have been dumped
 224 * to the screen, it probably died attempting to read DirB on a RBV.
 225 * Meaning it should have MAC_VIA_IICI here :-)
 226 */
 227
 228struct mac_model *macintosh_config;
 229EXPORT_SYMBOL(macintosh_config);
 230
 231static struct mac_model mac_data_table[] = {
 232	/*
 233	 * We'll pretend to be a Macintosh II, that's pretty safe.
 234	 */
 235
 236	{
 237		.ident		= MAC_MODEL_II,
 238		.name		= "Unknown",
 239		.adb_type	= MAC_ADB_II,
 240		.via_type	= MAC_VIA_II,
 241		.scsi_type	= MAC_SCSI_OLD,
 242		.scc_type	= MAC_SCC_II,
 243		.nubus_type	= MAC_NUBUS,
 244		.floppy_type	= MAC_FLOPPY_IWM,
 245	},
 246
 247	/*
 248	 * Original Mac II hardware
 249	 */
 250
 251	{
 252		.ident		= MAC_MODEL_II,
 253		.name		= "II",
 254		.adb_type	= MAC_ADB_II,
 255		.via_type	= MAC_VIA_II,
 256		.scsi_type	= MAC_SCSI_OLD,
 257		.scc_type	= MAC_SCC_II,
 258		.nubus_type	= MAC_NUBUS,
 259		.floppy_type	= MAC_FLOPPY_IWM,
 260	}, {
 261		.ident		= MAC_MODEL_IIX,
 262		.name		= "IIx",
 263		.adb_type	= MAC_ADB_II,
 264		.via_type	= MAC_VIA_II,
 265		.scsi_type	= MAC_SCSI_OLD,
 266		.scc_type	= MAC_SCC_II,
 267		.nubus_type	= MAC_NUBUS,
 268		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 269	}, {
 270		.ident		= MAC_MODEL_IICX,
 271		.name		= "IIcx",
 272		.adb_type	= MAC_ADB_II,
 273		.via_type	= MAC_VIA_II,
 274		.scsi_type	= MAC_SCSI_OLD,
 275		.scc_type	= MAC_SCC_II,
 276		.nubus_type	= MAC_NUBUS,
 277		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 278	}, {
 279		.ident		= MAC_MODEL_SE30,
 280		.name		= "SE/30",
 281		.adb_type	= MAC_ADB_II,
 282		.via_type	= MAC_VIA_II,
 283		.scsi_type	= MAC_SCSI_OLD,
 284		.scc_type	= MAC_SCC_II,
 285		.nubus_type	= MAC_NUBUS,
 286		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 287	},
 288
 289	/*
 290	 * Weirdified Mac II hardware - all subtly different. Gee thanks
 291	 * Apple. All these boxes seem to have VIA2 in a different place to
 292	 * the Mac II (+1A000 rather than +4000)
 293	 * CSA: see http://developer.apple.com/technotes/hw/hw_09.html
 294	 */
 295
 296	{
 297		.ident		= MAC_MODEL_IICI,
 298		.name		= "IIci",
 299		.adb_type	= MAC_ADB_II,
 300		.via_type	= MAC_VIA_IICI,
 301		.scsi_type	= MAC_SCSI_OLD,
 302		.scc_type	= MAC_SCC_II,
 303		.nubus_type	= MAC_NUBUS,
 304		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 305	}, {
 306		.ident		= MAC_MODEL_IIFX,
 307		.name		= "IIfx",
 308		.adb_type	= MAC_ADB_IOP,
 309		.via_type	= MAC_VIA_IICI,
 310		.scsi_type	= MAC_SCSI_OLD,
 311		.scc_type	= MAC_SCC_IOP,
 312		.nubus_type	= MAC_NUBUS,
 313		.floppy_type	= MAC_FLOPPY_SWIM_IOP,
 314	}, {
 315		.ident		= MAC_MODEL_IISI,
 316		.name		= "IIsi",
 317		.adb_type	= MAC_ADB_IISI,
 318		.via_type	= MAC_VIA_IICI,
 319		.scsi_type	= MAC_SCSI_OLD,
 320		.scc_type	= MAC_SCC_II,
 321		.nubus_type	= MAC_NUBUS,
 322		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 323	}, {
 324		.ident		= MAC_MODEL_IIVI,
 325		.name		= "IIvi",
 326		.adb_type	= MAC_ADB_IISI,
 327		.via_type	= MAC_VIA_IICI,
 328		.scsi_type	= MAC_SCSI_OLD,
 329		.scc_type	= MAC_SCC_II,
 330		.nubus_type	= MAC_NUBUS,
 331		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 332	}, {
 333		.ident		= MAC_MODEL_IIVX,
 334		.name		= "IIvx",
 335		.adb_type	= MAC_ADB_IISI,
 336		.via_type	= MAC_VIA_IICI,
 337		.scsi_type	= MAC_SCSI_OLD,
 338		.scc_type	= MAC_SCC_II,
 339		.nubus_type	= MAC_NUBUS,
 340		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 341	},
 342
 343	/*
 344	 * Classic models (guessing: similar to SE/30? Nope, similar to LC...)
 345	 */
 346
 347	{
 348		.ident		= MAC_MODEL_CLII,
 349		.name		= "Classic II",
 350		.adb_type	= MAC_ADB_IISI,
 351		.via_type	= MAC_VIA_IICI,
 352		.scsi_type	= MAC_SCSI_OLD,
 353		.scc_type	= MAC_SCC_II,
 354		.nubus_type	= MAC_NUBUS,
 355		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 356	}, {
 357		.ident		= MAC_MODEL_CCL,
 358		.name		= "Color Classic",
 359		.adb_type	= MAC_ADB_CUDA,
 360		.via_type	= MAC_VIA_IICI,
 361		.scsi_type	= MAC_SCSI_OLD,
 362		.scc_type	= MAC_SCC_II,
 363		.nubus_type	= MAC_NUBUS,
 364		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 365	}, {
 366		.ident		= MAC_MODEL_CCLII,
 367		.name		= "Color Classic II",
 368		.adb_type	= MAC_ADB_CUDA,
 369		.via_type	= MAC_VIA_IICI,
 370		.scsi_type	= MAC_SCSI_OLD,
 371		.scc_type	= MAC_SCC_II,
 372		.nubus_type	= MAC_NUBUS,
 373		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 374	},
 375
 376	/*
 377	 * Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
 378	 */
 379
 380	{
 381		.ident		= MAC_MODEL_LC,
 382		.name		= "LC",
 383		.adb_type	= MAC_ADB_IISI,
 384		.via_type	= MAC_VIA_IICI,
 385		.scsi_type	= MAC_SCSI_OLD,
 386		.scc_type	= MAC_SCC_II,
 387		.nubus_type	= MAC_NUBUS,
 388		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 389	}, {
 390		.ident		= MAC_MODEL_LCII,
 391		.name		= "LC II",
 392		.adb_type	= MAC_ADB_IISI,
 393		.via_type	= MAC_VIA_IICI,
 394		.scsi_type	= MAC_SCSI_OLD,
 395		.scc_type	= MAC_SCC_II,
 396		.nubus_type	= MAC_NUBUS,
 397		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 398	}, {
 399		.ident		= MAC_MODEL_LCIII,
 400		.name		= "LC III",
 401		.adb_type	= MAC_ADB_IISI,
 402		.via_type	= MAC_VIA_IICI,
 403		.scsi_type	= MAC_SCSI_OLD,
 404		.scc_type	= MAC_SCC_II,
 405		.nubus_type	= MAC_NUBUS,
 406		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 407	},
 408
 409	/*
 410	 * Quadra. Video is at 0xF9000000, via is like a MacII. We label it
 411	 * differently as some of the stuff connected to VIA2 seems different.
 412	 * Better SCSI chip and onboard ethernet using a NatSemi SONIC except
 413	 * the 660AV and 840AV which use an AMD 79C940 (MACE).
 414	 * The 700, 900 and 950 have some I/O chips in the wrong place to
 415	 * confuse us. The 840AV has a SCSI location of its own (same as
 416	 * the 660AV).
 417	 */
 418
 419	{
 420		.ident		= MAC_MODEL_Q605,
 421		.name		= "Quadra 605",
 422		.adb_type	= MAC_ADB_CUDA,
 423		.via_type	= MAC_VIA_QUADRA,
 424		.scsi_type	= MAC_SCSI_QUADRA,
 425		.scc_type	= MAC_SCC_QUADRA,
 426		.nubus_type	= MAC_NUBUS,
 427		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 428	}, {
 429		.ident		= MAC_MODEL_Q605_ACC,
 430		.name		= "Quadra 605",
 431		.adb_type	= MAC_ADB_CUDA,
 432		.via_type	= MAC_VIA_QUADRA,
 433		.scsi_type	= MAC_SCSI_QUADRA,
 434		.scc_type	= MAC_SCC_QUADRA,
 435		.nubus_type	= MAC_NUBUS,
 436		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 437	}, {
 438		.ident		= MAC_MODEL_Q610,
 439		.name		= "Quadra 610",
 440		.adb_type	= MAC_ADB_II,
 441		.via_type	= MAC_VIA_QUADRA,
 442		.scsi_type	= MAC_SCSI_QUADRA,
 443		.scc_type	= MAC_SCC_QUADRA,
 444		.ether_type	= MAC_ETHER_SONIC,
 445		.nubus_type	= MAC_NUBUS,
 446		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 447	}, {
 448		.ident		= MAC_MODEL_Q630,
 449		.name		= "Quadra 630",
 450		.adb_type	= MAC_ADB_CUDA,
 451		.via_type	= MAC_VIA_QUADRA,
 452		.scsi_type	= MAC_SCSI_QUADRA,
 453		.ide_type	= MAC_IDE_QUADRA,
 454		.scc_type	= MAC_SCC_QUADRA,
 455		.ether_type	= MAC_ETHER_SONIC,
 456		.nubus_type	= MAC_NUBUS,
 457		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 458	}, {
 459		.ident		= MAC_MODEL_Q650,
 460		.name		= "Quadra 650",
 461		.adb_type	= MAC_ADB_II,
 462		.via_type	= MAC_VIA_QUADRA,
 463		.scsi_type	= MAC_SCSI_QUADRA,
 464		.scc_type	= MAC_SCC_QUADRA,
 465		.ether_type	= MAC_ETHER_SONIC,
 466		.nubus_type	= MAC_NUBUS,
 467		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 468	},
 469	/* The Q700 does have a NS Sonic */
 470	{
 471		.ident		= MAC_MODEL_Q700,
 472		.name		= "Quadra 700",
 473		.adb_type	= MAC_ADB_II,
 474		.via_type	= MAC_VIA_QUADRA,
 475		.scsi_type	= MAC_SCSI_QUADRA2,
 476		.scc_type	= MAC_SCC_QUADRA,
 477		.ether_type	= MAC_ETHER_SONIC,
 478		.nubus_type	= MAC_NUBUS,
 479		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 480	}, {
 481		.ident		= MAC_MODEL_Q800,
 482		.name		= "Quadra 800",
 483		.adb_type	= MAC_ADB_II,
 484		.via_type	= MAC_VIA_QUADRA,
 485		.scsi_type	= MAC_SCSI_QUADRA,
 486		.scc_type	= MAC_SCC_QUADRA,
 487		.ether_type	= MAC_ETHER_SONIC,
 488		.nubus_type	= MAC_NUBUS,
 489		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 490	}, {
 491		.ident		= MAC_MODEL_Q840,
 492		.name		= "Quadra 840AV",
 493		.adb_type	= MAC_ADB_CUDA,
 494		.via_type	= MAC_VIA_QUADRA,
 495		.scsi_type	= MAC_SCSI_QUADRA3,
 496		.scc_type	= MAC_SCC_PSC,
 497		.ether_type	= MAC_ETHER_MACE,
 498		.nubus_type	= MAC_NUBUS,
 499		.floppy_type	= MAC_FLOPPY_AV,
 500	}, {
 501		.ident		= MAC_MODEL_Q900,
 502		.name		= "Quadra 900",
 503		.adb_type	= MAC_ADB_IOP,
 504		.via_type	= MAC_VIA_QUADRA,
 505		.scsi_type	= MAC_SCSI_QUADRA2,
 506		.scc_type	= MAC_SCC_IOP,
 507		.ether_type	= MAC_ETHER_SONIC,
 508		.nubus_type	= MAC_NUBUS,
 509		.floppy_type	= MAC_FLOPPY_SWIM_IOP,
 510	}, {
 511		.ident		= MAC_MODEL_Q950,
 512		.name		= "Quadra 950",
 513		.adb_type	= MAC_ADB_IOP,
 514		.via_type	= MAC_VIA_QUADRA,
 515		.scsi_type	= MAC_SCSI_QUADRA2,
 516		.scc_type	= MAC_SCC_IOP,
 517		.ether_type	= MAC_ETHER_SONIC,
 518		.nubus_type	= MAC_NUBUS,
 519		.floppy_type	= MAC_FLOPPY_SWIM_IOP,
 520	},
 521
 522	/*
 523	 * Performa - more LC type machines
 524	 */
 525
 526	{
 527		.ident		= MAC_MODEL_P460,
 528		.name		= "Performa 460",
 529		.adb_type	= MAC_ADB_IISI,
 530		.via_type	= MAC_VIA_IICI,
 531		.scsi_type	= MAC_SCSI_OLD,
 532		.scc_type	= MAC_SCC_II,
 533		.nubus_type	= MAC_NUBUS,
 534		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 535	}, {
 536		.ident		= MAC_MODEL_P475,
 537		.name		= "Performa 475",
 538		.adb_type	= MAC_ADB_CUDA,
 539		.via_type	= MAC_VIA_QUADRA,
 540		.scsi_type	= MAC_SCSI_QUADRA,
 541		.scc_type	= MAC_SCC_II,
 542		.nubus_type	= MAC_NUBUS,
 543		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 544	}, {
 545		.ident		= MAC_MODEL_P475F,
 546		.name		= "Performa 475",
 547		.adb_type	= MAC_ADB_CUDA,
 548		.via_type	= MAC_VIA_QUADRA,
 549		.scsi_type	= MAC_SCSI_QUADRA,
 550		.scc_type	= MAC_SCC_II,
 551		.nubus_type	= MAC_NUBUS,
 552		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 553	}, {
 554		.ident		= MAC_MODEL_P520,
 555		.name		= "Performa 520",
 556		.adb_type	= MAC_ADB_CUDA,
 557		.via_type	= MAC_VIA_IICI,
 558		.scsi_type	= MAC_SCSI_OLD,
 559		.scc_type	= MAC_SCC_II,
 560		.nubus_type	= MAC_NUBUS,
 561		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 562	}, {
 563		.ident		= MAC_MODEL_P550,
 564		.name		= "Performa 550",
 565		.adb_type	= MAC_ADB_CUDA,
 566		.via_type	= MAC_VIA_IICI,
 567		.scsi_type	= MAC_SCSI_OLD,
 568		.scc_type	= MAC_SCC_II,
 569		.nubus_type	= MAC_NUBUS,
 570		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 571	},
 572	/* These have the comm slot, and therefore possibly SONIC ethernet */
 573	{
 574		.ident		= MAC_MODEL_P575,
 575		.name		= "Performa 575",
 576		.adb_type	= MAC_ADB_CUDA,
 577		.via_type	= MAC_VIA_QUADRA,
 578		.scsi_type	= MAC_SCSI_QUADRA,
 579		.scc_type	= MAC_SCC_II,
 580		.ether_type	= MAC_ETHER_SONIC,
 581		.nubus_type	= MAC_NUBUS,
 582		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 583	}, {
 584		.ident		= MAC_MODEL_P588,
 585		.name		= "Performa 588",
 586		.adb_type	= MAC_ADB_CUDA,
 587		.via_type	= MAC_VIA_QUADRA,
 588		.scsi_type	= MAC_SCSI_QUADRA,
 589		.ide_type	= MAC_IDE_QUADRA,
 590		.scc_type	= MAC_SCC_II,
 591		.ether_type	= MAC_ETHER_SONIC,
 592		.nubus_type	= MAC_NUBUS,
 593		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 594	}, {
 595		.ident		= MAC_MODEL_TV,
 596		.name		= "TV",
 597		.adb_type	= MAC_ADB_CUDA,
 598		.via_type	= MAC_VIA_IICI,
 599		.scsi_type	= MAC_SCSI_OLD,
 600		.scc_type	= MAC_SCC_II,
 601		.nubus_type	= MAC_NUBUS,
 602		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 603	}, {
 604		.ident		= MAC_MODEL_P600,
 605		.name		= "Performa 600",
 606		.adb_type	= MAC_ADB_IISI,
 607		.via_type	= MAC_VIA_IICI,
 608		.scsi_type	= MAC_SCSI_OLD,
 609		.scc_type	= MAC_SCC_II,
 610		.nubus_type	= MAC_NUBUS,
 611		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 612	},
 613
 614	/*
 615	 * Centris - just guessing again; maybe like Quadra.
 616	 * The C610 may or may not have SONIC. We probe to make sure.
 617	 */
 618
 619	{
 620		.ident		= MAC_MODEL_C610,
 621		.name		= "Centris 610",
 622		.adb_type	= MAC_ADB_II,
 623		.via_type	= MAC_VIA_QUADRA,
 624		.scsi_type	= MAC_SCSI_QUADRA,
 625		.scc_type	= MAC_SCC_QUADRA,
 626		.ether_type	= MAC_ETHER_SONIC,
 627		.nubus_type	= MAC_NUBUS,
 628		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 629	}, {
 630		.ident		= MAC_MODEL_C650,
 631		.name		= "Centris 650",
 632		.adb_type	= MAC_ADB_II,
 633		.via_type	= MAC_VIA_QUADRA,
 634		.scsi_type	= MAC_SCSI_QUADRA,
 635		.scc_type	= MAC_SCC_QUADRA,
 636		.ether_type	= MAC_ETHER_SONIC,
 637		.nubus_type	= MAC_NUBUS,
 638		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1,
 639	}, {
 640		.ident		= MAC_MODEL_C660,
 641		.name		= "Centris 660AV",
 642		.adb_type	= MAC_ADB_CUDA,
 643		.via_type	= MAC_VIA_QUADRA,
 644		.scsi_type	= MAC_SCSI_QUADRA3,
 645		.scc_type	= MAC_SCC_PSC,
 646		.ether_type	= MAC_ETHER_MACE,
 647		.nubus_type	= MAC_NUBUS,
 648		.floppy_type	= MAC_FLOPPY_AV,
 649	},
 650
 651	/*
 652	 * The PowerBooks all the same "Combo" custom IC for SCSI and SCC
 653	 * and a PMU (in two variations?) for ADB. Most of them use the
 654	 * Quadra-style VIAs. A few models also have IDE from hell.
 655	 */
 656
 657	{
 658		.ident		= MAC_MODEL_PB140,
 659		.name		= "PowerBook 140",
 660		.adb_type	= MAC_ADB_PB1,
 661		.via_type	= MAC_VIA_QUADRA,
 662		.scsi_type	= MAC_SCSI_OLD,
 663		.scc_type	= MAC_SCC_QUADRA,
 664		.nubus_type	= MAC_NUBUS,
 665		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 666	}, {
 667		.ident		= MAC_MODEL_PB145,
 668		.name		= "PowerBook 145",
 669		.adb_type	= MAC_ADB_PB1,
 670		.via_type	= MAC_VIA_QUADRA,
 671		.scsi_type	= MAC_SCSI_OLD,
 672		.scc_type	= MAC_SCC_QUADRA,
 673		.nubus_type	= MAC_NUBUS,
 674		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 675	}, {
 676		.ident		= MAC_MODEL_PB150,
 677		.name		= "PowerBook 150",
 678		.adb_type	= MAC_ADB_PB2,
 679		.via_type	= MAC_VIA_IICI,
 680		.scsi_type	= MAC_SCSI_OLD,
 681		.ide_type	= MAC_IDE_PB,
 682		.scc_type	= MAC_SCC_QUADRA,
 683		.nubus_type	= MAC_NUBUS,
 684		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 685	}, {
 686		.ident		= MAC_MODEL_PB160,
 687		.name		= "PowerBook 160",
 688		.adb_type	= MAC_ADB_PB1,
 689		.via_type	= MAC_VIA_QUADRA,
 690		.scsi_type	= MAC_SCSI_OLD,
 691		.scc_type	= MAC_SCC_QUADRA,
 692		.nubus_type	= MAC_NUBUS,
 693		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 694	}, {
 695		.ident		= MAC_MODEL_PB165,
 696		.name		= "PowerBook 165",
 697		.adb_type	= MAC_ADB_PB1,
 698		.via_type	= MAC_VIA_QUADRA,
 699		.scsi_type	= MAC_SCSI_OLD,
 700		.scc_type	= MAC_SCC_QUADRA,
 701		.nubus_type	= MAC_NUBUS,
 702		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 703	}, {
 704		.ident		= MAC_MODEL_PB165C,
 705		.name		= "PowerBook 165c",
 706		.adb_type	= MAC_ADB_PB1,
 707		.via_type	= MAC_VIA_QUADRA,
 708		.scsi_type	= MAC_SCSI_OLD,
 709		.scc_type	= MAC_SCC_QUADRA,
 710		.nubus_type	= MAC_NUBUS,
 711		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 712	}, {
 713		.ident		= MAC_MODEL_PB170,
 714		.name		= "PowerBook 170",
 715		.adb_type	= MAC_ADB_PB1,
 716		.via_type	= MAC_VIA_QUADRA,
 717		.scsi_type	= MAC_SCSI_OLD,
 718		.scc_type	= MAC_SCC_QUADRA,
 719		.nubus_type	= MAC_NUBUS,
 720		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 721	}, {
 722		.ident		= MAC_MODEL_PB180,
 723		.name		= "PowerBook 180",
 724		.adb_type	= MAC_ADB_PB1,
 725		.via_type	= MAC_VIA_QUADRA,
 726		.scsi_type	= MAC_SCSI_OLD,
 727		.scc_type	= MAC_SCC_QUADRA,
 728		.nubus_type	= MAC_NUBUS,
 729		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 730	}, {
 731		.ident		= MAC_MODEL_PB180C,
 732		.name		= "PowerBook 180c",
 733		.adb_type	= MAC_ADB_PB1,
 734		.via_type	= MAC_VIA_QUADRA,
 735		.scsi_type	= MAC_SCSI_OLD,
 736		.scc_type	= MAC_SCC_QUADRA,
 737		.nubus_type	= MAC_NUBUS,
 738		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 739	}, {
 740		.ident		= MAC_MODEL_PB190,
 741		.name		= "PowerBook 190",
 742		.adb_type	= MAC_ADB_PB2,
 743		.via_type	= MAC_VIA_QUADRA,
 744		.scsi_type	= MAC_SCSI_OLD,
 745		.ide_type	= MAC_IDE_BABOON,
 746		.scc_type	= MAC_SCC_QUADRA,
 747		.nubus_type	= MAC_NUBUS,
 748		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 749	}, {
 750		.ident		= MAC_MODEL_PB520,
 751		.name		= "PowerBook 520",
 752		.adb_type	= MAC_ADB_PB2,
 753		.via_type	= MAC_VIA_QUADRA,
 754		.scsi_type	= MAC_SCSI_OLD,
 755		.scc_type	= MAC_SCC_QUADRA,
 756		.ether_type	= MAC_ETHER_SONIC,
 757		.nubus_type	= MAC_NUBUS,
 758		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 759	},
 760
 761	/*
 762	 * PowerBook Duos are pretty much like normal PowerBooks
 763	 * All of these probably have onboard SONIC in the Dock which
 764	 * means we'll have to probe for it eventually.
 765	 */
 766
 767	{
 768		.ident		= MAC_MODEL_PB210,
 769		.name		= "PowerBook Duo 210",
 770		.adb_type	= MAC_ADB_PB2,
 771		.via_type	= MAC_VIA_IICI,
 772		.scsi_type	= MAC_SCSI_OLD,
 773		.scc_type	= MAC_SCC_QUADRA,
 774		.nubus_type	= MAC_NUBUS,
 775		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 776	}, {
 777		.ident		= MAC_MODEL_PB230,
 778		.name		= "PowerBook Duo 230",
 779		.adb_type	= MAC_ADB_PB2,
 780		.via_type	= MAC_VIA_IICI,
 781		.scsi_type	= MAC_SCSI_OLD,
 782		.scc_type	= MAC_SCC_QUADRA,
 783		.nubus_type	= MAC_NUBUS,
 784		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 785	}, {
 786		.ident		= MAC_MODEL_PB250,
 787		.name		= "PowerBook Duo 250",
 788		.adb_type	= MAC_ADB_PB2,
 789		.via_type	= MAC_VIA_IICI,
 790		.scsi_type	= MAC_SCSI_OLD,
 791		.scc_type	= MAC_SCC_QUADRA,
 792		.nubus_type	= MAC_NUBUS,
 793		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 794	}, {
 795		.ident		= MAC_MODEL_PB270C,
 796		.name		= "PowerBook Duo 270c",
 797		.adb_type	= MAC_ADB_PB2,
 798		.via_type	= MAC_VIA_IICI,
 799		.scsi_type	= MAC_SCSI_OLD,
 800		.scc_type	= MAC_SCC_QUADRA,
 801		.nubus_type	= MAC_NUBUS,
 802		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 803	}, {
 804		.ident		= MAC_MODEL_PB280,
 805		.name		= "PowerBook Duo 280",
 806		.adb_type	= MAC_ADB_PB2,
 807		.via_type	= MAC_VIA_IICI,
 808		.scsi_type	= MAC_SCSI_OLD,
 809		.scc_type	= MAC_SCC_QUADRA,
 810		.nubus_type	= MAC_NUBUS,
 811		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 812	}, {
 813		.ident		= MAC_MODEL_PB280C,
 814		.name		= "PowerBook Duo 280c",
 815		.adb_type	= MAC_ADB_PB2,
 816		.via_type	= MAC_VIA_IICI,
 817		.scsi_type	= MAC_SCSI_OLD,
 818		.scc_type	= MAC_SCC_QUADRA,
 819		.nubus_type	= MAC_NUBUS,
 820		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
 821	},
 822
 823	/*
 824	 * Other stuff?
 825	 */
 826
 827	{
 828		.ident		= -1
 829	}
 830};
 831
 832static struct resource scc_a_rsrcs[] = {
 833	{ .flags = IORESOURCE_MEM },
 834	{ .flags = IORESOURCE_IRQ },
 835};
 836
 837static struct resource scc_b_rsrcs[] = {
 838	{ .flags = IORESOURCE_MEM },
 839	{ .flags = IORESOURCE_IRQ },
 840};
 841
 842struct platform_device scc_a_pdev = {
 843	.name           = "scc",
 844	.id             = 0,
 845	.num_resources  = ARRAY_SIZE(scc_a_rsrcs),
 846	.resource       = scc_a_rsrcs,
 847};
 848EXPORT_SYMBOL(scc_a_pdev);
 849
 850struct platform_device scc_b_pdev = {
 851	.name           = "scc",
 852	.id             = 1,
 853	.num_resources  = ARRAY_SIZE(scc_b_rsrcs),
 854	.resource       = scc_b_rsrcs,
 855};
 856EXPORT_SYMBOL(scc_b_pdev);
 857
 858static void __init mac_identify(void)
 859{
 860	struct mac_model *m;
 861
 862	/* Penguin data useful? */
 863	int model = mac_bi_data.id;
 864	if (!model) {
 865		/* no bootinfo model id -> NetBSD booter was used! */
 866		/* XXX FIXME: breaks for model > 31 */
 867		model = (mac_bi_data.cpuid >> 2) & 63;
 868		printk(KERN_WARNING "No bootinfo model ID, using cpuid instead "
 869		       "(obsolete bootloader?)\n");
 870	}
 871
 872	macintosh_config = mac_data_table;
 873	for (m = macintosh_config; m->ident != -1; m++) {
 874		if (m->ident == model) {
 875			macintosh_config = m;
 876			break;
 877		}
 878	}
 879
 880	/* Set up serial port resources for the console initcall. */
 881
 882	scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2;
 883	scc_a_rsrcs[0].end   = scc_a_rsrcs[0].start;
 884	scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase;
 885	scc_b_rsrcs[0].end   = scc_b_rsrcs[0].start;
 
 
 
 
 
 886
 887	switch (macintosh_config->scc_type) {
 888	case MAC_SCC_PSC:
 889		scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A;
 890		scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B;
 891		break;
 892	default:
 893		/* On non-PSC machines, the serial ports share an IRQ. */
 894		if (macintosh_config->ident == MAC_MODEL_IIFX) {
 895			scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC;
 896			scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC;
 897		} else {
 898			scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_AUTO_4;
 899			scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_AUTO_4;
 900		}
 901		break;
 902	}
 903
 904	/*
 905	 * We need to pre-init the IOPs, if any. Otherwise
 906	 * the serial console won't work if the user had
 907	 * the serial ports set to "Faster" mode in MacOS.
 908	 */
 909	iop_preinit();
 910
 911	printk(KERN_INFO "Detected Macintosh model: %d\n", model);
 912
 913	/*
 914	 * Report booter data:
 915	 */
 916	printk(KERN_DEBUG " Penguin bootinfo data:\n");
 917	printk(KERN_DEBUG " Video: addr 0x%lx "
 918		"row 0x%lx depth %lx dimensions %ld x %ld\n",
 919		mac_bi_data.videoaddr, mac_bi_data.videorow,
 920		mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
 921		mac_bi_data.dimensions >> 16);
 922	printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n",
 923		mac_bi_data.videological, mac_orig_videoaddr,
 924		mac_bi_data.sccbase);
 925	printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n",
 926		mac_bi_data.boottime, mac_bi_data.gmtbias);
 927	printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n",
 928		mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
 929
 930	iop_init();
 
 931	via_init();
 932	oss_init();
 933	psc_init();
 934	baboon_init();
 935
 936#ifdef CONFIG_ADB_CUDA
 937	find_via_cuda();
 938#endif
 
 
 
 939}
 940
 941static void __init mac_report_hardware(void)
 942{
 943	printk(KERN_INFO "Apple Macintosh %s\n", macintosh_config->name);
 944}
 945
 946static void mac_get_model(char *str)
 947{
 948	strcpy(str, "Macintosh ");
 949	strcat(str, macintosh_config->name);
 950}
 951
 952static struct resource swim_rsrc = { .flags = IORESOURCE_MEM };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 953
 954static struct platform_device swim_pdev = {
 955	.name		= "swim",
 956	.id		= -1,
 957	.num_resources	= 1,
 958	.resource	= &swim_rsrc,
 
 
 
 
 
 
 
 
 
 959};
 960
 961static struct platform_device esp_0_pdev = {
 962	.name		= "mac_esp",
 963	.id		= 0,
 
 964};
 965
 966static struct platform_device esp_1_pdev = {
 967	.name		= "mac_esp",
 968	.id		= 1,
 
 969};
 970
 971static struct platform_device sonic_pdev = {
 972	.name		= "macsonic",
 973	.id		= -1,
 
 974};
 975
 976static struct platform_device mace_pdev = {
 977	.name		= "macmace",
 978	.id		= -1,
 979};
 980
 981int __init mac_platform_init(void)
 982{
 983	u8 *swim_base;
 984
 985	if (!MACH_IS_MAC)
 986		return -ENODEV;
 987
 988	/*
 989	 * Serial devices
 990	 */
 991
 992	platform_device_register(&scc_a_pdev);
 993	platform_device_register(&scc_b_pdev);
 994
 995	/*
 996	 * Floppy device
 997	 */
 998
 999	switch (macintosh_config->floppy_type) {
1000	case MAC_FLOPPY_SWIM_ADDR1:
1001		swim_base = (u8 *)(VIA1_BASE + 0x1E000);
1002		break;
1003	case MAC_FLOPPY_SWIM_ADDR2:
1004		swim_base = (u8 *)(VIA1_BASE + 0x16000);
1005		break;
1006	default:
1007		swim_base = NULL;
1008		break;
1009	}
1010
1011	if (swim_base) {
1012		swim_rsrc.start = (resource_size_t) swim_base,
1013		swim_rsrc.end   = (resource_size_t) swim_base + 0x2000,
1014		platform_device_register(&swim_pdev);
 
 
 
 
1015	}
1016
1017	/*
1018	 * SCSI device(s)
1019	 */
1020
1021	switch (macintosh_config->scsi_type) {
1022	case MAC_SCSI_QUADRA:
1023	case MAC_SCSI_QUADRA3:
1024		platform_device_register(&esp_0_pdev);
1025		break;
1026	case MAC_SCSI_QUADRA2:
1027		platform_device_register(&esp_0_pdev);
1028		if ((macintosh_config->ident == MAC_MODEL_Q900) ||
1029		    (macintosh_config->ident == MAC_MODEL_Q950))
1030			platform_device_register(&esp_1_pdev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1031		break;
1032	}
1033
1034	/*
1035	 * Ethernet device
1036	 */
1037
1038	switch (macintosh_config->ether_type) {
1039	case MAC_ETHER_SONIC:
1040		platform_device_register(&sonic_pdev);
1041		break;
1042	case MAC_ETHER_MACE:
1043		platform_device_register(&mace_pdev);
 
 
 
 
 
 
 
 
 
1044		break;
1045	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1046
1047	return 0;
1048}
1049
1050arch_initcall(mac_platform_init);