diff options
| -rw-r--r-- | arch/arm/mach-imx/clk-gate2.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c index 4ba587da89d2..84acdfd1d715 100644 --- a/arch/arm/mach-imx/clk-gate2.c +++ b/arch/arm/mach-imx/clk-gate2.c | |||
| @@ -67,8 +67,12 @@ static void clk_gate2_disable(struct clk_hw *hw) | |||
| 67 | 67 | ||
| 68 | spin_lock_irqsave(gate->lock, flags); | 68 | spin_lock_irqsave(gate->lock, flags); |
| 69 | 69 | ||
| 70 | if (gate->share_count && --(*gate->share_count) > 0) | 70 | if (gate->share_count) { |
| 71 | goto out; | 71 | if (WARN_ON(*gate->share_count == 0)) |
| 72 | goto out; | ||
| 73 | else if (--(*gate->share_count) > 0) | ||
| 74 | goto out; | ||
| 75 | } | ||
| 72 | 76 | ||
| 73 | reg = readl(gate->reg); | 77 | reg = readl(gate->reg); |
| 74 | reg &= ~(3 << gate->bit_idx); | 78 | reg &= ~(3 << gate->bit_idx); |
| @@ -78,19 +82,26 @@ out: | |||
| 78 | spin_unlock_irqrestore(gate->lock, flags); | 82 | spin_unlock_irqrestore(gate->lock, flags); |
| 79 | } | 83 | } |
| 80 | 84 | ||
| 81 | static int clk_gate2_is_enabled(struct clk_hw *hw) | 85 | static int clk_gate2_reg_is_enabled(void __iomem *reg, u8 bit_idx) |
| 82 | { | 86 | { |
| 83 | u32 reg; | 87 | u32 val = readl(reg); |
| 84 | struct clk_gate2 *gate = to_clk_gate2(hw); | ||
| 85 | 88 | ||
| 86 | reg = readl(gate->reg); | 89 | if (((val >> bit_idx) & 1) == 1) |
| 87 | |||
| 88 | if (((reg >> gate->bit_idx) & 1) == 1) | ||
| 89 | return 1; | 90 | return 1; |
| 90 | 91 | ||
| 91 | return 0; | 92 | return 0; |
| 92 | } | 93 | } |
| 93 | 94 | ||
| 95 | static int clk_gate2_is_enabled(struct clk_hw *hw) | ||
| 96 | { | ||
| 97 | struct clk_gate2 *gate = to_clk_gate2(hw); | ||
| 98 | |||
| 99 | if (gate->share_count) | ||
| 100 | return !!(*gate->share_count); | ||
| 101 | else | ||
| 102 | return clk_gate2_reg_is_enabled(gate->reg, gate->bit_idx); | ||
| 103 | } | ||
| 104 | |||
| 94 | static struct clk_ops clk_gate2_ops = { | 105 | static struct clk_ops clk_gate2_ops = { |
| 95 | .enable = clk_gate2_enable, | 106 | .enable = clk_gate2_enable, |
| 96 | .disable = clk_gate2_disable, | 107 | .disable = clk_gate2_disable, |
| @@ -116,6 +127,10 @@ struct clk *clk_register_gate2(struct device *dev, const char *name, | |||
| 116 | gate->bit_idx = bit_idx; | 127 | gate->bit_idx = bit_idx; |
| 117 | gate->flags = clk_gate2_flags; | 128 | gate->flags = clk_gate2_flags; |
| 118 | gate->lock = lock; | 129 | gate->lock = lock; |
| 130 | |||
| 131 | /* Initialize share_count per hardware state */ | ||
| 132 | if (share_count) | ||
| 133 | *share_count = clk_gate2_reg_is_enabled(reg, bit_idx) ? 1 : 0; | ||
| 119 | gate->share_count = share_count; | 134 | gate->share_count = share_count; |
| 120 | 135 | ||
| 121 | init.name = name; | 136 | init.name = name; |
