aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorIan Chang <ianc@nvidia.com>2015-01-28 13:14:07 +0800
committerAaron Kling <webgeek1234@gmail.com>2015-03-30 12:46:08 -0500
commitbf642fad4b823811ae2882cc77449f5978fc62f0 (patch)
tree2850f623d9b2f517df09ee2d0fc8188ae4af00b1 /arch
parent2728ffa985b6443cd282587a21f389c653001585 (diff)
clock: tegra12: Lock PLLDP/D2 before SSC is enabledHEADlp5.1
Modified PLLDP/D2 enable sequence, so that in case when SSC is set by default PLL configuration, PLL is locked before SSC is turned ON. Bug 200015629 Cherry-pick from http://git-master/r/#/c/677174/ (The code base is different so can't cherry-pick directly) Change-Id: I0d95a2204043cdd00b43246fb1eebf6342f4bbda Signed-off-by: Ian Chang <ianc@nvidia.com> Reviewed-on: http://git-master/r/678169 (cherry picked from commit 2089a049849c79289c09eddccb99415ebab9ad0e) Reviewed-on: http://git-master/r/707246 Reviewed-by: Dhiren Parmar <dparmar@nvidia.com> Tested-by: Dhiren Parmar <dparmar@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-tegra/tegra12_clocks.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra12_clocks.c b/arch/arm/mach-tegra/tegra12_clocks.c
index c6a2b2d3830..19263841534 100644
--- a/arch/arm/mach-tegra/tegra12_clocks.c
+++ b/arch/arm/mach-tegra/tegra12_clocks.c
@@ -415,6 +415,8 @@
#define PLLSS_CTRL2_DEFAULT_VALUE \
((PLLSS_SDM_SSC_STEP << 16) | (PLLSS_SDM_DIN << 0))
+#define PLLSS_CFG_EN_SSC (0x1 << 30)
+
/* PLLSS configuration */
#define PLLSS_MISC_KCP 0
#define PLLSS_MISC_KVCO 0
@@ -3764,15 +3766,31 @@ static void tegra12_pllss_clk_init(struct clk *c)
static int tegra12_pllss_clk_enable(struct clk *c)
{
u32 val;
+
+ bool ssc_enabled = false;
pr_debug("%s on clock %s\n", __func__, c->name);
pll_do_iddq(c, PLL_BASE, PLLSS_BASE_IDDQ, false);
+ val = clk_readl(c->reg + PLLSS_CFG(c));
+ if (val & PLLSS_CFG_EN_SSC) {
+ val &= ~PLLSS_CFG_EN_SSC;
+ clk_writel(val, c->reg + PLLSS_CFG(c));
+ ssc_enabled = true;
+ }
+
val = clk_readl(c->reg + PLL_BASE);
val |= PLL_BASE_ENABLE;
clk_writel(val, c->reg + PLL_BASE);
tegra12_pll_clk_wait_for_lock(c, c->reg + PLL_BASE, PLLSS_BASE_LOCK);
+
+ if (ssc_enabled) {
+ val = clk_readl(c->reg + PLLSS_CFG(c));
+ val |= PLLSS_CFG_EN_SSC;
+ pll_writel_delay(val, c->reg + PLLSS_CFG(c));
+ }
+
return 0;
}