diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-10-26 01:10:33 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-10-26 01:10:33 -0700 |
commit | 2d5194198961493aa481cf6bbfb3976c88a73139 (patch) | |
tree | 8ce363eb490f14b06b42fd9e7a32ae270a24d802 /drivers | |
parent | 0ff93a3e06c8c66823b5b6bde5164e4625b98aa4 (diff) | |
parent | 1267aad12d280db0058d2200cb385bdc041c8181 (diff) |
Merge "clk: Check for failure at clk_change_rate"
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clk/clk.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 1c625764133d..97a604755053 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1449,7 +1449,7 @@ static struct clk_core *clk_propagate_rate_change(struct clk_core *core, * walk down a subtree and set the new rates notifying the rate * change on the way */ -static void clk_change_rate(struct clk_core *core) +static int clk_change_rate(struct clk_core *core) { struct clk_core *child; struct hlist_node *tmp; @@ -1457,6 +1457,7 @@ static void clk_change_rate(struct clk_core *core) unsigned long best_parent_rate = 0; bool skip_set_rate = false; struct clk_core *old_parent; + int rc = 0; old_rate = core->rate; @@ -1484,8 +1485,12 @@ static void clk_change_rate(struct clk_core *core) trace_clk_set_rate(core, core->new_rate); - if (!skip_set_rate && core->ops->set_rate) - core->ops->set_rate(core->hw, core->new_rate, best_parent_rate); + if (!skip_set_rate && core->ops->set_rate) { + rc = core->ops->set_rate(core->hw, core->new_rate, + best_parent_rate); + if (rc) + goto out; + } trace_clk_set_rate_complete(core, core->new_rate); @@ -1511,6 +1516,13 @@ static void clk_change_rate(struct clk_core *core) /* handle the new child who might not be in core->children yet */ if (core->new_child) clk_change_rate(core->new_child); + + return rc; + +out: + trace_clk_set_rate_complete(core, core->new_rate); + + return rc; } static int clk_core_set_rate_nolock(struct clk_core *core, @@ -1545,7 +1557,13 @@ static int clk_core_set_rate_nolock(struct clk_core *core, } /* change the rates */ - clk_change_rate(top); + ret = clk_change_rate(top); + if (ret) { + pr_err("%s: failed to set %s rate\n", __func__, + top->name); + clk_propagate_rate_change(top, ABORT_RATE_CHANGE); + return ret; + } core->req_rate = req_rate; |