diff options
| -rw-r--r-- | drivers/clk/msm/clock-generic.c | 20 |
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; } |
