summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2010-05-17 19:47:39 -0700
committerGary King <gking@nvidia.com>2010-05-17 19:49:24 -0700
commit80d5c87843a64fa49f520701c6c2959bb46c0004 (patch)
tree7d343cbde4983b58e811812f6363370176d19001
parentb8261a455d683a787c2d0f30930d6f5b99b0cbf4 (diff)
[ARM/tegra] suspend: move initialization into a dedicated function
perform resource acquisition in a dedicated init-time function, to eliminate sleeping-inside-spinlock problems. Change-Id: If0b54a329c316314e78a6f7aa2c678a45dc298c3
-rw-r--r--arch/arm/mach-tegra/board.h1
-rw-r--r--arch/arm/mach-tegra/common.c1
-rw-r--r--arch/arm/mach-tegra/suspend.c16
3 files changed, 11 insertions, 7 deletions
diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h
index 3d06354136f2..06ea725f3ef0 100644
--- a/arch/arm/mach-tegra/board.h
+++ b/arch/arm/mach-tegra/board.h
@@ -27,6 +27,7 @@ void __init tegra_common_init(void);
void __init tegra_map_common_io(void);
void __init tegra_init_irq(void);
void __init tegra_init_clock(void);
+void __init tegra_init_suspend(void);
extern struct sys_timer tegra_timer;
#endif
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c
index b3b42004f3ac..751dd09c3f0d 100644
--- a/arch/arm/mach-tegra/common.c
+++ b/arch/arm/mach-tegra/common.c
@@ -66,6 +66,7 @@ void __init tegra_common_init(void)
nvmap_add_carveout_heap(TEGRA_IRAM_BASE, TEGRA_IRAM_SIZE,
"iram", NVMEM_HEAP_CARVEOUT_IRAM);
tegra_init_clock();
+ tegra_init_suspend();
tegra_init_cache();
tegra_dma_init();
arm_pm_restart = tegra_machine_restart;
diff --git a/arch/arm/mach-tegra/suspend.c b/arch/arm/mach-tegra/suspend.c
index c22d00044e40..982648e84128 100644
--- a/arch/arm/mach-tegra/suspend.c
+++ b/arch/arm/mach-tegra/suspend.c
@@ -80,19 +80,21 @@ static void __iomem *tmrus = IO_ADDRESS(TEGRA_TMRUS_BASE);
#define FLOW_CTRL_CPU_CSR 0x8
#define FLOW_CTRL_CPU1_CSR 0x18
+static struct clk *tegra_pclk = NULL;
+
+void __init tegra_init_suspend(void)
+{
+ tegra_pclk = clk_get_sys(NULL, "pclk");
+ BUG_ON(!tegra_pclk);
+}
+
static void set_powergood_time(unsigned int us)
{
static int last_pclk = 0;
- static struct clk *clk = NULL;
unsigned long long ticks;
unsigned long long pclk;
- if (!clk) {
- clk = clk_get_sys(NULL, "pclk");
- BUG_ON(!clk);
- }
-
- pclk = clk_get_rate(clk);
+ pclk = clk_get_rate(tegra_pclk);
if (pclk != last_pclk) {
ticks = (us * pclk) + 999999ull;
do_div(ticks, 1000000);