Call clock notifiers with the CLK_ABORT_RATE_CHANGE message in two conditions: - in the PREPARE phase when another callback has denied the rate/parent change; or - in the PRE phase if the set_rate() or set_parent() function fails. Signed-off-by: Paul Walmsley <paul@xxxxxxxxx> --- arch/arm/mach-omap2/clock.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 50d8e06..1600119 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -804,6 +804,7 @@ int omap2_clk_set_rate(struct clk *clk, unsigned long rate) if (r == NOTIFY_BAD) { pr_debug("clock: %s: clk_set_rate() aborted by notifier\n", clk->name); + omap_clk_notify_downstream(clk, CLK_ABORT_RATE_CHANGE); return -EAGAIN; } @@ -814,10 +815,16 @@ int omap2_clk_set_rate(struct clk *clk, unsigned long rate) ret = clk->set_rate(clk, rate); - temp_rate = clk->rate; - clk->rate = clk->temp_rate; - omap_clk_notify_downstream(clk, CLK_POST_RATE_CHANGE); - clk->rate = temp_rate; + if (ret == 0) { + temp_rate = clk->rate; + clk->rate = clk->temp_rate; + omap_clk_notify_downstream(clk, CLK_POST_RATE_CHANGE); + clk->rate = temp_rate; + } else { + pr_debug("clock: %s: clk_set_rate() aborted by failed " + "set_rate(): %d\n", clk->name, ret); + omap_clk_notify_downstream(clk, CLK_ABORT_RATE_CHANGE); + } return ret; } @@ -883,6 +890,7 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent) if (r == NOTIFY_BAD) { pr_debug("clock: %s: clk_set_parent() aborted by notifier\n", clk->name); + omap_clk_notify_downstream(clk, CLK_ABORT_RATE_CHANGE); return -EAGAIN; } -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html