config.c 22.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 *  linux/arch/m68k/mac/config.c
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file COPYING in the main directory of this archive
 * for more details.
 */

/*
 * Miscellaneous linux stuff
 */

#include <linux/module.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/interrupt.h>
/* keyb */
#include <linux/random.h>
#include <linux/delay.h>
/* keyb */
#include <linux/init.h>
#include <linux/vt_kern.h>
25
#include <linux/platform_device.h>
L
Linus Torvalds 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

#define BOOTINFO_COMPAT_1_0
#include <asm/setup.h>
#include <asm/bootinfo.h>

#include <asm/system.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/pgtable.h>
#include <asm/rtc.h>
#include <asm/machdep.h>

#include <asm/macintosh.h>
#include <asm/macints.h>
#include <asm/machw.h>

#include <asm/mac_iop.h>
#include <asm/mac_via.h>
#include <asm/mac_oss.h>
#include <asm/mac_psc.h>

47 48 49 50
/* platform device info */

#define SWIM_IO_SIZE 0x2000	/* SWIM IO resource size */

L
Linus Torvalds 已提交
51 52 53 54 55
/* Mac bootinfo struct */

struct mac_booter_data mac_bi_data;

/* The phys. video addr. - might be bogus on some machines */
A
Adrian Bunk 已提交
56
static unsigned long mac_orig_videoaddr;
L
Linus Torvalds 已提交
57 58

/* Mac specific timer functions */
R
Roman Zippel 已提交
59 60 61
extern unsigned long mac_gettimeoffset(void);
extern int mac_hwclk(int, struct rtc_time *);
extern int mac_set_clock_mmss(unsigned long);
L
Linus Torvalds 已提交
62 63 64
extern void iop_preinit(void);
extern void iop_init(void);
extern void via_init(void);
65
extern void via_init_clock(irq_handler_t func);
L
Linus Torvalds 已提交
66 67 68 69 70 71 72 73 74 75
extern void via_flush_cache(void);
extern void oss_init(void);
extern void psc_init(void);
extern void baboon_init(void);

extern void mac_mksound(unsigned int, unsigned int);

extern void nubus_sweep_video(void);

static void mac_get_model(char *str);
A
Adrian Bunk 已提交
76 77
static void mac_identify(void);
static void mac_report_hardware(void);
L
Linus Torvalds 已提交
78

A
Al Viro 已提交
79
static void __init mac_sched_init(irq_handler_t vector)
L
Linus Torvalds 已提交
80 81 82 83 84 85 86 87 88 89
{
	via_init_clock(vector);
}

/*
 * Parse a Macintosh-specific record in the bootinfo
 */

int __init mac_parse_bootinfo(const struct bi_record *record)
{
R
Roman Zippel 已提交
90 91
	int unknown = 0;
	const u_long *data = record->data;
L
Linus Torvalds 已提交
92

R
Roman Zippel 已提交
93
	switch (record->tag) {
L
Linus Torvalds 已提交
94
	case BI_MAC_MODEL:
R
Roman Zippel 已提交
95 96
		mac_bi_data.id = *data;
		break;
L
Linus Torvalds 已提交
97
	case BI_MAC_VADDR:
R
Roman Zippel 已提交
98 99
		mac_bi_data.videoaddr = *data;
		break;
L
Linus Torvalds 已提交
100
	case BI_MAC_VDEPTH:
R
Roman Zippel 已提交
101 102
		mac_bi_data.videodepth = *data;
		break;
L
Linus Torvalds 已提交
103
	case BI_MAC_VROW:
R
Roman Zippel 已提交
104 105
		mac_bi_data.videorow = *data;
		break;
L
Linus Torvalds 已提交
106
	case BI_MAC_VDIM:
R
Roman Zippel 已提交
107 108
		mac_bi_data.dimensions = *data;
		break;
L
Linus Torvalds 已提交
109
	case BI_MAC_VLOGICAL:
R
Roman Zippel 已提交
110 111 112
		mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK);
		mac_orig_videoaddr = *data;
		break;
L
Linus Torvalds 已提交
113
	case BI_MAC_SCCBASE:
R
Roman Zippel 已提交
114 115
		mac_bi_data.sccbase = *data;
		break;
L
Linus Torvalds 已提交
116
	case BI_MAC_BTIME:
R
Roman Zippel 已提交
117 118
		mac_bi_data.boottime = *data;
		break;
L
Linus Torvalds 已提交
119
	case BI_MAC_GMTBIAS:
R
Roman Zippel 已提交
120 121
		mac_bi_data.gmtbias = *data;
		break;
L
Linus Torvalds 已提交
122
	case BI_MAC_MEMSIZE:
R
Roman Zippel 已提交
123 124
		mac_bi_data.memsize = *data;
		break;
L
Linus Torvalds 已提交
125
	case BI_MAC_CPUID:
R
Roman Zippel 已提交
126 127 128 129 130
		mac_bi_data.cpuid = *data;
		break;
	case BI_MAC_ROMBASE:
		mac_bi_data.rombase = *data;
		break;
L
Linus Torvalds 已提交
131
	default:
R
Roman Zippel 已提交
132 133 134 135
		unknown = 1;
		break;
	}
	return unknown;
L
Linus Torvalds 已提交
136 137 138 139 140 141 142 143 144 145 146
}

/*
 * Flip into 24bit mode for an instant - flushes the L2 cache card. We
 * have to disable interrupts for this. Our IRQ handlers will crap
 * themselves if they take an IRQ in 24bit mode!
 */

static void mac_cache_card_flush(int writeback)
{
	unsigned long flags;
R
Roman Zippel 已提交
147

L
Linus Torvalds 已提交
148 149 150 151 152 153 154
	local_irq_save(flags);
	via_flush_cache();
	local_irq_restore(flags);
}

void __init config_mac(void)
{
R
Roman Zippel 已提交
155 156
	if (!MACH_IS_MAC)
		printk(KERN_ERR "ERROR: no Mac, but config_mac() called!! \n");
L
Linus Torvalds 已提交
157

R
Roman Zippel 已提交
158 159 160 161 162 163 164 165 166
	mach_sched_init = mac_sched_init;
	mach_init_IRQ = mac_init_IRQ;
	mach_get_model = mac_get_model;
	mach_gettimeoffset = mac_gettimeoffset;
	mach_hwclk = mac_hwclk;
	mach_set_clock_mmss = mac_set_clock_mmss;
	mach_reset = mac_reset;
	mach_halt = mac_poweroff;
	mach_power_off = mac_poweroff;
L
Linus Torvalds 已提交
167 168
	mach_max_dma_address = 0xffffffff;
#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
R
Roman Zippel 已提交
169
	mach_beep = mac_mksound;
L
Linus Torvalds 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
#endif
#ifdef CONFIG_HEARTBEAT
#if 0
	mach_heartbeat = mac_heartbeat;
	mach_heartbeat_irq = IRQ_MAC_TIMER;
#endif
#endif

	/*
	 * Determine hardware present
	 */

	mac_identify();
	mac_report_hardware();

R
Roman Zippel 已提交
185 186 187 188 189
	/*
	 * AFAIK only the IIci takes a cache card.  The IIfx has onboard
	 * cache ... someone needs to figure out how to tell if it's on or
	 * not.
	 */
L
Linus Torvalds 已提交
190 191

	if (macintosh_config->ident == MAC_MODEL_IICI
R
Roman Zippel 已提交
192
	    || macintosh_config->ident == MAC_MODEL_IIFX)
L
Linus Torvalds 已提交
193 194 195 196 197 198 199
		mach_l2_flush = mac_cache_card_flush;

	/*
	 * Check for machine specific fixups.
	 */

#ifdef OLD_NUBUS_CODE
R
Roman Zippel 已提交
200
	nubus_sweep_video();
L
Linus Torvalds 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
#endif
}


/*
 *	Macintosh Table: hardcoded model configuration data.
 *
 *	Much of this was defined by Alan, based on who knows what docs.
 *	I've added a lot more, and some of that was pure guesswork based
 *	on hardware pages present on the Mac web site. Possibly wildly
 *	inaccurate, so look here if a new Mac model won't run. Example: if
 *	a Mac crashes immediately after the VIA1 registers have been dumped
 *	to the screen, it probably died attempting to read DirB on a RBV.
 *	Meaning it should have MAC_VIA_IIci here :-)
 */

struct mac_model *macintosh_config;
EXPORT_SYMBOL(macintosh_config);

R
Roman Zippel 已提交
220
static struct mac_model mac_data_table[] = {
L
Linus Torvalds 已提交
221 222 223 224 225 226 227 228 229 230 231
	/*
	 *	We'll pretend to be a Macintosh II, that's pretty safe.
	 */

	{
		.ident		= MAC_MODEL_II,
		.name		= "Unknown",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_II,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
232 233
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_IWM
L
Linus Torvalds 已提交
234 235 236 237 238 239 240 241 242 243 244 245 246 247
	},

	/*
	 *	Original MacII hardware
	 *
	 */

	{
		.ident		= MAC_MODEL_II,
		.name		= "II",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_II,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
248 249
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_IWM
L
Linus Torvalds 已提交
250 251 252 253 254 255 256
	}, {
		.ident		= MAC_MODEL_IIX,
		.name		= "IIx",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_II,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
257 258
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
259 260 261 262 263 264 265
	}, {
		.ident		= MAC_MODEL_IICX,
		.name		= "IIcx",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_II,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
266 267
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
268 269 270 271 272 273 274
	}, {
		.ident		= MAC_MODEL_SE30,
		.name		= "SE/30",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_II,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
275 276
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
277 278 279
	},

	/*
S
Simon Arlott 已提交
280
	 *	Weirdified MacII hardware - all subtly different. Gee thanks
L
Linus Torvalds 已提交
281 282 283 284 285 286 287 288 289 290 291 292
	 *	Apple. All these boxes seem to have VIA2 in a different place to
	 *	the MacII (+1A000 rather than +4000)
	 * CSA: see http://developer.apple.com/technotes/hw/hw_09.html
	 */

	{
		.ident		= MAC_MODEL_IICI,
		.name		= "IIci",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
293 294
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
295 296 297 298 299 300 301
	}, {
		.ident		= MAC_MODEL_IIFX,
		.name		= "IIfx",
		.adb_type	= MAC_ADB_IOP,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_IOP,
302 303
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_IOP
L
Linus Torvalds 已提交
304 305 306 307 308 309 310
	}, {
		.ident		= MAC_MODEL_IISI,
		.name		= "IIsi",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
311 312
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
313 314 315 316 317 318 319
	}, {
		.ident		= MAC_MODEL_IIVI,
		.name		= "IIvi",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
320 321
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
322 323 324 325 326 327 328
	}, {
		.ident		= MAC_MODEL_IIVX,
		.name		= "IIvx",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
329 330
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343
	},

	/*
	 *	Classic models (guessing: similar to SE/30 ?? Nope, similar to LC ...)
	 */

	{
		.ident		= MAC_MODEL_CLII,
		.name		= "Classic II",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
344 345
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
346 347 348 349 350 351 352
	}, {
		.ident		= MAC_MODEL_CCL,
		.name		= "Color Classic",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
353 354 355
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
	},
L
Linus Torvalds 已提交
356 357 358 359 360 361 362 363 364 365 366 367

	/*
	 *	Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
	 */

	{
		.ident		= MAC_MODEL_LC,
		.name		= "LC",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
368 369
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
370 371 372 373 374 375 376
	}, {
		.ident		= MAC_MODEL_LCII,
		.name		= "LC II",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
377 378
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
379 380 381 382 383 384 385
	}, {
		.ident		= MAC_MODEL_LCIII,
		.name		= "LC III",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
386 387
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
	},

	/*
	 *	Quadra. Video is at 0xF9000000, via is like a MacII. We label it differently
	 *	as some of the stuff connected to VIA2 seems different. Better SCSI chip and
	 *	onboard ethernet using a NatSemi SONIC except the 660AV and 840AV which use an
	 *	AMD 79C940 (MACE).
	 *	The 700, 900 and 950 have some I/O chips in the wrong place to
	 *	confuse us. The 840AV has a SCSI location of its own (same as
	 *	the 660AV).
	 */

	{
		.ident		= MAC_MODEL_Q605,
		.name		= "Quadra 605",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
407 408
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
409 410 411 412 413 414 415
	}, {
		.ident		= MAC_MODEL_Q605_ACC,
		.name		= "Quadra 605",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
416 417
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
418 419 420 421 422 423 424 425
	}, {
		.ident		= MAC_MODEL_Q610,
		.name		= "Quadra 610",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
426 427
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
428 429 430 431 432 433 434 435 436
	}, {
		.ident		= MAC_MODEL_Q630,
		.name		= "Quadra 630",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.ide_type	= MAC_IDE_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
437 438
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
439 440 441 442 443 444 445 446
	}, {
		.ident		= MAC_MODEL_Q650,
		.name		= "Quadra 650",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
447 448
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
449 450 451 452 453 454 455 456 457 458
	},
	/*	The Q700 does have a NS Sonic */
	{
		.ident		= MAC_MODEL_Q700,
		.name		= "Quadra 700",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA2,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
459 460
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
461 462 463 464 465 466 467 468
	}, {
		.ident		= MAC_MODEL_Q800,
		.name		= "Quadra 800",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
469 470
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
471 472 473 474 475 476 477 478
	}, {
		.ident		= MAC_MODEL_Q840,
		.name		= "Quadra 840AV",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA3,
		.scc_type	= MAC_SCC_PSC,
		.ether_type	= MAC_ETHER_MACE,
479 480
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_AV
L
Linus Torvalds 已提交
481 482 483 484 485 486 487 488
	}, {
		.ident		= MAC_MODEL_Q900,
		.name		= "Quadra 900",
		.adb_type	= MAC_ADB_IOP,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA2,
		.scc_type	= MAC_SCC_IOP,
		.ether_type	= MAC_ETHER_SONIC,
489 490
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_IOP
L
Linus Torvalds 已提交
491 492 493 494 495 496 497 498
	}, {
		.ident		= MAC_MODEL_Q950,
		.name		= "Quadra 950",
		.adb_type	= MAC_ADB_IOP,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA2,
		.scc_type	= MAC_SCC_IOP,
		.ether_type	= MAC_ETHER_SONIC,
499 500
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_IOP
L
Linus Torvalds 已提交
501 502 503 504 505 506 507 508 509 510 511 512 513
	},

	/*
	 *	Performa - more LC type machines
	 */

	{
		.ident		= MAC_MODEL_P460,
		.name		=  "Performa 460",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
514 515
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
516 517 518 519 520 521 522
	}, {
		.ident		= MAC_MODEL_P475,
		.name		=  "Performa 475",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_II,
523 524
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
525 526 527 528 529 530 531
	}, {
		.ident		= MAC_MODEL_P475F,
		.name		=  "Performa 475",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_II,
532 533
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
534 535 536 537 538 539 540
	}, {
		.ident		= MAC_MODEL_P520,
		.name		=  "Performa 520",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
541 542
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
543 544 545 546 547 548 549
	}, {
		.ident		= MAC_MODEL_P550,
		.name		=  "Performa 550",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
550 551
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
552 553 554 555 556 557 558 559 560 561
	},
	/* These have the comm slot, and therefore the possibility of SONIC ethernet */
	{
		.ident		= MAC_MODEL_P575,
		.name		= "Performa 575",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_II,
		.ether_type	= MAC_ETHER_SONIC,
562 563
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
564 565 566 567 568 569 570 571 572
	}, {
		.ident		= MAC_MODEL_P588,
		.name		= "Performa 588",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.ide_type	= MAC_IDE_QUADRA,
		.scc_type	= MAC_SCC_II,
		.ether_type	= MAC_ETHER_SONIC,
573 574
		.nubus_type	= MAC_NUBUS,
		.floppy_type	= MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
575 576 577 578 579 580 581
	}, {
		.ident		= MAC_MODEL_TV,
		.name		= "TV",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
582 583
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
584 585 586 587 588 589 590
	}, {
		.ident		= MAC_MODEL_P600,
		.name		= "Performa 600",
		.adb_type	= MAC_ADB_IISI,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_II,
591 592
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
	},

	/*
	 *	Centris - just guessing again; maybe like Quadra
	 */

	/* The C610 may or may not have SONIC.  We probe to make sure */
	{
		.ident		= MAC_MODEL_C610,
		.name		= "Centris 610",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
608 609
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
610 611 612 613 614 615 616 617
	}, {
		.ident		= MAC_MODEL_C650,
		.name		= "Centris 650",
		.adb_type	= MAC_ADB_II,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
618 619
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR1
L
Linus Torvalds 已提交
620 621 622 623 624 625 626 627
	}, {
		.ident		= MAC_MODEL_C660,
		.name		= "Centris 660AV",
		.adb_type	= MAC_ADB_CUDA,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_QUADRA3,
		.scc_type	= MAC_SCC_PSC,
		.ether_type	= MAC_ETHER_MACE,
628 629
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_AV
L
Linus Torvalds 已提交
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
	},

	/*
	 * The PowerBooks all the same "Combo" custom IC for SCSI and SCC
	 * and a PMU (in two variations?) for ADB. Most of them use the
	 * Quadra-style VIAs. A few models also have IDE from hell.
	 */

	{
		.ident		= MAC_MODEL_PB140,
		.name		= "PowerBook 140",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
645 646
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
647 648 649 650 651 652 653
	}, {
		.ident		= MAC_MODEL_PB145,
		.name		= "PowerBook 145",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
654 655
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
656 657 658 659 660 661 662 663
	}, {
		.ident		= MAC_MODEL_PB150,
		.name		= "PowerBook 150",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.ide_type	= MAC_IDE_PB,
		.scc_type	= MAC_SCC_QUADRA,
664 665
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
666 667 668 669 670 671 672
	}, {
		.ident		= MAC_MODEL_PB160,
		.name		= "PowerBook 160",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
673 674
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
675 676 677 678 679 680 681
	}, {
		.ident		= MAC_MODEL_PB165,
		.name		= "PowerBook 165",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
682 683
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
684 685 686 687 688 689 690
	}, {
		.ident		= MAC_MODEL_PB165C,
		.name		= "PowerBook 165c",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
691 692
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
693 694 695 696 697 698 699
	}, {
		.ident		= MAC_MODEL_PB170,
		.name		= "PowerBook 170",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
700 701
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
702 703 704 705 706 707 708
	}, {
		.ident		= MAC_MODEL_PB180,
		.name		= "PowerBook 180",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
709 710
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
711 712 713 714 715 716 717
	}, {
		.ident		= MAC_MODEL_PB180C,
		.name		= "PowerBook 180c",
		.adb_type	= MAC_ADB_PB1,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
718 719
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
720 721 722 723 724 725 726 727
	}, {
		.ident		= MAC_MODEL_PB190,
		.name		= "PowerBook 190",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.ide_type	= MAC_IDE_BABOON,
		.scc_type	= MAC_SCC_QUADRA,
728 729
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
730 731 732 733 734 735 736 737
	}, {
		.ident		= MAC_MODEL_PB520,
		.name		= "PowerBook 520",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_QUADRA,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
		.ether_type	= MAC_ETHER_SONIC,
738 739
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
740 741 742 743 744 745 746
	},

	/*
	 * PowerBook Duos are pretty much like normal PowerBooks
	 * All of these probably have onboard SONIC in the Dock which
	 * means we'll have to probe for it eventually.
	 *
S
Simon Arlott 已提交
747
	 * Are these really MAC_VIA_IIci? The developer notes for the
L
Linus Torvalds 已提交
748 749 750 751 752 753 754 755 756 757 758
	 * Duos show pretty much the same custom parts as in most of
	 * the other PowerBooks which would imply MAC_VIA_QUADRA.
	 */

	{
		.ident		= MAC_MODEL_PB210,
		.name		= "PowerBook Duo 210",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
759 760
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
761 762 763 764 765 766 767
	}, {
		.ident		= MAC_MODEL_PB230,
		.name		= "PowerBook Duo 230",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
768 769
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
770 771 772 773 774 775 776
	}, {
		.ident		= MAC_MODEL_PB250,
		.name		= "PowerBook Duo 250",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
777 778
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
779 780 781 782 783 784 785
	}, {
		.ident		= MAC_MODEL_PB270C,
		.name		= "PowerBook Duo 270c",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
786 787
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
788 789 790 791 792 793 794
	}, {
		.ident		= MAC_MODEL_PB280,
		.name		= "PowerBook Duo 280",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
795 796
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
797 798 799 800 801 802 803
	}, {
		.ident		= MAC_MODEL_PB280C,
		.name		= "PowerBook Duo 280c",
		.adb_type	= MAC_ADB_PB2,
		.via_type	= MAC_VIA_IIci,
		.scsi_type	= MAC_SCSI_OLD,
		.scc_type	= MAC_SCC_QUADRA,
804 805
		.nubus_type	= MAC_NUBUS,
		.floppy_type    = MAC_FLOPPY_SWIM_ADDR2
L
Linus Torvalds 已提交
806 807 808 809 810 811 812 813 814 815
	},

	/*
	 *	Other stuff ??
	 */
	{
		.ident		= -1
	}
};

A
Adrian Bunk 已提交
816
static void __init mac_identify(void)
L
Linus Torvalds 已提交
817 818 819 820 821 822 823 824
{
	struct mac_model *m;

	/* Penguin data useful? */
	int model = mac_bi_data.id;
	if (!model) {
		/* no bootinfo model id -> NetBSD booter was used! */
		/* XXX FIXME: breaks for model > 31 */
R
Roman Zippel 已提交
825 826
		model = (mac_bi_data.cpuid >> 2) & 63;
		printk(KERN_WARNING "No bootinfo model ID, using cpuid instead (hey, use Penguin!)\n");
L
Linus Torvalds 已提交
827 828 829
	}

	macintosh_config = mac_data_table;
R
Roman Zippel 已提交
830
	for (m = macintosh_config; m->ident != -1; m++) {
L
Linus Torvalds 已提交
831 832 833 834 835 836 837 838 839 840 841 842
		if (m->ident == model) {
			macintosh_config = m;
			break;
		}
	}

	/* We need to pre-init the IOPs, if any. Otherwise */
	/* the serial console won't work if the user had   */
	/* the serial ports set to "Faster" mode in MacOS. */

	iop_preinit();

R
Roman Zippel 已提交
843
	printk(KERN_INFO "Detected Macintosh model: %d \n", model);
L
Linus Torvalds 已提交
844 845 846 847

	/*
	 * Report booter data:
	 */
R
Roman Zippel 已提交
848 849
	printk(KERN_DEBUG " Penguin bootinfo data:\n");
	printk(KERN_DEBUG " Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ld\n",
L
Linus Torvalds 已提交
850 851 852
		mac_bi_data.videoaddr, mac_bi_data.videorow,
		mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
		mac_bi_data.dimensions >> 16);
R
Roman Zippel 已提交
853
	printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx \n",
L
Linus Torvalds 已提交
854 855
		mac_bi_data.videological, mac_orig_videoaddr,
		mac_bi_data.sccbase);
R
Roman Zippel 已提交
856
	printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx \n",
L
Linus Torvalds 已提交
857
		mac_bi_data.boottime, mac_bi_data.gmtbias);
R
Roman Zippel 已提交
858
	printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n",
L
Linus Torvalds 已提交
859 860 861 862 863 864 865 866 867
		mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);

	iop_init();
	via_init();
	oss_init();
	psc_init();
	baboon_init();
}

A
Adrian Bunk 已提交
868
static void __init mac_report_hardware(void)
L
Linus Torvalds 已提交
869 870 871 872 873 874
{
	printk(KERN_INFO "Apple Macintosh %s\n", macintosh_config->name);
}

static void mac_get_model(char *str)
{
R
Roman Zippel 已提交
875
	strcpy(str, "Macintosh ");
L
Linus Torvalds 已提交
876 877
	strcat(str, macintosh_config->name);
}
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916

static struct resource swim_resources[1];

static struct platform_device swim_device = {
	.name		= "swim",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(swim_resources),
	.resource	= swim_resources,
};

static struct platform_device *mac_platform_devices[] __initdata = {
	&swim_device
};

int __init mac_platform_init(void)
{
	u8 *swim_base;

	switch (macintosh_config->floppy_type) {
	case MAC_FLOPPY_SWIM_ADDR1:
		swim_base = (u8 *)(VIA1_BASE + 0x1E000);
		break;
	case MAC_FLOPPY_SWIM_ADDR2:
		swim_base = (u8 *)(VIA1_BASE + 0x16000);
		break;
	default:
		return 0;
	}

	swim_resources[0].name = "swim-regs";
	swim_resources[0].start = (resource_size_t)swim_base;
	swim_resources[0].end = (resource_size_t)(swim_base + SWIM_IO_SIZE);
	swim_resources[0].flags = IORESOURCE_MEM;

	return platform_add_devices(mac_platform_devices,
				    ARRAY_SIZE(mac_platform_devices));
}

arch_initcall(mac_platform_init);