12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 25be913c6SJingchang Lu /* 35be913c6SJingchang Lu * Copyright 2012-2013 Freescale Semiconductor, Inc. 45be913c6SJingchang Lu */ 55be913c6SJingchang Lu 6*dceb213cSAndrey Smirnov #include <linux/of_address.h> 75be913c6SJingchang Lu #include <linux/of_platform.h> 8*dceb213cSAndrey Smirnov #include <linux/io.h> 9*dceb213cSAndrey Smirnov 105be913c6SJingchang Lu #include <linux/irqchip.h> 115be913c6SJingchang Lu #include <asm/mach/arch.h> 125be913c6SJingchang Lu #include <asm/hardware/cache-l2x0.h> 135be913c6SJingchang Lu 14*dceb213cSAndrey Smirnov #include "common.h" 15*dceb213cSAndrey Smirnov #include "hardware.h" 16*dceb213cSAndrey Smirnov 17*dceb213cSAndrey Smirnov #define MSCM_CPxCOUNT 0x00c 18*dceb213cSAndrey Smirnov #define MSCM_CPxCFG1 0x014 19*dceb213cSAndrey Smirnov 20*dceb213cSAndrey Smirnov static void __init vf610_detect_cpu(void) 21*dceb213cSAndrey Smirnov { 22*dceb213cSAndrey Smirnov struct device_node *np; 23*dceb213cSAndrey Smirnov u32 cpxcount, cpxcfg1; 24*dceb213cSAndrey Smirnov unsigned int cpu_type; 25*dceb213cSAndrey Smirnov void __iomem *mscm; 26*dceb213cSAndrey Smirnov 27*dceb213cSAndrey Smirnov np = of_find_compatible_node(NULL, NULL, "fsl,vf610-mscm-cpucfg"); 28*dceb213cSAndrey Smirnov if (WARN_ON(!np)) 29*dceb213cSAndrey Smirnov return; 30*dceb213cSAndrey Smirnov 31*dceb213cSAndrey Smirnov mscm = of_iomap(np, 0); 32*dceb213cSAndrey Smirnov of_node_put(np); 33*dceb213cSAndrey Smirnov 34*dceb213cSAndrey Smirnov if (WARN_ON(!mscm)) 35*dceb213cSAndrey Smirnov return; 36*dceb213cSAndrey Smirnov 37*dceb213cSAndrey Smirnov cpxcount = readl_relaxed(mscm + MSCM_CPxCOUNT); 38*dceb213cSAndrey Smirnov cpxcfg1 = readl_relaxed(mscm + MSCM_CPxCFG1); 39*dceb213cSAndrey Smirnov 40*dceb213cSAndrey Smirnov iounmap(mscm); 41*dceb213cSAndrey Smirnov 42*dceb213cSAndrey Smirnov cpu_type = cpxcount ? MXC_CPU_VF600 : MXC_CPU_VF500; 43*dceb213cSAndrey Smirnov 44*dceb213cSAndrey Smirnov if (cpxcfg1) 45*dceb213cSAndrey Smirnov cpu_type |= MXC_CPU_VFx10; 46*dceb213cSAndrey Smirnov 47*dceb213cSAndrey Smirnov mxc_set_cpu_type(cpu_type); 48*dceb213cSAndrey Smirnov } 49*dceb213cSAndrey Smirnov 50*dceb213cSAndrey Smirnov static void __init vf610_init_machine(void) 51*dceb213cSAndrey Smirnov { 52*dceb213cSAndrey Smirnov struct device *parent; 53*dceb213cSAndrey Smirnov 54*dceb213cSAndrey Smirnov vf610_detect_cpu(); 55*dceb213cSAndrey Smirnov 56*dceb213cSAndrey Smirnov parent = imx_soc_device_init(); 57*dceb213cSAndrey Smirnov if (parent == NULL) 58*dceb213cSAndrey Smirnov pr_warn("failed to initialize soc device\n"); 59*dceb213cSAndrey Smirnov 60*dceb213cSAndrey Smirnov of_platform_default_populate(NULL, NULL, parent); 61*dceb213cSAndrey Smirnov } 62*dceb213cSAndrey Smirnov 638756dd92SShawn Guo static const char * const vf610_dt_compat[] __initconst = { 64da06aae8SStefan Agner "fsl,vf500", 65da06aae8SStefan Agner "fsl,vf510", 66da06aae8SStefan Agner "fsl,vf600", 675be913c6SJingchang Lu "fsl,vf610", 688064887eSStefan Agner "fsl,vf610m4", 695be913c6SJingchang Lu NULL, 705be913c6SJingchang Lu }; 715be913c6SJingchang Lu 72da06aae8SStefan Agner DT_MACHINE_START(VYBRID_VF610, "Freescale Vybrid VF5xx/VF6xx (Device Tree)") 73b9f71aadSRussell King .l2c_aux_val = 0, 74b9f71aadSRussell King .l2c_aux_mask = ~0, 75*dceb213cSAndrey Smirnov .init_machine = vf610_init_machine, 765be913c6SJingchang Lu .dt_compat = vf610_dt_compat, 775be913c6SJingchang Lu MACHINE_END 78