Skip to content

Commit

Permalink
ARM: tegra: support for Tegra30 CPU powerdomains
Browse files Browse the repository at this point in the history
Secondary CPU powerdomains can be powergated on Tegra30. Add the necessary
functions to do this. This will be used to boot the secondary CPUs later on.

Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com>
Acked-by: Stephen Warren <swarren@nvidia.com>
Tested-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Olof Johansson <olof@lixom.net>
  • Loading branch information
Peter De Schrijver authored and Olof Johansson committed Feb 26, 2012
1 parent 6cafa97 commit 65fe31d
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
3 changes: 3 additions & 0 deletions arch/arm/mach-tegra/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

#include <mach/iomap.h>
#include <mach/system.h>
#include <mach/powergate.h>

#include "board.h"
#include "clock.h"
Expand Down Expand Up @@ -119,6 +120,7 @@ void __init tegra20_init_early(void)
tegra_clk_init_from_table(tegra20_clk_init_table);
tegra_init_cache(0x331, 0x441);
tegra_pmc_init();
tegra_powergate_init();
}
#endif
#ifdef CONFIG_ARCH_TEGRA_3x_SOC
Expand All @@ -128,5 +130,6 @@ void __init tegra30_init_early(void)
tegra30_init_clocks();
tegra_init_cache(0x441, 0x551);
tegra_pmc_init();
tegra_powergate_init();
}
#endif
3 changes: 3 additions & 0 deletions arch/arm/mach-tegra/include/mach/powergate.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@
#define TEGRA_POWERGATE_CPU0 TEGRA_POWERGATE_CPU
#define TEGRA_POWERGATE_3D0 TEGRA_POWERGATE_3D

int __init tegra_powergate_init(void);

int tegra_cpu_powergate_id(int cpuid);
int tegra_powergate_is_powered(int id);
int tegra_powergate_power_on(int id);
int tegra_powergate_power_off(int id);
Expand Down
19 changes: 18 additions & 1 deletion arch/arm/mach-tegra/powergate.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@
#define PWRGATE_STATUS 0x38

static int tegra_num_powerdomains;
static int tegra_num_cpu_domains;
static u8 *tegra_cpu_domains;
static u8 tegra30_cpu_domains[] = {
TEGRA_POWERGATE_CPU0,
TEGRA_POWERGATE_CPU1,
TEGRA_POWERGATE_CPU2,
TEGRA_POWERGATE_CPU3,
};

static DEFINE_SPINLOCK(tegra_powergate_lock);

Expand Down Expand Up @@ -161,6 +169,14 @@ int tegra_powergate_sequence_power_up(int id, struct clk *clk)
return ret;
}

int tegra_cpu_powergate_id(int cpuid)
{
if (cpuid > 0 && cpuid < tegra_num_cpu_domains)
return tegra_cpu_domains[cpuid];

return -EINVAL;
}

int __init tegra_powergate_init(void)
{
switch (tegra_chip_id) {
Expand All @@ -169,6 +185,8 @@ int __init tegra_powergate_init(void)
break;
case TEGRA30:
tegra_num_powerdomains = 14;
tegra_num_cpu_domains = 4;
tegra_cpu_domains = tegra30_cpu_domains;
break;
default:
/* Unknown Tegra variant. Disable powergating */
Expand All @@ -178,7 +196,6 @@ int __init tegra_powergate_init(void)

return 0;
}
arch_initcall(tegra_powergate_init);

#ifdef CONFIG_DEBUG_FS

Expand Down

0 comments on commit 65fe31d

Please sign in to comment.