clk: lpc18xx-ccu: fix potential system hang when disabling unused clocks
CCU branch clock register must only be accessed while the base (parent) clock is running. Access with a disabled base clock will cause the system to hang. Fix this issue by adding code that check if the parent clock is running in the is_enabled clk_ops callback. This hang would occur when disabling unused clocks after AMBA runtime pm had already disabled some of the clocks. Signed-off-by: Joachim Eastwood <manabian@gmail.com> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
This commit is contained in:
parent
be68bf8831
commit
2a9a06f98f
|
@ -179,9 +179,22 @@ static void lpc18xx_ccu_gate_disable(struct clk_hw *hw)
|
|||
|
||||
static int lpc18xx_ccu_gate_is_enabled(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_gate *gate = to_clk_gate(hw);
|
||||
const struct clk_hw *parent;
|
||||
|
||||
return clk_readl(gate->reg) & LPC18XX_CCU_RUN;
|
||||
/*
|
||||
* The branch clock registers are only accessible
|
||||
* if the base (parent) clock is enabled. Register
|
||||
* access with a disabled base clock will hang the
|
||||
* system.
|
||||
*/
|
||||
parent = clk_hw_get_parent(hw);
|
||||
if (!parent)
|
||||
return 0;
|
||||
|
||||
if (!clk_hw_is_enabled(parent))
|
||||
return 0;
|
||||
|
||||
return clk_gate_ops.is_enabled(hw);
|
||||
}
|
||||
|
||||
static const struct clk_ops lpc18xx_ccu_gate_ops = {
|
||||
|
|
Loading…
Reference in New Issue
Block a user