Lines Matching +full:n +full:- +full:factor

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
10 #include <linux/clk-provider.h>
11 #include <linux/interconnect-clk.h>
13 #include <linux/reset-controller.h>
17 #include "clk-alpha-pll.h"
18 #include "clk-branch.h"
19 #include "clk-rcg.h"
20 #include "clk-regmap.h"
37 if (!f->freq) in qcom_find_freq()
40 for (; f->freq; f++) in qcom_find_freq()
41 if (rate <= f->freq) in qcom_find_freq()
45 return f - 1; in qcom_find_freq()
55 if (!f->freq) in qcom_find_freq_multi()
58 for (; f->freq; f++) in qcom_find_freq_multi()
59 if (rate <= f->freq) in qcom_find_freq_multi()
63 return f - 1; in qcom_find_freq_multi()
72 for ( ; f->freq; f++) { in qcom_find_freq_floor()
73 if (rate >= f->freq) in qcom_find_freq_floor()
91 return -ENOENT; in qcom_find_src_index()
103 return -ENOENT; in qcom_find_cfg_index()
111 struct device *dev = &pdev->dev; in qcom_cc_map()
117 return devm_regmap_init_mmio(dev, base, desc->config); in qcom_cc_map()
127 /* De-assert reset to FSM */ in qcom_pll_set_fsm_mode()
148 * Backwards compatibility with old DTs. Register a pass-through factor 1/1
158 struct clk_fixed_factor *factor; in _qcom_cc_register_board_clk() local
172 return -EINVAL; in _qcom_cc_register_board_clk()
174 fixed->fixed_rate = rate; in _qcom_cc_register_board_clk()
175 fixed->hw.init = &init_data; in _qcom_cc_register_board_clk()
180 ret = devm_clk_hw_register(dev, &fixed->hw); in _qcom_cc_register_board_clk()
187 factor = devm_kzalloc(dev, sizeof(*factor), GFP_KERNEL); in _qcom_cc_register_board_clk()
188 if (!factor) in _qcom_cc_register_board_clk()
189 return -EINVAL; in _qcom_cc_register_board_clk()
191 factor->mult = factor->div = 1; in _qcom_cc_register_board_clk()
192 factor->hw.init = &init_data; in _qcom_cc_register_board_clk()
200 ret = devm_clk_hw_register(dev, &factor->hw); in _qcom_cc_register_board_clk()
216 * function to skip registration of xo factor clocks. in qcom_cc_register_board_clk()
230 /* Drop 'protected-clocks' from the list of clocks to register */
233 struct device_node *np = dev->of_node; in qcom_cc_drop_protected()
236 of_property_for_each_u32(np, "protected-clocks", i) { in qcom_cc_drop_protected()
237 if (i >= cc->num_rclks) in qcom_cc_drop_protected()
240 cc->rclks[i] = NULL; in qcom_cc_drop_protected()
248 unsigned int idx = clkspec->args[0]; in qcom_cc_clk_hw_get()
250 if (idx >= cc->num_rclks) { in qcom_cc_clk_hw_get()
251 pr_err("%s: invalid index %u\n", __func__, idx); in qcom_cc_clk_hw_get()
252 return ERR_PTR(-EINVAL); in qcom_cc_clk_hw_get()
255 return cc->rclks[idx] ? &cc->rclks[idx]->hw : NULL; in qcom_cc_clk_hw_get()
268 if (!desc->icc_hws) in qcom_cc_icc_register()
271 icd = devm_kcalloc(dev, desc->num_icc_hws, sizeof(*icd), GFP_KERNEL); in qcom_cc_icc_register()
273 return -ENOMEM; in qcom_cc_icc_register()
275 for (i = 0; i < desc->num_icc_hws; i++) { in qcom_cc_icc_register()
276 icd[i].master_id = desc->icc_hws[i].master_id; in qcom_cc_icc_register()
277 icd[i].slave_id = desc->icc_hws[i].slave_id; in qcom_cc_icc_register()
278 hws = &desc->clks[desc->icc_hws[i].clk_id]->hw; in qcom_cc_icc_register()
282 "(%d) clock entry is null\n", i); in qcom_cc_icc_register()
286 return devm_icc_clk_register(dev, desc->icc_first_node_id, in qcom_cc_icc_register()
287 desc->num_icc_hws, icd); in qcom_cc_icc_register()
297 for (i = 0; i < data->num_alpha_plls; i++) { in qcom_cc_clk_pll_configure()
298 pll = data->alpha_plls[i]; in qcom_cc_clk_pll_configure()
299 init = pll->clkr.hw.init; in qcom_cc_clk_pll_configure()
301 if (!pll->config || !pll->regs) { in qcom_cc_clk_pll_configure()
302 pr_err("%s: missing pll config or regs\n", init->name); in qcom_cc_clk_pll_configure()
303 return -EINVAL; in qcom_cc_clk_pll_configure()
317 for (i = 0; i < data->num_clk_cbcrs; i++) in qcom_cc_clk_regs_configure()
318 qcom_branch_set_clk_en(regmap, data->clk_cbcrs[i]); in qcom_cc_clk_regs_configure()
320 if (data->clk_regs_configure) in qcom_cc_clk_regs_configure()
321 data->clk_regs_configure(dev, regmap); in qcom_cc_clk_regs_configure()
331 size_t num_clks = desc->num_clks; in qcom_cc_really_probe()
332 struct clk_regmap **rclks = desc->clks; in qcom_cc_really_probe()
333 size_t num_clk_hws = desc->num_clk_hws; in qcom_cc_really_probe()
334 struct clk_hw **clk_hws = desc->clk_hws; in qcom_cc_really_probe()
338 return -ENOMEM; in qcom_cc_really_probe()
340 ret = devm_pm_domain_attach_list(dev, NULL, &cc->pd_list); in qcom_cc_really_probe()
341 if (ret < 0 && ret != -EEXIST) in qcom_cc_really_probe()
344 if (desc->use_rpm) { in qcom_cc_really_probe()
354 if (desc->driver_data) { in qcom_cc_really_probe()
355 ret = qcom_cc_clk_pll_configure(desc->driver_data, regmap); in qcom_cc_really_probe()
359 qcom_cc_clk_regs_configure(dev, desc->driver_data, regmap); in qcom_cc_really_probe()
362 reset = &cc->reset; in qcom_cc_really_probe()
363 reset->rcdev.of_node = dev->of_node; in qcom_cc_really_probe()
364 reset->rcdev.ops = &qcom_reset_ops; in qcom_cc_really_probe()
365 reset->rcdev.owner = dev->driver->owner; in qcom_cc_really_probe()
366 reset->rcdev.nr_resets = desc->num_resets; in qcom_cc_really_probe()
367 reset->regmap = regmap; in qcom_cc_really_probe()
368 reset->reset_map = desc->resets; in qcom_cc_really_probe()
370 ret = devm_reset_controller_register(dev, &reset->rcdev); in qcom_cc_really_probe()
374 if (desc->gdscs && desc->num_gdscs) { in qcom_cc_really_probe()
377 ret = -ENOMEM; in qcom_cc_really_probe()
380 scd->dev = dev; in qcom_cc_really_probe()
381 scd->scs = desc->gdscs; in qcom_cc_really_probe()
382 scd->num = desc->num_gdscs; in qcom_cc_really_probe()
383 scd->pd_list = cc->pd_list; in qcom_cc_really_probe()
384 ret = gdsc_register(scd, &reset->rcdev, regmap); in qcom_cc_really_probe()
393 if (desc->driver_data && in qcom_cc_really_probe()
394 desc->driver_data->dfs_rcgs && in qcom_cc_really_probe()
395 desc->driver_data->num_dfs_rcgs) { in qcom_cc_really_probe()
397 desc->driver_data->dfs_rcgs, in qcom_cc_really_probe()
398 desc->driver_data->num_dfs_rcgs); in qcom_cc_really_probe()
403 cc->rclks = rclks; in qcom_cc_really_probe()
404 cc->num_rclks = num_clks; in qcom_cc_really_probe()
430 if (desc->use_rpm) in qcom_cc_really_probe()
445 return qcom_cc_really_probe(&pdev->dev, desc, regmap); in qcom_cc_probe()
457 return -ENOMEM; in qcom_cc_probe_by_index()
459 regmap = devm_regmap_init_mmio(&pdev->dev, base, desc->config); in qcom_cc_probe_by_index()
463 return qcom_cc_really_probe(&pdev->dev, desc, regmap); in qcom_cc_probe_by_index()