clk: sprd: check its parent status before reading gate clock
Some clocks only can be accessed if their parent is enabled. mipi_csi_xx clocks on SC9863A are an examples. We have to ensure the parent clock is enabled when reading those clocks. Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com> Link: https://lkml.kernel.org/r/20200527053638.31439-2-zhang.lyra@gmail.com Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
c2f30986d4
commit
8b4f6b8d59
|
@ -94,8 +94,15 @@ static int sprd_gate_is_enabled(struct clk_hw *hw)
|
|||
{
|
||||
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)
|
||||
|
|
|
@ -19,6 +19,15 @@ struct sprd_gate {
|
|||
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) \
|
||||
|
|
Loading…
Reference in New Issue