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