Lines Matching +full:protected +full:- +full:clocks
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>
12 #include <linux/reset-controller.h>
16 #include "clk-rcg.h"
17 #include "clk-regmap.h"
34 if (!f->freq) in qcom_find_freq()
37 for (; f->freq; f++) in qcom_find_freq()
38 if (rate <= f->freq) in qcom_find_freq()
42 return f - 1; in qcom_find_freq()
52 if (!f->freq) in qcom_find_freq_multi()
55 for (; f->freq; f++) in qcom_find_freq_multi()
56 if (rate <= f->freq) in qcom_find_freq_multi()
60 return f - 1; in qcom_find_freq_multi()
69 for ( ; f->freq; f++) { in qcom_find_freq_floor()
70 if (rate >= f->freq) in qcom_find_freq_floor()
88 return -ENOENT; in qcom_find_src_index()
100 return -ENOENT; in qcom_find_cfg_index()
108 struct device *dev = &pdev->dev; in qcom_cc_map()
114 return devm_regmap_init_mmio(dev, base, desc->config); in qcom_cc_map()
124 /* De-assert reset to FSM */ in qcom_pll_set_fsm_mode()
145 * Backwards compatibility with old DTs. Register a pass-through factor 1/1
160 clocks_node = of_find_node_by_path("/clocks"); in _qcom_cc_register_board_clk()
169 return -EINVAL; in _qcom_cc_register_board_clk()
171 fixed->fixed_rate = rate; in _qcom_cc_register_board_clk()
172 fixed->hw.init = &init_data; in _qcom_cc_register_board_clk()
177 ret = devm_clk_hw_register(dev, &fixed->hw); in _qcom_cc_register_board_clk()
186 return -EINVAL; in _qcom_cc_register_board_clk()
188 factor->mult = factor->div = 1; in _qcom_cc_register_board_clk()
189 factor->hw.init = &init_data; in _qcom_cc_register_board_clk()
197 ret = devm_clk_hw_register(dev, &factor->hw); in _qcom_cc_register_board_clk()
213 * function to skip registration of xo factor clocks. in qcom_cc_register_board_clk()
227 /* Drop 'protected-clocks' from the list of clocks to register */
230 struct device_node *np = dev->of_node; in qcom_cc_drop_protected()
233 of_property_for_each_u32(np, "protected-clocks", i) { in qcom_cc_drop_protected()
234 if (i >= cc->num_rclks) in qcom_cc_drop_protected()
237 cc->rclks[i] = NULL; in qcom_cc_drop_protected()
245 unsigned int idx = clkspec->args[0]; in qcom_cc_clk_hw_get()
247 if (idx >= cc->num_rclks) { in qcom_cc_clk_hw_get()
249 return ERR_PTR(-EINVAL); in qcom_cc_clk_hw_get()
252 return cc->rclks[idx] ? &cc->rclks[idx]->hw : NULL; in qcom_cc_clk_hw_get()
265 if (!desc->icc_hws) in qcom_cc_icc_register()
268 icd = devm_kcalloc(dev, desc->num_icc_hws, sizeof(*icd), GFP_KERNEL); in qcom_cc_icc_register()
270 return -ENOMEM; in qcom_cc_icc_register()
272 for (i = 0; i < desc->num_icc_hws; i++) { in qcom_cc_icc_register()
273 icd[i].master_id = desc->icc_hws[i].master_id; in qcom_cc_icc_register()
274 icd[i].slave_id = desc->icc_hws[i].slave_id; in qcom_cc_icc_register()
275 hws = &desc->clks[desc->icc_hws[i].clk_id]->hw; in qcom_cc_icc_register()
278 return dev_err_probe(dev, -ENOENT, in qcom_cc_icc_register()
283 return devm_icc_clk_register(dev, desc->icc_first_node_id, in qcom_cc_icc_register()
284 desc->num_icc_hws, icd); in qcom_cc_icc_register()
294 size_t num_clks = desc->num_clks; in qcom_cc_really_probe()
295 struct clk_regmap **rclks = desc->clks; in qcom_cc_really_probe()
296 size_t num_clk_hws = desc->num_clk_hws; in qcom_cc_really_probe()
297 struct clk_hw **clk_hws = desc->clk_hws; in qcom_cc_really_probe()
301 return -ENOMEM; in qcom_cc_really_probe()
303 ret = devm_pm_domain_attach_list(dev, NULL, &cc->pd_list); in qcom_cc_really_probe()
304 if (ret < 0 && ret != -EEXIST) in qcom_cc_really_probe()
307 reset = &cc->reset; in qcom_cc_really_probe()
308 reset->rcdev.of_node = dev->of_node; in qcom_cc_really_probe()
309 reset->rcdev.ops = &qcom_reset_ops; in qcom_cc_really_probe()
310 reset->rcdev.owner = dev->driver->owner; in qcom_cc_really_probe()
311 reset->rcdev.nr_resets = desc->num_resets; in qcom_cc_really_probe()
312 reset->regmap = regmap; in qcom_cc_really_probe()
313 reset->reset_map = desc->resets; in qcom_cc_really_probe()
315 ret = devm_reset_controller_register(dev, &reset->rcdev); in qcom_cc_really_probe()
319 if (desc->gdscs && desc->num_gdscs) { in qcom_cc_really_probe()
322 return -ENOMEM; in qcom_cc_really_probe()
323 scd->dev = dev; in qcom_cc_really_probe()
324 scd->scs = desc->gdscs; in qcom_cc_really_probe()
325 scd->num = desc->num_gdscs; in qcom_cc_really_probe()
326 scd->pd_list = cc->pd_list; in qcom_cc_really_probe()
327 ret = gdsc_register(scd, &reset->rcdev, regmap); in qcom_cc_really_probe()
336 cc->rclks = rclks; in qcom_cc_really_probe()
337 cc->num_rclks = num_clks; in qcom_cc_really_probe()
372 return qcom_cc_really_probe(&pdev->dev, desc, regmap); in qcom_cc_probe()
384 return -ENOMEM; in qcom_cc_probe_by_index()
386 regmap = devm_regmap_init_mmio(&pdev->dev, base, desc->config); in qcom_cc_probe_by_index()
390 return qcom_cc_really_probe(&pdev->dev, desc, regmap); in qcom_cc_probe_by_index()