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: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Sylwester Nawrocki <snawrocki@kernel.org>
This commit is contained in:
parent
b33228029d
commit
1da220e3a5
|
@ -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,
|
||||||
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,
|
||||||
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 {
|
||||||
*/
|
*/
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue