blob: e5b60598f7f7a383c67bc9e3884dc37387191259 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0
Allen Martine60ab6e2012-08-31 08:30:09 +00002/*
Tom Warren9c79abe2012-12-11 13:34:13 +00003 * Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
Tom Warren9c79abe2012-12-11 13:34:13 +00004 */
Allen Martine60ab6e2012-08-31 08:30:09 +00005
Tom Warrenab371962012-09-19 15:50:56 -07006#include <common.h>
Allen Martine60ab6e2012-08-31 08:30:09 +00007#include <asm/io.h>
Tom Warrenab371962012-09-19 15:50:56 -07008#include <asm/arch/tegra.h>
Tom Warrenab371962012-09-19 15:50:56 -07009#include <asm/arch-tegra/pmc.h>
Simon Glassdbd79542020-05-10 11:40:11 -060010#include <linux/delay.h>
Masahiro Yamadaed1632a2015-02-20 17:04:04 +090011#include "../cpu.h"
Allen Martine60ab6e2012-08-31 08:30:09 +000012
Allen Martine60ab6e2012-08-31 08:30:09 +000013static void enable_cpu_power_rail(void)
14{
Tom Warren22562a42012-09-04 17:00:24 -070015 struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE;
Allen Martine60ab6e2012-08-31 08:30:09 +000016 u32 reg;
17
18 reg = readl(&pmc->pmc_cntrl);
19 reg |= CPUPWRREQ_OE;
20 writel(reg, &pmc->pmc_cntrl);
21
22 /*
23 * The TI PMU65861C needs a 3.75ms delay between enabling
24 * the power rail and enabling the CPU clock. This delay
25 * between SM1EN and SM1 is for switching time + the ramp
26 * up of the voltage to the CPU (VDD_CPU from PMU).
27 */
28 udelay(3750);
29}
30
Allen Martine60ab6e2012-08-31 08:30:09 +000031void start_cpu(u32 reset_vector)
32{
33 /* Enable VDD_CPU */
34 enable_cpu_power_rail();
35
36 /* Hold the CPUs in reset */
37 reset_A9_cpu(1);
38
39 /* Disable the CPU clock */
40 enable_cpu_clock(0);
41
42 /* Enable CoreSight */
43 clock_enable_coresight(1);
44
45 /*
46 * Set the entry point for CPU execution from reset,
47 * if it's a non-zero value.
48 */
49 if (reset_vector)
50 writel(reset_vector, EXCEP_VECTOR_CPU_RESET_VECTOR);
51
52 /* Enable the CPU clock */
53 enable_cpu_clock(1);
54
55 /* If the CPU doesn't already have power, power it up */
56 powerup_cpu();
57
58 /* Take the CPU out of reset */
59 reset_A9_cpu(0);
60}