Merge branch 'torvalds/master'
[firefly-linux-kernel-4.4.55.git] / arch / m68k / mac / config.c
index afb95d5fb26b3b29b172d730d8b5bacc4c3c664a..689b47d292acd4d5f44472a2efed3d2d1e94cc0e 100644 (file)
 #include <linux/adb.h>
 #include <linux/cuda.h>
 
-#define BOOTINFO_COMPAT_1_0
 #include <asm/setup.h>
 #include <asm/bootinfo.h>
+#include <asm/bootinfo-mac.h>
+#include <asm/byteorder.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -70,31 +71,6 @@ static void mac_get_model(char *str);
 static void mac_identify(void);
 static void mac_report_hardware(void);
 
-#ifdef CONFIG_EARLY_PRINTK
-asmlinkage void __init mac_early_print(const char *s, unsigned n);
-
-static void __init mac_early_cons_write(struct console *con,
-                                 const char *s, unsigned n)
-{
-       mac_early_print(s, n);
-}
-
-static struct console __initdata mac_early_cons = {
-       .name  = "early",
-       .write = mac_early_cons_write,
-       .flags = CON_PRINTBUFFER | CON_BOOT,
-       .index = -1
-};
-
-int __init mac_unregister_early_cons(void)
-{
-       /* mac_early_print can't be used after init sections are discarded */
-       return unregister_console(&mac_early_cons);
-}
-
-late_initcall(mac_unregister_early_cons);
-#endif
-
 static void __init mac_sched_init(irq_handler_t vector)
 {
        via_init_clock(vector);
@@ -107,45 +83,46 @@ static void __init mac_sched_init(irq_handler_t vector)
 int __init mac_parse_bootinfo(const struct bi_record *record)
 {
        int unknown = 0;
-       const u_long *data = record->data;
+       const void *data = record->data;
 
-       switch (record->tag) {
+       switch (be16_to_cpu(record->tag)) {
        case BI_MAC_MODEL:
-               mac_bi_data.id = *data;
+               mac_bi_data.id = be32_to_cpup(data);
                break;
        case BI_MAC_VADDR:
-               mac_bi_data.videoaddr = *data;
+               mac_bi_data.videoaddr = be32_to_cpup(data);
                break;
        case BI_MAC_VDEPTH:
-               mac_bi_data.videodepth = *data;
+               mac_bi_data.videodepth = be32_to_cpup(data);
                break;
        case BI_MAC_VROW:
-               mac_bi_data.videorow = *data;
+               mac_bi_data.videorow = be32_to_cpup(data);
                break;
        case BI_MAC_VDIM:
-               mac_bi_data.dimensions = *data;
+               mac_bi_data.dimensions = be32_to_cpup(data);
                break;
        case BI_MAC_VLOGICAL:
-               mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK);
-               mac_orig_videoaddr = *data;
+               mac_orig_videoaddr = be32_to_cpup(data);
+               mac_bi_data.videological =
+                       VIDEOMEMBASE + (mac_orig_videoaddr & ~VIDEOMEMMASK);
                break;
        case BI_MAC_SCCBASE:
-               mac_bi_data.sccbase = *data;
+               mac_bi_data.sccbase = be32_to_cpup(data);
                break;
        case BI_MAC_BTIME:
-               mac_bi_data.boottime = *data;
+               mac_bi_data.boottime = be32_to_cpup(data);
                break;
        case BI_MAC_GMTBIAS:
-               mac_bi_data.gmtbias = *data;
+               mac_bi_data.gmtbias = be32_to_cpup(data);
                break;
        case BI_MAC_MEMSIZE:
-               mac_bi_data.memsize = *data;
+               mac_bi_data.memsize = be32_to_cpup(data);
                break;
        case BI_MAC_CPUID:
-               mac_bi_data.cpuid = *data;
+               mac_bi_data.cpuid = be32_to_cpup(data);
                break;
        case BI_MAC_ROMBASE:
-               mac_bi_data.rombase = *data;
+               mac_bi_data.rombase = be32_to_cpup(data);
                break;
        default:
                unknown = 1;
@@ -188,10 +165,6 @@ void __init config_mac(void)
        mach_beep = mac_mksound;
 #endif
 
-#ifdef CONFIG_EARLY_PRINTK
-       register_console(&mac_early_cons);
-#endif
-
        /*
         * Determine hardware present
         */
@@ -305,7 +278,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "IIfx",
                .adb_type       = MAC_ADB_IOP,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_IIFX,
                .scc_type       = MAC_SCC_IOP,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_IOP,
@@ -323,7 +296,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "IIvi",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -332,7 +305,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "IIvx",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -347,7 +320,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Classic II",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -356,7 +329,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Color Classic",
                .adb_type       = MAC_ADB_CUDA,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -365,7 +338,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Color Classic II",
                .adb_type       = MAC_ADB_CUDA,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -380,7 +353,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "LC",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -389,7 +362,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "LC II",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -398,7 +371,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "LC III",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -526,7 +499,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Performa 460",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -553,7 +526,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Performa 520",
                .adb_type       = MAC_ADB_CUDA,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -562,7 +535,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Performa 550",
                .adb_type       = MAC_ADB_CUDA,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -594,7 +567,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "TV",
                .adb_type       = MAC_ADB_CUDA,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -603,7 +576,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "Performa 600",
                .adb_type       = MAC_ADB_IISI,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LC,
                .scc_type       = MAC_SCC_II,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -739,7 +712,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook 190",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_QUADRA,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LATE,
                .ide_type       = MAC_IDE_BABOON,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
@@ -749,7 +722,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook 520",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_QUADRA,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_LATE,
                .scc_type       = MAC_SCC_QUADRA,
                .ether_type     = MAC_ETHER_SONIC,
                .nubus_type     = MAC_NUBUS,
@@ -767,7 +740,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook Duo 210",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_DUO,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -776,7 +749,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook Duo 230",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_DUO,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -785,7 +758,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook Duo 250",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_DUO,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -794,7 +767,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook Duo 270c",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_DUO,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -803,7 +776,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook Duo 280",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_DUO,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -812,7 +785,7 @@ static struct mac_model mac_data_table[] = {
                .name           = "PowerBook Duo 280c",
                .adb_type       = MAC_ADB_PB2,
                .via_type       = MAC_VIA_IICI,
-               .scsi_type      = MAC_SCSI_OLD,
+               .scsi_type      = MAC_SCSI_DUO,
                .scc_type       = MAC_SCC_QUADRA,
                .nubus_type     = MAC_NUBUS,
                .floppy_type    = MAC_FLOPPY_SWIM_ADDR2,
@@ -956,6 +929,70 @@ static struct platform_device swim_pdev = {
        .resource       = &swim_rsrc,
 };
 
+static const struct resource mac_scsi_iifx_rsrc[] __initconst = {
+       {
+               .flags = IORESOURCE_IRQ,
+               .start = IRQ_MAC_SCSI,
+               .end   = IRQ_MAC_SCSI,
+       }, {
+               .flags = IORESOURCE_MEM,
+               .start = 0x50008000,
+               .end   = 0x50009FFF,
+       },
+};
+
+static const struct resource mac_scsi_duo_rsrc[] __initconst = {
+       {
+               .flags = IORESOURCE_MEM,
+               .start = 0xFEE02000,
+               .end   = 0xFEE03FFF,
+       },
+};
+
+static const struct resource mac_scsi_old_rsrc[] __initconst = {
+       {
+               .flags = IORESOURCE_IRQ,
+               .start = IRQ_MAC_SCSI,
+               .end   = IRQ_MAC_SCSI,
+       }, {
+               .flags = IORESOURCE_MEM,
+               .start = 0x50010000,
+               .end   = 0x50011FFF,
+       }, {
+               .flags = IORESOURCE_MEM,
+               .start = 0x50006000,
+               .end   = 0x50007FFF,
+       },
+};
+
+static const struct resource mac_scsi_late_rsrc[] __initconst = {
+       {
+               .flags = IORESOURCE_IRQ,
+               .start = IRQ_MAC_SCSI,
+               .end   = IRQ_MAC_SCSI,
+       }, {
+               .flags = IORESOURCE_MEM,
+               .start = 0x50010000,
+               .end   = 0x50011FFF,
+       },
+};
+
+static const struct resource mac_scsi_ccl_rsrc[] __initconst = {
+       {
+               .flags = IORESOURCE_IRQ,
+               .start = IRQ_MAC_SCSI,
+               .end   = IRQ_MAC_SCSI,
+       }, {
+               .flags = IORESOURCE_MEM,
+               .start = 0x50F10000,
+               .end   = 0x50F11FFF,
+       }, {
+               .flags = IORESOURCE_MEM,
+               .start = 0x50F06000,
+               .end   = 0x50F07FFF,
+       },
+};
+
 static struct platform_device esp_0_pdev = {
        .name           = "mac_esp",
        .id             = 0,
@@ -1027,6 +1064,62 @@ int __init mac_platform_init(void)
                    (macintosh_config->ident == MAC_MODEL_Q950))
                        platform_device_register(&esp_1_pdev);
                break;
+       case MAC_SCSI_IIFX:
+               /* Addresses from The Guide to Mac Family Hardware.
+                * $5000 8000 - $5000 9FFF: SCSI DMA
+                * $5000 C000 - $5000 DFFF: Alternate SCSI (DMA)
+                * $5000 E000 - $5000 FFFF: Alternate SCSI (Hsk)
+                * The SCSI DMA custom IC embeds the 53C80 core. mac_scsi does
+                * not make use of its DMA or hardware handshaking logic.
+                */
+               platform_device_register_simple("mac_scsi", 0,
+                       mac_scsi_iifx_rsrc, ARRAY_SIZE(mac_scsi_iifx_rsrc));
+               break;
+       case MAC_SCSI_DUO:
+               /* Addresses from the Duo Dock II Developer Note.
+                * $FEE0 2000 - $FEE0 3FFF: normal mode
+                * $FEE0 4000 - $FEE0 5FFF: pseudo DMA without /DRQ
+                * $FEE0 6000 - $FEE0 7FFF: pseudo DMA with /DRQ
+                * The NetBSD code indicates that both 5380 chips share
+                * an IRQ (?) which would need careful handling (see mac_esp).
+                */
+               platform_device_register_simple("mac_scsi", 1,
+                       mac_scsi_duo_rsrc, ARRAY_SIZE(mac_scsi_duo_rsrc));
+               /* fall through */
+       case MAC_SCSI_OLD:
+               /* Addresses from Developer Notes for Duo System,
+                * PowerBook 180 & 160, 140 & 170, Macintosh IIsi
+                * and also from The Guide to Mac Family Hardware for
+                * SE/30, II, IIx, IIcx, IIci.
+                * $5000 6000 - $5000 7FFF: pseudo-DMA with /DRQ
+                * $5001 0000 - $5001 1FFF: normal mode
+                * $5001 2000 - $5001 3FFF: pseudo-DMA without /DRQ
+                * GMFH says that $5000 0000 - $50FF FFFF "wraps
+                * $5000 0000 - $5001 FFFF eight times" (!)
+                * mess.org says IIci and Color Classic do not alias
+                * I/O address space.
+                */
+               platform_device_register_simple("mac_scsi", 0,
+                       mac_scsi_old_rsrc, ARRAY_SIZE(mac_scsi_old_rsrc));
+               break;
+       case MAC_SCSI_LATE:
+               /* PDMA logic in 68040 PowerBooks is somehow different to
+                * '030 models. It's probably more like Quadras (see mac_esp).
+                */
+               platform_device_register_simple("mac_scsi", 0,
+                       mac_scsi_late_rsrc, ARRAY_SIZE(mac_scsi_late_rsrc));
+               break;
+       case MAC_SCSI_LC:
+               /* Addresses from Mac LC data in Designing Cards & Drivers 3ed.
+                * Also from the Developer Notes for Classic II, LC III,
+                * Color Classic and IIvx.
+                * $50F0 6000 - $50F0 7FFF: SCSI handshake
+                * $50F1 0000 - $50F1 1FFF: SCSI
+                * $50F1 2000 - $50F1 3FFF: SCSI DMA
+                */
+               platform_device_register_simple("mac_scsi", 0,
+                       mac_scsi_ccl_rsrc, ARRAY_SIZE(mac_scsi_ccl_rsrc));
+               break;
        }
 
        /*