]> Git Repo - J-linux.git/blob - drivers/clk/ti/clk.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / clk / ti / clk.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * TI clock support
4  *
5  * Copyright (C) 2013 Texas Instruments, Inc.
6  *
7  * Tero Kristo <[email protected]>
8  */
9
10 #include <linux/cleanup.h>
11 #include <linux/clk.h>
12 #include <linux/clk-provider.h>
13 #include <linux/clkdev.h>
14 #include <linux/clk/ti.h>
15 #include <linux/io.h>
16 #include <linux/of.h>
17 #include <linux/of_address.h>
18 #include <linux/list.h>
19 #include <linux/minmax.h>
20 #include <linux/regmap.h>
21 #include <linux/string_helpers.h>
22 #include <linux/memblock.h>
23 #include <linux/device.h>
24
25 #include "clock.h"
26
27 #undef pr_fmt
28 #define pr_fmt(fmt) "%s: " fmt, __func__
29
30 static LIST_HEAD(clk_hw_omap_clocks);
31 struct ti_clk_ll_ops *ti_clk_ll_ops;
32 static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
33
34 struct ti_clk_features ti_clk_features;
35
36 struct clk_iomap {
37         struct regmap *regmap;
38         void __iomem *mem;
39 };
40
41 static struct clk_iomap *clk_memmaps[CLK_MAX_MEMMAPS];
42
43 static void clk_memmap_writel(u32 val, const struct clk_omap_reg *reg)
44 {
45         struct clk_iomap *io = clk_memmaps[reg->index];
46
47         if (reg->ptr)
48                 writel_relaxed(val, reg->ptr);
49         else if (io->regmap)
50                 regmap_write(io->regmap, reg->offset, val);
51         else
52                 writel_relaxed(val, io->mem + reg->offset);
53 }
54
55 static void _clk_rmw(u32 val, u32 mask, void __iomem *ptr)
56 {
57         u32 v;
58
59         v = readl_relaxed(ptr);
60         v &= ~mask;
61         v |= val;
62         writel_relaxed(v, ptr);
63 }
64
65 static void clk_memmap_rmw(u32 val, u32 mask, const struct clk_omap_reg *reg)
66 {
67         struct clk_iomap *io = clk_memmaps[reg->index];
68
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);
73         } else {
74                 _clk_rmw(val, mask, io->mem + reg->offset);
75         }
76 }
77
78 static u32 clk_memmap_readl(const struct clk_omap_reg *reg)
79 {
80         u32 val;
81         struct clk_iomap *io = clk_memmaps[reg->index];
82
83         if (reg->ptr)
84                 val = readl_relaxed(reg->ptr);
85         else if (io->regmap)
86                 regmap_read(io->regmap, reg->offset, &val);
87         else
88                 val = readl_relaxed(io->mem + reg->offset);
89
90         return val;
91 }
92
93 /**
94  * ti_clk_setup_ll_ops - setup low level clock operations
95  * @ops: low level clock ops descriptor
96  *
97  * Sets up low level clock operations for TI clock driver. This is used
98  * to provide various callbacks for the clock driver towards platform
99  * specific code. Returns 0 on success, -EBUSY if ll_ops have been
100  * registered already.
101  */
102 int ti_clk_setup_ll_ops(struct ti_clk_ll_ops *ops)
103 {
104         if (ti_clk_ll_ops) {
105                 pr_err("Attempt to register ll_ops multiple times.\n");
106                 return -EBUSY;
107         }
108
109         ti_clk_ll_ops = ops;
110         ops->clk_readl = clk_memmap_readl;
111         ops->clk_writel = clk_memmap_writel;
112         ops->clk_rmw = clk_memmap_rmw;
113
114         return 0;
115 }
116
117 /*
118  * Eventually we could standardize to using '_' for clk-*.c files to follow the
119  * TRM naming.
120  */
121 static struct device_node *ti_find_clock_provider(struct device_node *from,
122                                                   const char *name)
123 {
124         char *tmp __free(kfree) = NULL;
125         struct device_node *np;
126         bool found = false;
127         const char *n;
128         char *p;
129
130         tmp = kstrdup_and_replace(name, '-', '_', GFP_KERNEL);
131         if (!tmp)
132                 return NULL;
133
134         /* Ignore a possible address for the node name */
135         p = strchr(tmp, '@');
136         if (p)
137                 *p = '\0';
138
139         /* Node named "clock" with "clock-output-names" */
140         for_each_of_allnodes_from(from, np) {
141                 if (of_property_read_string_index(np, "clock-output-names",
142                                                   0, &n))
143                         continue;
144
145                 if (!strncmp(n, tmp, strlen(tmp))) {
146                         of_node_get(np);
147                         found = true;
148                         break;
149                 }
150         }
151
152         if (found) {
153                 of_node_put(from);
154                 return np;
155         }
156
157         /* Fall back to using old node name base provider name */
158         return of_find_node_by_name(from, tmp);
159 }
160
161 /**
162  * ti_dt_clocks_register - register DT alias clocks during boot
163  * @oclks: list of clocks to register
164  *
165  * Register alias or non-standard DT clock entries during boot. By
166  * default, DT clocks are found based on their clock-output-names
167  * property, or the clock node name for legacy cases. If any
168  * additional con-id / dev-id -> clock mapping is required, use this
169  * function to list these.
170  */
171 void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
172 {
173         struct ti_dt_clk *c;
174         struct device_node *node, *parent, *child;
175         struct clk *clk;
176         struct of_phandle_args clkspec;
177         char buf[64];
178         char *ptr;
179         char *tags[2];
180         int i;
181         int num_args;
182         int ret;
183         static bool clkctrl_nodes_missing;
184         static bool has_clkctrl_data;
185         static bool compat_mode;
186
187         compat_mode = ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT;
188
189         for (c = oclks; c->node_name != NULL; c++) {
190                 strcpy(buf, c->node_name);
191                 ptr = buf;
192                 for (i = 0; i < 2; i++)
193                         tags[i] = NULL;
194                 num_args = 0;
195                 while (*ptr) {
196                         if (*ptr == ':') {
197                                 if (num_args >= 2) {
198                                         pr_warn("Bad number of tags on %s\n",
199                                                 c->node_name);
200                                         return;
201                                 }
202                                 tags[num_args++] = ptr + 1;
203                                 *ptr = 0;
204                         }
205                         ptr++;
206                 }
207
208                 if (num_args && clkctrl_nodes_missing)
209                         continue;
210
211                 node = ti_find_clock_provider(NULL, buf);
212                 if (num_args && compat_mode) {
213                         parent = node;
214                         child = of_get_child_by_name(parent, "clock");
215                         if (!child)
216                                 child = of_get_child_by_name(parent, "clk");
217                         if (child) {
218                                 of_node_put(parent);
219                                 node = child;
220                         }
221                 }
222
223                 clkspec.np = node;
224                 clkspec.args_count = num_args;
225                 for (i = 0; i < num_args; i++) {
226                         ret = kstrtoint(tags[i], i ? 10 : 16, clkspec.args + i);
227                         if (ret) {
228                                 pr_warn("Bad tag in %s at %d: %s\n",
229                                         c->node_name, i, tags[i]);
230                                 of_node_put(node);
231                                 return;
232                         }
233                 }
234                 clk = of_clk_get_from_provider(&clkspec);
235                 of_node_put(node);
236                 if (!IS_ERR(clk)) {
237                         c->lk.clk = clk;
238                         clkdev_add(&c->lk);
239                 } else {
240                         if (num_args && !has_clkctrl_data) {
241                                 struct device_node *np;
242
243                                 np = of_find_compatible_node(NULL, NULL,
244                                                              "ti,clkctrl");
245                                 if (np) {
246                                         has_clkctrl_data = true;
247                                         of_node_put(np);
248                                 } else {
249                                         clkctrl_nodes_missing = true;
250
251                                         pr_warn("missing clkctrl nodes, please update your dts.\n");
252                                         continue;
253                                 }
254                         }
255
256                         pr_warn("failed to lookup clock node %s, ret=%ld\n",
257                                 c->node_name, PTR_ERR(clk));
258                 }
259         }
260 }
261
262 struct clk_init_item {
263         struct device_node *node;
264         void *user;
265         ti_of_clk_init_cb_t func;
266         struct list_head link;
267 };
268
269 static LIST_HEAD(retry_list);
270
271 /**
272  * ti_clk_retry_init - retries a failed clock init at later phase
273  * @node: device node for the clock
274  * @user: user data pointer
275  * @func: init function to be called for the clock
276  *
277  * Adds a failed clock init to the retry list. The retry list is parsed
278  * once all the other clocks have been initialized.
279  */
280 int __init ti_clk_retry_init(struct device_node *node, void *user,
281                              ti_of_clk_init_cb_t func)
282 {
283         struct clk_init_item *retry;
284
285         pr_debug("%pOFn: adding to retry list...\n", node);
286         retry = kzalloc(sizeof(*retry), GFP_KERNEL);
287         if (!retry)
288                 return -ENOMEM;
289
290         retry->node = node;
291         retry->func = func;
292         retry->user = user;
293         list_add(&retry->link, &retry_list);
294
295         return 0;
296 }
297
298 /**
299  * ti_clk_get_reg_addr - get register address for a clock register
300  * @node: device node for the clock
301  * @index: register index from the clock node
302  * @reg: pointer to target register struct
303  *
304  * Builds clock register address from device tree information, and returns
305  * the data via the provided output pointer @reg. Returns 0 on success,
306  * negative error value on failure.
307  */
308 int ti_clk_get_reg_addr(struct device_node *node, int index,
309                         struct clk_omap_reg *reg)
310 {
311         u32 clksel_addr, val;
312         bool is_clksel = false;
313         int i, err;
314
315         for (i = 0; i < CLK_MAX_MEMMAPS; i++) {
316                 if (clocks_node_ptr[i] == node->parent)
317                         break;
318                 if (clocks_node_ptr[i] == node->parent->parent)
319                         break;
320         }
321
322         if (i == CLK_MAX_MEMMAPS) {
323                 pr_err("clk-provider not found for %pOFn!\n", node);
324                 return -ENOENT;
325         }
326
327         reg->index = i;
328
329         if (of_device_is_compatible(node->parent, "ti,clksel")) {
330                 err = of_property_read_u32_index(node->parent, "reg", index, &clksel_addr);
331                 if (err) {
332                         pr_err("%pOFn parent clksel must have reg[%d]!\n", node, index);
333                         return -EINVAL;
334                 }
335                 is_clksel = true;
336         }
337
338         err = of_property_read_u32_index(node, "reg", index, &val);
339         if (err && is_clksel) {
340                 /* Legacy clksel with no reg and a possible ti,bit-shift property */
341                 reg->offset = clksel_addr;
342                 reg->bit = ti_clk_get_legacy_bit_shift(node);
343                 reg->ptr = NULL;
344
345                 return 0;
346         }
347
348         /* Updated clksel clock with a proper reg property */
349         if (is_clksel) {
350                 reg->offset = clksel_addr;
351                 reg->bit = val;
352                 reg->ptr = NULL;
353                 return 0;
354         }
355
356         /* Other clocks that may or may not have ti,bit-shift property  */
357         reg->offset = val;
358         reg->bit = ti_clk_get_legacy_bit_shift(node);
359         reg->ptr = NULL;
360
361         return 0;
362 }
363
364 /**
365  * ti_clk_get_legacy_bit_shift - get bit shift for a clock register
366  * @node: device node for the clock
367  *
368  * Gets the clock register bit shift using the legacy ti,bit-shift
369  * property. Only needed for legacy clock, and can be eventually
370  * dropped once all the composite clocks use a clksel node with a
371  * proper reg property.
372  */
373 int ti_clk_get_legacy_bit_shift(struct device_node *node)
374 {
375         int err;
376         u32 val;
377
378         err = of_property_read_u32(node, "ti,bit-shift", &val);
379         if (!err && in_range(val, 0, 32))
380                 return val;
381
382         return 0;
383 }
384
385 void ti_clk_latch(struct clk_omap_reg *reg, s8 shift)
386 {
387         u32 latch;
388
389         if (shift < 0)
390                 return;
391
392         latch = 1 << shift;
393
394         ti_clk_ll_ops->clk_rmw(latch, latch, reg);
395         ti_clk_ll_ops->clk_rmw(0, latch, reg);
396         ti_clk_ll_ops->clk_readl(reg); /* OCP barrier */
397 }
398
399 /**
400  * omap2_clk_provider_init - init master clock provider
401  * @parent: master node
402  * @index: internal index for clk_reg_ops
403  * @syscon: syscon regmap pointer for accessing clock registers
404  * @mem: iomem pointer for the clock provider memory area, only used if
405  *       syscon is not provided
406  *
407  * Initializes a master clock IP block. This basically sets up the
408  * mapping from clocks node to the memory map index. All the clocks
409  * are then initialized through the common of_clk_init call, and the
410  * clocks will access their memory maps based on the node layout.
411  * Returns 0 in success.
412  */
413 int __init omap2_clk_provider_init(struct device_node *parent, int index,
414                                    struct regmap *syscon, void __iomem *mem)
415 {
416         struct device_node *clocks;
417         struct clk_iomap *io;
418
419         /* get clocks for this parent */
420         clocks = of_get_child_by_name(parent, "clocks");
421         if (!clocks) {
422                 pr_err("%pOFn missing 'clocks' child node.\n", parent);
423                 return -EINVAL;
424         }
425
426         /* add clocks node info */
427         clocks_node_ptr[index] = clocks;
428
429         io = kzalloc(sizeof(*io), GFP_KERNEL);
430         if (!io)
431                 return -ENOMEM;
432
433         io->regmap = syscon;
434         io->mem = mem;
435
436         clk_memmaps[index] = io;
437
438         return 0;
439 }
440
441 /**
442  * omap2_clk_legacy_provider_init - initialize a legacy clock provider
443  * @index: index for the clock provider
444  * @mem: iomem pointer for the clock provider memory area
445  *
446  * Initializes a legacy clock provider memory mapping.
447  */
448 void __init omap2_clk_legacy_provider_init(int index, void __iomem *mem)
449 {
450         struct clk_iomap *io;
451
452         io = memblock_alloc(sizeof(*io), SMP_CACHE_BYTES);
453         if (!io)
454                 panic("%s: Failed to allocate %zu bytes\n", __func__,
455                       sizeof(*io));
456
457         io->mem = mem;
458
459         clk_memmaps[index] = io;
460 }
461
462 /**
463  * ti_dt_clk_init_retry_clks - init clocks from the retry list
464  *
465  * Initializes any clocks that have failed to initialize before,
466  * reasons being missing parent node(s) during earlier init. This
467  * typically happens only for DPLLs which need to have both of their
468  * parent clocks ready during init.
469  */
470 void ti_dt_clk_init_retry_clks(void)
471 {
472         struct clk_init_item *retry;
473         struct clk_init_item *tmp;
474         int retries = 5;
475
476         while (!list_empty(&retry_list) && retries) {
477                 list_for_each_entry_safe(retry, tmp, &retry_list, link) {
478                         pr_debug("retry-init: %pOFn\n", retry->node);
479                         retry->func(retry->user, retry->node);
480                         list_del(&retry->link);
481                         kfree(retry);
482                 }
483                 retries--;
484         }
485 }
486
487 static const struct of_device_id simple_clk_match_table[] __initconst = {
488         { .compatible = "fixed-clock" },
489         { .compatible = "fixed-factor-clock" },
490         { }
491 };
492
493 /**
494  * ti_dt_clk_name - init clock name from first output name or node name
495  * @np: device node
496  *
497  * Use the first clock-output-name for the clock name if found. Fall back
498  * to legacy naming based on node name.
499  */
500 const char *ti_dt_clk_name(struct device_node *np)
501 {
502         const char *name;
503
504         if (!of_property_read_string_index(np, "clock-output-names", 0,
505                                            &name))
506                 return name;
507
508         return np->name;
509 }
510
511 /**
512  * ti_clk_add_aliases - setup clock aliases
513  *
514  * Sets up any missing clock aliases. No return value.
515  */
516 void __init ti_clk_add_aliases(void)
517 {
518         struct device_node *np;
519         struct clk *clk;
520
521         for_each_matching_node(np, simple_clk_match_table) {
522                 struct of_phandle_args clkspec;
523
524                 clkspec.np = np;
525                 clk = of_clk_get_from_provider(&clkspec);
526
527                 ti_clk_add_alias(clk, ti_dt_clk_name(np));
528         }
529 }
530
531 /**
532  * ti_clk_setup_features - setup clock features flags
533  * @features: features definition to use
534  *
535  * Initializes the clock driver features flags based on platform
536  * provided data. No return value.
537  */
538 void __init ti_clk_setup_features(struct ti_clk_features *features)
539 {
540         memcpy(&ti_clk_features, features, sizeof(*features));
541 }
542
543 /**
544  * ti_clk_get_features - get clock driver features flags
545  *
546  * Get TI clock driver features description. Returns a pointer
547  * to the current feature setup.
548  */
549 const struct ti_clk_features *ti_clk_get_features(void)
550 {
551         return &ti_clk_features;
552 }
553
554 /**
555  * omap2_clk_enable_init_clocks - prepare & enable a list of clocks
556  * @clk_names: ptr to an array of strings of clock names to enable
557  * @num_clocks: number of clock names in @clk_names
558  *
559  * Prepare and enable a list of clocks, named by @clk_names.  No
560  * return value. XXX Deprecated; only needed until these clocks are
561  * properly claimed and enabled by the drivers or core code that uses
562  * them.  XXX What code disables & calls clk_put on these clocks?
563  */
564 void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)
565 {
566         struct clk *init_clk;
567         int i;
568
569         for (i = 0; i < num_clocks; i++) {
570                 init_clk = clk_get(NULL, clk_names[i]);
571                 if (WARN(IS_ERR(init_clk), "could not find init clock %s\n",
572                          clk_names[i]))
573                         continue;
574                 clk_prepare_enable(init_clk);
575         }
576 }
577
578 /**
579  * ti_clk_add_alias - add a clock alias for a TI clock
580  * @clk: clock handle to create alias for
581  * @con: connection ID for this clock
582  *
583  * Creates a clock alias for a TI clock. Allocates the clock lookup entry
584  * and assigns the data to it. Returns 0 if successful, negative error
585  * value otherwise.
586  */
587 int ti_clk_add_alias(struct clk *clk, const char *con)
588 {
589         struct clk_lookup *cl;
590
591         if (!clk)
592                 return 0;
593
594         if (IS_ERR(clk))
595                 return PTR_ERR(clk);
596
597         cl = kzalloc(sizeof(*cl), GFP_KERNEL);
598         if (!cl)
599                 return -ENOMEM;
600
601         cl->con_id = con;
602         cl->clk = clk;
603
604         clkdev_add(cl);
605
606         return 0;
607 }
608
609 /**
610  * of_ti_clk_register - register a TI clock to the common clock framework
611  * @node: device node for this clock
612  * @hw: hardware clock handle
613  * @con: connection ID for this clock
614  *
615  * Registers a TI clock to the common clock framework, and adds a clock
616  * alias for it. Returns a handle to the registered clock if successful,
617  * ERR_PTR value in failure.
618  */
619 struct clk *of_ti_clk_register(struct device_node *node, struct clk_hw *hw,
620                                const char *con)
621 {
622         struct clk *clk;
623         int ret;
624
625         ret = of_clk_hw_register(node, hw);
626         if (ret)
627                 return ERR_PTR(ret);
628
629         clk = hw->clk;
630         ret = ti_clk_add_alias(clk, con);
631         if (ret) {
632                 clk_unregister(clk);
633                 return ERR_PTR(ret);
634         }
635
636         return clk;
637 }
638
639 /**
640  * of_ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework
641  * @node: device node for this clock
642  * @hw: hardware clock handle
643  * @con: connection ID for this clock
644  *
645  * Registers a clk_hw_omap clock to the clock framewor, adds a clock alias
646  * for it, and adds the list to the available clk_hw_omap type clocks.
647  * Returns a handle to the registered clock if successful, ERR_PTR value
648  * in failure.
649  */
650 struct clk *of_ti_clk_register_omap_hw(struct device_node *node,
651                                        struct clk_hw *hw, const char *con)
652 {
653         struct clk *clk;
654         struct clk_hw_omap *oclk;
655
656         clk = of_ti_clk_register(node, hw, con);
657         if (IS_ERR(clk))
658                 return clk;
659
660         oclk = to_clk_hw_omap(hw);
661
662         list_add(&oclk->node, &clk_hw_omap_clocks);
663
664         return clk;
665 }
666
667 /**
668  * omap2_clk_for_each - call function for each registered clk_hw_omap
669  * @fn: pointer to a callback function
670  *
671  * Call @fn for each registered clk_hw_omap, passing @hw to each
672  * function.  @fn must return 0 for success or any other value for
673  * failure.  If @fn returns non-zero, the iteration across clocks
674  * will stop and the non-zero return value will be passed to the
675  * caller of omap2_clk_for_each().
676  */
677 int omap2_clk_for_each(int (*fn)(struct clk_hw_omap *hw))
678 {
679         int ret;
680         struct clk_hw_omap *hw;
681
682         list_for_each_entry(hw, &clk_hw_omap_clocks, node) {
683                 ret = (*fn)(hw);
684                 if (ret)
685                         break;
686         }
687
688         return ret;
689 }
690
691 /**
692  * omap2_clk_is_hw_omap - check if the provided clk_hw is OMAP clock
693  * @hw: clk_hw to check if it is an omap clock or not
694  *
695  * Checks if the provided clk_hw is OMAP clock or not. Returns true if
696  * it is, false otherwise.
697  */
698 bool omap2_clk_is_hw_omap(struct clk_hw *hw)
699 {
700         struct clk_hw_omap *oclk;
701
702         list_for_each_entry(oclk, &clk_hw_omap_clocks, node) {
703                 if (&oclk->hw == hw)
704                         return true;
705         }
706
707         return false;
708 }
This page took 0.067673 seconds and 4 git commands to generate.