18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2006 Freescale Semiconductor, Inc. All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Description: 68c2ecf20Sopenharmony_ci * MPC832xE MDS board specific routines. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/stddef.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/errno.h> 138c2ecf20Sopenharmony_ci#include <linux/reboot.h> 148c2ecf20Sopenharmony_ci#include <linux/pci.h> 158c2ecf20Sopenharmony_ci#include <linux/kdev_t.h> 168c2ecf20Sopenharmony_ci#include <linux/major.h> 178c2ecf20Sopenharmony_ci#include <linux/console.h> 188c2ecf20Sopenharmony_ci#include <linux/delay.h> 198c2ecf20Sopenharmony_ci#include <linux/seq_file.h> 208c2ecf20Sopenharmony_ci#include <linux/root_dev.h> 218c2ecf20Sopenharmony_ci#include <linux/initrd.h> 228c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 238c2ecf20Sopenharmony_ci#include <linux/of_device.h> 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#include <linux/atomic.h> 268c2ecf20Sopenharmony_ci#include <asm/time.h> 278c2ecf20Sopenharmony_ci#include <asm/io.h> 288c2ecf20Sopenharmony_ci#include <asm/machdep.h> 298c2ecf20Sopenharmony_ci#include <asm/ipic.h> 308c2ecf20Sopenharmony_ci#include <asm/irq.h> 318c2ecf20Sopenharmony_ci#include <asm/prom.h> 328c2ecf20Sopenharmony_ci#include <asm/udbg.h> 338c2ecf20Sopenharmony_ci#include <sysdev/fsl_soc.h> 348c2ecf20Sopenharmony_ci#include <sysdev/fsl_pci.h> 358c2ecf20Sopenharmony_ci#include <soc/fsl/qe/qe.h> 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#include "mpc83xx.h" 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#undef DEBUG 408c2ecf20Sopenharmony_ci#ifdef DEBUG 418c2ecf20Sopenharmony_ci#define DBG(fmt...) udbg_printf(fmt) 428c2ecf20Sopenharmony_ci#else 438c2ecf20Sopenharmony_ci#define DBG(fmt...) 448c2ecf20Sopenharmony_ci#endif 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/* ************************************************************************ 478c2ecf20Sopenharmony_ci * 488c2ecf20Sopenharmony_ci * Setup the architecture 498c2ecf20Sopenharmony_ci * 508c2ecf20Sopenharmony_ci */ 518c2ecf20Sopenharmony_cistatic void __init mpc832x_sys_setup_arch(void) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci struct device_node *np; 548c2ecf20Sopenharmony_ci u8 __iomem *bcsr_regs = NULL; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci mpc83xx_setup_arch(); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci /* Map BCSR area */ 598c2ecf20Sopenharmony_ci np = of_find_node_by_name(NULL, "bcsr"); 608c2ecf20Sopenharmony_ci if (np) { 618c2ecf20Sopenharmony_ci struct resource res; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci of_address_to_resource(np, 0, &res); 648c2ecf20Sopenharmony_ci bcsr_regs = ioremap(res.start, resource_size(&res)); 658c2ecf20Sopenharmony_ci of_node_put(np); 668c2ecf20Sopenharmony_ci } 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci#ifdef CONFIG_QUICC_ENGINE 698c2ecf20Sopenharmony_ci if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) { 708c2ecf20Sopenharmony_ci par_io_init(np); 718c2ecf20Sopenharmony_ci of_node_put(np); 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci for_each_node_by_name(np, "ucc") 748c2ecf20Sopenharmony_ci par_io_of_config(np); 758c2ecf20Sopenharmony_ci } 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci if ((np = of_find_compatible_node(NULL, "network", "ucc_geth")) 788c2ecf20Sopenharmony_ci != NULL){ 798c2ecf20Sopenharmony_ci /* Reset the Ethernet PHYs */ 808c2ecf20Sopenharmony_ci#define BCSR8_FETH_RST 0x50 818c2ecf20Sopenharmony_ci clrbits8(&bcsr_regs[8], BCSR8_FETH_RST); 828c2ecf20Sopenharmony_ci udelay(1000); 838c2ecf20Sopenharmony_ci setbits8(&bcsr_regs[8], BCSR8_FETH_RST); 848c2ecf20Sopenharmony_ci iounmap(bcsr_regs); 858c2ecf20Sopenharmony_ci of_node_put(np); 868c2ecf20Sopenharmony_ci } 878c2ecf20Sopenharmony_ci#endif /* CONFIG_QUICC_ENGINE */ 888c2ecf20Sopenharmony_ci} 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cimachine_device_initcall(mpc832x_mds, mpc83xx_declare_of_platform_devices); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci/* 938c2ecf20Sopenharmony_ci * Called very early, MMU is off, device-tree isn't unflattened 948c2ecf20Sopenharmony_ci */ 958c2ecf20Sopenharmony_cistatic int __init mpc832x_sys_probe(void) 968c2ecf20Sopenharmony_ci{ 978c2ecf20Sopenharmony_ci return of_machine_is_compatible("MPC832xMDS"); 988c2ecf20Sopenharmony_ci} 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cidefine_machine(mpc832x_mds) { 1018c2ecf20Sopenharmony_ci .name = "MPC832x MDS", 1028c2ecf20Sopenharmony_ci .probe = mpc832x_sys_probe, 1038c2ecf20Sopenharmony_ci .setup_arch = mpc832x_sys_setup_arch, 1048c2ecf20Sopenharmony_ci .init_IRQ = mpc83xx_ipic_init_IRQ, 1058c2ecf20Sopenharmony_ci .get_irq = ipic_get_irq, 1068c2ecf20Sopenharmony_ci .restart = mpc83xx_restart, 1078c2ecf20Sopenharmony_ci .time_init = mpc83xx_time_init, 1088c2ecf20Sopenharmony_ci .calibrate_decr = generic_calibrate_decr, 1098c2ecf20Sopenharmony_ci .progress = udbg_progress, 1108c2ecf20Sopenharmony_ci}; 111