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