summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/clk/msm/clock-generic.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/clk/msm/clock-generic.c b/drivers/clk/msm/clock-generic.c
index dbe378407885..087beacd55a7 100644
--- a/drivers/clk/msm/clock-generic.c
+++ b/drivers/clk/msm/clock-generic.c
@@ -865,8 +865,6 @@ static enum handoff mux_div_clk_handoff(struct clk *c)
unsigned int numer;
parent_rate = clk_get_rate(c->parent);
- if (!parent_rate)
- return HANDOFF_DISABLED_CLK;
/*
* div values are doubled for half dividers.
* Adjust for that by picking a numer of 2.
@@ -880,10 +878,20 @@ static enum handoff mux_div_clk_handoff(struct clk *c)
return HANDOFF_DISABLED_CLK;
}
- if (!md->ops->is_enabled)
- return HANDOFF_DISABLED_CLK;
- if (md->ops->is_enabled(md))
- return HANDOFF_ENABLED_CLK;
+ if (md->en_mask && md->ops && md->ops->is_enabled)
+ return md->ops->is_enabled(md)
+ ? HANDOFF_ENABLED_CLK
+ : HANDOFF_DISABLED_CLK;
+
+ /*
+ * If this function returns 'enabled' even when the clock downstream
+ * of this clock is disabled, then handoff code will unnecessarily
+ * enable the current parent of this clock. If this function always
+ * returns 'disabled' and a clock downstream is on, the clock handoff
+ * code will bump up the ref count for this clock and its current
+ * parent as necessary. So, clocks without an actual HW gate can
+ * always return disabled.
+ */
return HANDOFF_DISABLED_CLK;
}