Lines Matching +full:ls2k +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2022-2023 Loongson Technology Corporation Limited
9 #include <linux/clk-provider.h>
13 #include <linux/io-64-nonatomic-lo-hi.h>
14 #include <dt-bindings/clock/loongson,ls2k-clk.h>
34 /* Must be last --ends in a flexible-array member. */
148 * The hda clk divisor in the upper 32bits and the clk-prodiver
210 return (val & GENMASK(shift + width - 1, shift)) >> shift; in loongson2_rate_part()
217 struct loongson2_clk_data *clk = to_loongson2_clk(hw); in loongson2_pll_recalc_rate() local
219 val = readq(clk->reg); in loongson2_pll_recalc_rate()
220 mult = loongson2_rate_part(val, clk->mult_shift, clk->mult_width); in loongson2_pll_recalc_rate()
221 div = loongson2_rate_part(val, clk->div_shift, clk->div_width); in loongson2_pll_recalc_rate()
234 struct loongson2_clk_data *clk = to_loongson2_clk(hw); in loongson2_freqscale_recalc_rate() local
236 val = readq(clk->reg); in loongson2_freqscale_recalc_rate()
237 mult = loongson2_rate_part(val, clk->div_shift, clk->div_width) + 1; in loongson2_freqscale_recalc_rate()
252 struct loongson2_clk_data *clk; in loongson2_clk_register() local
255 clk = devm_kzalloc(clp->dev, sizeof(*clk), GFP_KERNEL); in loongson2_clk_register()
256 if (!clk) in loongson2_clk_register()
257 return ERR_PTR(-ENOMEM); in loongson2_clk_register()
259 init.name = cld->name; in loongson2_clk_register()
264 if (!cld->parent_name) in loongson2_clk_register()
267 init.parent_names = &cld->parent_name; in loongson2_clk_register()
269 clk->reg = clp->base + cld->reg_offset; in loongson2_clk_register()
270 clk->div_shift = cld->div_shift; in loongson2_clk_register()
271 clk->div_width = cld->div_width; in loongson2_clk_register()
272 clk->mult_shift = cld->mult_shift; in loongson2_clk_register()
273 clk->mult_width = cld->mult_width; in loongson2_clk_register()
274 clk->hw.init = &init; in loongson2_clk_register()
276 hw = &clk->hw; in loongson2_clk_register()
277 ret = devm_clk_hw_register(clp->dev, hw); in loongson2_clk_register()
279 clk = ERR_PTR(ret); in loongson2_clk_register()
288 struct device *dev = &pdev->dev; in loongson2_clk_probe()
294 return -EINVAL; in loongson2_clk_probe()
296 for (p = data; p->name; p++) in loongson2_clk_probe()
297 clks_num = max(clks_num, p->id + 1); in loongson2_clk_probe()
302 return -ENOMEM; in loongson2_clk_probe()
304 clp->base = devm_platform_ioremap_resource(pdev, 0); in loongson2_clk_probe()
305 if (IS_ERR(clp->base)) in loongson2_clk_probe()
306 return PTR_ERR(clp->base); in loongson2_clk_probe()
308 spin_lock_init(&clp->clk_lock); in loongson2_clk_probe()
309 clp->clk_data.num = clks_num; in loongson2_clk_probe()
310 clp->dev = dev; in loongson2_clk_probe()
313 memset_p((void **)clp->clk_data.hws, ERR_PTR(-ENOENT), clks_num); in loongson2_clk_probe()
317 switch (p->type) { in loongson2_clk_probe()
327 hw = devm_clk_hw_register_divider(dev, p->name, in loongson2_clk_probe()
328 p->parent_name, 0, in loongson2_clk_probe()
329 clp->base + p->reg_offset, in loongson2_clk_probe()
330 p->div_shift, p->div_width, in loongson2_clk_probe()
332 &clp->clk_lock); in loongson2_clk_probe()
335 hw = devm_clk_hw_register_gate(dev, p->name, p->parent_name, 0, in loongson2_clk_probe()
336 clp->base + p->reg_offset, in loongson2_clk_probe()
337 p->bit_idx, 0, in loongson2_clk_probe()
338 &clp->clk_lock); in loongson2_clk_probe()
341 hw = devm_clk_hw_register_fixed_rate_parent_data(dev, p->name, pdata, in loongson2_clk_probe()
342 0, p->fixed_rate); in loongson2_clk_probe()
345 return dev_err_probe(dev, -EINVAL, "Invalid clk type\n"); in loongson2_clk_probe()
350 "Register clk: %s, type: %u failed!\n", in loongson2_clk_probe()
351 p->name, p->type); in loongson2_clk_probe()
353 clp->clk_data.hws[p->id] = hw; in loongson2_clk_probe()
356 return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, &clp->clk_data); in loongson2_clk_probe()
360 { .compatible = "loongson,ls2k0500-clk", .data = &ls2k0500_clks },
361 { .compatible = "loongson,ls2k-clk", .data = &ls2k1000_clks },
362 { .compatible = "loongson,ls2k2000-clk", .data = &ls2k2000_clks },
370 .name = "loongson2-clk",