18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Maple (970 eval board) setup code 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * (c) Copyright 2004 Benjamin Herrenschmidt (benh@kernel.crashing.org), 68c2ecf20Sopenharmony_ci * IBM Corp. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#undef DEBUG 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/errno.h> 138c2ecf20Sopenharmony_ci#include <linux/sched.h> 148c2ecf20Sopenharmony_ci#include <linux/kernel.h> 158c2ecf20Sopenharmony_ci#include <linux/export.h> 168c2ecf20Sopenharmony_ci#include <linux/mm.h> 178c2ecf20Sopenharmony_ci#include <linux/stddef.h> 188c2ecf20Sopenharmony_ci#include <linux/unistd.h> 198c2ecf20Sopenharmony_ci#include <linux/ptrace.h> 208c2ecf20Sopenharmony_ci#include <linux/user.h> 218c2ecf20Sopenharmony_ci#include <linux/tty.h> 228c2ecf20Sopenharmony_ci#include <linux/string.h> 238c2ecf20Sopenharmony_ci#include <linux/delay.h> 248c2ecf20Sopenharmony_ci#include <linux/ioport.h> 258c2ecf20Sopenharmony_ci#include <linux/major.h> 268c2ecf20Sopenharmony_ci#include <linux/initrd.h> 278c2ecf20Sopenharmony_ci#include <linux/vt_kern.h> 288c2ecf20Sopenharmony_ci#include <linux/console.h> 298c2ecf20Sopenharmony_ci#include <linux/pci.h> 308c2ecf20Sopenharmony_ci#include <linux/adb.h> 318c2ecf20Sopenharmony_ci#include <linux/cuda.h> 328c2ecf20Sopenharmony_ci#include <linux/pmu.h> 338c2ecf20Sopenharmony_ci#include <linux/irq.h> 348c2ecf20Sopenharmony_ci#include <linux/seq_file.h> 358c2ecf20Sopenharmony_ci#include <linux/root_dev.h> 368c2ecf20Sopenharmony_ci#include <linux/serial.h> 378c2ecf20Sopenharmony_ci#include <linux/smp.h> 388c2ecf20Sopenharmony_ci#include <linux/bitops.h> 398c2ecf20Sopenharmony_ci#include <linux/of_device.h> 408c2ecf20Sopenharmony_ci#include <linux/memblock.h> 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#include <asm/processor.h> 438c2ecf20Sopenharmony_ci#include <asm/sections.h> 448c2ecf20Sopenharmony_ci#include <asm/prom.h> 458c2ecf20Sopenharmony_ci#include <asm/io.h> 468c2ecf20Sopenharmony_ci#include <asm/pci-bridge.h> 478c2ecf20Sopenharmony_ci#include <asm/iommu.h> 488c2ecf20Sopenharmony_ci#include <asm/machdep.h> 498c2ecf20Sopenharmony_ci#include <asm/dma.h> 508c2ecf20Sopenharmony_ci#include <asm/cputable.h> 518c2ecf20Sopenharmony_ci#include <asm/time.h> 528c2ecf20Sopenharmony_ci#include <asm/mpic.h> 538c2ecf20Sopenharmony_ci#include <asm/rtas.h> 548c2ecf20Sopenharmony_ci#include <asm/udbg.h> 558c2ecf20Sopenharmony_ci#include <asm/nvram.h> 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#include "maple.h" 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci#ifdef DEBUG 608c2ecf20Sopenharmony_ci#define DBG(fmt...) udbg_printf(fmt) 618c2ecf20Sopenharmony_ci#else 628c2ecf20Sopenharmony_ci#define DBG(fmt...) 638c2ecf20Sopenharmony_ci#endif 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic unsigned long maple_find_nvram_base(void) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci struct device_node *rtcs; 688c2ecf20Sopenharmony_ci unsigned long result = 0; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci /* find NVRAM device */ 718c2ecf20Sopenharmony_ci rtcs = of_find_compatible_node(NULL, "nvram", "AMD8111"); 728c2ecf20Sopenharmony_ci if (rtcs) { 738c2ecf20Sopenharmony_ci struct resource r; 748c2ecf20Sopenharmony_ci if (of_address_to_resource(rtcs, 0, &r)) { 758c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: Unable to translate NVRAM" 768c2ecf20Sopenharmony_ci " address\n"); 778c2ecf20Sopenharmony_ci goto bail; 788c2ecf20Sopenharmony_ci } 798c2ecf20Sopenharmony_ci if (!(r.flags & IORESOURCE_IO)) { 808c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: NVRAM address isn't PIO!\n"); 818c2ecf20Sopenharmony_ci goto bail; 828c2ecf20Sopenharmony_ci } 838c2ecf20Sopenharmony_ci result = r.start; 848c2ecf20Sopenharmony_ci } else 858c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: Unable to find NVRAM\n"); 868c2ecf20Sopenharmony_ci bail: 878c2ecf20Sopenharmony_ci of_node_put(rtcs); 888c2ecf20Sopenharmony_ci return result; 898c2ecf20Sopenharmony_ci} 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistatic void __noreturn maple_restart(char *cmd) 928c2ecf20Sopenharmony_ci{ 938c2ecf20Sopenharmony_ci unsigned int maple_nvram_base; 948c2ecf20Sopenharmony_ci const unsigned int *maple_nvram_offset, *maple_nvram_command; 958c2ecf20Sopenharmony_ci struct device_node *sp; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci maple_nvram_base = maple_find_nvram_base(); 988c2ecf20Sopenharmony_ci if (maple_nvram_base == 0) 998c2ecf20Sopenharmony_ci goto fail; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci /* find service processor device */ 1028c2ecf20Sopenharmony_ci sp = of_find_node_by_name(NULL, "service-processor"); 1038c2ecf20Sopenharmony_ci if (!sp) { 1048c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: Unable to find Service Processor\n"); 1058c2ecf20Sopenharmony_ci goto fail; 1068c2ecf20Sopenharmony_ci } 1078c2ecf20Sopenharmony_ci maple_nvram_offset = of_get_property(sp, "restart-addr", NULL); 1088c2ecf20Sopenharmony_ci maple_nvram_command = of_get_property(sp, "restart-value", NULL); 1098c2ecf20Sopenharmony_ci of_node_put(sp); 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci /* send command */ 1128c2ecf20Sopenharmony_ci outb_p(*maple_nvram_command, maple_nvram_base + *maple_nvram_offset); 1138c2ecf20Sopenharmony_ci for (;;) ; 1148c2ecf20Sopenharmony_ci fail: 1158c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: Manual Restart Required\n"); 1168c2ecf20Sopenharmony_ci for (;;) ; 1178c2ecf20Sopenharmony_ci} 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistatic void __noreturn maple_power_off(void) 1208c2ecf20Sopenharmony_ci{ 1218c2ecf20Sopenharmony_ci unsigned int maple_nvram_base; 1228c2ecf20Sopenharmony_ci const unsigned int *maple_nvram_offset, *maple_nvram_command; 1238c2ecf20Sopenharmony_ci struct device_node *sp; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci maple_nvram_base = maple_find_nvram_base(); 1268c2ecf20Sopenharmony_ci if (maple_nvram_base == 0) 1278c2ecf20Sopenharmony_ci goto fail; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci /* find service processor device */ 1308c2ecf20Sopenharmony_ci sp = of_find_node_by_name(NULL, "service-processor"); 1318c2ecf20Sopenharmony_ci if (!sp) { 1328c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: Unable to find Service Processor\n"); 1338c2ecf20Sopenharmony_ci goto fail; 1348c2ecf20Sopenharmony_ci } 1358c2ecf20Sopenharmony_ci maple_nvram_offset = of_get_property(sp, "power-off-addr", NULL); 1368c2ecf20Sopenharmony_ci maple_nvram_command = of_get_property(sp, "power-off-value", NULL); 1378c2ecf20Sopenharmony_ci of_node_put(sp); 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci /* send command */ 1408c2ecf20Sopenharmony_ci outb_p(*maple_nvram_command, maple_nvram_base + *maple_nvram_offset); 1418c2ecf20Sopenharmony_ci for (;;) ; 1428c2ecf20Sopenharmony_ci fail: 1438c2ecf20Sopenharmony_ci printk(KERN_EMERG "Maple: Manual Power-Down Required\n"); 1448c2ecf20Sopenharmony_ci for (;;) ; 1458c2ecf20Sopenharmony_ci} 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistatic void __noreturn maple_halt(void) 1488c2ecf20Sopenharmony_ci{ 1498c2ecf20Sopenharmony_ci maple_power_off(); 1508c2ecf20Sopenharmony_ci} 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 1538c2ecf20Sopenharmony_cistatic struct smp_ops_t maple_smp_ops = { 1548c2ecf20Sopenharmony_ci .probe = smp_mpic_probe, 1558c2ecf20Sopenharmony_ci .message_pass = smp_mpic_message_pass, 1568c2ecf20Sopenharmony_ci .kick_cpu = smp_generic_kick_cpu, 1578c2ecf20Sopenharmony_ci .setup_cpu = smp_mpic_setup_cpu, 1588c2ecf20Sopenharmony_ci .give_timebase = smp_generic_give_timebase, 1598c2ecf20Sopenharmony_ci .take_timebase = smp_generic_take_timebase, 1608c2ecf20Sopenharmony_ci}; 1618c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */ 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_cistatic void __init maple_use_rtas_reboot_and_halt_if_present(void) 1648c2ecf20Sopenharmony_ci{ 1658c2ecf20Sopenharmony_ci if (rtas_service_present("system-reboot") && 1668c2ecf20Sopenharmony_ci rtas_service_present("power-off")) { 1678c2ecf20Sopenharmony_ci ppc_md.restart = rtas_restart; 1688c2ecf20Sopenharmony_ci pm_power_off = rtas_power_off; 1698c2ecf20Sopenharmony_ci ppc_md.halt = rtas_halt; 1708c2ecf20Sopenharmony_ci } 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic void __init maple_setup_arch(void) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci /* init to some ~sane value until calibrate_delay() runs */ 1768c2ecf20Sopenharmony_ci loops_per_jiffy = 50000000; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci /* Setup SMP callback */ 1798c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 1808c2ecf20Sopenharmony_ci smp_ops = &maple_smp_ops; 1818c2ecf20Sopenharmony_ci#endif 1828c2ecf20Sopenharmony_ci /* Lookup PCI hosts */ 1838c2ecf20Sopenharmony_ci maple_pci_init(); 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci maple_use_rtas_reboot_and_halt_if_present(); 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci printk(KERN_DEBUG "Using native/NAP idle loop\n"); 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci mmio_nvram_init(); 1908c2ecf20Sopenharmony_ci} 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* 1938c2ecf20Sopenharmony_ci * This is almost identical to pSeries and CHRP. We need to make that 1948c2ecf20Sopenharmony_ci * code generic at one point, with appropriate bits in the device-tree to 1958c2ecf20Sopenharmony_ci * identify the presence of an HT APIC 1968c2ecf20Sopenharmony_ci */ 1978c2ecf20Sopenharmony_cistatic void __init maple_init_IRQ(void) 1988c2ecf20Sopenharmony_ci{ 1998c2ecf20Sopenharmony_ci struct device_node *root, *np, *mpic_node = NULL; 2008c2ecf20Sopenharmony_ci const unsigned int *opprop; 2018c2ecf20Sopenharmony_ci unsigned long openpic_addr = 0; 2028c2ecf20Sopenharmony_ci int naddr, n, i, opplen, has_isus = 0; 2038c2ecf20Sopenharmony_ci struct mpic *mpic; 2048c2ecf20Sopenharmony_ci unsigned int flags = 0; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci /* Locate MPIC in the device-tree. Note that there is a bug 2078c2ecf20Sopenharmony_ci * in Maple device-tree where the type of the controller is 2088c2ecf20Sopenharmony_ci * open-pic and not interrupt-controller 2098c2ecf20Sopenharmony_ci */ 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci for_each_node_by_type(np, "interrupt-controller") 2128c2ecf20Sopenharmony_ci if (of_device_is_compatible(np, "open-pic")) { 2138c2ecf20Sopenharmony_ci mpic_node = np; 2148c2ecf20Sopenharmony_ci break; 2158c2ecf20Sopenharmony_ci } 2168c2ecf20Sopenharmony_ci if (mpic_node == NULL) 2178c2ecf20Sopenharmony_ci for_each_node_by_type(np, "open-pic") { 2188c2ecf20Sopenharmony_ci mpic_node = np; 2198c2ecf20Sopenharmony_ci break; 2208c2ecf20Sopenharmony_ci } 2218c2ecf20Sopenharmony_ci if (mpic_node == NULL) { 2228c2ecf20Sopenharmony_ci printk(KERN_ERR 2238c2ecf20Sopenharmony_ci "Failed to locate the MPIC interrupt controller\n"); 2248c2ecf20Sopenharmony_ci return; 2258c2ecf20Sopenharmony_ci } 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci /* Find address list in /platform-open-pic */ 2288c2ecf20Sopenharmony_ci root = of_find_node_by_path("/"); 2298c2ecf20Sopenharmony_ci naddr = of_n_addr_cells(root); 2308c2ecf20Sopenharmony_ci opprop = of_get_property(root, "platform-open-pic", &opplen); 2318c2ecf20Sopenharmony_ci if (opprop) { 2328c2ecf20Sopenharmony_ci openpic_addr = of_read_number(opprop, naddr); 2338c2ecf20Sopenharmony_ci has_isus = (opplen > naddr); 2348c2ecf20Sopenharmony_ci printk(KERN_DEBUG "OpenPIC addr: %lx, has ISUs: %d\n", 2358c2ecf20Sopenharmony_ci openpic_addr, has_isus); 2368c2ecf20Sopenharmony_ci } 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci BUG_ON(openpic_addr == 0); 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci /* Check for a big endian MPIC */ 2418c2ecf20Sopenharmony_ci if (of_get_property(np, "big-endian", NULL) != NULL) 2428c2ecf20Sopenharmony_ci flags |= MPIC_BIG_ENDIAN; 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci /* XXX Maple specific bits */ 2458c2ecf20Sopenharmony_ci flags |= MPIC_U3_HT_IRQS; 2468c2ecf20Sopenharmony_ci /* All U3/U4 are big-endian, older SLOF firmware doesn't encode this */ 2478c2ecf20Sopenharmony_ci flags |= MPIC_BIG_ENDIAN; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci /* Setup the openpic driver. More device-tree junks, we hard code no 2508c2ecf20Sopenharmony_ci * ISUs for now. I'll have to revisit some stuffs with the folks doing 2518c2ecf20Sopenharmony_ci * the firmware for those 2528c2ecf20Sopenharmony_ci */ 2538c2ecf20Sopenharmony_ci mpic = mpic_alloc(mpic_node, openpic_addr, flags, 2548c2ecf20Sopenharmony_ci /*has_isus ? 16 :*/ 0, 0, " MPIC "); 2558c2ecf20Sopenharmony_ci BUG_ON(mpic == NULL); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci /* Add ISUs */ 2588c2ecf20Sopenharmony_ci opplen /= sizeof(u32); 2598c2ecf20Sopenharmony_ci for (n = 0, i = naddr; i < opplen; i += naddr, n++) { 2608c2ecf20Sopenharmony_ci unsigned long isuaddr = of_read_number(opprop + i, naddr); 2618c2ecf20Sopenharmony_ci mpic_assign_isu(mpic, n, isuaddr); 2628c2ecf20Sopenharmony_ci } 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci /* All ISUs are setup, complete initialization */ 2658c2ecf20Sopenharmony_ci mpic_init(mpic); 2668c2ecf20Sopenharmony_ci ppc_md.get_irq = mpic_get_irq; 2678c2ecf20Sopenharmony_ci of_node_put(mpic_node); 2688c2ecf20Sopenharmony_ci of_node_put(root); 2698c2ecf20Sopenharmony_ci} 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_cistatic void __init maple_progress(char *s, unsigned short hex) 2728c2ecf20Sopenharmony_ci{ 2738c2ecf20Sopenharmony_ci printk("*** %04x : %s\n", hex, s ? s : ""); 2748c2ecf20Sopenharmony_ci} 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci/* 2788c2ecf20Sopenharmony_ci * Called very early, MMU is off, device-tree isn't unflattened 2798c2ecf20Sopenharmony_ci */ 2808c2ecf20Sopenharmony_cistatic int __init maple_probe(void) 2818c2ecf20Sopenharmony_ci{ 2828c2ecf20Sopenharmony_ci if (!of_machine_is_compatible("Momentum,Maple") && 2838c2ecf20Sopenharmony_ci !of_machine_is_compatible("Momentum,Apache")) 2848c2ecf20Sopenharmony_ci return 0; 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci pm_power_off = maple_power_off; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci iommu_init_early_dart(&maple_pci_controller_ops); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci return 1; 2918c2ecf20Sopenharmony_ci} 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci#ifdef CONFIG_EDAC 2948c2ecf20Sopenharmony_ci/* 2958c2ecf20Sopenharmony_ci * Register a platform device for CPC925 memory controller on 2968c2ecf20Sopenharmony_ci * all boards with U3H (CPC925) bridge. 2978c2ecf20Sopenharmony_ci */ 2988c2ecf20Sopenharmony_cistatic int __init maple_cpc925_edac_setup(void) 2998c2ecf20Sopenharmony_ci{ 3008c2ecf20Sopenharmony_ci struct platform_device *pdev; 3018c2ecf20Sopenharmony_ci struct device_node *np = NULL; 3028c2ecf20Sopenharmony_ci struct resource r; 3038c2ecf20Sopenharmony_ci int ret; 3048c2ecf20Sopenharmony_ci volatile void __iomem *mem; 3058c2ecf20Sopenharmony_ci u32 rev; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci np = of_find_node_by_type(NULL, "memory-controller"); 3088c2ecf20Sopenharmony_ci if (!np) { 3098c2ecf20Sopenharmony_ci printk(KERN_ERR "%s: Unable to find memory-controller node\n", 3108c2ecf20Sopenharmony_ci __func__); 3118c2ecf20Sopenharmony_ci return -ENODEV; 3128c2ecf20Sopenharmony_ci } 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci ret = of_address_to_resource(np, 0, &r); 3158c2ecf20Sopenharmony_ci of_node_put(np); 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci if (ret < 0) { 3188c2ecf20Sopenharmony_ci printk(KERN_ERR "%s: Unable to get memory-controller reg\n", 3198c2ecf20Sopenharmony_ci __func__); 3208c2ecf20Sopenharmony_ci return -ENODEV; 3218c2ecf20Sopenharmony_ci } 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci mem = ioremap(r.start, resource_size(&r)); 3248c2ecf20Sopenharmony_ci if (!mem) { 3258c2ecf20Sopenharmony_ci printk(KERN_ERR "%s: Unable to map memory-controller memory\n", 3268c2ecf20Sopenharmony_ci __func__); 3278c2ecf20Sopenharmony_ci return -ENOMEM; 3288c2ecf20Sopenharmony_ci } 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci rev = __raw_readl(mem); 3318c2ecf20Sopenharmony_ci iounmap(mem); 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci if (rev < 0x34 || rev > 0x3f) { /* U3H */ 3348c2ecf20Sopenharmony_ci printk(KERN_ERR "%s: Non-CPC925(U3H) bridge revision: %02x\n", 3358c2ecf20Sopenharmony_ci __func__, rev); 3368c2ecf20Sopenharmony_ci return 0; 3378c2ecf20Sopenharmony_ci } 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci pdev = platform_device_register_simple("cpc925_edac", 0, &r, 1); 3408c2ecf20Sopenharmony_ci if (IS_ERR(pdev)) 3418c2ecf20Sopenharmony_ci return PTR_ERR(pdev); 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci printk(KERN_INFO "%s: CPC925 platform device created\n", __func__); 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ci return 0; 3468c2ecf20Sopenharmony_ci} 3478c2ecf20Sopenharmony_cimachine_device_initcall(maple, maple_cpc925_edac_setup); 3488c2ecf20Sopenharmony_ci#endif 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_cidefine_machine(maple) { 3518c2ecf20Sopenharmony_ci .name = "Maple", 3528c2ecf20Sopenharmony_ci .probe = maple_probe, 3538c2ecf20Sopenharmony_ci .setup_arch = maple_setup_arch, 3548c2ecf20Sopenharmony_ci .init_IRQ = maple_init_IRQ, 3558c2ecf20Sopenharmony_ci .pci_irq_fixup = maple_pci_irq_fixup, 3568c2ecf20Sopenharmony_ci .pci_get_legacy_ide_irq = maple_pci_get_legacy_ide_irq, 3578c2ecf20Sopenharmony_ci .restart = maple_restart, 3588c2ecf20Sopenharmony_ci .halt = maple_halt, 3598c2ecf20Sopenharmony_ci .get_boot_time = maple_get_boot_time, 3608c2ecf20Sopenharmony_ci .set_rtc_time = maple_set_rtc_time, 3618c2ecf20Sopenharmony_ci .get_rtc_time = maple_get_rtc_time, 3628c2ecf20Sopenharmony_ci .calibrate_decr = generic_calibrate_decr, 3638c2ecf20Sopenharmony_ci .progress = maple_progress, 3648c2ecf20Sopenharmony_ci .power_save = power4_idle, 3658c2ecf20Sopenharmony_ci}; 366