]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - arch/m68k/mac/config.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[linux-2.6.git] / arch / m68k / mac / config.c
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 */
50 struct mac_booter_data mac_bi_data;
51
52 /* The phys. video addr. - might be bogus on some machines */
53 static unsigned long mac_orig_videoaddr;
54
55 /* Mac specific timer functions */
56 extern unsigned long mac_gettimeoffset(void);
57 extern int mac_hwclk(int, struct rtc_time *);
58 extern int mac_set_clock_mmss(unsigned long);
59 extern void iop_preinit(void);
60 extern void iop_init(void);
61 extern void via_init(void);
62 extern void via_init_clock(irq_handler_t func);
63 extern void via_flush_cache(void);
64 extern void oss_init(void);
65 extern void psc_init(void);
66 extern void baboon_init(void);
67
68 extern void mac_mksound(unsigned int, unsigned int);
69
70 static void mac_get_model(char *str);
71 static void mac_identify(void);
72 static void mac_report_hardware(void);
73
74 static 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
83 int __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
139 static 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
148 void __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
198 struct mac_model *macintosh_config;
199 EXPORT_SYMBOL(macintosh_config);
200
201 static 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
806 static struct resource scc_a_rsrcs[] = {
807         { .flags = IORESOURCE_MEM },
808         { .flags = IORESOURCE_IRQ },
809 };
810
811 static struct resource scc_b_rsrcs[] = {
812         { .flags = IORESOURCE_MEM },
813         { .flags = IORESOURCE_IRQ },
814 };
815
816 struct 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 };
822 EXPORT_SYMBOL(scc_a_pdev);
823
824 struct 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 };
830 EXPORT_SYMBOL(scc_b_pdev);
831
832 static 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                 /* XXX FIXME: breaks for model > 31 */
841                 model = (mac_bi_data.cpuid >> 2) & 63;
842                 printk(KERN_WARNING "No bootinfo model ID, using cpuid instead "
843                        "(obsolete bootloader?)\n");
844         }
845
846         macintosh_config = mac_data_table;
847         for (m = macintosh_config; m->ident != -1; m++) {
848                 if (m->ident == model) {
849                         macintosh_config = m;
850                         break;
851                 }
852         }
853
854         /* Set up serial port resources for the console initcall. */
855
856         scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2;
857         scc_a_rsrcs[0].end   = scc_a_rsrcs[0].start;
858         scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase;
859         scc_b_rsrcs[0].end   = scc_b_rsrcs[0].start;
860
861         switch (macintosh_config->scc_type) {
862         case MAC_SCC_PSC:
863                 scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A;
864                 scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B;
865                 break;
866         default:
867                 scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC;
868                 scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC;
869                 break;
870         }
871
872         /*
873          * We need to pre-init the IOPs, if any. Otherwise
874          * the serial console won't work if the user had
875          * the serial ports set to "Faster" mode in MacOS.
876          */
877         iop_preinit();
878
879         printk(KERN_INFO "Detected Macintosh model: %d\n", model);
880
881         /*
882          * Report booter data:
883          */
884         printk(KERN_DEBUG " Penguin bootinfo data:\n");
885         printk(KERN_DEBUG " Video: addr 0x%lx "
886                 "row 0x%lx depth %lx dimensions %ld x %ld\n",
887                 mac_bi_data.videoaddr, mac_bi_data.videorow,
888                 mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
889                 mac_bi_data.dimensions >> 16);
890         printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n",
891                 mac_bi_data.videological, mac_orig_videoaddr,
892                 mac_bi_data.sccbase);
893         printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n",
894                 mac_bi_data.boottime, mac_bi_data.gmtbias);
895         printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n",
896                 mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
897
898         iop_init();
899         via_init();
900         oss_init();
901         psc_init();
902         baboon_init();
903
904 #ifdef CONFIG_ADB_CUDA
905         find_via_cuda();
906 #endif
907 }
908
909 static void __init mac_report_hardware(void)
910 {
911         printk(KERN_INFO "Apple Macintosh %s\n", macintosh_config->name);
912 }
913
914 static void mac_get_model(char *str)
915 {
916         strcpy(str, "Macintosh ");
917         strcat(str, macintosh_config->name);
918 }
919
920 static struct resource swim_rsrc = { .flags = IORESOURCE_MEM };
921
922 static struct platform_device swim_pdev = {
923         .name           = "swim",
924         .id             = -1,
925         .num_resources  = 1,
926         .resource       = &swim_rsrc,
927 };
928
929 static struct platform_device esp_0_pdev = {
930         .name           = "mac_esp",
931         .id             = 0,
932 };
933
934 static struct platform_device esp_1_pdev = {
935         .name           = "mac_esp",
936         .id             = 1,
937 };
938
939 static struct platform_device sonic_pdev = {
940         .name           = "macsonic",
941         .id             = -1,
942 };
943
944 static struct platform_device mace_pdev = {
945         .name           = "macmace",
946         .id             = -1,
947 };
948
949 int __init mac_platform_init(void)
950 {
951         u8 *swim_base;
952
953         /*
954          * Serial devices
955          */
956
957         platform_device_register(&scc_a_pdev);
958         platform_device_register(&scc_b_pdev);
959
960         /*
961          * Floppy device
962          */
963
964         switch (macintosh_config->floppy_type) {
965         case MAC_FLOPPY_SWIM_ADDR1:
966                 swim_base = (u8 *)(VIA1_BASE + 0x1E000);
967                 break;
968         case MAC_FLOPPY_SWIM_ADDR2:
969                 swim_base = (u8 *)(VIA1_BASE + 0x16000);
970                 break;
971         default:
972                 swim_base = NULL;
973                 break;
974         }
975
976         if (swim_base) {
977                 swim_rsrc.start = (resource_size_t) swim_base,
978                 swim_rsrc.end   = (resource_size_t) swim_base + 0x2000,
979                 platform_device_register(&swim_pdev);
980         }
981
982         /*
983          * SCSI device(s)
984          */
985
986         switch (macintosh_config->scsi_type) {
987         case MAC_SCSI_QUADRA:
988         case MAC_SCSI_QUADRA3:
989                 platform_device_register(&esp_0_pdev);
990                 break;
991         case MAC_SCSI_QUADRA2:
992                 platform_device_register(&esp_0_pdev);
993                 if ((macintosh_config->ident == MAC_MODEL_Q900) ||
994                     (macintosh_config->ident == MAC_MODEL_Q950))
995                         platform_device_register(&esp_1_pdev);
996                 break;
997         }
998
999         /*
1000          * Ethernet device
1001          */
1002
1003         switch (macintosh_config->ether_type) {
1004         case MAC_ETHER_SONIC:
1005                 platform_device_register(&sonic_pdev);
1006                 break;
1007         case MAC_ETHER_MACE:
1008                 platform_device_register(&mace_pdev);
1009                 break;
1010         }
1011
1012         return 0;
1013 }
1014
1015 arch_initcall(mac_platform_init);