Lines Matching +full:clk +full:- +full:provider

1 // SPDX-License-Identifier: GPL-2.0-only
7 * Tero Kristo <t-kristo@ti.com>
11 #include <linux/clk.h>
12 #include <linux/clk-provider.h>
14 #include <linux/clk/ti.h>
45 struct clk_iomap *io = clk_memmaps[reg->index];
47 if (reg->ptr)
48 writel_relaxed(val, reg->ptr);
49 else if (io->regmap)
50 regmap_write(io->regmap, reg->offset, val);
52 writel_relaxed(val, io->mem + reg->offset);
67 struct clk_iomap *io = clk_memmaps[reg->index];
69 if (reg->ptr) {
70 _clk_rmw(val, mask, reg->ptr);
71 } else if (io->regmap) {
72 regmap_update_bits(io->regmap, reg->offset, mask, val);
74 _clk_rmw(val, mask, io->mem + reg->offset);
81 struct clk_iomap *io = clk_memmaps[reg->index];
83 if (reg->ptr)
84 val = readl_relaxed(reg->ptr);
85 else if (io->regmap)
86 regmap_read(io->regmap, reg->offset, &val);
88 val = readl_relaxed(io->mem + reg->offset);
94 * ti_clk_setup_ll_ops - setup low level clock operations
99 * specific code. Returns 0 on success, -EBUSY if ll_ops have been
106 return -EBUSY;
110 ops->clk_readl = clk_memmap_readl;
111 ops->clk_writel = clk_memmap_writel;
112 ops->clk_rmw = clk_memmap_rmw;
118 * Eventually we could standardize to using '_' for clk-*.c files to follow the
127 tmp = kstrdup_and_replace(name, '-', '_', GFP_KERNEL);
136 /* Node named "clock" with "clock-output-names" */
137 for_each_node_with_property(np, "clock-output-names") {
138 if (of_property_match_string(np, "clock-output-names", tmp) == 0)
142 /* Fall back to using old node name base provider name */
147 * ti_dt_clocks_register - register DT alias clocks during boot
150 * Register alias or non-standard DT clock entries during boot. By
151 * default, DT clocks are found based on their clock-output-names
153 * additional con-id / dev-id -> clock mapping is required, use this
160 struct clk *clk;
172 compat_mode = ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT;
174 for (c = oclks; c->node_name != NULL; c++) {
175 strcpy(buf, c->node_name);
184 c->node_name);
201 child = of_get_child_by_name(parent, "clk");
214 c->node_name, i, tags[i]);
219 clk = of_clk_get_from_provider(&clkspec);
221 if (!IS_ERR(clk)) {
222 c->lk.clk = clk;
223 clkdev_add(&c->lk);
242 c->node_name, PTR_ERR(clk));
257 * ti_clk_retry_init - retries a failed clock init at later phase
273 return -ENOMEM;
275 retry->node = node;
276 retry->func = func;
277 retry->user = user;
278 list_add(&retry->link, &retry_list);
284 * ti_clk_get_reg_addr - get register address for a clock register
301 if (clocks_node_ptr[i] == node->parent)
303 if (clocks_node_ptr[i] == node->parent->parent)
308 pr_err("clk-provider not found for %pOFn!\n", node);
309 return -ENOENT;
312 reg->index = i;
314 if (of_device_is_compatible(node->parent, "ti,clksel")) {
315 err = of_property_read_u32_index(node->parent, "reg", index, &clksel_addr);
318 return -EINVAL;
325 /* Legacy clksel with no reg and a possible ti,bit-shift property */
326 reg->offset = clksel_addr;
327 reg->bit = ti_clk_get_legacy_bit_shift(node);
328 reg->ptr = NULL;
335 reg->offset = clksel_addr;
336 reg->bit = val;
337 reg->ptr = NULL;
341 /* Other clocks that may or may not have ti,bit-shift property */
342 reg->offset = val;
343 reg->bit = ti_clk_get_legacy_bit_shift(node);
344 reg->ptr = NULL;
350 * ti_clk_get_legacy_bit_shift - get bit shift for a clock register
353 * Gets the clock register bit shift using the legacy ti,bit-shift
363 err = of_property_read_u32(node, "ti,bit-shift", &val);
379 ti_clk_ll_ops->clk_rmw(latch, latch, reg);
380 ti_clk_ll_ops->clk_rmw(0, latch, reg);
381 ti_clk_ll_ops->clk_readl(reg); /* OCP barrier */
385 * omap2_clk_provider_init - init master clock provider
389 * @mem: iomem pointer for the clock provider memory area, only used if
408 return -EINVAL;
416 return -ENOMEM;
418 io->regmap = syscon;
419 io->mem = mem;
427 * omap2_clk_legacy_provider_init - initialize a legacy clock provider
428 * @index: index for the clock provider
429 * @mem: iomem pointer for the clock provider memory area
431 * Initializes a legacy clock provider memory mapping.
439 io->mem = mem;
445 * ti_dt_clk_init_retry_clks - init clocks from the retry list
460 pr_debug("retry-init: %pOFn\n", retry->node);
461 retry->func(retry->user, retry->node);
462 list_del(&retry->link);
465 retries--;
470 { .compatible = "fixed-clock" },
471 { .compatible = "fixed-factor-clock" },
476 * ti_dt_clk_name - init clock name from first output name or node name
479 * Use the first clock-output-name for the clock name if found. Fall back
486 if (!of_property_read_string_index(np, "clock-output-names", 0,
490 return np->name;
494 * ti_clk_add_aliases - setup clock aliases
501 struct clk *clk;
507 clk = of_clk_get_from_provider(&clkspec);
509 ti_clk_add_alias(clk, ti_dt_clk_name(np));
514 * ti_clk_setup_features - setup clock features flags
526 * ti_clk_get_features - get clock driver features flags
537 * omap2_clk_enable_init_clocks - prepare & enable a list of clocks
548 struct clk *init_clk;
561 * ti_clk_add_alias - add a clock alias for a TI clock
562 * @clk: clock handle to create alias for
569 int ti_clk_add_alias(struct clk *clk, const char *con)
573 if (!clk)
576 if (IS_ERR(clk))
577 return PTR_ERR(clk);
581 return -ENOMEM;
583 cl->con_id = con;
584 cl->clk = clk;
592 * of_ti_clk_register - register a TI clock to the common clock framework
601 struct clk *of_ti_clk_register(struct device_node *node, struct clk_hw *hw,
604 struct clk *clk;
611 clk = hw->clk;
612 ret = ti_clk_add_alias(clk, con);
614 clk_unregister(clk);
618 return clk;
622 * of_ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework
632 struct clk *of_ti_clk_register_omap_hw(struct device_node *node,
635 struct clk *clk;
638 clk = of_ti_clk_register(node, hw, con);
639 if (IS_ERR(clk))
640 return clk;
644 list_add(&oclk->node, &clk_hw_omap_clocks);
646 return clk;
650 * omap2_clk_for_each - call function for each registered clk_hw_omap
655 * failure. If @fn returns non-zero, the iteration across clocks
656 * will stop and the non-zero return value will be passed to the
674 * omap2_clk_is_hw_omap - check if the provided clk_hw is OMAP clock
685 if (&oclk->hw == hw)