Lines Matching +full:cpu +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/clk-provider.h>
16 #include "clk-krait.h"
52 mux->old_index = krait_mux_clk_ops.get_parent(&mux->hw); in krait_notifier_cb()
53 ret = krait_mux_clk_ops.set_parent(&mux->hw, mux->safe_sel); in krait_notifier_cb()
54 mux->reparent = false; in krait_notifier_cb()
61 if (!mux->reparent) in krait_notifier_cb()
62 ret = krait_mux_clk_ops.set_parent(&mux->hw, in krait_notifier_cb()
63 mux->old_index); in krait_notifier_cb()
74 mux->clk_nb.notifier_call = krait_notifier_cb; in krait_notifier_register()
75 ret = devm_clk_notifier_register(dev, clk, &mux->clk_nb); in krait_notifier_register()
83 krait_add_div(struct device *dev, int id, const char *s, unsigned int offset) in krait_add_div() argument
94 int cpu, ret; in krait_add_div() local
98 return ERR_PTR(-ENOMEM); in krait_add_div()
100 div->width = 2; in krait_add_div()
101 div->shift = 6; in krait_add_div()
102 div->lpl = id >= 0; in krait_add_div()
103 div->offset = offset; in krait_add_div()
104 div->hw.init = &init; in krait_add_div()
108 return ERR_PTR(-ENOMEM); in krait_add_div()
113 clk = ERR_PTR(-ENOMEM); in krait_add_div()
120 ret = devm_clk_hw_register(dev, &div->hw); in krait_add_div()
126 clk = &div->hw; in krait_add_div()
128 /* clk-krait ignore any rate change if mux is not flagged as enabled */ in krait_add_div()
130 for_each_online_cpu(cpu) in krait_add_div()
131 clk_prepare_enable(div->hw.clk); in krait_add_div()
133 clk_prepare_enable(div->hw.clk); in krait_add_div()
145 unsigned int offset, bool unique_aux) in krait_add_sec_mux() argument
147 int cpu, ret; in krait_add_sec_mux() local
164 return ERR_PTR(-ENOMEM); in krait_add_sec_mux()
166 mux->offset = offset; in krait_add_sec_mux()
167 mux->lpl = id >= 0; in krait_add_sec_mux()
168 mux->mask = 0x3; in krait_add_sec_mux()
169 mux->shift = 2; in krait_add_sec_mux()
170 mux->parent_map = sec_mux_map; in krait_add_sec_mux()
171 mux->hw.init = &init; in krait_add_sec_mux()
172 mux->safe_sel = 0; in krait_add_sec_mux()
174 /* Checking for qcom,krait-cc-v1 or qcom,krait-cc-v2 is not in krait_add_sec_mux()
180 mux->disable_sec_src_gating = true; in krait_add_sec_mux()
184 return ERR_PTR(-ENOMEM); in krait_add_sec_mux()
189 clk = ERR_PTR(-ENOMEM); in krait_add_sec_mux()
198 ret = devm_clk_hw_register(dev, &mux->hw); in krait_add_sec_mux()
204 clk = &mux->hw; in krait_add_sec_mux()
206 ret = krait_notifier_register(dev, mux->hw.clk, mux); in krait_add_sec_mux()
212 /* clk-krait ignore any rate change if mux is not flagged as enabled */ in krait_add_sec_mux()
214 for_each_online_cpu(cpu) in krait_add_sec_mux()
215 clk_prepare_enable(mux->hw.clk); in krait_add_sec_mux()
217 clk_prepare_enable(mux->hw.clk); in krait_add_sec_mux()
229 int id, const char *s, unsigned int offset) in krait_add_pri_mux() argument
245 return ERR_PTR(-ENOMEM); in krait_add_pri_mux()
247 mux->mask = 0x3; in krait_add_pri_mux()
248 mux->shift = 0; in krait_add_pri_mux()
249 mux->offset = offset; in krait_add_pri_mux()
250 mux->lpl = id >= 0; in krait_add_pri_mux()
251 mux->parent_map = pri_mux_map; in krait_add_pri_mux()
252 mux->hw.init = &init; in krait_add_pri_mux()
253 mux->safe_sel = 2; in krait_add_pri_mux()
257 return ERR_PTR(-ENOMEM); in krait_add_pri_mux()
261 clk = ERR_PTR(-ENOMEM); in krait_add_pri_mux()
271 ret = devm_clk_hw_register(dev, &mux->hw); in krait_add_pri_mux()
277 clk = &mux->hw; in krait_add_pri_mux()
279 ret = krait_notifier_register(dev, mux->hw.clk, mux); in krait_add_pri_mux()
290 /* id < 0 for L2, otherwise id == physical CPU number */
294 unsigned int offset; in krait_add_clks() local
299 offset = 0x4501 + (0x1000 * id); in krait_add_clks()
302 return ERR_PTR(-ENOMEM); in krait_add_clks()
304 offset = 0x500; in krait_add_clks()
308 hfpll_div = krait_add_div(dev, id, s, offset); in krait_add_clks()
314 sec_mux = krait_add_sec_mux(dev, id, s, offset, unique_aux); in krait_add_clks()
320 pri_mux = krait_add_pri_mux(dev, hfpll_div, sec_mux, id, s, offset); in krait_add_clks()
329 unsigned int idx = clkspec->args[0]; in krait_of_get()
334 return ERR_PTR(-EINVAL); in krait_of_get()
337 return clks[idx] ? : ERR_PTR(-ENODEV); in krait_of_get()
341 { .compatible = "qcom,krait-cc-v1", (void *)1UL },
342 { .compatible = "qcom,krait-cc-v2" },
349 struct device *dev = &pdev->dev; in krait_cc_probe()
351 int cpu; in krait_cc_probe() local
371 return -ENOMEM; in krait_cc_probe()
373 for_each_possible_cpu(cpu) { in krait_cc_probe()
374 mux = krait_add_clks(dev, cpu, unique_aux); in krait_cc_probe()
377 clks[cpu] = mux->clk; in krait_cc_probe()
380 l2_pri_mux = krait_add_clks(dev, -1, unique_aux); in krait_cc_probe()
383 clks[l2_mux] = l2_pri_mux->clk; in krait_cc_probe()
386 * We don't want the CPU or L2 clocks to be turned off at late init in krait_cc_probe()
392 for_each_online_cpu(cpu) { in krait_cc_probe()
394 WARN(clk_prepare_enable(clks[cpu]), in krait_cc_probe()
395 "Unable to turn on CPU%d clock", cpu); in krait_cc_probe()
419 for_each_possible_cpu(cpu) { in krait_cc_probe()
420 clk = clks[cpu]; in krait_cc_probe()
423 pr_info("CPU%d @ Undefined rate. Forcing new rate.\n", cpu); in krait_cc_probe()
430 pr_info("CPU%d @ %lu KHz\n", cpu, clk_get_rate(clk) / 1000); in krait_cc_probe()
433 of_clk_add_provider(dev->of_node, krait_of_get, clks); in krait_cc_probe()
441 .name = "krait-cc",
447 MODULE_DESCRIPTION("Krait CPU Clock Driver");
449 MODULE_ALIAS("platform:krait-cc");