clk: imx8m: check mcore_booted before register clk
authorPeng Fan <peng.fan@nxp.com>
Mon, 28 Feb 2022 12:41:12 +0000 (20:41 +0800)
committerAbel Vesa <abel.vesa@nxp.com>
Tue, 12 Apr 2022 10:47:03 +0000 (13:47 +0300)
If mcore_booted is true, ignore the clk root gate registration and
this will simplify AMP clock management and avoid system hang unexpectly
especially Linux shutdown clk used by mcore.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Reviewed-by: Abel Vesa <abel.vesa@nxp.com>
Link: https://lore.kernel.org/r/20220228124112.3974242-2-peng.fan@oss.nxp.com
[abelvesa@kernel.org: Removed if-case for when mcore_booted is true]
Signed-off-by: Abel Vesa <abel.vesa@nxp.com>
drivers/clk/imx/clk-composite-8m.c

index 2dfd614..cbf0d79 100644 (file)
@@ -178,7 +178,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
                                        unsigned long flags)
 {
        struct clk_hw *hw = ERR_PTR(-ENOMEM), *mux_hw;
-       struct clk_hw *div_hw, *gate_hw;
+       struct clk_hw *div_hw, *gate_hw = NULL;
        struct clk_divider *div = NULL;
        struct clk_gate *gate = NULL;
        struct clk_mux *mux = NULL;
@@ -223,14 +223,17 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
        div->lock = &imx_ccm_lock;
        div->flags = CLK_DIVIDER_ROUND_CLOSEST;
 
-       gate = kzalloc(sizeof(*gate), GFP_KERNEL);
-       if (!gate)
-               goto fail;
+       /* skip registering the gate ops if M4 is enabled */
+       if (!mcore_booted) {
+               gate = kzalloc(sizeof(*gate), GFP_KERNEL);
+               if (!gate)
+                       goto fail;
 
-       gate_hw = &gate->hw;
-       gate->reg = reg;
-       gate->bit_idx = PCG_CGC_SHIFT;
-       gate->lock = &imx_ccm_lock;
+               gate_hw = &gate->hw;
+               gate->reg = reg;
+               gate->bit_idx = PCG_CGC_SHIFT;
+               gate->lock = &imx_ccm_lock;
+       }
 
        hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
                        mux_hw, mux_ops, div_hw,