| 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | #include <linux/of.h> |
| 3 | #include <linux/of_address.h> |
| 4 | #include <asm/mach/arch.h> |
| 5 | |
| 6 | #include "vexpress.h" |
| 7 | |
| 8 | #define SYS_FLAGSSET 0x030 |
| 9 | #define SYS_FLAGSCLR 0x034 |
| 10 | |
| 11 | void vexpress_flags_set(u32 data) |
| 12 | { |
| 13 | static void __iomem *base; |
| 14 | |
| 15 | if (!base) { |
| 16 | struct device_node *node = of_find_compatible_node(NULL, NULL, |
| 17 | compat: "arm,vexpress-sysreg" ); |
| 18 | |
| 19 | base = of_iomap(node, index: 0); |
| 20 | } |
| 21 | |
| 22 | if (WARN_ON(!base)) |
| 23 | return; |
| 24 | |
| 25 | writel(val: ~0, addr: base + SYS_FLAGSCLR); |
| 26 | writel(val: data, addr: base + SYS_FLAGSSET); |
| 27 | } |
| 28 | |
| 29 | static const char * const v2m_dt_match[] __initconst = { |
| 30 | "arm,vexpress" , |
| 31 | NULL, |
| 32 | }; |
| 33 | |
| 34 | DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express" ) |
| 35 | .dt_compat = v2m_dt_match, |
| 36 | .l2c_aux_val = 0x00400000, |
| 37 | .l2c_aux_mask = 0xfe0fffff, |
| 38 | .smp = smp_ops(vexpress_smp_dt_ops), |
| 39 | .smp_init = smp_init_ops(vexpress_smp_init_ops), |
| 40 | MACHINE_END |
| 41 | |