Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2013, 2018, The Linux Foundation. All rights reserved.
4 */
5
6#include <linux/kernel.h>
7#include <linux/bitops.h>
8#include <linux/err.h>
9#include <linux/bug.h>
10#include <linux/export.h>
11#include <linux/clk-provider.h>
12#include <linux/delay.h>
13#include <linux/regmap.h>
14#include <linux/math64.h>
15#include <linux/slab.h>
16
17#include <asm/div64.h>
18
19#include "clk-rcg.h"
20#include "common.h"
21
22#define CMD_REG 0x0
23#define CMD_UPDATE BIT(0)
24#define CMD_ROOT_EN BIT(1)
25#define CMD_DIRTY_CFG BIT(4)
26#define CMD_DIRTY_N BIT(5)
27#define CMD_DIRTY_M BIT(6)
28#define CMD_DIRTY_D BIT(7)
29#define CMD_ROOT_OFF BIT(31)
30
31#define CFG_REG 0x4
32#define CFG_SRC_DIV_SHIFT 0
33#define CFG_SRC_SEL_SHIFT 8
34#define CFG_SRC_SEL_MASK (0x7 << CFG_SRC_SEL_SHIFT)
35#define CFG_MODE_SHIFT 12
36#define CFG_MODE_MASK (0x3 << CFG_MODE_SHIFT)
37#define CFG_MODE_DUAL_EDGE (0x2 << CFG_MODE_SHIFT)
38#define CFG_HW_CLK_CTRL_MASK BIT(20)
39
40#define M_REG 0x8
41#define N_REG 0xc
42#define D_REG 0x10
43
44/* Dynamic Frequency Scaling */
45#define MAX_PERF_LEVEL 8
46#define SE_CMD_DFSR_OFFSET 0x14
47#define SE_CMD_DFS_EN BIT(0)
48#define SE_PERF_DFSR(level) (0x1c + 0x4 * (level))
49#define SE_PERF_M_DFSR(level) (0x5c + 0x4 * (level))
50#define SE_PERF_N_DFSR(level) (0x9c + 0x4 * (level))
51
52enum freq_policy {
53 FLOOR,
54 CEIL,
55};
56
57static int clk_rcg2_is_enabled(struct clk_hw *hw)
58{
59 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
60 u32 cmd;
61 int ret;
62
63 ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, &cmd);
64 if (ret)
65 return ret;
66
67 return (cmd & CMD_ROOT_OFF) == 0;
68}
69
70static u8 clk_rcg2_get_parent(struct clk_hw *hw)
71{
72 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
73 int num_parents = clk_hw_get_num_parents(hw);
74 u32 cfg;
75 int i, ret;
76
77 ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
78 if (ret)
79 goto err;
80
81 cfg &= CFG_SRC_SEL_MASK;
82 cfg >>= CFG_SRC_SEL_SHIFT;
83
84 for (i = 0; i < num_parents; i++)
85 if (cfg == rcg->parent_map[i].cfg)
86 return i;
87
88err:
89 pr_debug("%s: Clock %s has invalid parent, using default.\n",
90 __func__, clk_hw_get_name(hw));
91 return 0;
92}
93
94static int update_config(struct clk_rcg2 *rcg)
95{
96 int count, ret;
97 u32 cmd;
98 struct clk_hw *hw = &rcg->clkr.hw;
99 const char *name = clk_hw_get_name(hw);
100
101 ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG,
102 CMD_UPDATE, CMD_UPDATE);
103 if (ret)
104 return ret;
105
106 /* Wait for update to take effect */
107 for (count = 500; count > 0; count--) {
108 ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, &cmd);
109 if (ret)
110 return ret;
111 if (!(cmd & CMD_UPDATE))
112 return 0;
113 udelay(1);
114 }
115
116 WARN(1, "%s: rcg didn't update its configuration.", name);
117 return 0;
118}
119
120static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)
121{
122 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
123 int ret;
124 u32 cfg = rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT;
125
126 ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
127 CFG_SRC_SEL_MASK, cfg);
128 if (ret)
129 return ret;
130
131 return update_config(rcg);
132}
133
134/*
135 * Calculate m/n:d rate
136 *
137 * parent_rate m
138 * rate = ----------- x ---
139 * hid_div n
140 */
141static unsigned long
142calc_rate(unsigned long rate, u32 m, u32 n, u32 mode, u32 hid_div)
143{
144 if (hid_div) {
145 rate *= 2;
146 rate /= hid_div + 1;
147 }
148
149 if (mode) {
150 u64 tmp = rate;
151 tmp *= m;
152 do_div(tmp, n);
153 rate = tmp;
154 }
155
156 return rate;
157}
158
159static unsigned long
160clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
161{
162 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
163 u32 cfg, hid_div, m = 0, n = 0, mode = 0, mask;
164
165 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
166
167 if (rcg->mnd_width) {
168 mask = BIT(rcg->mnd_width) - 1;
169 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + M_REG, &m);
170 m &= mask;
171 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + N_REG, &n);
172 n = ~n;
173 n &= mask;
174 n += m;
175 mode = cfg & CFG_MODE_MASK;
176 mode >>= CFG_MODE_SHIFT;
177 }
178
179 mask = BIT(rcg->hid_width) - 1;
180 hid_div = cfg >> CFG_SRC_DIV_SHIFT;
181 hid_div &= mask;
182
183 return calc_rate(parent_rate, m, n, mode, hid_div);
184}
185
186static int _freq_tbl_determine_rate(struct clk_hw *hw, const struct freq_tbl *f,
187 struct clk_rate_request *req,
188 enum freq_policy policy)
189{
190 unsigned long clk_flags, rate = req->rate;
191 struct clk_hw *p;
192 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
193 int index;
194
195 switch (policy) {
196 case FLOOR:
197 f = qcom_find_freq_floor(f, rate);
198 break;
199 case CEIL:
200 f = qcom_find_freq(f, rate);
201 break;
202 default:
203 return -EINVAL;
204 };
205
206 if (!f)
207 return -EINVAL;
208
209 index = qcom_find_src_index(hw, rcg->parent_map, f->src);
210 if (index < 0)
211 return index;
212
213 clk_flags = clk_hw_get_flags(hw);
214 p = clk_hw_get_parent_by_index(hw, index);
215 if (clk_flags & CLK_SET_RATE_PARENT) {
216 rate = f->freq;
217 if (f->pre_div) {
218 rate /= 2;
219 rate *= f->pre_div + 1;
220 }
221
222 if (f->n) {
223 u64 tmp = rate;
224 tmp = tmp * f->n;
225 do_div(tmp, f->m);
226 rate = tmp;
227 }
228 } else {
229 rate = clk_hw_get_rate(p);
230 }
231 req->best_parent_hw = p;
232 req->best_parent_rate = rate;
233 req->rate = f->freq;
234
235 return 0;
236}
237
238static int clk_rcg2_determine_rate(struct clk_hw *hw,
239 struct clk_rate_request *req)
240{
241 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
242
243 return _freq_tbl_determine_rate(hw, rcg->freq_tbl, req, CEIL);
244}
245
246static int clk_rcg2_determine_floor_rate(struct clk_hw *hw,
247 struct clk_rate_request *req)
248{
249 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
250
251 return _freq_tbl_determine_rate(hw, rcg->freq_tbl, req, FLOOR);
252}
253
254static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)
255{
256 u32 cfg, mask;
257 struct clk_hw *hw = &rcg->clkr.hw;
258 int ret, index = qcom_find_src_index(hw, rcg->parent_map, f->src);
259
260 if (index < 0)
261 return index;
262
263 if (rcg->mnd_width && f->n) {
264 mask = BIT(rcg->mnd_width) - 1;
265 ret = regmap_update_bits(rcg->clkr.regmap,
266 rcg->cmd_rcgr + M_REG, mask, f->m);
267 if (ret)
268 return ret;
269
270 ret = regmap_update_bits(rcg->clkr.regmap,
271 rcg->cmd_rcgr + N_REG, mask, ~(f->n - f->m));
272 if (ret)
273 return ret;
274
275 ret = regmap_update_bits(rcg->clkr.regmap,
276 rcg->cmd_rcgr + D_REG, mask, ~f->n);
277 if (ret)
278 return ret;
279 }
280
281 mask = BIT(rcg->hid_width) - 1;
282 mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK | CFG_HW_CLK_CTRL_MASK;
283 cfg = f->pre_div << CFG_SRC_DIV_SHIFT;
284 cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT;
285 if (rcg->mnd_width && f->n && (f->m != f->n))
286 cfg |= CFG_MODE_DUAL_EDGE;
287
288 return regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
289 mask, cfg);
290}
291
292static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)
293{
294 int ret;
295
296 ret = __clk_rcg2_configure(rcg, f);
297 if (ret)
298 return ret;
299
300 return update_config(rcg);
301}
302
303static int __clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
304 enum freq_policy policy)
305{
306 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
307 const struct freq_tbl *f;
308
309 switch (policy) {
310 case FLOOR:
311 f = qcom_find_freq_floor(rcg->freq_tbl, rate);
312 break;
313 case CEIL:
314 f = qcom_find_freq(rcg->freq_tbl, rate);
315 break;
316 default:
317 return -EINVAL;
318 };
319
320 if (!f)
321 return -EINVAL;
322
323 return clk_rcg2_configure(rcg, f);
324}
325
326static int clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
327 unsigned long parent_rate)
328{
329 return __clk_rcg2_set_rate(hw, rate, CEIL);
330}
331
332static int clk_rcg2_set_floor_rate(struct clk_hw *hw, unsigned long rate,
333 unsigned long parent_rate)
334{
335 return __clk_rcg2_set_rate(hw, rate, FLOOR);
336}
337
338static int clk_rcg2_set_rate_and_parent(struct clk_hw *hw,
339 unsigned long rate, unsigned long parent_rate, u8 index)
340{
341 return __clk_rcg2_set_rate(hw, rate, CEIL);
342}
343
344static int clk_rcg2_set_floor_rate_and_parent(struct clk_hw *hw,
345 unsigned long rate, unsigned long parent_rate, u8 index)
346{
347 return __clk_rcg2_set_rate(hw, rate, FLOOR);
348}
349
350const struct clk_ops clk_rcg2_ops = {
351 .is_enabled = clk_rcg2_is_enabled,
352 .get_parent = clk_rcg2_get_parent,
353 .set_parent = clk_rcg2_set_parent,
354 .recalc_rate = clk_rcg2_recalc_rate,
355 .determine_rate = clk_rcg2_determine_rate,
356 .set_rate = clk_rcg2_set_rate,
357 .set_rate_and_parent = clk_rcg2_set_rate_and_parent,
358};
359EXPORT_SYMBOL_GPL(clk_rcg2_ops);
360
361const struct clk_ops clk_rcg2_floor_ops = {
362 .is_enabled = clk_rcg2_is_enabled,
363 .get_parent = clk_rcg2_get_parent,
364 .set_parent = clk_rcg2_set_parent,
365 .recalc_rate = clk_rcg2_recalc_rate,
366 .determine_rate = clk_rcg2_determine_floor_rate,
367 .set_rate = clk_rcg2_set_floor_rate,
368 .set_rate_and_parent = clk_rcg2_set_floor_rate_and_parent,
369};
370EXPORT_SYMBOL_GPL(clk_rcg2_floor_ops);
371
372struct frac_entry {
373 int num;
374 int den;
375};
376
377static const struct frac_entry frac_table_675m[] = { /* link rate of 270M */
378 { 52, 295 }, /* 119 M */
379 { 11, 57 }, /* 130.25 M */
380 { 63, 307 }, /* 138.50 M */
381 { 11, 50 }, /* 148.50 M */
382 { 47, 206 }, /* 154 M */
383 { 31, 100 }, /* 205.25 M */
384 { 107, 269 }, /* 268.50 M */
385 { },
386};
387
388static struct frac_entry frac_table_810m[] = { /* Link rate of 162M */
389 { 31, 211 }, /* 119 M */
390 { 32, 199 }, /* 130.25 M */
391 { 63, 307 }, /* 138.50 M */
392 { 11, 60 }, /* 148.50 M */
393 { 50, 263 }, /* 154 M */
394 { 31, 120 }, /* 205.25 M */
395 { 119, 359 }, /* 268.50 M */
396 { },
397};
398
399static int clk_edp_pixel_set_rate(struct clk_hw *hw, unsigned long rate,
400 unsigned long parent_rate)
401{
402 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
403 struct freq_tbl f = *rcg->freq_tbl;
404 const struct frac_entry *frac;
405 int delta = 100000;
406 s64 src_rate = parent_rate;
407 s64 request;
408 u32 mask = BIT(rcg->hid_width) - 1;
409 u32 hid_div;
410
411 if (src_rate == 810000000)
412 frac = frac_table_810m;
413 else
414 frac = frac_table_675m;
415
416 for (; frac->num; frac++) {
417 request = rate;
418 request *= frac->den;
419 request = div_s64(request, frac->num);
420 if ((src_rate < (request - delta)) ||
421 (src_rate > (request + delta)))
422 continue;
423
424 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
425 &hid_div);
426 f.pre_div = hid_div;
427 f.pre_div >>= CFG_SRC_DIV_SHIFT;
428 f.pre_div &= mask;
429 f.m = frac->num;
430 f.n = frac->den;
431
432 return clk_rcg2_configure(rcg, &f);
433 }
434
435 return -EINVAL;
436}
437
438static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw,
439 unsigned long rate, unsigned long parent_rate, u8 index)
440{
441 /* Parent index is set statically in frequency table */
442 return clk_edp_pixel_set_rate(hw, rate, parent_rate);
443}
444
445static int clk_edp_pixel_determine_rate(struct clk_hw *hw,
446 struct clk_rate_request *req)
447{
448 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
449 const struct freq_tbl *f = rcg->freq_tbl;
450 const struct frac_entry *frac;
451 int delta = 100000;
452 s64 request;
453 u32 mask = BIT(rcg->hid_width) - 1;
454 u32 hid_div;
455 int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
456
457 /* Force the correct parent */
458 req->best_parent_hw = clk_hw_get_parent_by_index(hw, index);
459 req->best_parent_rate = clk_hw_get_rate(req->best_parent_hw);
460
461 if (req->best_parent_rate == 810000000)
462 frac = frac_table_810m;
463 else
464 frac = frac_table_675m;
465
466 for (; frac->num; frac++) {
467 request = req->rate;
468 request *= frac->den;
469 request = div_s64(request, frac->num);
470 if ((req->best_parent_rate < (request - delta)) ||
471 (req->best_parent_rate > (request + delta)))
472 continue;
473
474 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
475 &hid_div);
476 hid_div >>= CFG_SRC_DIV_SHIFT;
477 hid_div &= mask;
478
479 req->rate = calc_rate(req->best_parent_rate,
480 frac->num, frac->den,
481 !!frac->den, hid_div);
482 return 0;
483 }
484
485 return -EINVAL;
486}
487
488const struct clk_ops clk_edp_pixel_ops = {
489 .is_enabled = clk_rcg2_is_enabled,
490 .get_parent = clk_rcg2_get_parent,
491 .set_parent = clk_rcg2_set_parent,
492 .recalc_rate = clk_rcg2_recalc_rate,
493 .set_rate = clk_edp_pixel_set_rate,
494 .set_rate_and_parent = clk_edp_pixel_set_rate_and_parent,
495 .determine_rate = clk_edp_pixel_determine_rate,
496};
497EXPORT_SYMBOL_GPL(clk_edp_pixel_ops);
498
499static int clk_byte_determine_rate(struct clk_hw *hw,
500 struct clk_rate_request *req)
501{
502 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
503 const struct freq_tbl *f = rcg->freq_tbl;
504 int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
505 unsigned long parent_rate, div;
506 u32 mask = BIT(rcg->hid_width) - 1;
507 struct clk_hw *p;
508
509 if (req->rate == 0)
510 return -EINVAL;
511
512 req->best_parent_hw = p = clk_hw_get_parent_by_index(hw, index);
513 req->best_parent_rate = parent_rate = clk_hw_round_rate(p, req->rate);
514
515 div = DIV_ROUND_UP((2 * parent_rate), req->rate) - 1;
516 div = min_t(u32, div, mask);
517
518 req->rate = calc_rate(parent_rate, 0, 0, 0, div);
519
520 return 0;
521}
522
523static int clk_byte_set_rate(struct clk_hw *hw, unsigned long rate,
524 unsigned long parent_rate)
525{
526 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
527 struct freq_tbl f = *rcg->freq_tbl;
528 unsigned long div;
529 u32 mask = BIT(rcg->hid_width) - 1;
530
531 div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
532 div = min_t(u32, div, mask);
533
534 f.pre_div = div;
535
536 return clk_rcg2_configure(rcg, &f);
537}
538
539static int clk_byte_set_rate_and_parent(struct clk_hw *hw,
540 unsigned long rate, unsigned long parent_rate, u8 index)
541{
542 /* Parent index is set statically in frequency table */
543 return clk_byte_set_rate(hw, rate, parent_rate);
544}
545
546const struct clk_ops clk_byte_ops = {
547 .is_enabled = clk_rcg2_is_enabled,
548 .get_parent = clk_rcg2_get_parent,
549 .set_parent = clk_rcg2_set_parent,
550 .recalc_rate = clk_rcg2_recalc_rate,
551 .set_rate = clk_byte_set_rate,
552 .set_rate_and_parent = clk_byte_set_rate_and_parent,
553 .determine_rate = clk_byte_determine_rate,
554};
555EXPORT_SYMBOL_GPL(clk_byte_ops);
556
557static int clk_byte2_determine_rate(struct clk_hw *hw,
558 struct clk_rate_request *req)
559{
560 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
561 unsigned long parent_rate, div;
562 u32 mask = BIT(rcg->hid_width) - 1;
563 struct clk_hw *p;
564 unsigned long rate = req->rate;
565
566 if (rate == 0)
567 return -EINVAL;
568
569 p = req->best_parent_hw;
570 req->best_parent_rate = parent_rate = clk_hw_round_rate(p, rate);
571
572 div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
573 div = min_t(u32, div, mask);
574
575 req->rate = calc_rate(parent_rate, 0, 0, 0, div);
576
577 return 0;
578}
579
580static int clk_byte2_set_rate(struct clk_hw *hw, unsigned long rate,
581 unsigned long parent_rate)
582{
583 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
584 struct freq_tbl f = { 0 };
585 unsigned long div;
586 int i, num_parents = clk_hw_get_num_parents(hw);
587 u32 mask = BIT(rcg->hid_width) - 1;
588 u32 cfg;
589
590 div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
591 div = min_t(u32, div, mask);
592
593 f.pre_div = div;
594
595 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
596 cfg &= CFG_SRC_SEL_MASK;
597 cfg >>= CFG_SRC_SEL_SHIFT;
598
599 for (i = 0; i < num_parents; i++) {
600 if (cfg == rcg->parent_map[i].cfg) {
601 f.src = rcg->parent_map[i].src;
602 return clk_rcg2_configure(rcg, &f);
603 }
604 }
605
606 return -EINVAL;
607}
608
609static int clk_byte2_set_rate_and_parent(struct clk_hw *hw,
610 unsigned long rate, unsigned long parent_rate, u8 index)
611{
612 /* Read the hardware to determine parent during set_rate */
613 return clk_byte2_set_rate(hw, rate, parent_rate);
614}
615
616const struct clk_ops clk_byte2_ops = {
617 .is_enabled = clk_rcg2_is_enabled,
618 .get_parent = clk_rcg2_get_parent,
619 .set_parent = clk_rcg2_set_parent,
620 .recalc_rate = clk_rcg2_recalc_rate,
621 .set_rate = clk_byte2_set_rate,
622 .set_rate_and_parent = clk_byte2_set_rate_and_parent,
623 .determine_rate = clk_byte2_determine_rate,
624};
625EXPORT_SYMBOL_GPL(clk_byte2_ops);
626
627static const struct frac_entry frac_table_pixel[] = {
628 { 3, 8 },
629 { 2, 9 },
630 { 4, 9 },
631 { 1, 1 },
632 { }
633};
634
635static int clk_pixel_determine_rate(struct clk_hw *hw,
636 struct clk_rate_request *req)
637{
638 unsigned long request, src_rate;
639 int delta = 100000;
640 const struct frac_entry *frac = frac_table_pixel;
641
642 for (; frac->num; frac++) {
643 request = (req->rate * frac->den) / frac->num;
644
645 src_rate = clk_hw_round_rate(req->best_parent_hw, request);
646 if ((src_rate < (request - delta)) ||
647 (src_rate > (request + delta)))
648 continue;
649
650 req->best_parent_rate = src_rate;
651 req->rate = (src_rate * frac->num) / frac->den;
652 return 0;
653 }
654
655 return -EINVAL;
656}
657
658static int clk_pixel_set_rate(struct clk_hw *hw, unsigned long rate,
659 unsigned long parent_rate)
660{
661 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
662 struct freq_tbl f = { 0 };
663 const struct frac_entry *frac = frac_table_pixel;
664 unsigned long request;
665 int delta = 100000;
666 u32 mask = BIT(rcg->hid_width) - 1;
667 u32 hid_div, cfg;
668 int i, num_parents = clk_hw_get_num_parents(hw);
669
670 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
671 cfg &= CFG_SRC_SEL_MASK;
672 cfg >>= CFG_SRC_SEL_SHIFT;
673
674 for (i = 0; i < num_parents; i++)
675 if (cfg == rcg->parent_map[i].cfg) {
676 f.src = rcg->parent_map[i].src;
677 break;
678 }
679
680 for (; frac->num; frac++) {
681 request = (rate * frac->den) / frac->num;
682
683 if ((parent_rate < (request - delta)) ||
684 (parent_rate > (request + delta)))
685 continue;
686
687 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
688 &hid_div);
689 f.pre_div = hid_div;
690 f.pre_div >>= CFG_SRC_DIV_SHIFT;
691 f.pre_div &= mask;
692 f.m = frac->num;
693 f.n = frac->den;
694
695 return clk_rcg2_configure(rcg, &f);
696 }
697 return -EINVAL;
698}
699
700static int clk_pixel_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
701 unsigned long parent_rate, u8 index)
702{
703 return clk_pixel_set_rate(hw, rate, parent_rate);
704}
705
706const struct clk_ops clk_pixel_ops = {
707 .is_enabled = clk_rcg2_is_enabled,
708 .get_parent = clk_rcg2_get_parent,
709 .set_parent = clk_rcg2_set_parent,
710 .recalc_rate = clk_rcg2_recalc_rate,
711 .set_rate = clk_pixel_set_rate,
712 .set_rate_and_parent = clk_pixel_set_rate_and_parent,
713 .determine_rate = clk_pixel_determine_rate,
714};
715EXPORT_SYMBOL_GPL(clk_pixel_ops);
716
717static int clk_gfx3d_determine_rate(struct clk_hw *hw,
718 struct clk_rate_request *req)
719{
720 struct clk_rate_request parent_req = { };
721 struct clk_hw *p2, *p8, *p9, *xo;
722 unsigned long p9_rate;
723 int ret;
724
725 xo = clk_hw_get_parent_by_index(hw, 0);
726 if (req->rate == clk_hw_get_rate(xo)) {
727 req->best_parent_hw = xo;
728 return 0;
729 }
730
731 p9 = clk_hw_get_parent_by_index(hw, 2);
732 p2 = clk_hw_get_parent_by_index(hw, 3);
733 p8 = clk_hw_get_parent_by_index(hw, 4);
734
735 /* PLL9 is a fixed rate PLL */
736 p9_rate = clk_hw_get_rate(p9);
737
738 parent_req.rate = req->rate = min(req->rate, p9_rate);
739 if (req->rate == p9_rate) {
740 req->rate = req->best_parent_rate = p9_rate;
741 req->best_parent_hw = p9;
742 return 0;
743 }
744
745 if (req->best_parent_hw == p9) {
746 /* Are we going back to a previously used rate? */
747 if (clk_hw_get_rate(p8) == req->rate)
748 req->best_parent_hw = p8;
749 else
750 req->best_parent_hw = p2;
751 } else if (req->best_parent_hw == p8) {
752 req->best_parent_hw = p2;
753 } else {
754 req->best_parent_hw = p8;
755 }
756
757 ret = __clk_determine_rate(req->best_parent_hw, &parent_req);
758 if (ret)
759 return ret;
760
761 req->rate = req->best_parent_rate = parent_req.rate;
762
763 return 0;
764}
765
766static int clk_gfx3d_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
767 unsigned long parent_rate, u8 index)
768{
769 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
770 u32 cfg;
771 int ret;
772
773 /* Just mux it, we don't use the division or m/n hardware */
774 cfg = rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT;
775 ret = regmap_write(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, cfg);
776 if (ret)
777 return ret;
778
779 return update_config(rcg);
780}
781
782static int clk_gfx3d_set_rate(struct clk_hw *hw, unsigned long rate,
783 unsigned long parent_rate)
784{
785 /*
786 * We should never get here; clk_gfx3d_determine_rate() should always
787 * make us use a different parent than what we're currently using, so
788 * clk_gfx3d_set_rate_and_parent() should always be called.
789 */
790 return 0;
791}
792
793const struct clk_ops clk_gfx3d_ops = {
794 .is_enabled = clk_rcg2_is_enabled,
795 .get_parent = clk_rcg2_get_parent,
796 .set_parent = clk_rcg2_set_parent,
797 .recalc_rate = clk_rcg2_recalc_rate,
798 .set_rate = clk_gfx3d_set_rate,
799 .set_rate_and_parent = clk_gfx3d_set_rate_and_parent,
800 .determine_rate = clk_gfx3d_determine_rate,
801};
802EXPORT_SYMBOL_GPL(clk_gfx3d_ops);
803
804static int clk_rcg2_set_force_enable(struct clk_hw *hw)
805{
806 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
807 const char *name = clk_hw_get_name(hw);
808 int ret, count;
809
810 ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG,
811 CMD_ROOT_EN, CMD_ROOT_EN);
812 if (ret)
813 return ret;
814
815 /* wait for RCG to turn ON */
816 for (count = 500; count > 0; count--) {
817 if (clk_rcg2_is_enabled(hw))
818 return 0;
819
820 udelay(1);
821 }
822
823 pr_err("%s: RCG did not turn on\n", name);
824 return -ETIMEDOUT;
825}
826
827static int clk_rcg2_clear_force_enable(struct clk_hw *hw)
828{
829 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
830
831 return regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG,
832 CMD_ROOT_EN, 0);
833}
834
835static int
836clk_rcg2_shared_force_enable_clear(struct clk_hw *hw, const struct freq_tbl *f)
837{
838 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
839 int ret;
840
841 ret = clk_rcg2_set_force_enable(hw);
842 if (ret)
843 return ret;
844
845 ret = clk_rcg2_configure(rcg, f);
846 if (ret)
847 return ret;
848
849 return clk_rcg2_clear_force_enable(hw);
850}
851
852static int clk_rcg2_shared_set_rate(struct clk_hw *hw, unsigned long rate,
853 unsigned long parent_rate)
854{
855 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
856 const struct freq_tbl *f;
857
858 f = qcom_find_freq(rcg->freq_tbl, rate);
859 if (!f)
860 return -EINVAL;
861
862 /*
863 * In case clock is disabled, update the CFG, M, N and D registers
864 * and don't hit the update bit of CMD register.
865 */
866 if (!__clk_is_enabled(hw->clk))
867 return __clk_rcg2_configure(rcg, f);
868
869 return clk_rcg2_shared_force_enable_clear(hw, f);
870}
871
872static int clk_rcg2_shared_set_rate_and_parent(struct clk_hw *hw,
873 unsigned long rate, unsigned long parent_rate, u8 index)
874{
875 return clk_rcg2_shared_set_rate(hw, rate, parent_rate);
876}
877
878static int clk_rcg2_shared_enable(struct clk_hw *hw)
879{
880 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
881 int ret;
882
883 /*
884 * Set the update bit because required configuration has already
885 * been written in clk_rcg2_shared_set_rate()
886 */
887 ret = clk_rcg2_set_force_enable(hw);
888 if (ret)
889 return ret;
890
891 ret = update_config(rcg);
892 if (ret)
893 return ret;
894
895 return clk_rcg2_clear_force_enable(hw);
896}
897
898static void clk_rcg2_shared_disable(struct clk_hw *hw)
899{
900 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
901 u32 cfg;
902
903 /*
904 * Store current configuration as switching to safe source would clear
905 * the SRC and DIV of CFG register
906 */
907 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
908
909 /*
910 * Park the RCG at a safe configuration - sourced off of safe source.
911 * Force enable and disable the RCG while configuring it to safeguard
912 * against any update signal coming from the downstream clock.
913 * The current parent is still prepared and enabled at this point, and
914 * the safe source is always on while application processor subsystem
915 * is online. Therefore, the RCG can safely switch its parent.
916 */
917 clk_rcg2_set_force_enable(hw);
918
919 regmap_write(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
920 rcg->safe_src_index << CFG_SRC_SEL_SHIFT);
921
922 update_config(rcg);
923
924 clk_rcg2_clear_force_enable(hw);
925
926 /* Write back the stored configuration corresponding to current rate */
927 regmap_write(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, cfg);
928}
929
930const struct clk_ops clk_rcg2_shared_ops = {
931 .enable = clk_rcg2_shared_enable,
932 .disable = clk_rcg2_shared_disable,
933 .get_parent = clk_rcg2_get_parent,
934 .set_parent = clk_rcg2_set_parent,
935 .recalc_rate = clk_rcg2_recalc_rate,
936 .determine_rate = clk_rcg2_determine_rate,
937 .set_rate = clk_rcg2_shared_set_rate,
938 .set_rate_and_parent = clk_rcg2_shared_set_rate_and_parent,
939};
940EXPORT_SYMBOL_GPL(clk_rcg2_shared_ops);
941
942/* Common APIs to be used for DFS based RCGR */
943static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
944 struct freq_tbl *f)
945{
946 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
947 struct clk_hw *p;
948 unsigned long prate = 0;
949 u32 val, mask, cfg, mode;
950 int i, num_parents;
951
952 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_DFSR(l), &cfg);
953
954 mask = BIT(rcg->hid_width) - 1;
955 f->pre_div = 1;
956 if (cfg & mask)
957 f->pre_div = cfg & mask;
958
959 cfg &= CFG_SRC_SEL_MASK;
960 cfg >>= CFG_SRC_SEL_SHIFT;
961
962 num_parents = clk_hw_get_num_parents(hw);
963 for (i = 0; i < num_parents; i++) {
964 if (cfg == rcg->parent_map[i].cfg) {
965 f->src = rcg->parent_map[i].src;
966 p = clk_hw_get_parent_by_index(&rcg->clkr.hw, i);
967 prate = clk_hw_get_rate(p);
968 }
969 }
970
971 mode = cfg & CFG_MODE_MASK;
972 mode >>= CFG_MODE_SHIFT;
973 if (mode) {
974 mask = BIT(rcg->mnd_width) - 1;
975 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_M_DFSR(l),
976 &val);
977 val &= mask;
978 f->m = val;
979
980 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_N_DFSR(l),
981 &val);
982 val = ~val;
983 val &= mask;
984 val += f->m;
985 f->n = val;
986 }
987
988 f->freq = calc_rate(prate, f->m, f->n, mode, f->pre_div);
989}
990
991static int clk_rcg2_dfs_populate_freq_table(struct clk_rcg2 *rcg)
992{
993 struct freq_tbl *freq_tbl;
994 int i;
995
996 /* Allocate space for 1 extra since table is NULL terminated */
997 freq_tbl = kcalloc(MAX_PERF_LEVEL + 1, sizeof(*freq_tbl), GFP_KERNEL);
998 if (!freq_tbl)
999 return -ENOMEM;
1000 rcg->freq_tbl = freq_tbl;
1001
1002 for (i = 0; i < MAX_PERF_LEVEL; i++)
1003 clk_rcg2_dfs_populate_freq(&rcg->clkr.hw, i, freq_tbl + i);
1004
1005 return 0;
1006}
1007
1008static int clk_rcg2_dfs_determine_rate(struct clk_hw *hw,
1009 struct clk_rate_request *req)
1010{
1011 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
1012 int ret;
1013
1014 if (!rcg->freq_tbl) {
1015 ret = clk_rcg2_dfs_populate_freq_table(rcg);
1016 if (ret) {
1017 pr_err("Failed to update DFS tables for %s\n",
1018 clk_hw_get_name(hw));
1019 return ret;
1020 }
1021 }
1022
1023 return clk_rcg2_determine_rate(hw, req);
1024}
1025
1026static unsigned long
1027clk_rcg2_dfs_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
1028{
1029 struct clk_rcg2 *rcg = to_clk_rcg2(hw);
1030 u32 level, mask, cfg, m = 0, n = 0, mode, pre_div;
1031
1032 regmap_read(rcg->clkr.regmap,
1033 rcg->cmd_rcgr + SE_CMD_DFSR_OFFSET, &level);
1034 level &= GENMASK(4, 1);
1035 level >>= 1;
1036
1037 if (rcg->freq_tbl)
1038 return rcg->freq_tbl[level].freq;
1039
1040 /*
1041 * Assume that parent_rate is actually the parent because
1042 * we can't do any better at figuring it out when the table
1043 * hasn't been populated yet. We only populate the table
1044 * in determine_rate because we can't guarantee the parents
1045 * will be registered with the framework until then.
1046 */
1047 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_DFSR(level),
1048 &cfg);
1049
1050 mask = BIT(rcg->hid_width) - 1;
1051 pre_div = 1;
1052 if (cfg & mask)
1053 pre_div = cfg & mask;
1054
1055 mode = cfg & CFG_MODE_MASK;
1056 mode >>= CFG_MODE_SHIFT;
1057 if (mode) {
1058 mask = BIT(rcg->mnd_width) - 1;
1059 regmap_read(rcg->clkr.regmap,
1060 rcg->cmd_rcgr + SE_PERF_M_DFSR(level), &m);
1061 m &= mask;
1062
1063 regmap_read(rcg->clkr.regmap,
1064 rcg->cmd_rcgr + SE_PERF_N_DFSR(level), &n);
1065 n = ~n;
1066 n &= mask;
1067 n += m;
1068 }
1069
1070 return calc_rate(parent_rate, m, n, mode, pre_div);
1071}
1072
1073static const struct clk_ops clk_rcg2_dfs_ops = {
1074 .is_enabled = clk_rcg2_is_enabled,
1075 .get_parent = clk_rcg2_get_parent,
1076 .determine_rate = clk_rcg2_dfs_determine_rate,
1077 .recalc_rate = clk_rcg2_dfs_recalc_rate,
1078};
1079
1080static int clk_rcg2_enable_dfs(const struct clk_rcg_dfs_data *data,
1081 struct regmap *regmap)
1082{
1083 struct clk_rcg2 *rcg = data->rcg;
1084 struct clk_init_data *init = data->init;
1085 u32 val;
1086 int ret;
1087
1088 ret = regmap_read(regmap, rcg->cmd_rcgr + SE_CMD_DFSR_OFFSET, &val);
1089 if (ret)
1090 return -EINVAL;
1091
1092 if (!(val & SE_CMD_DFS_EN))
1093 return 0;
1094
1095 /*
1096 * Rate changes with consumer writing a register in
1097 * their own I/O region
1098 */
1099 init->flags |= CLK_GET_RATE_NOCACHE;
1100 init->ops = &clk_rcg2_dfs_ops;
1101
1102 rcg->freq_tbl = NULL;
1103
1104 pr_debug("DFS registered for clk %s\n", init->name);
1105
1106 return 0;
1107}
1108
1109int qcom_cc_register_rcg_dfs(struct regmap *regmap,
1110 const struct clk_rcg_dfs_data *rcgs, size_t len)
1111{
1112 int i, ret;
1113
1114 for (i = 0; i < len; i++) {
1115 ret = clk_rcg2_enable_dfs(&rcgs[i], regmap);
1116 if (ret) {
1117 const char *name = rcgs[i].init->name;
1118
1119 pr_err("DFS register failed for clk %s\n", name);
1120 return ret;
1121 }
1122 }
1123
1124 return 0;
1125}
1126EXPORT_SYMBOL_GPL(qcom_cc_register_rcg_dfs);