msm: clock: Decrease voltage voting overhead for RPM and PCOM clocks
The clk_get_rate() calls that were added to clk_enable(), clk_disable(),
and clk_set_rate() to support voltage scaling result in unnecessary
round-trips to the remote processor for remotely-managed clocks.
Fix this by caching the last set rate in 'struct clk' instead of calling
clk_get() to query it.
Change-Id: I7c303afe3988c3731efb60d1067842cf586baf7e
Signed-off-by: Matt Wagantall <mattw@codeaurora.org>
diff --git a/arch/arm/mach-msm/clock.c b/arch/arm/mach-msm/clock.c
index 4f3ad95..4a3ea81 100644
--- a/arch/arm/mach-msm/clock.c
+++ b/arch/arm/mach-msm/clock.c
@@ -133,7 +133,7 @@
int clk_enable(struct clk *clk)
{
int ret = 0;
- unsigned long flags, rate;
+ unsigned long flags;
struct clk *parent;
if (!clk)
@@ -142,7 +142,6 @@
spin_lock_irqsave(&clk->lock, flags);
if (clk->count == 0) {
parent = clk_get_parent(clk);
- rate = clk_get_rate(clk);
ret = clk_enable(parent);
if (ret)
@@ -151,7 +150,7 @@
if (ret)
goto err_enable_depends;
- ret = vote_rate_vdd(clk, rate);
+ ret = vote_rate_vdd(clk, clk->rate);
if (ret)
goto err_vote_vdd;
if (clk->ops->enable)
@@ -175,7 +174,7 @@
return 0;
err_enable_clock:
- unvote_rate_vdd(clk, rate);
+ unvote_rate_vdd(clk, clk->rate);
err_vote_vdd:
clk_disable(clk->depends);
err_enable_depends:
@@ -198,11 +197,10 @@
goto out;
if (clk->count == 1) {
struct clk *parent = clk_get_parent(clk);
- unsigned long rate = clk_get_rate(clk);
if (clk->ops->disable)
clk->ops->disable(clk);
- unvote_rate_vdd(clk, rate);
+ unvote_rate_vdd(clk, clk->rate);
clk_disable(clk->depends);
clk_disable(parent);
}
@@ -241,7 +239,7 @@
spin_lock_irqsave(&clk->lock, flags);
if (clk->count) {
- start_rate = clk_get_rate(clk);
+ start_rate = clk->rate;
/* Enforce vdd requirements for target frequency. */
rc = vote_rate_vdd(clk, rate);
if (rc)
@@ -254,6 +252,10 @@
} else {
rc = set_fn(clk, rate);
}
+
+ if (!rc)
+ clk->rate = rate;
+
spin_unlock_irqrestore(&clk->lock, flags);
return rc;