From cde3cb071c9b45f1c46b855041a8f81e28c8654e Mon Sep 17 00:00:00 2001 From: Shawn Guo Date: Fri, 27 Jun 2014 12:39:54 +0800 Subject: [PATCH] ENGR00318063-13: ARM: imx: do not reparent during clk_set_rate Without flag CLK_SET_RATE_NO_REPARENT, during clk_set_rate call, clock framework will spontaneously switch parent if there is another parent clock which can provide a better rate. Such implicit clock reparent sometimes results in unexpected clock tree topology change. Also, with flag CLK_SET_PARENT_GATE in place, the clk_set_rate() can fail due to this spontaneous clock switch. So let's stop clock framework from doing this spontaneous reparent by adding flag CLK_SET_RATE_NO_REPARENT for mux clocks. While at it, adds the missing CLK_SET_PARENT_GATE flag for the fixup mux clock also. shawn.guo: cherry-pick commit f99c1687c820 from imx_3.10.y Signed-off-by: Shawn Guo --- arch/arm/mach-imx/clk-busy.c | 2 +- arch/arm/mach-imx/clk-fixup-mux.c | 1 + arch/arm/mach-imx/clk.h | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-imx/clk-busy.c b/arch/arm/mach-imx/clk-busy.c index 4bb1bc419b79..f082d704de91 100644 --- a/arch/arm/mach-imx/clk-busy.c +++ b/arch/arm/mach-imx/clk-busy.c @@ -175,7 +175,7 @@ struct clk *imx_clk_busy_mux(const char *name, void __iomem *reg, u8 shift, init.name = name; init.ops = &clk_busy_mux_ops; - init.flags = 0; + init.flags = CLK_SET_RATE_NO_REPARENT; init.parent_names = parent_names; init.num_parents = num_parents; diff --git a/arch/arm/mach-imx/clk-fixup-mux.c b/arch/arm/mach-imx/clk-fixup-mux.c index 0d40b35c557c..caafa869f6f4 100644 --- a/arch/arm/mach-imx/clk-fixup-mux.c +++ b/arch/arm/mach-imx/clk-fixup-mux.c @@ -88,6 +88,7 @@ struct clk *imx_clk_fixup_mux(const char *name, void __iomem *reg, init.name = name; init.ops = &clk_fixup_mux_ops; + init.flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_PARENT_GATE; init.parent_names = parents; init.num_parents = num_parents; init.flags = 0; diff --git a/arch/arm/mach-imx/clk.h b/arch/arm/mach-imx/clk.h index ac0b6f0404bc..c21f7277d8b1 100644 --- a/arch/arm/mach-imx/clk.h +++ b/arch/arm/mach-imx/clk.h @@ -141,8 +141,8 @@ static inline struct clk *imx_clk_mux_flags(const char *name, int num_parents, unsigned long flags) { return clk_register_mux(NULL, name, parents, num_parents, - flags | CLK_SET_PARENT_GATE, reg, shift, width, 0, - &imx_ccm_lock); + flags | CLK_SET_RATE_NO_REPARENT | CLK_SET_PARENT_GATE, + reg, shift, width, 0, &imx_ccm_lock); } static inline struct clk *imx_clk_mux_glitchless(const char *name, @@ -150,7 +150,7 @@ static inline struct clk *imx_clk_mux_glitchless(const char *name, int num_parents) { return clk_register_mux(NULL, name, parents, num_parents, - 0, reg, shift, + CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0, &imx_ccm_lock); } -- 2.39.2