aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk-s2mps11.c
diff options
context:
space:
mode:
authorKarol Wrona <k.wrona@samsung.com>2014-07-01 13:13:59 -0400
committerMike Turquette <mturquette@linaro.org>2014-07-02 12:44:47 -0400
commit89ed7e6e68c176e77c7e2677551c91d4185fe0b4 (patch)
tree992eb3a4f77b6b03b594b0d45bba136a182efc40 /drivers/clk/clk-s2mps11.c
parent4da66b631f6bee2dfdb77b571418f11016a7ba68 (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.c33
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
84static int s2mps11_clk_is_enabled(struct clk_hw *hw) 78static 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
91static unsigned long s2mps11_clk_recalc_rate(struct clk_hw *hw, 92static 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
101static struct clk_ops s2mps11_clk_ops = { 98static 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)) {