18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Based on MPC8560 ADS and arch/ppc tqm85xx ports 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Maintained by Kumar Gala (see MAINTAINERS for contact information) 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright 2008 Freescale Semiconductor Inc. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Copyright (c) 2005-2006 DENX Software Engineering 108c2ecf20Sopenharmony_ci * Stefan Roese <sr@denx.de> 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * Based on original work by 138c2ecf20Sopenharmony_ci * Kumar Gala <kumar.gala@freescale.com> 148c2ecf20Sopenharmony_ci * Copyright 2004 Freescale Semiconductor Inc. 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <linux/stddef.h> 188c2ecf20Sopenharmony_ci#include <linux/kernel.h> 198c2ecf20Sopenharmony_ci#include <linux/pci.h> 208c2ecf20Sopenharmony_ci#include <linux/kdev_t.h> 218c2ecf20Sopenharmony_ci#include <linux/delay.h> 228c2ecf20Sopenharmony_ci#include <linux/seq_file.h> 238c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#include <asm/time.h> 268c2ecf20Sopenharmony_ci#include <asm/machdep.h> 278c2ecf20Sopenharmony_ci#include <asm/pci-bridge.h> 288c2ecf20Sopenharmony_ci#include <asm/mpic.h> 298c2ecf20Sopenharmony_ci#include <asm/prom.h> 308c2ecf20Sopenharmony_ci#include <mm/mmu_decl.h> 318c2ecf20Sopenharmony_ci#include <asm/udbg.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include <sysdev/fsl_soc.h> 348c2ecf20Sopenharmony_ci#include <sysdev/fsl_pci.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include "mpc85xx.h" 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#ifdef CONFIG_CPM2 398c2ecf20Sopenharmony_ci#include <asm/cpm2.h> 408c2ecf20Sopenharmony_ci#endif /* CONFIG_CPM2 */ 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cistatic void __init tqm85xx_pic_init(void) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci struct mpic *mpic = mpic_alloc(NULL, 0, 458c2ecf20Sopenharmony_ci MPIC_BIG_ENDIAN, 468c2ecf20Sopenharmony_ci 0, 256, " OpenPIC "); 478c2ecf20Sopenharmony_ci BUG_ON(mpic == NULL); 488c2ecf20Sopenharmony_ci mpic_init(mpic); 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci mpc85xx_cpm2_pic_init(); 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* 548c2ecf20Sopenharmony_ci * Setup the architecture 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_cistatic void __init tqm85xx_setup_arch(void) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci if (ppc_md.progress) 598c2ecf20Sopenharmony_ci ppc_md.progress("tqm85xx_setup_arch()", 0); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#ifdef CONFIG_CPM2 628c2ecf20Sopenharmony_ci cpm2_reset(); 638c2ecf20Sopenharmony_ci#endif 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci fsl_pci_assign_primary(); 668c2ecf20Sopenharmony_ci} 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistatic void tqm85xx_show_cpuinfo(struct seq_file *m) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci uint pvid, svid, phid1; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci pvid = mfspr(SPRN_PVR); 738c2ecf20Sopenharmony_ci svid = mfspr(SPRN_SVR); 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci seq_printf(m, "Vendor\t\t: TQ Components\n"); 768c2ecf20Sopenharmony_ci seq_printf(m, "PVR\t\t: 0x%x\n", pvid); 778c2ecf20Sopenharmony_ci seq_printf(m, "SVR\t\t: 0x%x\n", svid); 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci /* Display cpu Pll setting */ 808c2ecf20Sopenharmony_ci phid1 = mfspr(SPRN_HID1); 818c2ecf20Sopenharmony_ci seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f)); 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistatic void tqm85xx_ti1520_fixup(struct pci_dev *pdev) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci unsigned int val; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci /* Do not do the fixup on other platforms! */ 898c2ecf20Sopenharmony_ci if (!machine_is(tqm85xx)) 908c2ecf20Sopenharmony_ci return; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci dev_info(&pdev->dev, "Using TI 1520 fixup on TQM85xx\n"); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci /* 958c2ecf20Sopenharmony_ci * Enable P2CCLK bit in system control register 968c2ecf20Sopenharmony_ci * to enable CLOCK output to power chip 978c2ecf20Sopenharmony_ci */ 988c2ecf20Sopenharmony_ci pci_read_config_dword(pdev, 0x80, &val); 998c2ecf20Sopenharmony_ci pci_write_config_dword(pdev, 0x80, val | (1 << 27)); 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci} 1028c2ecf20Sopenharmony_ciDECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1520, 1038c2ecf20Sopenharmony_ci tqm85xx_ti1520_fixup); 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cimachine_arch_initcall(tqm85xx, mpc85xx_common_publish_devices); 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cistatic const char * const board[] __initconst = { 1088c2ecf20Sopenharmony_ci "tqc,tqm8540", 1098c2ecf20Sopenharmony_ci "tqc,tqm8541", 1108c2ecf20Sopenharmony_ci "tqc,tqm8548", 1118c2ecf20Sopenharmony_ci "tqc,tqm8555", 1128c2ecf20Sopenharmony_ci "tqc,tqm8560", 1138c2ecf20Sopenharmony_ci NULL 1148c2ecf20Sopenharmony_ci}; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci/* 1178c2ecf20Sopenharmony_ci * Called very early, device-tree isn't unflattened 1188c2ecf20Sopenharmony_ci */ 1198c2ecf20Sopenharmony_cistatic int __init tqm85xx_probe(void) 1208c2ecf20Sopenharmony_ci{ 1218c2ecf20Sopenharmony_ci return of_device_compatible_match(of_root, board); 1228c2ecf20Sopenharmony_ci} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cidefine_machine(tqm85xx) { 1258c2ecf20Sopenharmony_ci .name = "TQM85xx", 1268c2ecf20Sopenharmony_ci .probe = tqm85xx_probe, 1278c2ecf20Sopenharmony_ci .setup_arch = tqm85xx_setup_arch, 1288c2ecf20Sopenharmony_ci .init_IRQ = tqm85xx_pic_init, 1298c2ecf20Sopenharmony_ci .show_cpuinfo = tqm85xx_show_cpuinfo, 1308c2ecf20Sopenharmony_ci .get_irq = mpic_get_irq, 1318c2ecf20Sopenharmony_ci .calibrate_decr = generic_calibrate_decr, 1328c2ecf20Sopenharmony_ci .progress = udbg_progress, 1338c2ecf20Sopenharmony_ci}; 134