1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0 209f455dcSMasahiro Yamada /* 309f455dcSMasahiro Yamada * Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. 409f455dcSMasahiro Yamada */ 509f455dcSMasahiro Yamada 609f455dcSMasahiro Yamada #include <common.h> 709f455dcSMasahiro Yamada #include <asm/io.h> 809f455dcSMasahiro Yamada #include <asm/arch/tegra.h> 909f455dcSMasahiro Yamada #include <asm/arch-tegra/pmc.h> 1009f455dcSMasahiro Yamada #include "../cpu.h" 1109f455dcSMasahiro Yamada enable_cpu_power_rail(void)1209f455dcSMasahiro Yamadastatic void enable_cpu_power_rail(void) 1309f455dcSMasahiro Yamada { 1409f455dcSMasahiro Yamada struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; 1509f455dcSMasahiro Yamada u32 reg; 1609f455dcSMasahiro Yamada 1709f455dcSMasahiro Yamada reg = readl(&pmc->pmc_cntrl); 1809f455dcSMasahiro Yamada reg |= CPUPWRREQ_OE; 1909f455dcSMasahiro Yamada writel(reg, &pmc->pmc_cntrl); 2009f455dcSMasahiro Yamada 2109f455dcSMasahiro Yamada /* 2209f455dcSMasahiro Yamada * The TI PMU65861C needs a 3.75ms delay between enabling 2309f455dcSMasahiro Yamada * the power rail and enabling the CPU clock. This delay 2409f455dcSMasahiro Yamada * between SM1EN and SM1 is for switching time + the ramp 2509f455dcSMasahiro Yamada * up of the voltage to the CPU (VDD_CPU from PMU). 2609f455dcSMasahiro Yamada */ 2709f455dcSMasahiro Yamada udelay(3750); 2809f455dcSMasahiro Yamada } 2909f455dcSMasahiro Yamada start_cpu(u32 reset_vector)3009f455dcSMasahiro Yamadavoid start_cpu(u32 reset_vector) 3109f455dcSMasahiro Yamada { 3209f455dcSMasahiro Yamada /* Enable VDD_CPU */ 3309f455dcSMasahiro Yamada enable_cpu_power_rail(); 3409f455dcSMasahiro Yamada 3509f455dcSMasahiro Yamada /* Hold the CPUs in reset */ 3609f455dcSMasahiro Yamada reset_A9_cpu(1); 3709f455dcSMasahiro Yamada 3809f455dcSMasahiro Yamada /* Disable the CPU clock */ 3909f455dcSMasahiro Yamada enable_cpu_clock(0); 4009f455dcSMasahiro Yamada 4109f455dcSMasahiro Yamada /* Enable CoreSight */ 4209f455dcSMasahiro Yamada clock_enable_coresight(1); 4309f455dcSMasahiro Yamada 4409f455dcSMasahiro Yamada /* 4509f455dcSMasahiro Yamada * Set the entry point for CPU execution from reset, 4609f455dcSMasahiro Yamada * if it's a non-zero value. 4709f455dcSMasahiro Yamada */ 4809f455dcSMasahiro Yamada if (reset_vector) 4909f455dcSMasahiro Yamada writel(reset_vector, EXCEP_VECTOR_CPU_RESET_VECTOR); 5009f455dcSMasahiro Yamada 5109f455dcSMasahiro Yamada /* Enable the CPU clock */ 5209f455dcSMasahiro Yamada enable_cpu_clock(1); 5309f455dcSMasahiro Yamada 5409f455dcSMasahiro Yamada /* If the CPU doesn't already have power, power it up */ 5509f455dcSMasahiro Yamada powerup_cpu(); 5609f455dcSMasahiro Yamada 5709f455dcSMasahiro Yamada /* Take the CPU out of reset */ 5809f455dcSMasahiro Yamada reset_A9_cpu(0); 5909f455dcSMasahiro Yamada } 60