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