summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-10-26 01:10:33 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-10-26 01:10:33 -0700
commit2d5194198961493aa481cf6bbfb3976c88a73139 (patch)
tree8ce363eb490f14b06b42fd9e7a32ae270a24d802 /drivers
parent0ff93a3e06c8c66823b5b6bde5164e4625b98aa4 (diff)
parent1267aad12d280db0058d2200cb385bdc041c8181 (diff)
Merge "clk: Check for failure at clk_change_rate"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/clk.c26
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;