Linux Audio

Check our new training course

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