162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2012-2013 Freescale Semiconductor, Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/of_address.h> 762306a36Sopenharmony_ci#include <linux/of_platform.h> 862306a36Sopenharmony_ci#include <linux/io.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/irqchip.h> 1162306a36Sopenharmony_ci#include <asm/mach/arch.h> 1262306a36Sopenharmony_ci#include <asm/hardware/cache-l2x0.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "common.h" 1562306a36Sopenharmony_ci#include "hardware.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define MSCM_CPxCOUNT 0x00c 1862306a36Sopenharmony_ci#define MSCM_CPxCFG1 0x014 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic void __init vf610_detect_cpu(void) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci struct device_node *np; 2362306a36Sopenharmony_ci u32 cpxcount, cpxcfg1; 2462306a36Sopenharmony_ci unsigned int cpu_type; 2562306a36Sopenharmony_ci void __iomem *mscm; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "fsl,vf610-mscm-cpucfg"); 2862306a36Sopenharmony_ci if (WARN_ON(!np)) 2962306a36Sopenharmony_ci return; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci mscm = of_iomap(np, 0); 3262306a36Sopenharmony_ci of_node_put(np); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci if (WARN_ON(!mscm)) 3562306a36Sopenharmony_ci return; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci cpxcount = readl_relaxed(mscm + MSCM_CPxCOUNT); 3862306a36Sopenharmony_ci cpxcfg1 = readl_relaxed(mscm + MSCM_CPxCFG1); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci iounmap(mscm); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci cpu_type = cpxcount ? MXC_CPU_VF600 : MXC_CPU_VF500; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci if (cpxcfg1) 4562306a36Sopenharmony_ci cpu_type |= MXC_CPU_VFx10; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci mxc_set_cpu_type(cpu_type); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic void __init vf610_init_machine(void) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci vf610_detect_cpu(); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci of_platform_default_populate(NULL, NULL, NULL); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic const char * const vf610_dt_compat[] __initconst = { 5862306a36Sopenharmony_ci "fsl,vf500", 5962306a36Sopenharmony_ci "fsl,vf510", 6062306a36Sopenharmony_ci "fsl,vf600", 6162306a36Sopenharmony_ci "fsl,vf610", 6262306a36Sopenharmony_ci "fsl,vf610m4", 6362306a36Sopenharmony_ci NULL, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciDT_MACHINE_START(VYBRID_VF610, "Freescale Vybrid VF5xx/VF6xx (Device Tree)") 6762306a36Sopenharmony_ci .l2c_aux_val = 0, 6862306a36Sopenharmony_ci .l2c_aux_mask = ~0, 6962306a36Sopenharmony_ci .init_machine = vf610_init_machine, 7062306a36Sopenharmony_ci .dt_compat = vf610_dt_compat, 7162306a36Sopenharmony_ciMACHINE_END 72