Commit 1da220e3 authored by Marek Szyprowski's avatar Marek Szyprowski Committed by Sylwester Nawrocki

clk: samsung: Use clk_hw API for calling clk framework from clk notifiers

clk_notifier_register() documentation states, that the provided notifier
callbacks associated with the notifier must not re-enter into the clk
framework by calling any top-level clk APIs. Fix this by replacing
clk_get_rate() calls with clk_hw_get_rate(), which is safe in this
context.
Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: default avatarSylwester Nawrocki <snawrocki@kernel.org>
parent b3322802
...@@ -152,7 +152,7 @@ static int exynos_cpuclk_pre_rate_change(struct clk_notifier_data *ndata, ...@@ -152,7 +152,7 @@ static int exynos_cpuclk_pre_rate_change(struct clk_notifier_data *ndata,
struct exynos_cpuclk *cpuclk, void __iomem *base) struct exynos_cpuclk *cpuclk, void __iomem *base)
{ {
const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg; const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg;
unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent); unsigned long alt_prate = clk_hw_get_rate(cpuclk->alt_parent);
unsigned long alt_div = 0, alt_div_mask = DIV_MASK; unsigned long alt_div = 0, alt_div_mask = DIV_MASK;
unsigned long div0, div1 = 0, mux_reg; unsigned long div0, div1 = 0, mux_reg;
unsigned long flags; unsigned long flags;
...@@ -280,7 +280,7 @@ static int exynos5433_cpuclk_pre_rate_change(struct clk_notifier_data *ndata, ...@@ -280,7 +280,7 @@ static int exynos5433_cpuclk_pre_rate_change(struct clk_notifier_data *ndata,
struct exynos_cpuclk *cpuclk, void __iomem *base) struct exynos_cpuclk *cpuclk, void __iomem *base)
{ {
const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg; const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg;
unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent); unsigned long alt_prate = clk_hw_get_rate(cpuclk->alt_parent);
unsigned long alt_div = 0, alt_div_mask = DIV_MASK; unsigned long alt_div = 0, alt_div_mask = DIV_MASK;
unsigned long div0, div1 = 0, mux_reg; unsigned long div0, div1 = 0, mux_reg;
unsigned long flags; unsigned long flags;
...@@ -432,7 +432,7 @@ int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx, ...@@ -432,7 +432,7 @@ int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
else else
cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb; cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb;
cpuclk->alt_parent = __clk_lookup(alt_parent); cpuclk->alt_parent = __clk_get_hw(__clk_lookup(alt_parent));
if (!cpuclk->alt_parent) { if (!cpuclk->alt_parent) {
pr_err("%s: could not lookup alternate parent %s\n", pr_err("%s: could not lookup alternate parent %s\n",
__func__, alt_parent); __func__, alt_parent);
......
...@@ -49,7 +49,7 @@ struct exynos_cpuclk_cfg_data { ...@@ -49,7 +49,7 @@ struct exynos_cpuclk_cfg_data {
*/ */
struct exynos_cpuclk { struct exynos_cpuclk {
struct clk_hw hw; struct clk_hw hw;
struct clk *alt_parent; struct clk_hw *alt_parent;
void __iomem *ctrl_base; void __iomem *ctrl_base;
spinlock_t *lock; spinlock_t *lock;
const struct exynos_cpuclk_cfg_data *cfg; const struct exynos_cpuclk_cfg_data *cfg;
......
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