1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Copyright 2012-2013 Freescale Semiconductor, Inc. |
4 | */ |
5 | |
6 | #include <linux/of_address.h> |
7 | #include <linux/of_platform.h> |
8 | #include <linux/io.h> |
9 | |
10 | #include <linux/irqchip.h> |
11 | #include <asm/mach/arch.h> |
12 | #include <asm/hardware/cache-l2x0.h> |
13 | |
14 | #include "common.h" |
15 | #include "hardware.h" |
16 | |
17 | #define MSCM_CPxCOUNT 0x00c |
18 | #define MSCM_CPxCFG1 0x014 |
19 | |
20 | static void __init vf610_detect_cpu(void) |
21 | { |
22 | struct device_node *np; |
23 | u32 cpxcount, cpxcfg1; |
24 | unsigned int cpu_type; |
25 | void __iomem *mscm; |
26 | |
27 | np = of_find_compatible_node(NULL, NULL, compat: "fsl,vf610-mscm-cpucfg" ); |
28 | if (WARN_ON(!np)) |
29 | return; |
30 | |
31 | mscm = of_iomap(node: np, index: 0); |
32 | of_node_put(node: np); |
33 | |
34 | if (WARN_ON(!mscm)) |
35 | return; |
36 | |
37 | cpxcount = readl_relaxed(mscm + MSCM_CPxCOUNT); |
38 | cpxcfg1 = readl_relaxed(mscm + MSCM_CPxCFG1); |
39 | |
40 | iounmap(addr: mscm); |
41 | |
42 | cpu_type = cpxcount ? MXC_CPU_VF600 : MXC_CPU_VF500; |
43 | |
44 | if (cpxcfg1) |
45 | cpu_type |= MXC_CPU_VFx10; |
46 | |
47 | mxc_set_cpu_type(type: cpu_type); |
48 | } |
49 | |
50 | static void __init vf610_init_machine(void) |
51 | { |
52 | vf610_detect_cpu(); |
53 | |
54 | of_platform_default_populate(NULL, NULL, NULL); |
55 | } |
56 | |
57 | static const char * const vf610_dt_compat[] __initconst = { |
58 | "fsl,vf500" , |
59 | "fsl,vf510" , |
60 | "fsl,vf600" , |
61 | "fsl,vf610" , |
62 | "fsl,vf610m4" , |
63 | NULL, |
64 | }; |
65 | |
66 | DT_MACHINE_START(VYBRID_VF610, "Freescale Vybrid VF5xx/VF6xx (Device Tree)" ) |
67 | .l2c_aux_val = 0, |
68 | .l2c_aux_mask = ~0, |
69 | .init_machine = vf610_init_machine, |
70 | .dt_compat = vf610_dt_compat, |
71 | MACHINE_END |
72 | |