12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 25be913c6SJingchang Lu /* 35be913c6SJingchang Lu * Copyright 2012-2013 Freescale Semiconductor, Inc. 45be913c6SJingchang Lu */ 55be913c6SJingchang Lu 6dceb213cSAndrey Smirnov #include <linux/of_address.h> 75be913c6SJingchang Lu #include <linux/of_platform.h> 8dceb213cSAndrey Smirnov #include <linux/io.h> 9dceb213cSAndrey Smirnov 105be913c6SJingchang Lu #include <linux/irqchip.h> 115be913c6SJingchang Lu #include <asm/mach/arch.h> 125be913c6SJingchang Lu #include <asm/hardware/cache-l2x0.h> 135be913c6SJingchang Lu 14dceb213cSAndrey Smirnov #include "common.h" 15dceb213cSAndrey Smirnov #include "hardware.h" 16dceb213cSAndrey Smirnov 17dceb213cSAndrey Smirnov #define MSCM_CPxCOUNT 0x00c 18dceb213cSAndrey Smirnov #define MSCM_CPxCFG1 0x014 19dceb213cSAndrey Smirnov 20dceb213cSAndrey Smirnov static void __init vf610_detect_cpu(void) 21dceb213cSAndrey Smirnov { 22dceb213cSAndrey Smirnov struct device_node *np; 23dceb213cSAndrey Smirnov u32 cpxcount, cpxcfg1; 24dceb213cSAndrey Smirnov unsigned int cpu_type; 25dceb213cSAndrey Smirnov void __iomem *mscm; 26dceb213cSAndrey Smirnov 27dceb213cSAndrey Smirnov np = of_find_compatible_node(NULL, NULL, "fsl,vf610-mscm-cpucfg"); 28dceb213cSAndrey Smirnov if (WARN_ON(!np)) 29dceb213cSAndrey Smirnov return; 30dceb213cSAndrey Smirnov 31dceb213cSAndrey Smirnov mscm = of_iomap(np, 0); 32dceb213cSAndrey Smirnov of_node_put(np); 33dceb213cSAndrey Smirnov 34dceb213cSAndrey Smirnov if (WARN_ON(!mscm)) 35dceb213cSAndrey Smirnov return; 36dceb213cSAndrey Smirnov 37dceb213cSAndrey Smirnov cpxcount = readl_relaxed(mscm + MSCM_CPxCOUNT); 38dceb213cSAndrey Smirnov cpxcfg1 = readl_relaxed(mscm + MSCM_CPxCFG1); 39dceb213cSAndrey Smirnov 40dceb213cSAndrey Smirnov iounmap(mscm); 41dceb213cSAndrey Smirnov 42dceb213cSAndrey Smirnov cpu_type = cpxcount ? MXC_CPU_VF600 : MXC_CPU_VF500; 43dceb213cSAndrey Smirnov 44dceb213cSAndrey Smirnov if (cpxcfg1) 45dceb213cSAndrey Smirnov cpu_type |= MXC_CPU_VFx10; 46dceb213cSAndrey Smirnov 47dceb213cSAndrey Smirnov mxc_set_cpu_type(cpu_type); 48dceb213cSAndrey Smirnov } 49dceb213cSAndrey Smirnov 50dceb213cSAndrey Smirnov static void __init vf610_init_machine(void) 51dceb213cSAndrey Smirnov { 52dceb213cSAndrey Smirnov struct device *parent; 53dceb213cSAndrey Smirnov 54dceb213cSAndrey Smirnov vf610_detect_cpu(); 55dceb213cSAndrey Smirnov 56dceb213cSAndrey Smirnov parent = imx_soc_device_init(); 57dceb213cSAndrey Smirnov if (parent == NULL) 58dceb213cSAndrey Smirnov pr_warn("failed to initialize soc device\n"); 59dceb213cSAndrey Smirnov 60dceb213cSAndrey Smirnov of_platform_default_populate(NULL, NULL, parent); 61dceb213cSAndrey Smirnov } 62dceb213cSAndrey 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, 75dceb213cSAndrey Smirnov .init_machine = vf610_init_machine, 765be913c6SJingchang Lu .dt_compat = vf610_dt_compat, 775be913c6SJingchang Lu MACHINE_END 78