summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra3_clocks.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2012-02-26 00:23:37 -0800
committerSimone Willett <swillett@nvidia.com>2012-03-20 16:40:21 -0700
commit9323c09c666c0745af1a98fc60a737f72ad3b21e (patch)
treedaa5d88cc3f1b2bfd49f5e4e05c700437e0a6d71 /arch/arm/mach-tegra/tegra3_clocks.c
parentdd3b612801db7d5c6291ac13d66e1d994221746a (diff)
ARM: tegra: clock: Update parameterized cluster switch
Adjusted CPU rate during parametrized (enforced from sysfs) cluster switch, so that target rate meets min/max constraints on both sides of the switch. Updated local timer rate accordingly. Bug 945975 Signed-off-by: Alex Frid <afrid@nvidia.com> (cherry picked from commit c27f5a2e7380cb667f1f6a4ba61daf67c63ef2d4) Change-Id: I130ec1a32ecaf8adfd7eff1ec2042f569b54ac54 Reviewed-on: http://git-master/r/90805 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra3_clocks.c')
-rw-r--r--arch/arm/mach-tegra/tegra3_clocks.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/arm/mach-tegra/tegra3_clocks.c b/arch/arm/mach-tegra/tegra3_clocks.c
index 42ee4e47cbbd..43d8ed9f2db8 100644
--- a/arch/arm/mach-tegra/tegra3_clocks.c
+++ b/arch/arm/mach-tegra/tegra3_clocks.c
@@ -1012,15 +1012,21 @@ static int tegra3_cpu_cmplx_clk_set_parent(struct clk *c, struct clk *p)
spin_unlock(&parameters_lock);
if (flags) {
- /* over-clocking after the switch - allow, but lower rate */
- if (rate > p->max_rate) {
- rate = p->max_rate;
+ /* over/under-clocking after switch - allow, but update rate */
+ if ((rate > p->max_rate) || (rate < p->min_rate)) {
+ unsigned long fl;
+
+ rate = rate > p->max_rate ? p->max_rate : p->min_rate;
ret = clk_set_rate(c->parent, rate);
if (ret) {
pr_err("%s: Failed to set rate %lu for %s\n",
__func__, rate, p->name);
return ret;
}
+ clk_lock_save(c->parent, &fl);
+ clk_set_rate(&tegra3_clk_twd,
+ clk_get_rate_locked(c->parent));
+ clk_unlock_restore(c->parent, &fl);
}
} else
#endif