162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2012-2013 Freescale Semiconductor, Inc.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/of_address.h>
762306a36Sopenharmony_ci#include <linux/of_platform.h>
862306a36Sopenharmony_ci#include <linux/io.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/irqchip.h>
1162306a36Sopenharmony_ci#include <asm/mach/arch.h>
1262306a36Sopenharmony_ci#include <asm/hardware/cache-l2x0.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "common.h"
1562306a36Sopenharmony_ci#include "hardware.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define MSCM_CPxCOUNT		0x00c
1862306a36Sopenharmony_ci#define MSCM_CPxCFG1		0x014
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic void __init vf610_detect_cpu(void)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	struct device_node *np;
2362306a36Sopenharmony_ci	u32 cpxcount, cpxcfg1;
2462306a36Sopenharmony_ci	unsigned int cpu_type;
2562306a36Sopenharmony_ci	void __iomem *mscm;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	np = of_find_compatible_node(NULL, NULL, "fsl,vf610-mscm-cpucfg");
2862306a36Sopenharmony_ci	if (WARN_ON(!np))
2962306a36Sopenharmony_ci		return;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	mscm = of_iomap(np, 0);
3262306a36Sopenharmony_ci	of_node_put(np);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (WARN_ON(!mscm))
3562306a36Sopenharmony_ci		return;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	cpxcount = readl_relaxed(mscm + MSCM_CPxCOUNT);
3862306a36Sopenharmony_ci	cpxcfg1  = readl_relaxed(mscm + MSCM_CPxCFG1);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	iounmap(mscm);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	cpu_type = cpxcount ? MXC_CPU_VF600 : MXC_CPU_VF500;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	if (cpxcfg1)
4562306a36Sopenharmony_ci		cpu_type |= MXC_CPU_VFx10;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	mxc_set_cpu_type(cpu_type);
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic void __init vf610_init_machine(void)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	vf610_detect_cpu();
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	of_platform_default_populate(NULL, NULL, NULL);
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic const char * const vf610_dt_compat[] __initconst = {
5862306a36Sopenharmony_ci	"fsl,vf500",
5962306a36Sopenharmony_ci	"fsl,vf510",
6062306a36Sopenharmony_ci	"fsl,vf600",
6162306a36Sopenharmony_ci	"fsl,vf610",
6262306a36Sopenharmony_ci	"fsl,vf610m4",
6362306a36Sopenharmony_ci	NULL,
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciDT_MACHINE_START(VYBRID_VF610, "Freescale Vybrid VF5xx/VF6xx (Device Tree)")
6762306a36Sopenharmony_ci	.l2c_aux_val	= 0,
6862306a36Sopenharmony_ci	.l2c_aux_mask	= ~0,
6962306a36Sopenharmony_ci	.init_machine   = vf610_init_machine,
7062306a36Sopenharmony_ci	.dt_compat	= vf610_dt_compat,
7162306a36Sopenharmony_ciMACHINE_END
72