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