diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-tegra/tegra3_clocks.c | 12 |
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(¶meters_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 |