18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Freescale Semiconductor, Inc. 48c2ecf20Sopenharmony_ci * Copyright 2017-2018 NXP 58c2ecf20Sopenharmony_ci * Author: Dong Aisheng <aisheng.dong@nxp.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/irqchip.h> 98c2ecf20Sopenharmony_ci#include <linux/mfd/syscon.h> 108c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 118c2ecf20Sopenharmony_ci#include <linux/regmap.h> 128c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "common.h" 158c2ecf20Sopenharmony_ci#include "cpuidle.h" 168c2ecf20Sopenharmony_ci#include "hardware.h" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define SIM_JTAG_ID_REG 0x8c 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistatic void __init imx7ulp_set_revision(void) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci struct regmap *sim; 238c2ecf20Sopenharmony_ci u32 revision; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci sim = syscon_regmap_lookup_by_compatible("fsl,imx7ulp-sim"); 268c2ecf20Sopenharmony_ci if (IS_ERR(sim)) { 278c2ecf20Sopenharmony_ci pr_warn("failed to find fsl,imx7ulp-sim regmap!\n"); 288c2ecf20Sopenharmony_ci return; 298c2ecf20Sopenharmony_ci } 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci if (regmap_read(sim, SIM_JTAG_ID_REG, &revision)) { 328c2ecf20Sopenharmony_ci pr_warn("failed to read sim regmap!\n"); 338c2ecf20Sopenharmony_ci return; 348c2ecf20Sopenharmony_ci } 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci /* 378c2ecf20Sopenharmony_ci * bit[31:28] of JTAG_ID register defines revision as below from B0: 388c2ecf20Sopenharmony_ci * 0001 B0 398c2ecf20Sopenharmony_ci * 0010 B1 408c2ecf20Sopenharmony_ci */ 418c2ecf20Sopenharmony_ci switch (revision >> 28) { 428c2ecf20Sopenharmony_ci case 1: 438c2ecf20Sopenharmony_ci imx_set_soc_revision(IMX_CHIP_REVISION_2_0); 448c2ecf20Sopenharmony_ci break; 458c2ecf20Sopenharmony_ci case 2: 468c2ecf20Sopenharmony_ci imx_set_soc_revision(IMX_CHIP_REVISION_2_1); 478c2ecf20Sopenharmony_ci break; 488c2ecf20Sopenharmony_ci default: 498c2ecf20Sopenharmony_ci imx_set_soc_revision(IMX_CHIP_REVISION_1_0); 508c2ecf20Sopenharmony_ci break; 518c2ecf20Sopenharmony_ci } 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic void __init imx7ulp_init_machine(void) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci imx7ulp_pm_init(); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci mxc_set_cpu_type(MXC_CPU_IMX7ULP); 598c2ecf20Sopenharmony_ci imx7ulp_set_revision(); 608c2ecf20Sopenharmony_ci of_platform_default_populate(NULL, NULL, NULL); 618c2ecf20Sopenharmony_ci} 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistatic const char *const imx7ulp_dt_compat[] __initconst = { 648c2ecf20Sopenharmony_ci "fsl,imx7ulp", 658c2ecf20Sopenharmony_ci NULL, 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistatic void __init imx7ulp_init_late(void) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci if (IS_ENABLED(CONFIG_ARM_IMX_CPUFREQ_DT)) 718c2ecf20Sopenharmony_ci platform_device_register_simple("imx-cpufreq-dt", -1, NULL, 0); 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci imx7ulp_cpuidle_init(); 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ciDT_MACHINE_START(IMX7ulp, "Freescale i.MX7ULP (Device Tree)") 778c2ecf20Sopenharmony_ci .init_machine = imx7ulp_init_machine, 788c2ecf20Sopenharmony_ci .dt_compat = imx7ulp_dt_compat, 798c2ecf20Sopenharmony_ci .init_late = imx7ulp_init_late, 808c2ecf20Sopenharmony_ciMACHINE_END 81