162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/of.h>
362306a36Sopenharmony_ci#include <linux/of_address.h>
462306a36Sopenharmony_ci#include <asm/mach/arch.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "vexpress.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define SYS_FLAGSSET		0x030
962306a36Sopenharmony_ci#define SYS_FLAGSCLR		0x034
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_civoid vexpress_flags_set(u32 data)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	static void __iomem *base;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	if (!base) {
1662306a36Sopenharmony_ci		struct device_node *node = of_find_compatible_node(NULL, NULL,
1762306a36Sopenharmony_ci				"arm,vexpress-sysreg");
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci		base = of_iomap(node, 0);
2062306a36Sopenharmony_ci	}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	if (WARN_ON(!base))
2362306a36Sopenharmony_ci		return;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	writel(~0, base + SYS_FLAGSCLR);
2662306a36Sopenharmony_ci	writel(data, base + SYS_FLAGSSET);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic const char * const v2m_dt_match[] __initconst = {
3062306a36Sopenharmony_ci	"arm,vexpress",
3162306a36Sopenharmony_ci	NULL,
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciDT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")
3562306a36Sopenharmony_ci	.dt_compat	= v2m_dt_match,
3662306a36Sopenharmony_ci	.l2c_aux_val	= 0x00400000,
3762306a36Sopenharmony_ci	.l2c_aux_mask	= 0xfe0fffff,
3862306a36Sopenharmony_ci	.smp		= smp_ops(vexpress_smp_dt_ops),
3962306a36Sopenharmony_ci	.smp_init	= smp_init_ops(vexpress_smp_init_ops),
4062306a36Sopenharmony_ciMACHINE_END
41