1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/io.h>
16#include <linux/of_address.h>
17
18#include "clk-kona.h"
19
20
21#define selector_clear_exists(sel) ((sel)->width = 0)
22#define trigger_clear_exists(trig) FLAG_CLEAR(trig, TRIG, EXISTS)
23
24LIST_HEAD(ccu_list);
25
26
27
28static bool ccu_data_offsets_valid(struct ccu_data *ccu)
29{
30 struct ccu_policy *ccu_policy = &ccu->policy;
31 u32 limit;
32
33 limit = ccu->range - sizeof(u32);
34 limit = round_down(limit, sizeof(u32));
35 if (ccu_policy_exists(ccu_policy)) {
36 if (ccu_policy->enable.offset > limit) {
37 pr_err("%s: bad policy enable offset for %s "
38 "(%u > %u)\n", __func__,
39 ccu->name, ccu_policy->enable.offset, limit);
40 return false;
41 }
42 if (ccu_policy->control.offset > limit) {
43 pr_err("%s: bad policy control offset for %s "
44 "(%u > %u)\n", __func__,
45 ccu->name, ccu_policy->control.offset, limit);
46 return false;
47 }
48 }
49
50 return true;
51}
52
53static bool clk_requires_trigger(struct kona_clk *bcm_clk)
54{
55 struct peri_clk_data *peri = bcm_clk->u.peri;
56 struct bcm_clk_sel *sel;
57 struct bcm_clk_div *div;
58
59 if (bcm_clk->type != bcm_clk_peri)
60 return false;
61
62 sel = &peri->sel;
63 if (sel->parent_count && selector_exists(sel))
64 return true;
65
66 div = &peri->div;
67 if (!divider_exists(div))
68 return false;
69
70
71 if (!divider_is_fixed(div))
72 return true;
73
74 div = &peri->pre_div;
75
76 return divider_exists(div) && !divider_is_fixed(div);
77}
78
79static bool peri_clk_data_offsets_valid(struct kona_clk *bcm_clk)
80{
81 struct peri_clk_data *peri;
82 struct bcm_clk_policy *policy;
83 struct bcm_clk_gate *gate;
84 struct bcm_clk_hyst *hyst;
85 struct bcm_clk_div *div;
86 struct bcm_clk_sel *sel;
87 struct bcm_clk_trig *trig;
88 const char *name;
89 u32 range;
90 u32 limit;
91
92 BUG_ON(bcm_clk->type != bcm_clk_peri);
93 peri = bcm_clk->u.peri;
94 name = bcm_clk->init_data.name;
95 range = bcm_clk->ccu->range;
96
97 limit = range - sizeof(u32);
98 limit = round_down(limit, sizeof(u32));
99
100 policy = &peri->policy;
101 if (policy_exists(policy)) {
102 if (policy->offset > limit) {
103 pr_err("%s: bad policy offset for %s (%u > %u)\n",
104 __func__, name, policy->offset, limit);
105 return false;
106 }
107 }
108
109 gate = &peri->gate;
110 hyst = &peri->hyst;
111 if (gate_exists(gate)) {
112 if (gate->offset > limit) {
113 pr_err("%s: bad gate offset for %s (%u > %u)\n",
114 __func__, name, gate->offset, limit);
115 return false;
116 }
117
118 if (hyst_exists(hyst)) {
119 if (hyst->offset > limit) {
120 pr_err("%s: bad hysteresis offset for %s "
121 "(%u > %u)\n", __func__,
122 name, hyst->offset, limit);
123 return false;
124 }
125 }
126 } else if (hyst_exists(hyst)) {
127 pr_err("%s: hysteresis but no gate for %s\n", __func__, name);
128 return false;
129 }
130
131 div = &peri->div;
132 if (divider_exists(div)) {
133 if (div->u.s.offset > limit) {
134 pr_err("%s: bad divider offset for %s (%u > %u)\n",
135 __func__, name, div->u.s.offset, limit);
136 return false;
137 }
138 }
139
140 div = &peri->pre_div;
141 if (divider_exists(div)) {
142 if (div->u.s.offset > limit) {
143 pr_err("%s: bad pre-divider offset for %s "
144 "(%u > %u)\n",
145 __func__, name, div->u.s.offset, limit);
146 return false;
147 }
148 }
149
150 sel = &peri->sel;
151 if (selector_exists(sel)) {
152 if (sel->offset > limit) {
153 pr_err("%s: bad selector offset for %s (%u > %u)\n",
154 __func__, name, sel->offset, limit);
155 return false;
156 }
157 }
158
159 trig = &peri->trig;
160 if (trigger_exists(trig)) {
161 if (trig->offset > limit) {
162 pr_err("%s: bad trigger offset for %s (%u > %u)\n",
163 __func__, name, trig->offset, limit);
164 return false;
165 }
166 }
167
168 trig = &peri->pre_trig;
169 if (trigger_exists(trig)) {
170 if (trig->offset > limit) {
171 pr_err("%s: bad pre-trigger offset for %s (%u > %u)\n",
172 __func__, name, trig->offset, limit);
173 return false;
174 }
175 }
176
177 return true;
178}
179
180
181static bool bit_posn_valid(u32 bit_posn, const char *field_name,
182 const char *clock_name)
183{
184 u32 limit = BITS_PER_BYTE * sizeof(u32) - 1;
185
186 if (bit_posn > limit) {
187 pr_err("%s: bad %s bit for %s (%u > %u)\n", __func__,
188 field_name, clock_name, bit_posn, limit);
189 return false;
190 }
191 return true;
192}
193
194
195
196
197
198
199
200
201static bool bitfield_valid(u32 shift, u32 width, const char *field_name,
202 const char *clock_name)
203{
204 u32 limit = BITS_PER_BYTE * sizeof(u32);
205
206 if (!width) {
207 pr_err("%s: bad %s field width 0 for %s\n", __func__,
208 field_name, clock_name);
209 return false;
210 }
211 if (shift + width > limit) {
212 pr_err("%s: bad %s for %s (%u + %u > %u)\n", __func__,
213 field_name, clock_name, shift, width, limit);
214 return false;
215 }
216 return true;
217}
218
219static bool
220ccu_policy_valid(struct ccu_policy *ccu_policy, const char *ccu_name)
221{
222 struct bcm_lvm_en *enable = &ccu_policy->enable;
223 struct bcm_policy_ctl *control;
224
225 if (!bit_posn_valid(enable->bit, "policy enable", ccu_name))
226 return false;
227
228 control = &ccu_policy->control;
229 if (!bit_posn_valid(control->go_bit, "policy control GO", ccu_name))
230 return false;
231
232 if (!bit_posn_valid(control->atl_bit, "policy control ATL", ccu_name))
233 return false;
234
235 if (!bit_posn_valid(control->ac_bit, "policy control AC", ccu_name))
236 return false;
237
238 return true;
239}
240
241static bool policy_valid(struct bcm_clk_policy *policy, const char *clock_name)
242{
243 if (!bit_posn_valid(policy->bit, "policy", clock_name))
244 return false;
245
246 return true;
247}
248
249
250
251
252
253
254
255static bool gate_valid(struct bcm_clk_gate *gate, const char *field_name,
256 const char *clock_name)
257{
258 if (!bit_posn_valid(gate->status_bit, "gate status", clock_name))
259 return false;
260
261 if (gate_is_sw_controllable(gate)) {
262 if (!bit_posn_valid(gate->en_bit, "gate enable", clock_name))
263 return false;
264
265 if (gate_is_hw_controllable(gate)) {
266 if (!bit_posn_valid(gate->hw_sw_sel_bit,
267 "gate hw/sw select",
268 clock_name))
269 return false;
270 }
271 } else {
272 BUG_ON(!gate_is_hw_controllable(gate));
273 }
274
275 return true;
276}
277
278static bool hyst_valid(struct bcm_clk_hyst *hyst, const char *clock_name)
279{
280 if (!bit_posn_valid(hyst->en_bit, "hysteresis enable", clock_name))
281 return false;
282
283 if (!bit_posn_valid(hyst->val_bit, "hysteresis value", clock_name))
284 return false;
285
286 return true;
287}
288
289
290
291
292
293static bool sel_valid(struct bcm_clk_sel *sel, const char *field_name,
294 const char *clock_name)
295{
296 if (!bitfield_valid(sel->shift, sel->width, field_name, clock_name))
297 return false;
298
299 if (sel->parent_count) {
300 u32 max_sel;
301 u32 limit;
302
303
304
305
306
307
308
309
310
311 max_sel = sel->parent_sel[sel->parent_count - 1];
312 limit = (1 << sel->width) - 1;
313 if (max_sel > limit) {
314 pr_err("%s: bad selector for %s "
315 "(%u needs > %u bits)\n",
316 __func__, clock_name, max_sel,
317 sel->width);
318 return false;
319 }
320 } else {
321 pr_warn("%s: ignoring selector for %s (no parents)\n",
322 __func__, clock_name);
323 selector_clear_exists(sel);
324 kfree(sel->parent_sel);
325 sel->parent_sel = NULL;
326 }
327
328 return true;
329}
330
331
332
333
334
335
336
337static bool div_valid(struct bcm_clk_div *div, const char *field_name,
338 const char *clock_name)
339{
340 if (divider_is_fixed(div)) {
341
342 if (div->u.fixed == 0) {
343 pr_err("%s: bad %s fixed value 0 for %s\n", __func__,
344 field_name, clock_name);
345 return false;
346 }
347 return true;
348 }
349 if (!bitfield_valid(div->u.s.shift, div->u.s.width,
350 field_name, clock_name))
351 return false;
352
353 if (divider_has_fraction(div))
354 if (div->u.s.frac_width > div->u.s.width) {
355 pr_warn("%s: bad %s fraction width for %s (%u > %u)\n",
356 __func__, field_name, clock_name,
357 div->u.s.frac_width, div->u.s.width);
358 return false;
359 }
360
361 return true;
362}
363
364
365
366
367
368
369
370static bool kona_dividers_valid(struct kona_clk *bcm_clk)
371{
372 struct peri_clk_data *peri = bcm_clk->u.peri;
373 struct bcm_clk_div *div;
374 struct bcm_clk_div *pre_div;
375 u32 limit;
376
377 BUG_ON(bcm_clk->type != bcm_clk_peri);
378
379 if (!divider_exists(&peri->div) || !divider_exists(&peri->pre_div))
380 return true;
381
382 div = &peri->div;
383 pre_div = &peri->pre_div;
384 if (divider_is_fixed(div) || divider_is_fixed(pre_div))
385 return true;
386
387 limit = BITS_PER_BYTE * sizeof(u32);
388
389 return div->u.s.frac_width + pre_div->u.s.frac_width <= limit;
390}
391
392
393
394static bool trig_valid(struct bcm_clk_trig *trig, const char *field_name,
395 const char *clock_name)
396{
397 return bit_posn_valid(trig->bit, field_name, clock_name);
398}
399
400
401static bool
402peri_clk_data_valid(struct kona_clk *bcm_clk)
403{
404 struct peri_clk_data *peri;
405 struct bcm_clk_policy *policy;
406 struct bcm_clk_gate *gate;
407 struct bcm_clk_hyst *hyst;
408 struct bcm_clk_sel *sel;
409 struct bcm_clk_div *div;
410 struct bcm_clk_div *pre_div;
411 struct bcm_clk_trig *trig;
412 const char *name;
413
414 BUG_ON(bcm_clk->type != bcm_clk_peri);
415
416
417
418
419
420
421 if (!peri_clk_data_offsets_valid(bcm_clk))
422 return false;
423
424 peri = bcm_clk->u.peri;
425 name = bcm_clk->init_data.name;
426
427 policy = &peri->policy;
428 if (policy_exists(policy) && !policy_valid(policy, name))
429 return false;
430
431 gate = &peri->gate;
432 if (gate_exists(gate) && !gate_valid(gate, "gate", name))
433 return false;
434
435 hyst = &peri->hyst;
436 if (hyst_exists(hyst) && !hyst_valid(hyst, name))
437 return false;
438
439 sel = &peri->sel;
440 if (selector_exists(sel)) {
441 if (!sel_valid(sel, "selector", name))
442 return false;
443
444 } else if (sel->parent_count > 1) {
445 pr_err("%s: multiple parents but no selector for %s\n",
446 __func__, name);
447
448 return false;
449 }
450
451 div = &peri->div;
452 pre_div = &peri->pre_div;
453 if (divider_exists(div)) {
454 if (!div_valid(div, "divider", name))
455 return false;
456
457 if (divider_exists(pre_div))
458 if (!div_valid(pre_div, "pre-divider", name))
459 return false;
460 } else if (divider_exists(pre_div)) {
461 pr_err("%s: pre-divider but no divider for %s\n", __func__,
462 name);
463 return false;
464 }
465
466 trig = &peri->trig;
467 if (trigger_exists(trig)) {
468 if (!trig_valid(trig, "trigger", name))
469 return false;
470
471 if (trigger_exists(&peri->pre_trig)) {
472 if (!trig_valid(trig, "pre-trigger", name)) {
473 return false;
474 }
475 }
476 if (!clk_requires_trigger(bcm_clk)) {
477 pr_warn("%s: ignoring trigger for %s (not needed)\n",
478 __func__, name);
479 trigger_clear_exists(trig);
480 }
481 } else if (trigger_exists(&peri->pre_trig)) {
482 pr_err("%s: pre-trigger but no trigger for %s\n", __func__,
483 name);
484 return false;
485 } else if (clk_requires_trigger(bcm_clk)) {
486 pr_err("%s: required trigger missing for %s\n", __func__,
487 name);
488 return false;
489 }
490
491 return kona_dividers_valid(bcm_clk);
492}
493
494static bool kona_clk_valid(struct kona_clk *bcm_clk)
495{
496 switch (bcm_clk->type) {
497 case bcm_clk_peri:
498 if (!peri_clk_data_valid(bcm_clk))
499 return false;
500 break;
501 default:
502 pr_err("%s: unrecognized clock type (%d)\n", __func__,
503 (int)bcm_clk->type);
504 return false;
505 }
506 return true;
507}
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537static u32 *parent_process(const char *clocks[],
538 u32 *count, const char ***names)
539{
540 static const char **parent_names;
541 static u32 *parent_sel;
542 const char **clock;
543 u32 parent_count;
544 u32 bad_count = 0;
545 u32 orig_count;
546 u32 i;
547 u32 j;
548
549 *count = 0;
550 *names = NULL;
551 if (!clocks)
552 return NULL;
553
554
555
556
557
558 for (clock = clocks; *clock; clock++)
559 if (*clock == BAD_CLK_NAME)
560 bad_count++;
561 orig_count = (u32)(clock - clocks);
562 parent_count = orig_count - bad_count;
563
564
565 if (!parent_count)
566 return NULL;
567
568
569 if (parent_count > PARENT_COUNT_MAX) {
570 pr_err("%s: too many parents (%u > %u)\n", __func__,
571 parent_count, PARENT_COUNT_MAX);
572 return ERR_PTR(-EINVAL);
573 }
574
575
576
577
578
579
580
581
582 parent_names = kmalloc(parent_count * sizeof(parent_names), GFP_KERNEL);
583 if (!parent_names) {
584 pr_err("%s: error allocating %u parent names\n", __func__,
585 parent_count);
586 return ERR_PTR(-ENOMEM);
587 }
588
589
590
591 parent_sel = kmalloc(parent_count * sizeof(*parent_sel), GFP_KERNEL);
592 if (!parent_sel) {
593 pr_err("%s: error allocating %u parent selectors\n", __func__,
594 parent_count);
595 kfree(parent_names);
596
597 return ERR_PTR(-ENOMEM);
598 }
599
600
601 for (i = 0, j = 0; i < orig_count; i++) {
602 if (clocks[i] != BAD_CLK_NAME) {
603 parent_names[j] = clocks[i];
604 parent_sel[j] = i;
605 j++;
606 }
607 }
608 *names = parent_names;
609 *count = parent_count;
610
611 return parent_sel;
612}
613
614static int
615clk_sel_setup(const char **clocks, struct bcm_clk_sel *sel,
616 struct clk_init_data *init_data)
617{
618 const char **parent_names = NULL;
619 u32 parent_count = 0;
620 u32 *parent_sel;
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636 parent_sel = parent_process(clocks, &parent_count, &parent_names);
637 if (IS_ERR(parent_sel)) {
638 int ret = PTR_ERR(parent_sel);
639
640 pr_err("%s: error processing parent clocks for %s (%d)\n",
641 __func__, init_data->name, ret);
642
643 return ret;
644 }
645
646 init_data->parent_names = parent_names;
647 init_data->num_parents = parent_count;
648
649 sel->parent_count = parent_count;
650 sel->parent_sel = parent_sel;
651
652 return 0;
653}
654
655static void clk_sel_teardown(struct bcm_clk_sel *sel,
656 struct clk_init_data *init_data)
657{
658 kfree(sel->parent_sel);
659 sel->parent_sel = NULL;
660 sel->parent_count = 0;
661
662 init_data->num_parents = 0;
663 kfree(init_data->parent_names);
664 init_data->parent_names = NULL;
665}
666
667static void peri_clk_teardown(struct peri_clk_data *data,
668 struct clk_init_data *init_data)
669{
670 clk_sel_teardown(&data->sel, init_data);
671}
672
673
674
675
676
677
678
679static int
680peri_clk_setup(struct peri_clk_data *data, struct clk_init_data *init_data)
681{
682 init_data->flags = CLK_IGNORE_UNUSED;
683
684 return clk_sel_setup(data->clocks, &data->sel, init_data);
685}
686
687static void bcm_clk_teardown(struct kona_clk *bcm_clk)
688{
689 switch (bcm_clk->type) {
690 case bcm_clk_peri:
691 peri_clk_teardown(bcm_clk->u.data, &bcm_clk->init_data);
692 break;
693 default:
694 break;
695 }
696 bcm_clk->u.data = NULL;
697 bcm_clk->type = bcm_clk_none;
698}
699
700static void kona_clk_teardown(struct clk *clk)
701{
702 struct clk_hw *hw;
703 struct kona_clk *bcm_clk;
704
705 if (!clk)
706 return;
707
708 hw = __clk_get_hw(clk);
709 if (!hw) {
710 pr_err("%s: clk %p has null hw pointer\n", __func__, clk);
711 return;
712 }
713 clk_unregister(clk);
714
715 bcm_clk = to_kona_clk(hw);
716 bcm_clk_teardown(bcm_clk);
717}
718
719struct clk *kona_clk_setup(struct kona_clk *bcm_clk)
720{
721 struct clk_init_data *init_data = &bcm_clk->init_data;
722 struct clk *clk = NULL;
723
724 switch (bcm_clk->type) {
725 case bcm_clk_peri:
726 if (peri_clk_setup(bcm_clk->u.data, init_data))
727 return NULL;
728 break;
729 default:
730 pr_err("%s: clock type %d invalid for %s\n", __func__,
731 (int)bcm_clk->type, init_data->name);
732 return NULL;
733 }
734
735
736 if (!kona_clk_valid(bcm_clk)) {
737 pr_err("%s: clock data invalid for %s\n", __func__,
738 init_data->name);
739 goto out_teardown;
740 }
741
742 bcm_clk->hw.init = init_data;
743 clk = clk_register(NULL, &bcm_clk->hw);
744 if (IS_ERR(clk)) {
745 pr_err("%s: error registering clock %s (%ld)\n", __func__,
746 init_data->name, PTR_ERR(clk));
747 goto out_teardown;
748 }
749 BUG_ON(!clk);
750
751 return clk;
752out_teardown:
753 bcm_clk_teardown(bcm_clk);
754
755 return NULL;
756}
757
758static void ccu_clks_teardown(struct ccu_data *ccu)
759{
760 u32 i;
761
762 for (i = 0; i < ccu->clk_data.clk_num; i++)
763 kona_clk_teardown(ccu->clk_data.clks[i]);
764 kfree(ccu->clk_data.clks);
765}
766
767static void kona_ccu_teardown(struct ccu_data *ccu)
768{
769 kfree(ccu->clk_data.clks);
770 ccu->clk_data.clks = NULL;
771 if (!ccu->base)
772 return;
773
774 of_clk_del_provider(ccu->node);
775 ccu_clks_teardown(ccu);
776 list_del(&ccu->links);
777 of_node_put(ccu->node);
778 ccu->node = NULL;
779 iounmap(ccu->base);
780 ccu->base = NULL;
781}
782
783static bool ccu_data_valid(struct ccu_data *ccu)
784{
785 struct ccu_policy *ccu_policy;
786
787 if (!ccu_data_offsets_valid(ccu))
788 return false;
789
790 ccu_policy = &ccu->policy;
791 if (ccu_policy_exists(ccu_policy))
792 if (!ccu_policy_valid(ccu_policy, ccu->name))
793 return false;
794
795 return true;
796}
797
798
799
800
801
802void __init kona_dt_ccu_setup(struct ccu_data *ccu,
803 struct device_node *node)
804{
805 struct resource res = { 0 };
806 resource_size_t range;
807 unsigned int i;
808 int ret;
809
810 if (ccu->clk_data.clk_num) {
811 size_t size;
812
813 size = ccu->clk_data.clk_num * sizeof(*ccu->clk_data.clks);
814 ccu->clk_data.clks = kzalloc(size, GFP_KERNEL);
815 if (!ccu->clk_data.clks) {
816 pr_err("%s: unable to allocate %u clocks for %s\n",
817 __func__, ccu->clk_data.clk_num, node->name);
818 return;
819 }
820 }
821
822 ret = of_address_to_resource(node, 0, &res);
823 if (ret) {
824 pr_err("%s: no valid CCU registers found for %s\n", __func__,
825 node->name);
826 goto out_err;
827 }
828
829 range = resource_size(&res);
830 if (range > (resource_size_t)U32_MAX) {
831 pr_err("%s: address range too large for %s\n", __func__,
832 node->name);
833 goto out_err;
834 }
835
836 ccu->range = (u32)range;
837
838 if (!ccu_data_valid(ccu)) {
839 pr_err("%s: ccu data not valid for %s\n", __func__, node->name);
840 goto out_err;
841 }
842
843 ccu->base = ioremap(res.start, ccu->range);
844 if (!ccu->base) {
845 pr_err("%s: unable to map CCU registers for %s\n", __func__,
846 node->name);
847 goto out_err;
848 }
849 ccu->node = of_node_get(node);
850 list_add_tail(&ccu->links, &ccu_list);
851
852
853
854
855
856
857 for (i = 0; i < ccu->clk_data.clk_num; i++) {
858 if (!ccu->kona_clks[i].ccu)
859 continue;
860 ccu->clk_data.clks[i] = kona_clk_setup(&ccu->kona_clks[i]);
861 }
862
863 ret = of_clk_add_provider(node, of_clk_src_onecell_get, &ccu->clk_data);
864 if (ret) {
865 pr_err("%s: error adding ccu %s as provider (%d)\n", __func__,
866 node->name, ret);
867 goto out_err;
868 }
869
870 if (!kona_ccu_init(ccu))
871 pr_err("Broadcom %s initialization had errors\n", node->name);
872
873 return;
874out_err:
875 kona_ccu_teardown(ccu);
876 pr_err("Broadcom %s setup aborted\n", node->name);
877}
878