diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-imx/clk-gate2.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c index 5a75cdc81891..8935bff99fe7 100644 --- a/arch/arm/mach-imx/clk-gate2.c +++ b/arch/arm/mach-imx/clk-gate2.c | |||
@@ -96,15 +96,30 @@ static int clk_gate2_is_enabled(struct clk_hw *hw) | |||
96 | { | 96 | { |
97 | struct clk_gate2 *gate = to_clk_gate2(hw); | 97 | struct clk_gate2 *gate = to_clk_gate2(hw); |
98 | 98 | ||
99 | if (gate->share_count) | 99 | return clk_gate2_reg_is_enabled(gate->reg, gate->bit_idx); |
100 | return !!__clk_get_enable_count(hw->clk); | 100 | } |
101 | else | 101 | |
102 | return clk_gate2_reg_is_enabled(gate->reg, gate->bit_idx); | 102 | static void clk_gate2_disable_unused(struct clk_hw *hw) |
103 | { | ||
104 | struct clk_gate2 *gate = to_clk_gate2(hw); | ||
105 | unsigned long flags = 0; | ||
106 | u32 reg; | ||
107 | |||
108 | spin_lock_irqsave(gate->lock, flags); | ||
109 | |||
110 | if (!gate->share_count || *gate->share_count == 0) { | ||
111 | reg = readl(gate->reg); | ||
112 | reg &= ~(3 << gate->bit_idx); | ||
113 | writel(reg, gate->reg); | ||
114 | } | ||
115 | |||
116 | spin_unlock_irqrestore(gate->lock, flags); | ||
103 | } | 117 | } |
104 | 118 | ||
105 | static struct clk_ops clk_gate2_ops = { | 119 | static struct clk_ops clk_gate2_ops = { |
106 | .enable = clk_gate2_enable, | 120 | .enable = clk_gate2_enable, |
107 | .disable = clk_gate2_disable, | 121 | .disable = clk_gate2_disable, |
122 | .disable_unused = clk_gate2_disable_unused, | ||
108 | .is_enabled = clk_gate2_is_enabled, | 123 | .is_enabled = clk_gate2_is_enabled, |
109 | }; | 124 | }; |
110 | 125 | ||