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"
42 mux->old_index = krait_mux_clk_ops.get_parent(&mux->hw); in krait_notifier_cb()
43 ret = krait_mux_clk_ops.set_parent(&mux->hw, mux->safe_sel); in krait_notifier_cb()
44 mux->reparent = false; in krait_notifier_cb()
51 if (!mux->reparent) in krait_notifier_cb()
52 ret = krait_mux_clk_ops.set_parent(&mux->hw, in krait_notifier_cb()
53 mux->old_index); in krait_notifier_cb()
64 mux->clk_nb.notifier_call = krait_notifier_cb; in krait_notifier_register()
65 ret = clk_notifier_register(clk, &mux->clk_nb); in krait_notifier_register()
73 krait_add_div(struct device *dev, int id, const char *s, unsigned int offset) in krait_add_div() argument
86 return -ENOMEM; in krait_add_div()
88 div->width = 2; in krait_add_div()
89 div->shift = 6; in krait_add_div()
90 div->lpl = id >= 0; in krait_add_div()
91 div->offset = offset; in krait_add_div()
92 div->hw.init = &init; in krait_add_div()
96 return -ENOMEM; in krait_add_div()
102 return -ENOMEM; in krait_add_div()
105 clk = devm_clk_register(dev, &div->hw); in krait_add_div()
114 unsigned int offset, bool unique_aux) in krait_add_sec_mux() argument
132 return -ENOMEM; in krait_add_sec_mux()
134 mux->offset = offset; in krait_add_sec_mux()
135 mux->lpl = id >= 0; in krait_add_sec_mux()
136 mux->mask = 0x3; in krait_add_sec_mux()
137 mux->shift = 2; in krait_add_sec_mux()
138 mux->parent_map = sec_mux_map; in krait_add_sec_mux()
139 mux->hw.init = &init; in krait_add_sec_mux()
140 mux->safe_sel = 0; in krait_add_sec_mux()
144 return -ENOMEM; in krait_add_sec_mux()
149 clk = ERR_PTR(-ENOMEM); in krait_add_sec_mux()
154 clk = devm_clk_register(dev, &mux->hw); in krait_add_sec_mux()
170 unsigned int offset) in krait_add_pri_mux() argument
185 return ERR_PTR(-ENOMEM); in krait_add_pri_mux()
187 mux->mask = 0x3; in krait_add_pri_mux()
188 mux->shift = 0; in krait_add_pri_mux()
189 mux->offset = offset; in krait_add_pri_mux()
190 mux->lpl = id >= 0; in krait_add_pri_mux()
191 mux->parent_map = pri_mux_map; in krait_add_pri_mux()
192 mux->hw.init = &init; in krait_add_pri_mux()
193 mux->safe_sel = 2; in krait_add_pri_mux()
197 return ERR_PTR(-ENOMEM); in krait_add_pri_mux()
201 clk = ERR_PTR(-ENOMEM); in krait_add_pri_mux()
207 clk = ERR_PTR(-ENOMEM); in krait_add_pri_mux()
213 clk = ERR_PTR(-ENOMEM); in krait_add_pri_mux()
217 clk = devm_clk_register(dev, &mux->hw); in krait_add_pri_mux()
233 /* id < 0 for L2, otherwise id == physical CPU number */
237 unsigned int offset; in krait_add_clks() local
243 offset = 0x4501 + (0x1000 * id); in krait_add_clks()
246 return ERR_PTR(-ENOMEM); in krait_add_clks()
248 offset = 0x500; in krait_add_clks()
252 ret = krait_add_div(dev, id, s, offset); in krait_add_clks()
258 ret = krait_add_sec_mux(dev, id, s, offset, unique_aux); in krait_add_clks()
264 clk = krait_add_pri_mux(dev, id, s, offset); in krait_add_clks()
272 unsigned int idx = clkspec->args[0]; in krait_of_get()
277 return ERR_PTR(-EINVAL); in krait_of_get()
280 return clks[idx] ? : ERR_PTR(-ENODEV); in krait_of_get()
284 { .compatible = "qcom,krait-cc-v1", (void *)1UL },
285 { .compatible = "qcom,krait-cc-v2" },
292 struct device *dev = &pdev->dev; in krait_cc_probe()
295 int cpu; in krait_cc_probe() local
302 return -ENODEV; in krait_cc_probe()
309 if (!id->data) { in krait_cc_probe()
319 return -ENOMEM; in krait_cc_probe()
321 for_each_possible_cpu(cpu) { in krait_cc_probe()
322 clk = krait_add_clks(dev, cpu, id->data); in krait_cc_probe()
325 clks[cpu] = clk; in krait_cc_probe()
328 l2_pri_mux_clk = krait_add_clks(dev, -1, id->data); in krait_cc_probe()
334 * We don't want the CPU or L2 clocks to be turned off at late init in krait_cc_probe()
340 for_each_online_cpu(cpu) { in krait_cc_probe()
342 WARN(clk_prepare_enable(clks[cpu]), in krait_cc_probe()
343 "Unable to turn on CPU%d clock", cpu); in krait_cc_probe()
367 for_each_possible_cpu(cpu) { in krait_cc_probe()
368 clk = clks[cpu]; in krait_cc_probe()
371 pr_info("CPU%d @ QSB rate. Forcing new rate.\n", cpu); in krait_cc_probe()
378 pr_info("CPU%d @ %lu KHz\n", cpu, clk_get_rate(clk) / 1000); in krait_cc_probe()
381 of_clk_add_provider(dev->of_node, krait_of_get, clks); in krait_cc_probe()
389 .name = "krait-cc",
395 MODULE_DESCRIPTION("Krait CPU Clock Driver");
397 MODULE_ALIAS("platform:krait-cc");