Linux-libre 3.16.85-gnu
[librecmc/linux-libre.git] / drivers / clk / qcom / clk-rcg2.c
1 /*
2  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13
14 #include <linux/kernel.h>
15 #include <linux/bitops.h>
16 #include <linux/err.h>
17 #include <linux/bug.h>
18 #include <linux/export.h>
19 #include <linux/clk-provider.h>
20 #include <linux/delay.h>
21 #include <linux/regmap.h>
22 #include <linux/math64.h>
23
24 #include <asm/div64.h>
25
26 #include "clk-rcg.h"
27
28 #define CMD_REG                 0x0
29 #define CMD_UPDATE              BIT(0)
30 #define CMD_ROOT_EN             BIT(1)
31 #define CMD_DIRTY_CFG           BIT(4)
32 #define CMD_DIRTY_N             BIT(5)
33 #define CMD_DIRTY_M             BIT(6)
34 #define CMD_DIRTY_D             BIT(7)
35 #define CMD_ROOT_OFF            BIT(31)
36
37 #define CFG_REG                 0x4
38 #define CFG_SRC_DIV_SHIFT       0
39 #define CFG_SRC_SEL_SHIFT       8
40 #define CFG_SRC_SEL_MASK        (0x7 << CFG_SRC_SEL_SHIFT)
41 #define CFG_MODE_SHIFT          12
42 #define CFG_MODE_MASK           (0x3 << CFG_MODE_SHIFT)
43 #define CFG_MODE_DUAL_EDGE      (0x2 << CFG_MODE_SHIFT)
44
45 #define M_REG                   0x8
46 #define N_REG                   0xc
47 #define D_REG                   0x10
48
49 static int clk_rcg2_is_enabled(struct clk_hw *hw)
50 {
51         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
52         u32 cmd;
53         int ret;
54
55         ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, &cmd);
56         if (ret)
57                 return ret;
58
59         return (cmd & CMD_ROOT_OFF) == 0;
60 }
61
62 static u8 clk_rcg2_get_parent(struct clk_hw *hw)
63 {
64         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
65         int num_parents = __clk_get_num_parents(hw->clk);
66         u32 cfg;
67         int i, ret;
68
69         ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
70         if (ret)
71                 return ret;
72
73         cfg &= CFG_SRC_SEL_MASK;
74         cfg >>= CFG_SRC_SEL_SHIFT;
75
76         for (i = 0; i < num_parents; i++)
77                 if (cfg == rcg->parent_map[i])
78                         return i;
79
80         return -EINVAL;
81 }
82
83 static int update_config(struct clk_rcg2 *rcg)
84 {
85         int count, ret;
86         u32 cmd;
87         struct clk_hw *hw = &rcg->clkr.hw;
88         const char *name = __clk_get_name(hw->clk);
89
90         ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG,
91                                  CMD_UPDATE, CMD_UPDATE);
92         if (ret)
93                 return ret;
94
95         /* Wait for update to take effect */
96         for (count = 500; count > 0; count--) {
97                 ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, &cmd);
98                 if (ret)
99                         return ret;
100                 if (!(cmd & CMD_UPDATE))
101                         return 0;
102                 udelay(1);
103         }
104
105         WARN(1, "%s: rcg didn't update its configuration.", name);
106         return 0;
107 }
108
109 static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)
110 {
111         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
112         int ret;
113
114         ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
115                                  CFG_SRC_SEL_MASK,
116                                  rcg->parent_map[index] << CFG_SRC_SEL_SHIFT);
117         if (ret)
118                 return ret;
119
120         return update_config(rcg);
121 }
122
123 /*
124  * Calculate m/n:d rate
125  *
126  *          parent_rate     m
127  *   rate = ----------- x  ---
128  *            hid_div       n
129  */
130 static unsigned long
131 calc_rate(unsigned long rate, u32 m, u32 n, u32 mode, u32 hid_div)
132 {
133         if (hid_div) {
134                 rate *= 2;
135                 rate /= hid_div + 1;
136         }
137
138         if (mode) {
139                 u64 tmp = rate;
140                 tmp *= m;
141                 do_div(tmp, n);
142                 rate = tmp;
143         }
144
145         return rate;
146 }
147
148 static unsigned long
149 clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
150 {
151         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
152         u32 cfg, hid_div, m = 0, n = 0, mode = 0, mask;
153
154         regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
155
156         if (rcg->mnd_width) {
157                 mask = BIT(rcg->mnd_width) - 1;
158                 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + M_REG, &m);
159                 m &= mask;
160                 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + N_REG, &n);
161                 n =  ~n;
162                 n &= mask;
163                 n += m;
164                 mode = cfg & CFG_MODE_MASK;
165                 mode >>= CFG_MODE_SHIFT;
166         }
167
168         mask = BIT(rcg->hid_width) - 1;
169         hid_div = cfg >> CFG_SRC_DIV_SHIFT;
170         hid_div &= mask;
171
172         return calc_rate(parent_rate, m, n, mode, hid_div);
173 }
174
175 static const
176 struct freq_tbl *find_freq(const struct freq_tbl *f, unsigned long rate)
177 {
178         if (!f)
179                 return NULL;
180
181         for (; f->freq; f++)
182                 if (rate <= f->freq)
183                         return f;
184
185         /* Default to our fastest rate */
186         return f - 1;
187 }
188
189 static long _freq_tbl_determine_rate(struct clk_hw *hw,
190                 const struct freq_tbl *f, unsigned long rate,
191                 unsigned long *p_rate, struct clk **p)
192 {
193         unsigned long clk_flags;
194
195         f = find_freq(f, rate);
196         if (!f)
197                 return -EINVAL;
198
199         clk_flags = __clk_get_flags(hw->clk);
200         *p = clk_get_parent_by_index(hw->clk, f->src);
201         if (clk_flags & CLK_SET_RATE_PARENT) {
202                 rate = f->freq;
203                 if (f->pre_div) {
204                         rate /= 2;
205                         rate *= f->pre_div + 1;
206                 }
207
208                 if (f->n) {
209                         u64 tmp = rate;
210                         tmp = tmp * f->n;
211                         do_div(tmp, f->m);
212                         rate = tmp;
213                 }
214         } else {
215                 rate =  __clk_get_rate(*p);
216         }
217         *p_rate = rate;
218
219         return f->freq;
220 }
221
222 static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate,
223                 unsigned long *p_rate, struct clk **p)
224 {
225         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
226
227         return _freq_tbl_determine_rate(hw, rcg->freq_tbl, rate, p_rate, p);
228 }
229
230 static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)
231 {
232         u32 cfg, mask;
233         int ret;
234
235         if (rcg->mnd_width && f->n) {
236                 mask = BIT(rcg->mnd_width) - 1;
237                 ret = regmap_update_bits(rcg->clkr.regmap,
238                                 rcg->cmd_rcgr + M_REG, mask, f->m);
239                 if (ret)
240                         return ret;
241
242                 ret = regmap_update_bits(rcg->clkr.regmap,
243                                 rcg->cmd_rcgr + N_REG, mask, ~(f->n - f->m));
244                 if (ret)
245                         return ret;
246
247                 ret = regmap_update_bits(rcg->clkr.regmap,
248                                 rcg->cmd_rcgr + D_REG, mask, ~f->n);
249                 if (ret)
250                         return ret;
251         }
252
253         mask = BIT(rcg->hid_width) - 1;
254         mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK;
255         cfg = f->pre_div << CFG_SRC_DIV_SHIFT;
256         cfg |= rcg->parent_map[f->src] << CFG_SRC_SEL_SHIFT;
257         if (rcg->mnd_width && f->n && (f->m != f->n))
258                 cfg |= CFG_MODE_DUAL_EDGE;
259         ret = regmap_update_bits(rcg->clkr.regmap,
260                         rcg->cmd_rcgr + CFG_REG, mask, cfg);
261         if (ret)
262                 return ret;
263
264         return update_config(rcg);
265 }
266
267 static int __clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate)
268 {
269         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
270         const struct freq_tbl *f;
271
272         f = find_freq(rcg->freq_tbl, rate);
273         if (!f)
274                 return -EINVAL;
275
276         return clk_rcg2_configure(rcg, f);
277 }
278
279 static int clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
280                             unsigned long parent_rate)
281 {
282         return __clk_rcg2_set_rate(hw, rate);
283 }
284
285 static int clk_rcg2_set_rate_and_parent(struct clk_hw *hw,
286                 unsigned long rate, unsigned long parent_rate, u8 index)
287 {
288         return __clk_rcg2_set_rate(hw, rate);
289 }
290
291 const struct clk_ops clk_rcg2_ops = {
292         .is_enabled = clk_rcg2_is_enabled,
293         .get_parent = clk_rcg2_get_parent,
294         .set_parent = clk_rcg2_set_parent,
295         .recalc_rate = clk_rcg2_recalc_rate,
296         .determine_rate = clk_rcg2_determine_rate,
297         .set_rate = clk_rcg2_set_rate,
298         .set_rate_and_parent = clk_rcg2_set_rate_and_parent,
299 };
300 EXPORT_SYMBOL_GPL(clk_rcg2_ops);
301
302 struct frac_entry {
303         int num;
304         int den;
305 };
306
307 static const struct frac_entry frac_table_675m[] = {    /* link rate of 270M */
308         { 52, 295 },    /* 119 M */
309         { 11, 57 },     /* 130.25 M */
310         { 63, 307 },    /* 138.50 M */
311         { 11, 50 },     /* 148.50 M */
312         { 47, 206 },    /* 154 M */
313         { 31, 100 },    /* 205.25 M */
314         { 107, 269 },   /* 268.50 M */
315         { },
316 };
317
318 static struct frac_entry frac_table_810m[] = { /* Link rate of 162M */
319         { 31, 211 },    /* 119 M */
320         { 32, 199 },    /* 130.25 M */
321         { 63, 307 },    /* 138.50 M */
322         { 11, 60 },     /* 148.50 M */
323         { 50, 263 },    /* 154 M */
324         { 31, 120 },    /* 205.25 M */
325         { 119, 359 },   /* 268.50 M */
326         { },
327 };
328
329 static int clk_edp_pixel_set_rate(struct clk_hw *hw, unsigned long rate,
330                               unsigned long parent_rate)
331 {
332         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
333         struct freq_tbl f = *rcg->freq_tbl;
334         const struct frac_entry *frac;
335         int delta = 100000;
336         s64 src_rate = parent_rate;
337         s64 request;
338         u32 mask = BIT(rcg->hid_width) - 1;
339         u32 hid_div;
340
341         if (src_rate == 810000000)
342                 frac = frac_table_810m;
343         else
344                 frac = frac_table_675m;
345
346         for (; frac->num; frac++) {
347                 request = rate;
348                 request *= frac->den;
349                 request = div_s64(request, frac->num);
350                 if ((src_rate < (request - delta)) ||
351                     (src_rate > (request + delta)))
352                         continue;
353
354                 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
355                                 &hid_div);
356                 f.pre_div = hid_div;
357                 f.pre_div >>= CFG_SRC_DIV_SHIFT;
358                 f.pre_div &= mask;
359                 f.m = frac->num;
360                 f.n = frac->den;
361
362                 return clk_rcg2_configure(rcg, &f);
363         }
364
365         return -EINVAL;
366 }
367
368 static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw,
369                 unsigned long rate, unsigned long parent_rate, u8 index)
370 {
371         /* Parent index is set statically in frequency table */
372         return clk_edp_pixel_set_rate(hw, rate, parent_rate);
373 }
374
375 static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
376                                  unsigned long *p_rate, struct clk **p)
377 {
378         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
379         const struct freq_tbl *f = rcg->freq_tbl;
380         const struct frac_entry *frac;
381         int delta = 100000;
382         s64 src_rate = *p_rate;
383         s64 request;
384         u32 mask = BIT(rcg->hid_width) - 1;
385         u32 hid_div;
386
387         /* Force the correct parent */
388         *p = clk_get_parent_by_index(hw->clk, f->src);
389
390         if (src_rate == 810000000)
391                 frac = frac_table_810m;
392         else
393                 frac = frac_table_675m;
394
395         for (; frac->num; frac++) {
396                 request = rate;
397                 request *= frac->den;
398                 request = div_s64(request, frac->num);
399                 if ((src_rate < (request - delta)) ||
400                     (src_rate > (request + delta)))
401                         continue;
402
403                 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
404                                 &hid_div);
405                 hid_div >>= CFG_SRC_DIV_SHIFT;
406                 hid_div &= mask;
407
408                 return calc_rate(src_rate, frac->num, frac->den, !!frac->den,
409                                  hid_div);
410         }
411
412         return -EINVAL;
413 }
414
415 const struct clk_ops clk_edp_pixel_ops = {
416         .is_enabled = clk_rcg2_is_enabled,
417         .get_parent = clk_rcg2_get_parent,
418         .set_parent = clk_rcg2_set_parent,
419         .recalc_rate = clk_rcg2_recalc_rate,
420         .set_rate = clk_edp_pixel_set_rate,
421         .set_rate_and_parent = clk_edp_pixel_set_rate_and_parent,
422         .determine_rate = clk_edp_pixel_determine_rate,
423 };
424 EXPORT_SYMBOL_GPL(clk_edp_pixel_ops);
425
426 static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate,
427                          unsigned long *p_rate, struct clk **p)
428 {
429         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
430         const struct freq_tbl *f = rcg->freq_tbl;
431         unsigned long parent_rate, div;
432         u32 mask = BIT(rcg->hid_width) - 1;
433
434         if (rate == 0)
435                 return -EINVAL;
436
437         *p = clk_get_parent_by_index(hw->clk, f->src);
438         *p_rate = parent_rate = __clk_round_rate(*p, rate);
439
440         div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
441         div = min_t(u32, div, mask);
442
443         return calc_rate(parent_rate, 0, 0, 0, div);
444 }
445
446 static int clk_byte_set_rate(struct clk_hw *hw, unsigned long rate,
447                          unsigned long parent_rate)
448 {
449         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
450         struct freq_tbl f = *rcg->freq_tbl;
451         unsigned long div;
452         u32 mask = BIT(rcg->hid_width) - 1;
453
454         div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
455         div = min_t(u32, div, mask);
456
457         f.pre_div = div;
458
459         return clk_rcg2_configure(rcg, &f);
460 }
461
462 static int clk_byte_set_rate_and_parent(struct clk_hw *hw,
463                 unsigned long rate, unsigned long parent_rate, u8 index)
464 {
465         /* Parent index is set statically in frequency table */
466         return clk_byte_set_rate(hw, rate, parent_rate);
467 }
468
469 const struct clk_ops clk_byte_ops = {
470         .is_enabled = clk_rcg2_is_enabled,
471         .get_parent = clk_rcg2_get_parent,
472         .set_parent = clk_rcg2_set_parent,
473         .recalc_rate = clk_rcg2_recalc_rate,
474         .set_rate = clk_byte_set_rate,
475         .set_rate_and_parent = clk_byte_set_rate_and_parent,
476         .determine_rate = clk_byte_determine_rate,
477 };
478 EXPORT_SYMBOL_GPL(clk_byte_ops);
479
480 static const struct frac_entry frac_table_pixel[] = {
481         { 3, 8 },
482         { 2, 9 },
483         { 4, 9 },
484         { 1, 1 },
485         { }
486 };
487
488 static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
489                                  unsigned long *p_rate, struct clk **p)
490 {
491         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
492         unsigned long request, src_rate;
493         int delta = 100000;
494         const struct freq_tbl *f = rcg->freq_tbl;
495         const struct frac_entry *frac = frac_table_pixel;
496         struct clk *parent = *p = clk_get_parent_by_index(hw->clk, f->src);
497
498         for (; frac->num; frac++) {
499                 request = (rate * frac->den) / frac->num;
500
501                 src_rate = __clk_round_rate(parent, request);
502                 if ((src_rate < (request - delta)) ||
503                         (src_rate > (request + delta)))
504                         continue;
505
506                 *p_rate = src_rate;
507                 return (src_rate * frac->num) / frac->den;
508         }
509
510         return -EINVAL;
511 }
512
513 static int clk_pixel_set_rate(struct clk_hw *hw, unsigned long rate,
514                 unsigned long parent_rate)
515 {
516         struct clk_rcg2 *rcg = to_clk_rcg2(hw);
517         struct freq_tbl f = *rcg->freq_tbl;
518         const struct frac_entry *frac = frac_table_pixel;
519         unsigned long request, src_rate;
520         int delta = 100000;
521         u32 mask = BIT(rcg->hid_width) - 1;
522         u32 hid_div;
523         struct clk *parent = clk_get_parent_by_index(hw->clk, f.src);
524
525         for (; frac->num; frac++) {
526                 request = (rate * frac->den) / frac->num;
527
528                 src_rate = __clk_round_rate(parent, request);
529                 if ((src_rate < (request - delta)) ||
530                         (src_rate > (request + delta)))
531                         continue;
532
533                 regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
534                                 &hid_div);
535                 f.pre_div = hid_div;
536                 f.pre_div >>= CFG_SRC_DIV_SHIFT;
537                 f.pre_div &= mask;
538                 f.m = frac->num;
539                 f.n = frac->den;
540
541                 return clk_rcg2_configure(rcg, &f);
542         }
543         return -EINVAL;
544 }
545
546 static int clk_pixel_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
547                 unsigned long parent_rate, u8 index)
548 {
549         /* Parent index is set statically in frequency table */
550         return clk_pixel_set_rate(hw, rate, parent_rate);
551 }
552
553 const struct clk_ops clk_pixel_ops = {
554         .is_enabled = clk_rcg2_is_enabled,
555         .get_parent = clk_rcg2_get_parent,
556         .set_parent = clk_rcg2_set_parent,
557         .recalc_rate = clk_rcg2_recalc_rate,
558         .set_rate = clk_pixel_set_rate,
559         .set_rate_and_parent = clk_pixel_set_rate_and_parent,
560         .determine_rate = clk_pixel_determine_rate,
561 };
562 EXPORT_SYMBOL_GPL(clk_pixel_ops);