diff options
author | Karol Wrona <k.wrona@samsung.com> | 2014-07-01 13:13:59 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-07-02 12:44:47 -0400 |
commit | 89ed7e6e68c176e77c7e2677551c91d4185fe0b4 (patch) | |
tree | 992eb3a4f77b6b03b594b0d45bba136a182efc40 /drivers/clk/clk-s2mps11.c | |
parent | 4da66b631f6bee2dfdb77b571418f11016a7ba68 (diff) |
clk: s2mps11: Fix clk_ops
s2mps11 clocks had registered callbacks for prepare ,unprepare and is_enabled.
During disabling unused clocks the lack of is_prepared caused that unused
s2mps11 clocks were not unprepared and stayed active.
Regmap_read is cached so it can be called in is_prepare callback
to achieve this information. Enabled field was removed from struct s2mps11_clk.
Signed-off-by: Karol Wrona <k.wrona@samsung.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
Diffstat (limited to 'drivers/clk/clk-s2mps11.c')
-rw-r--r-- | drivers/clk/clk-s2mps11.c | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index 9b7b5859a420..13878da1e2e4 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c | |||
@@ -46,7 +46,6 @@ struct s2mps11_clk { | |||
46 | struct clk *clk; | 46 | struct clk *clk; |
47 | struct clk_lookup *lookup; | 47 | struct clk_lookup *lookup; |
48 | u32 mask; | 48 | u32 mask; |
49 | bool enabled; | ||
50 | unsigned int reg; | 49 | unsigned int reg; |
51 | }; | 50 | }; |
52 | 51 | ||
@@ -63,8 +62,6 @@ static int s2mps11_clk_prepare(struct clk_hw *hw) | |||
63 | ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, | 62 | ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, |
64 | s2mps11->reg, | 63 | s2mps11->reg, |
65 | s2mps11->mask, s2mps11->mask); | 64 | s2mps11->mask, s2mps11->mask); |
66 | if (!ret) | ||
67 | s2mps11->enabled = true; | ||
68 | 65 | ||
69 | return ret; | 66 | return ret; |
70 | } | 67 | } |
@@ -76,32 +73,32 @@ static void s2mps11_clk_unprepare(struct clk_hw *hw) | |||
76 | 73 | ||
77 | ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, s2mps11->reg, | 74 | ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, s2mps11->reg, |
78 | s2mps11->mask, ~s2mps11->mask); | 75 | s2mps11->mask, ~s2mps11->mask); |
79 | |||
80 | if (!ret) | ||
81 | s2mps11->enabled = false; | ||
82 | } | 76 | } |
83 | 77 | ||
84 | static int s2mps11_clk_is_enabled(struct clk_hw *hw) | 78 | static int s2mps11_clk_is_prepared(struct clk_hw *hw) |
85 | { | 79 | { |
80 | int ret; | ||
81 | u32 val; | ||
86 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); | 82 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); |
87 | 83 | ||
88 | return s2mps11->enabled; | 84 | ret = regmap_read(s2mps11->iodev->regmap_pmic, |
85 | s2mps11->reg, &val); | ||
86 | if (ret < 0) | ||
87 | return -EINVAL; | ||
88 | |||
89 | return val & s2mps11->mask; | ||
89 | } | 90 | } |
90 | 91 | ||
91 | static unsigned long s2mps11_clk_recalc_rate(struct clk_hw *hw, | 92 | static unsigned long s2mps11_clk_recalc_rate(struct clk_hw *hw, |
92 | unsigned long parent_rate) | 93 | unsigned long parent_rate) |
93 | { | 94 | { |
94 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); | 95 | return 32768; |
95 | if (s2mps11->enabled) | ||
96 | return 32768; | ||
97 | else | ||
98 | return 0; | ||
99 | } | 96 | } |
100 | 97 | ||
101 | static struct clk_ops s2mps11_clk_ops = { | 98 | static struct clk_ops s2mps11_clk_ops = { |
102 | .prepare = s2mps11_clk_prepare, | 99 | .prepare = s2mps11_clk_prepare, |
103 | .unprepare = s2mps11_clk_unprepare, | 100 | .unprepare = s2mps11_clk_unprepare, |
104 | .is_enabled = s2mps11_clk_is_enabled, | 101 | .is_prepared = s2mps11_clk_is_prepared, |
105 | .recalc_rate = s2mps11_clk_recalc_rate, | 102 | .recalc_rate = s2mps11_clk_recalc_rate, |
106 | }; | 103 | }; |
107 | 104 | ||
@@ -169,7 +166,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev) | |||
169 | unsigned int s2mps11_reg; | 166 | unsigned int s2mps11_reg; |
170 | struct clk_init_data *clks_init; | 167 | struct clk_init_data *clks_init; |
171 | int i, ret = 0; | 168 | int i, ret = 0; |
172 | u32 val; | ||
173 | 169 | ||
174 | s2mps11_clks = devm_kzalloc(&pdev->dev, sizeof(*s2mps11_clk) * | 170 | s2mps11_clks = devm_kzalloc(&pdev->dev, sizeof(*s2mps11_clk) * |
175 | S2MPS11_CLKS_NUM, GFP_KERNEL); | 171 | S2MPS11_CLKS_NUM, GFP_KERNEL); |
@@ -214,13 +210,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev) | |||
214 | s2mps11_clk->mask = 1 << i; | 210 | s2mps11_clk->mask = 1 << i; |
215 | s2mps11_clk->reg = s2mps11_reg; | 211 | s2mps11_clk->reg = s2mps11_reg; |
216 | 212 | ||
217 | ret = regmap_read(s2mps11_clk->iodev->regmap_pmic, | ||
218 | s2mps11_clk->reg, &val); | ||
219 | if (ret < 0) | ||
220 | goto err_reg; | ||
221 | |||
222 | s2mps11_clk->enabled = val & s2mps11_clk->mask; | ||
223 | |||
224 | s2mps11_clk->clk = devm_clk_register(&pdev->dev, | 213 | s2mps11_clk->clk = devm_clk_register(&pdev->dev, |
225 | &s2mps11_clk->hw); | 214 | &s2mps11_clk->hw); |
226 | if (IS_ERR(s2mps11_clk->clk)) { | 215 | if (IS_ERR(s2mps11_clk->clk)) { |