Skip to content

Commit

Permalink
clk: lpc18xx-ccu: fix potential system hang when disabling unused clocks
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
manabian authored and bebarino committed Oct 26, 2015
1 parent be68bf8 commit 2a9a06f
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions drivers/clk/nxp/clk-lpc18xx-ccu.c
Expand Up @@ -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;

/*
* 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_readl(gate->reg) & LPC18XX_CCU_RUN;
return clk_gate_ops.is_enabled(hw);
}

static const struct clk_ops lpc18xx_ccu_gate_ops = {
Expand Down

0 comments on commit 2a9a06f

Please sign in to comment.