Commit 89ed7e6e authored by Karol Wrona's avatar Karol Wrona Committed by Mike Turquette

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: default avatarKarol Wrona <k.wrona@samsung.com>
Signed-off-by: default avatarMike Turquette <mturquette@linaro.org>
parent 4da66b63
...@@ -46,7 +46,6 @@ struct s2mps11_clk { ...@@ -46,7 +46,6 @@ struct s2mps11_clk {
struct clk *clk; struct clk *clk;
struct clk_lookup *lookup; struct clk_lookup *lookup;
u32 mask; u32 mask;
bool enabled;
unsigned int reg; unsigned int reg;
}; };
...@@ -63,8 +62,6 @@ static int s2mps11_clk_prepare(struct clk_hw *hw) ...@@ -63,8 +62,6 @@ static int s2mps11_clk_prepare(struct clk_hw *hw)
ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, ret = regmap_update_bits(s2mps11->iodev->regmap_pmic,
s2mps11->reg, s2mps11->reg,
s2mps11->mask, s2mps11->mask); s2mps11->mask, s2mps11->mask);
if (!ret)
s2mps11->enabled = true;
return ret; return ret;
} }
...@@ -76,32 +73,32 @@ static void s2mps11_clk_unprepare(struct clk_hw *hw) ...@@ -76,32 +73,32 @@ static void s2mps11_clk_unprepare(struct clk_hw *hw)
ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, s2mps11->reg, ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, s2mps11->reg,
s2mps11->mask, ~s2mps11->mask); s2mps11->mask, ~s2mps11->mask);
if (!ret)
s2mps11->enabled = false;
} }
static int s2mps11_clk_is_enabled(struct clk_hw *hw) static int s2mps11_clk_is_prepared(struct clk_hw *hw)
{ {
int ret;
u32 val;
struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw);
return s2mps11->enabled; ret = regmap_read(s2mps11->iodev->regmap_pmic,
s2mps11->reg, &val);
if (ret < 0)
return -EINVAL;
return val & s2mps11->mask;
} }
static unsigned long s2mps11_clk_recalc_rate(struct clk_hw *hw, static unsigned long s2mps11_clk_recalc_rate(struct clk_hw *hw,
unsigned long parent_rate) unsigned long parent_rate)
{ {
struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); return 32768;
if (s2mps11->enabled)
return 32768;
else
return 0;
} }
static struct clk_ops s2mps11_clk_ops = { static struct clk_ops s2mps11_clk_ops = {
.prepare = s2mps11_clk_prepare, .prepare = s2mps11_clk_prepare,
.unprepare = s2mps11_clk_unprepare, .unprepare = s2mps11_clk_unprepare,
.is_enabled = s2mps11_clk_is_enabled, .is_prepared = s2mps11_clk_is_prepared,
.recalc_rate = s2mps11_clk_recalc_rate, .recalc_rate = s2mps11_clk_recalc_rate,
}; };
...@@ -169,7 +166,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev) ...@@ -169,7 +166,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev)
unsigned int s2mps11_reg; unsigned int s2mps11_reg;
struct clk_init_data *clks_init; struct clk_init_data *clks_init;
int i, ret = 0; int i, ret = 0;
u32 val;
s2mps11_clks = devm_kzalloc(&pdev->dev, sizeof(*s2mps11_clk) * s2mps11_clks = devm_kzalloc(&pdev->dev, sizeof(*s2mps11_clk) *
S2MPS11_CLKS_NUM, GFP_KERNEL); S2MPS11_CLKS_NUM, GFP_KERNEL);
...@@ -214,13 +210,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev) ...@@ -214,13 +210,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev)
s2mps11_clk->mask = 1 << i; s2mps11_clk->mask = 1 << i;
s2mps11_clk->reg = s2mps11_reg; s2mps11_clk->reg = s2mps11_reg;
ret = regmap_read(s2mps11_clk->iodev->regmap_pmic,
s2mps11_clk->reg, &val);
if (ret < 0)
goto err_reg;
s2mps11_clk->enabled = val & s2mps11_clk->mask;
s2mps11_clk->clk = devm_clk_register(&pdev->dev, s2mps11_clk->clk = devm_clk_register(&pdev->dev,
&s2mps11_clk->hw); &s2mps11_clk->hw);
if (IS_ERR(s2mps11_clk->clk)) { if (IS_ERR(s2mps11_clk->clk)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment