{
        struct sprd_gate *sg = hw_to_sprd_gate(hw);
        struct sprd_clk_common *common = &sg->common;
+       struct clk_hw *parent;
        unsigned int reg;
 
+       if (sg->flags & SPRD_GATE_NON_AON) {
+               parent = clk_hw_get_parent(hw);
+               if (!parent || !clk_hw_is_enabled(parent))
+                       return 0;
+       }
+
        regmap_read(common->regmap, common->reg, ®);
 
        if (sg->flags & CLK_GATE_SET_TO_DISABLE)
 
        struct sprd_clk_common  common;
 };
 
+/*
+ * sprd_gate->flags is used for:
+ * CLK_GATE_SET_TO_DISABLE     BIT(0)
+ * CLK_GATE_HIWORD_MASK                BIT(1)
+ * CLK_GATE_BIG_ENDIAN         BIT(2)
+ * so we define new flags from BIT(3)
+ */
+#define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */
+
 #define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,     \
                                    _sc_offset, _enable_mask, _flags,   \
                                    _gate_flags, _udelay, _ops, _fn)    \