Commit 18901e9f authored by Joseph Lo's avatar Joseph Lo Committed by Stephen Warren

ARM: tegra114: add power up sequence for warm boot CPU

For Tegra114, once the CPUs were powered up by PMC in cold boot flow. The
flow controller will maintain the power state and control power sequence
for each CPU by setting event trigger (e.g. CPU hotplug ,idle and
suspend power down/up).
Signed-off-by: default avatarJoseph Lo <josephl@nvidia.com>
Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
parent ecc4d9da
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define FLOW_CTRL_WAITEVENT (2 << 29) #define FLOW_CTRL_WAITEVENT (2 << 29)
#define FLOW_CTRL_WAIT_FOR_INTERRUPT (4 << 29) #define FLOW_CTRL_WAIT_FOR_INTERRUPT (4 << 29)
#define FLOW_CTRL_JTAG_RESUME (1 << 28) #define FLOW_CTRL_JTAG_RESUME (1 << 28)
#define FLOW_CTRL_SCLK_RESUME (1 << 27)
#define FLOW_CTRL_HALT_CPU_IRQ (1 << 10) #define FLOW_CTRL_HALT_CPU_IRQ (1 << 10)
#define FLOW_CTRL_HALT_CPU_FIQ (1 << 8) #define FLOW_CTRL_HALT_CPU_FIQ (1 << 8)
#define FLOW_CTRL_CPU0_CSR 0x8 #define FLOW_CTRL_CPU0_CSR 0x8
......
...@@ -140,8 +140,31 @@ static int tegra30_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -140,8 +140,31 @@ static int tegra30_boot_secondary(unsigned int cpu, struct task_struct *idle)
static int tegra114_boot_secondary(unsigned int cpu, struct task_struct *idle) static int tegra114_boot_secondary(unsigned int cpu, struct task_struct *idle)
{ {
int ret = 0;
cpu = cpu_logical_map(cpu); cpu = cpu_logical_map(cpu);
return tegra_pmc_cpu_power_on(cpu);
if (cpumask_test_cpu(cpu, &tegra_cpu_init_mask)) {
/*
* Warm boot flow
* The flow controller in charge of the power state and
* control for each CPU.
*/
/* set SCLK as event trigger for flow controller */
flowctrl_write_cpu_csr(cpu, 1);
flowctrl_write_cpu_halt(cpu,
FLOW_CTRL_WAITEVENT | FLOW_CTRL_SCLK_RESUME);
} else {
/*
* Cold boot flow
* The CPU is powered up by toggling PMC directly. It will
* also initial power state in flow controller. After that,
* the CPU's power state is maintained by flow controller.
*/
ret = tegra_pmc_cpu_power_on(cpu);
}
return ret;
} }
static int __cpuinit tegra_boot_secondary(unsigned int cpu, static int __cpuinit tegra_boot_secondary(unsigned int cpu,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment