summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2012-09-04 20:16:02 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:33:44 -0700
commit7bf1c61d3659dca5361f768e01bac03c69cc01fe (patch)
tree4ee8aea3f650f27e66711fb928fdbd50df1e6c97
parentc839d7471f1fac08db4630b3d6a750389fcf9f94 (diff)
ARM: tegra11: clock: Register clock suspend/resume
Registered clock suspend/resume as syscore operations. Change-Id: Icb2cf9365cf469f8a3ea29052a8a18d5545397b5 Signed-off-by: Alex Frid <afrid@nvidia.com> Reviewed-on: http://git-master/r/130857 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: Rb0e78fa7fc2af9b31efa5e0f05d1383775325262
-rw-r--r--arch/arm/mach-tegra/tegra11_clocks.c110
1 files changed, 61 insertions, 49 deletions
diff --git a/arch/arm/mach-tegra/tegra11_clocks.c b/arch/arm/mach-tegra/tegra11_clocks.c
index 10a463aafe3b..b15c0a89948e 100644
--- a/arch/arm/mach-tegra/tegra11_clocks.c
+++ b/arch/arm/mach-tegra/tegra11_clocks.c
@@ -27,6 +27,7 @@
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/cpufreq.h>
+#include <linux/syscore_ops.h>
#include <asm/clkdev.h>
@@ -6507,53 +6508,6 @@ void __init tegra11x_clk_init_la(void)
}
}
-void __init tegra11x_init_clocks(void)
-{
- int i;
- struct clk *c;
-
- for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
- tegra11_init_one_clock(tegra_ptr_clks[i]);
-
- for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
- tegra11_init_one_clock(&tegra_list_clks[i]);
-
- for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
- c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
- if (!c) {
- pr_err("%s: Unknown duplicate clock %s\n", __func__,
- tegra_clk_duplicates[i].name);
- continue;
- }
-
- tegra_clk_duplicates[i].lookup.clk = c;
- clkdev_add(&tegra_clk_duplicates[i].lookup);
- }
-
- for (i = 0; i < ARRAY_SIZE(tegra_sync_source_list); i++)
- tegra11_init_one_clock(&tegra_sync_source_list[i]);
- for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_list); i++)
- tegra11_init_one_clock(&tegra_clk_audio_list[i]);
- for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_2x_list); i++)
- tegra11_init_one_clock(&tegra_clk_audio_2x_list[i]);
-
- init_clk_out_mux();
- for (i = 0; i < ARRAY_SIZE(tegra_clk_out_list); i++)
- tegra11_init_one_clock(&tegra_clk_out_list[i]);
-
- for (i = 0; i < ARRAY_SIZE(tegra_xusb_source_clks); i++)
- tegra11_init_one_clock(&tegra_xusb_source_clks[i]);
-
- for (i = 0; i < ARRAY_SIZE(tegra_xusb_coupled_clks); i++)
- tegra11_init_one_clock(&tegra_xusb_coupled_clks[i]);
-
- /* Initialize to default */
- tegra_init_cpu_edp_limits(0);
-
- /* To be ready for DFLL late init */
- tegra_dfll_cpu.ops->init = tegra11_dfll_cpu_late_init;
-}
-
#ifdef CONFIG_CPU_FREQ
/*
@@ -6721,7 +6675,7 @@ int tegra_update_mselect_rate(unsigned long cpu_rate)
static u32 clk_rst_suspend[RST_DEVICES_NUM + CLK_OUT_ENB_NUM +
PERIPH_CLK_SOURCE_NUM + 25];
-void tegra_clk_suspend(void)
+static int tegra11_clk_suspend(void)
{
unsigned long off;
u32 *ctx = clk_rst_suspend;
@@ -6788,9 +6742,11 @@ void tegra_clk_suspend(void)
*ctx++ = clk_readl(SPARE_REG);
*ctx++ = clk_readl(MISC_CLK_ENB);
*ctx++ = clk_readl(CLK_MASK_ARM);
+
+ return 0;
}
-void tegra_clk_resume(void)
+static void tegra11_clk_resume(void)
{
unsigned long off;
const u32 *ctx = clk_rst_suspend;
@@ -6964,4 +6920,60 @@ void tegra_clk_resume(void)
tegra11_pll_clk_init(&tegra_pll_u); /* Re-init utmi parameters */
tegra11_pllp_clk_resume(&tegra_pll_p); /* Fire a bug if not restored */
}
+
+static struct syscore_ops tegra_clk_syscore_ops = {
+ .suspend = tegra11_clk_suspend,
+ .resume = tegra11_clk_resume,
+};
#endif
+
+void __init tegra11x_init_clocks(void)
+{
+ int i;
+ struct clk *c;
+
+ for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
+ tegra11_init_one_clock(tegra_ptr_clks[i]);
+
+ for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
+ tegra11_init_one_clock(&tegra_list_clks[i]);
+
+ for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
+ c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
+ if (!c) {
+ pr_err("%s: Unknown duplicate clock %s\n", __func__,
+ tegra_clk_duplicates[i].name);
+ continue;
+ }
+
+ tegra_clk_duplicates[i].lookup.clk = c;
+ clkdev_add(&tegra_clk_duplicates[i].lookup);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(tegra_sync_source_list); i++)
+ tegra11_init_one_clock(&tegra_sync_source_list[i]);
+ for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_list); i++)
+ tegra11_init_one_clock(&tegra_clk_audio_list[i]);
+ for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_2x_list); i++)
+ tegra11_init_one_clock(&tegra_clk_audio_2x_list[i]);
+
+ init_clk_out_mux();
+ for (i = 0; i < ARRAY_SIZE(tegra_clk_out_list); i++)
+ tegra11_init_one_clock(&tegra_clk_out_list[i]);
+
+ for (i = 0; i < ARRAY_SIZE(tegra_xusb_source_clks); i++)
+ tegra11_init_one_clock(&tegra_xusb_source_clks[i]);
+
+ for (i = 0; i < ARRAY_SIZE(tegra_xusb_coupled_clks); i++)
+ tegra11_init_one_clock(&tegra_xusb_coupled_clks[i]);
+
+ /* Initialize to default */
+ tegra_init_cpu_edp_limits(0);
+
+ /* To be ready for DFLL late init */
+ tegra_dfll_cpu.ops->init = tegra11_dfll_cpu_late_init;
+
+#ifdef CONFIG_PM_SLEEP
+ register_syscore_ops(&tegra_clk_syscore_ops);
+#endif
+}