162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2016 Freescale Semiconductor, Inc.
462306a36Sopenharmony_ci * Copyright 2017-2018 NXP
562306a36Sopenharmony_ci *   Author: Dong Aisheng <aisheng.dong@nxp.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/irqchip.h>
962306a36Sopenharmony_ci#include <linux/mfd/syscon.h>
1062306a36Sopenharmony_ci#include <linux/of_platform.h>
1162306a36Sopenharmony_ci#include <linux/regmap.h>
1262306a36Sopenharmony_ci#include <asm/mach/arch.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "common.h"
1562306a36Sopenharmony_ci#include "cpuidle.h"
1662306a36Sopenharmony_ci#include "hardware.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define SIM_JTAG_ID_REG		0x8c
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic void __init imx7ulp_set_revision(void)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	struct regmap *sim;
2362306a36Sopenharmony_ci	u32 revision;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	sim = syscon_regmap_lookup_by_compatible("fsl,imx7ulp-sim");
2662306a36Sopenharmony_ci	if (IS_ERR(sim)) {
2762306a36Sopenharmony_ci		pr_warn("failed to find fsl,imx7ulp-sim regmap!\n");
2862306a36Sopenharmony_ci		return;
2962306a36Sopenharmony_ci	}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	if (regmap_read(sim, SIM_JTAG_ID_REG, &revision)) {
3262306a36Sopenharmony_ci		pr_warn("failed to read sim regmap!\n");
3362306a36Sopenharmony_ci		return;
3462306a36Sopenharmony_ci	}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	/*
3762306a36Sopenharmony_ci	 * bit[31:28] of JTAG_ID register defines revision as below from B0:
3862306a36Sopenharmony_ci	 * 0001        B0
3962306a36Sopenharmony_ci	 * 0010        B1
4062306a36Sopenharmony_ci	 * 0011        B2
4162306a36Sopenharmony_ci	 */
4262306a36Sopenharmony_ci	switch (revision >> 28) {
4362306a36Sopenharmony_ci	case 1:
4462306a36Sopenharmony_ci		imx_set_soc_revision(IMX_CHIP_REVISION_2_0);
4562306a36Sopenharmony_ci		break;
4662306a36Sopenharmony_ci	case 2:
4762306a36Sopenharmony_ci		imx_set_soc_revision(IMX_CHIP_REVISION_2_1);
4862306a36Sopenharmony_ci		break;
4962306a36Sopenharmony_ci	case 3:
5062306a36Sopenharmony_ci		imx_set_soc_revision(IMX_CHIP_REVISION_2_2);
5162306a36Sopenharmony_ci		break;
5262306a36Sopenharmony_ci	default:
5362306a36Sopenharmony_ci		imx_set_soc_revision(IMX_CHIP_REVISION_1_0);
5462306a36Sopenharmony_ci		break;
5562306a36Sopenharmony_ci	}
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic void __init imx7ulp_init_machine(void)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	imx7ulp_pm_init();
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	mxc_set_cpu_type(MXC_CPU_IMX7ULP);
6362306a36Sopenharmony_ci	imx7ulp_set_revision();
6462306a36Sopenharmony_ci	of_platform_default_populate(NULL, NULL, NULL);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic const char *const imx7ulp_dt_compat[] __initconst = {
6862306a36Sopenharmony_ci	"fsl,imx7ulp",
6962306a36Sopenharmony_ci	NULL,
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic void __init imx7ulp_init_late(void)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_ARM_IMX_CPUFREQ_DT))
7562306a36Sopenharmony_ci		platform_device_register_simple("imx-cpufreq-dt", -1, NULL, 0);
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	imx7ulp_cpuidle_init();
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciDT_MACHINE_START(IMX7ulp, "Freescale i.MX7ULP (Device Tree)")
8162306a36Sopenharmony_ci	.init_machine	= imx7ulp_init_machine,
8262306a36Sopenharmony_ci	.dt_compat	= imx7ulp_dt_compat,
8362306a36Sopenharmony_ci	.init_late	= imx7ulp_init_late,
8462306a36Sopenharmony_ciMACHINE_END
85