]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00318063-13: ARM: imx: do not reparent during clk_set_rate
authorShawn Guo <shawn.guo@freescale.com>
Fri, 27 Jun 2014 04:39:54 +0000 (12:39 +0800)
committerNitin Garg <nitin.garg@freescale.com>
Fri, 16 Jan 2015 03:17:34 +0000 (21:17 -0600)
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 <shawn.guo@freescale.com>
arch/arm/mach-imx/clk-busy.c
arch/arm/mach-imx/clk-fixup-mux.c
arch/arm/mach-imx/clk.h

index 4bb1bc419b798e5323652d36c0cf1413e45ccf31..f082d704de9149e790807b624f9a0cf75598bd66 100644 (file)
@@ -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;
 
index 0d40b35c557cba39980ad2644e6d4a97902f9555..caafa869f6f4e25464570e42e1ba977fe8b87051 100644 (file)
@@ -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;
index ac0b6f0404bc77a99b80dcbcacc2e44d7c666481..c21f7277d8b159194369a7fd05a454268429aa33 100644 (file)
@@ -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);
 }