Lines Matching +full:cpu +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/clk-provider.h>
15 #include "clk-krait.h"
51 mux->old_index = krait_mux_clk_ops.get_parent(&mux->hw); in krait_notifier_cb()
52 ret = krait_mux_clk_ops.set_parent(&mux->hw, mux->safe_sel); in krait_notifier_cb()
53 mux->reparent = false; in krait_notifier_cb()
60 if (!mux->reparent) in krait_notifier_cb()
61 ret = krait_mux_clk_ops.set_parent(&mux->hw, in krait_notifier_cb()
62 mux->old_index); in krait_notifier_cb()
73 mux->clk_nb.notifier_call = krait_notifier_cb; in krait_notifier_register()
74 ret = devm_clk_notifier_register(dev, clk, &mux->clk_nb); in krait_notifier_register()
82 krait_add_div(struct device *dev, int id, const char *s, unsigned int offset) in krait_add_div() argument
93 int cpu, ret; in krait_add_div() local
97 return ERR_PTR(-ENOMEM); in krait_add_div()
99 div->width = 2; in krait_add_div()
100 div->shift = 6; in krait_add_div()
101 div->lpl = id >= 0; in krait_add_div()
102 div->offset = offset; in krait_add_div()
103 div->hw.init = &init; in krait_add_div()
107 return ERR_PTR(-ENOMEM); in krait_add_div()
112 clk = ERR_PTR(-ENOMEM); in krait_add_div()
119 ret = devm_clk_hw_register(dev, &div->hw); in krait_add_div()
125 clk = &div->hw; in krait_add_div()
127 /* clk-krait ignore any rate change if mux is not flagged as enabled */ in krait_add_div()
129 for_each_online_cpu(cpu) in krait_add_div()
130 clk_prepare_enable(div->hw.clk); in krait_add_div()
132 clk_prepare_enable(div->hw.clk); in krait_add_div()
144 unsigned int offset, bool unique_aux) in krait_add_sec_mux() argument
146 int cpu, ret; in krait_add_sec_mux() local
163 return ERR_PTR(-ENOMEM); in krait_add_sec_mux()
165 mux->offset = offset; in krait_add_sec_mux()
166 mux->lpl = id >= 0; in krait_add_sec_mux()
167 mux->mask = 0x3; in krait_add_sec_mux()
168 mux->shift = 2; in krait_add_sec_mux()
169 mux->parent_map = sec_mux_map; in krait_add_sec_mux()
170 mux->hw.init = &init; in krait_add_sec_mux()
171 mux->safe_sel = 0; in krait_add_sec_mux()
173 /* Checking for qcom,krait-cc-v1 or qcom,krait-cc-v2 is not in krait_add_sec_mux()
179 mux->disable_sec_src_gating = true; in krait_add_sec_mux()
183 return ERR_PTR(-ENOMEM); in krait_add_sec_mux()
188 clk = ERR_PTR(-ENOMEM); in krait_add_sec_mux()
197 ret = devm_clk_hw_register(dev, &mux->hw); in krait_add_sec_mux()
203 clk = &mux->hw; in krait_add_sec_mux()
205 ret = krait_notifier_register(dev, mux->hw.clk, mux); in krait_add_sec_mux()
211 /* clk-krait ignore any rate change if mux is not flagged as enabled */ in krait_add_sec_mux()
213 for_each_online_cpu(cpu) in krait_add_sec_mux()
214 clk_prepare_enable(mux->hw.clk); in krait_add_sec_mux()
216 clk_prepare_enable(mux->hw.clk); in krait_add_sec_mux()
228 int id, const char *s, unsigned int offset) in krait_add_pri_mux() argument
244 return ERR_PTR(-ENOMEM); in krait_add_pri_mux()
246 mux->mask = 0x3; in krait_add_pri_mux()
247 mux->shift = 0; in krait_add_pri_mux()
248 mux->offset = offset; in krait_add_pri_mux()
249 mux->lpl = id >= 0; in krait_add_pri_mux()
250 mux->parent_map = pri_mux_map; in krait_add_pri_mux()
251 mux->hw.init = &init; in krait_add_pri_mux()
252 mux->safe_sel = 2; in krait_add_pri_mux()
256 return ERR_PTR(-ENOMEM); in krait_add_pri_mux()
260 clk = ERR_PTR(-ENOMEM); in krait_add_pri_mux()
270 ret = devm_clk_hw_register(dev, &mux->hw); in krait_add_pri_mux()
276 clk = &mux->hw; in krait_add_pri_mux()
278 ret = krait_notifier_register(dev, mux->hw.clk, mux); in krait_add_pri_mux()
289 /* id < 0 for L2, otherwise id == physical CPU number */
293 unsigned int offset; in krait_add_clks() local
298 offset = 0x4501 + (0x1000 * id); in krait_add_clks()
301 return ERR_PTR(-ENOMEM); in krait_add_clks()
303 offset = 0x500; in krait_add_clks()
307 hfpll_div = krait_add_div(dev, id, s, offset); in krait_add_clks()
313 sec_mux = krait_add_sec_mux(dev, id, s, offset, unique_aux); in krait_add_clks()
319 pri_mux = krait_add_pri_mux(dev, hfpll_div, sec_mux, id, s, offset); in krait_add_clks()
328 unsigned int idx = clkspec->args[0]; in krait_of_get()
333 return ERR_PTR(-EINVAL); in krait_of_get()
336 return clks[idx] ? : ERR_PTR(-ENODEV); in krait_of_get()
340 { .compatible = "qcom,krait-cc-v1", (void *)1UL },
341 { .compatible = "qcom,krait-cc-v2" },
348 struct device *dev = &pdev->dev; in krait_cc_probe()
350 int cpu; in krait_cc_probe() local
370 return -ENOMEM; in krait_cc_probe()
372 for_each_possible_cpu(cpu) { in krait_cc_probe()
373 mux = krait_add_clks(dev, cpu, unique_aux); in krait_cc_probe()
376 clks[cpu] = mux->clk; in krait_cc_probe()
379 l2_pri_mux = krait_add_clks(dev, -1, unique_aux); in krait_cc_probe()
382 clks[l2_mux] = l2_pri_mux->clk; in krait_cc_probe()
385 * We don't want the CPU or L2 clocks to be turned off at late init in krait_cc_probe()
391 for_each_online_cpu(cpu) { in krait_cc_probe()
393 WARN(clk_prepare_enable(clks[cpu]), in krait_cc_probe()
394 "Unable to turn on CPU%d clock", cpu); in krait_cc_probe()
418 for_each_possible_cpu(cpu) { in krait_cc_probe()
419 clk = clks[cpu]; in krait_cc_probe()
422 pr_info("CPU%d @ Undefined rate. Forcing new rate.\n", cpu); in krait_cc_probe()
429 pr_info("CPU%d @ %lu KHz\n", cpu, clk_get_rate(clk) / 1000); in krait_cc_probe()
432 of_clk_add_provider(dev->of_node, krait_of_get, clks); in krait_cc_probe()
440 .name = "krait-cc",
446 MODULE_DESCRIPTION("Krait CPU Clock Driver");
448 MODULE_ALIAS("platform:krait-cc");