Lines Matching refs:cpuclk

73 			    struct rockchip_cpuclk *cpuclk, unsigned long rate)  in rockchip_get_cpuclk_settings()  argument
76 cpuclk->rate_table; in rockchip_get_cpuclk_settings()
79 for (i = 0; i < cpuclk->rate_count; i++) { in rockchip_get_cpuclk_settings()
90 struct rockchip_cpuclk *cpuclk = to_rockchip_cpuclk_hw(hw); in rockchip_cpuclk_recalc_rate() local
91 const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; in rockchip_cpuclk_recalc_rate()
92 u32 clksel0 = readl_relaxed(cpuclk->reg_base + reg_data->core_reg[0]); in rockchip_cpuclk_recalc_rate()
103 static void rockchip_cpuclk_set_dividers(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_set_dividers() argument
117 writel(clksel->val, cpuclk->reg_base + clksel->reg); in rockchip_cpuclk_set_dividers()
121 static void rockchip_cpuclk_set_pre_muxs(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_set_pre_muxs() argument
135 writel(clksel->val, cpuclk->reg_base + clksel->reg); in rockchip_cpuclk_set_pre_muxs()
139 static void rockchip_cpuclk_set_post_muxs(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_set_post_muxs() argument
153 writel(clksel->val, cpuclk->reg_base + clksel->reg); in rockchip_cpuclk_set_post_muxs()
157 static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_pre_rate_change() argument
160 const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; in rockchip_cpuclk_pre_rate_change()
167 rate = rockchip_get_cpuclk_settings(cpuclk, ndata->new_rate); in rockchip_cpuclk_pre_rate_change()
175 rockchip_boost_enable_recovery_sw_low(cpuclk->pll_hw); in rockchip_cpuclk_pre_rate_change()
177 alt_prate = clk_get_rate(cpuclk->alt_parent); in rockchip_cpuclk_pre_rate_change()
179 spin_lock_irqsave(cpuclk->lock, flags); in rockchip_cpuclk_pre_rate_change()
209 cpuclk->reg_base + reg_data->core_reg[i]); in rockchip_cpuclk_pre_rate_change()
214 rockchip_boost_add_core_div(cpuclk->pll_hw, alt_prate); in rockchip_cpuclk_pre_rate_change()
216 rockchip_cpuclk_set_pre_muxs(cpuclk, rate); in rockchip_cpuclk_pre_rate_change()
223 cpuclk->reg_base + reg_data->mux_core_reg); in rockchip_cpuclk_pre_rate_change()
228 cpuclk->reg_base + reg_data->core_reg[0]); in rockchip_cpuclk_pre_rate_change()
230 spin_unlock_irqrestore(cpuclk->lock, flags); in rockchip_cpuclk_pre_rate_change()
234 static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_post_rate_change() argument
237 const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; in rockchip_cpuclk_post_rate_change()
242 rate = rockchip_get_cpuclk_settings(cpuclk, ndata->new_rate); in rockchip_cpuclk_post_rate_change()
249 spin_lock_irqsave(cpuclk->lock, flags); in rockchip_cpuclk_post_rate_change()
252 rockchip_cpuclk_set_dividers(cpuclk, rate); in rockchip_cpuclk_post_rate_change()
265 cpuclk->reg_base + reg_data->mux_core_reg); in rockchip_cpuclk_post_rate_change()
270 cpuclk->reg_base + reg_data->core_reg[0]); in rockchip_cpuclk_post_rate_change()
272 rockchip_cpuclk_set_post_muxs(cpuclk, rate); in rockchip_cpuclk_post_rate_change()
278 cpuclk->reg_base + reg_data->core_reg[i]); in rockchip_cpuclk_post_rate_change()
282 rockchip_cpuclk_set_dividers(cpuclk, rate); in rockchip_cpuclk_post_rate_change()
285 rockchip_boost_disable_recovery_sw(cpuclk->pll_hw); in rockchip_cpuclk_post_rate_change()
287 spin_unlock_irqrestore(cpuclk->lock, flags); in rockchip_cpuclk_post_rate_change()
301 struct rockchip_cpuclk *cpuclk = to_rockchip_cpuclk_nb(nb); in rockchip_cpuclk_notifier_cb() local
307 ret = rockchip_cpuclk_pre_rate_change(cpuclk, ndata); in rockchip_cpuclk_notifier_cb()
309 ret = rockchip_cpuclk_post_rate_change(cpuclk, ndata); in rockchip_cpuclk_notifier_cb()
321 struct rockchip_cpuclk *cpuclk; in rockchip_clk_register_cpuclk() local
337 cpuclk = kzalloc(sizeof(*cpuclk), GFP_KERNEL); in rockchip_clk_register_cpuclk()
338 if (!cpuclk) in rockchip_clk_register_cpuclk()
355 cpuclk->reg_base = reg_base; in rockchip_clk_register_cpuclk()
356 cpuclk->lock = lock; in rockchip_clk_register_cpuclk()
357 cpuclk->reg_data = reg_data; in rockchip_clk_register_cpuclk()
358 cpuclk->clk_nb.notifier_call = rockchip_cpuclk_notifier_cb; in rockchip_clk_register_cpuclk()
359 cpuclk->hw.init = &init; in rockchip_clk_register_cpuclk()
368 cpuclk->pll_hw = __clk_get_hw(pll_clk); in rockchip_clk_register_cpuclk()
369 rockchip_boost_init(cpuclk->pll_hw); in rockchip_clk_register_cpuclk()
372 cpuclk->alt_parent = alt_parent; in rockchip_clk_register_cpuclk()
373 if (!cpuclk->alt_parent) { in rockchip_clk_register_cpuclk()
380 ret = clk_prepare_enable(cpuclk->alt_parent); in rockchip_clk_register_cpuclk()
396 ret = clk_notifier_register(clk, &cpuclk->clk_nb); in rockchip_clk_register_cpuclk()
404 cpuclk->rate_count = nrates; in rockchip_clk_register_cpuclk()
405 cpuclk->rate_table = kmemdup(rates, in rockchip_clk_register_cpuclk()
408 if (!cpuclk->rate_table) { in rockchip_clk_register_cpuclk()
414 cclk = clk_register(NULL, &cpuclk->hw); in rockchip_clk_register_cpuclk()
424 kfree(cpuclk->rate_table); in rockchip_clk_register_cpuclk()
426 clk_notifier_unregister(clk, &cpuclk->clk_nb); in rockchip_clk_register_cpuclk()
428 clk_disable_unprepare(cpuclk->alt_parent); in rockchip_clk_register_cpuclk()
430 kfree(cpuclk); in rockchip_clk_register_cpuclk()
434 static int rockchip_cpuclk_v2_pre_rate_change(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_v2_pre_rate_change() argument
441 rate = rockchip_get_cpuclk_settings(cpuclk, new_rate); in rockchip_cpuclk_v2_pre_rate_change()
449 spin_lock_irqsave(cpuclk->lock, flags); in rockchip_cpuclk_v2_pre_rate_change()
450 rockchip_cpuclk_set_dividers(cpuclk, rate); in rockchip_cpuclk_v2_pre_rate_change()
451 spin_unlock_irqrestore(cpuclk->lock, flags); in rockchip_cpuclk_v2_pre_rate_change()
457 static int rockchip_cpuclk_v2_post_rate_change(struct rockchip_cpuclk *cpuclk, in rockchip_cpuclk_v2_post_rate_change() argument
464 rate = rockchip_get_cpuclk_settings(cpuclk, new_rate); in rockchip_cpuclk_v2_post_rate_change()
472 spin_lock_irqsave(cpuclk->lock, flags); in rockchip_cpuclk_v2_post_rate_change()
473 rockchip_cpuclk_set_dividers(cpuclk, rate); in rockchip_cpuclk_v2_post_rate_change()
474 spin_unlock_irqrestore(cpuclk->lock, flags); in rockchip_cpuclk_v2_post_rate_change()
484 struct rockchip_cpuclk *cpuclk = to_rockchip_cpuclk_nb(nb); in rockchip_cpuclk_v2_notifier_cb() local
490 ret = rockchip_cpuclk_v2_pre_rate_change(cpuclk, ndata); in rockchip_cpuclk_v2_notifier_cb()
492 ret = rockchip_cpuclk_v2_post_rate_change(cpuclk, ndata); in rockchip_cpuclk_v2_notifier_cb()
508 struct rockchip_cpuclk *cpuclk; in rockchip_clk_register_cpuclk_v2() local
558 cpuclk = kzalloc(sizeof(*cpuclk), GFP_KERNEL); in rockchip_clk_register_cpuclk_v2()
559 if (!cpuclk) { in rockchip_clk_register_cpuclk_v2()
564 cpuclk->reg_base = base; in rockchip_clk_register_cpuclk_v2()
565 cpuclk->lock = lock; in rockchip_clk_register_cpuclk_v2()
566 cpuclk->clk_nb.notifier_call = rockchip_cpuclk_v2_notifier_cb; in rockchip_clk_register_cpuclk_v2()
567 ret = clk_notifier_register(hw->clk, &cpuclk->clk_nb); in rockchip_clk_register_cpuclk_v2()
575 cpuclk->rate_count = nrates; in rockchip_clk_register_cpuclk_v2()
576 cpuclk->rate_table = kmemdup(rates, in rockchip_clk_register_cpuclk_v2()
579 if (!cpuclk->rate_table) { in rockchip_clk_register_cpuclk_v2()
588 kfree(cpuclk); in rockchip_clk_register_cpuclk_v2()