blob: 7fbc2e28655c5e2f7edba9cb7fce785644afa236 [file] [log] [blame]
Allen Martine60ab6e2012-08-31 08:30:09 +00001/*
Tom Warren9c79abe2012-12-11 13:34:13 +00002 * Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
3 *
Tom Rinie2378802016-01-14 22:05:13 -05004 * SPDX-License-Identifier: GPL-2.0
Tom Warren9c79abe2012-12-11 13:34:13 +00005 */
Allen Martine60ab6e2012-08-31 08:30:09 +00006
Tom Warrenab371962012-09-19 15:50:56 -07007#include <common.h>
Allen Martine60ab6e2012-08-31 08:30:09 +00008#include <asm/io.h>
Tom Warrenab371962012-09-19 15:50:56 -07009#include <asm/arch/tegra.h>
Tom Warrenab371962012-09-19 15:50:56 -070010#include <asm/arch-tegra/pmc.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}