Loading...
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
4 * Copyright (c) 2013 Linaro Ltd.
5 *
6 * Common Clock Framework support for all PLL's in Samsung platforms
7*/
8
9#ifndef __SAMSUNG_CLK_PLL_H
10#define __SAMSUNG_CLK_PLL_H
11
12enum samsung_pll_type {
13 pll_2126,
14 pll_3000,
15 pll_35xx,
16 pll_36xx,
17 pll_2550,
18 pll_2650,
19 pll_4500,
20 pll_4502,
21 pll_4508,
22 pll_4600,
23 pll_4650,
24 pll_4650c,
25 pll_6552,
26 pll_6552_s3c2416,
27 pll_6553,
28 pll_s3c2410_mpll,
29 pll_s3c2410_upll,
30 pll_s3c2440_mpll,
31 pll_2550x,
32 pll_2550xx,
33 pll_2650x,
34 pll_2650xx,
35 pll_1450x,
36 pll_1451x,
37 pll_1452x,
38 pll_1460x,
39};
40
41#define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \
42 ((u64)(_fin) * (BIT(_ks) * (_m) + (_k)) / BIT(_ks) / ((_p) << (_s)))
43#define PLL_VALID_RATE(_fin, _fout, _m, _p, _s, _k, _ks) ((_fout) + \
44 BUILD_BUG_ON_ZERO(PLL_RATE(_fin, _m, _p, _s, _k, _ks) != (_fout)))
45
46#define PLL_35XX_RATE(_fin, _rate, _m, _p, _s) \
47 { \
48 .rate = PLL_VALID_RATE(_fin, _rate, \
49 _m, _p, _s, 0, 16), \
50 .mdiv = (_m), \
51 .pdiv = (_p), \
52 .sdiv = (_s), \
53 }
54
55#define PLL_S3C2410_MPLL_RATE(_fin, _rate, _m, _p, _s) \
56 { \
57 .rate = PLL_VALID_RATE(_fin, _rate, \
58 _m + 8, _p + 2, _s, 0, 16), \
59 .mdiv = (_m), \
60 .pdiv = (_p), \
61 .sdiv = (_s), \
62 }
63
64#define PLL_S3C2440_MPLL_RATE(_fin, _rate, _m, _p, _s) \
65 { \
66 .rate = PLL_VALID_RATE(_fin, _rate, \
67 2 * (_m + 8), _p + 2, _s, 0, 16), \
68 .mdiv = (_m), \
69 .pdiv = (_p), \
70 .sdiv = (_s), \
71 }
72
73#define PLL_36XX_RATE(_fin, _rate, _m, _p, _s, _k) \
74 { \
75 .rate = PLL_VALID_RATE(_fin, _rate, \
76 _m, _p, _s, _k, 16), \
77 .mdiv = (_m), \
78 .pdiv = (_p), \
79 .sdiv = (_s), \
80 .kdiv = (_k), \
81 }
82
83#define PLL_4508_RATE(_fin, _rate, _m, _p, _s, _afc) \
84 { \
85 .rate = PLL_VALID_RATE(_fin, _rate, \
86 _m, _p, _s - 1, 0, 16), \
87 .mdiv = (_m), \
88 .pdiv = (_p), \
89 .sdiv = (_s), \
90 .afc = (_afc), \
91 }
92
93#define PLL_4600_RATE(_fin, _rate, _m, _p, _s, _k, _vsel) \
94 { \
95 .rate = PLL_VALID_RATE(_fin, _rate, \
96 _m, _p, _s, _k, 16), \
97 .mdiv = (_m), \
98 .pdiv = (_p), \
99 .sdiv = (_s), \
100 .kdiv = (_k), \
101 .vsel = (_vsel), \
102 }
103
104#define PLL_4650_RATE(_fin, _rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \
105 { \
106 .rate = PLL_VALID_RATE(_fin, _rate, \
107 _m, _p, _s, _k, 10), \
108 .mdiv = (_m), \
109 .pdiv = (_p), \
110 .sdiv = (_s), \
111 .kdiv = (_k), \
112 .mfr = (_mfr), \
113 .mrr = (_mrr), \
114 .vsel = (_vsel), \
115 }
116
117/* NOTE: Rate table should be kept sorted in descending order. */
118
119struct samsung_pll_rate_table {
120 unsigned int rate;
121 unsigned int pdiv;
122 unsigned int mdiv;
123 unsigned int sdiv;
124 unsigned int kdiv;
125 unsigned int afc;
126 unsigned int mfr;
127 unsigned int mrr;
128 unsigned int vsel;
129};
130
131#endif /* __SAMSUNG_CLK_PLL_H */
1/*
2 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
3 * Copyright (c) 2013 Linaro Ltd.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Common Clock Framework support for all PLL's in Samsung platforms
10*/
11
12#ifndef __SAMSUNG_CLK_PLL_H
13#define __SAMSUNG_CLK_PLL_H
14
15enum samsung_pll_type {
16 pll_2126,
17 pll_3000,
18 pll_35xx,
19 pll_36xx,
20 pll_2550,
21 pll_2650,
22 pll_4500,
23 pll_4502,
24 pll_4508,
25 pll_4600,
26 pll_4650,
27 pll_4650c,
28 pll_6552,
29 pll_6552_s3c2416,
30 pll_6553,
31 pll_s3c2410_mpll,
32 pll_s3c2410_upll,
33 pll_s3c2440_mpll,
34 pll_2550x,
35 pll_2550xx,
36 pll_2650x,
37 pll_2650xx,
38 pll_1450x,
39 pll_1451x,
40 pll_1452x,
41 pll_1460x,
42};
43
44#define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \
45 ((u64)(_fin) * (BIT(_ks) * (_m) + (_k)) / BIT(_ks) / ((_p) << (_s)))
46#define PLL_VALID_RATE(_fin, _fout, _m, _p, _s, _k, _ks) ((_fout) + \
47 BUILD_BUG_ON_ZERO(PLL_RATE(_fin, _m, _p, _s, _k, _ks) != (_fout)))
48
49#define PLL_35XX_RATE(_fin, _rate, _m, _p, _s) \
50 { \
51 .rate = PLL_VALID_RATE(_fin, _rate, \
52 _m, _p, _s, 0, 16), \
53 .mdiv = (_m), \
54 .pdiv = (_p), \
55 .sdiv = (_s), \
56 }
57
58#define PLL_S3C2410_MPLL_RATE(_fin, _rate, _m, _p, _s) \
59 { \
60 .rate = PLL_VALID_RATE(_fin, _rate, \
61 _m + 8, _p + 2, _s, 0, 16), \
62 .mdiv = (_m), \
63 .pdiv = (_p), \
64 .sdiv = (_s), \
65 }
66
67#define PLL_S3C2440_MPLL_RATE(_fin, _rate, _m, _p, _s) \
68 { \
69 .rate = PLL_VALID_RATE(_fin, _rate, \
70 2 * (_m + 8), _p + 2, _s, 0, 16), \
71 .mdiv = (_m), \
72 .pdiv = (_p), \
73 .sdiv = (_s), \
74 }
75
76#define PLL_36XX_RATE(_fin, _rate, _m, _p, _s, _k) \
77 { \
78 .rate = PLL_VALID_RATE(_fin, _rate, \
79 _m, _p, _s, _k, 16), \
80 .mdiv = (_m), \
81 .pdiv = (_p), \
82 .sdiv = (_s), \
83 .kdiv = (_k), \
84 }
85
86#define PLL_4508_RATE(_fin, _rate, _m, _p, _s, _afc) \
87 { \
88 .rate = PLL_VALID_RATE(_fin, _rate, \
89 _m, _p, _s - 1, 0, 16), \
90 .mdiv = (_m), \
91 .pdiv = (_p), \
92 .sdiv = (_s), \
93 .afc = (_afc), \
94 }
95
96#define PLL_4600_RATE(_fin, _rate, _m, _p, _s, _k, _vsel) \
97 { \
98 .rate = PLL_VALID_RATE(_fin, _rate, \
99 _m, _p, _s, _k, 16), \
100 .mdiv = (_m), \
101 .pdiv = (_p), \
102 .sdiv = (_s), \
103 .kdiv = (_k), \
104 .vsel = (_vsel), \
105 }
106
107#define PLL_4650_RATE(_fin, _rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \
108 { \
109 .rate = PLL_VALID_RATE(_fin, _rate, \
110 _m, _p, _s, _k, 10), \
111 .mdiv = (_m), \
112 .pdiv = (_p), \
113 .sdiv = (_s), \
114 .kdiv = (_k), \
115 .mfr = (_mfr), \
116 .mrr = (_mrr), \
117 .vsel = (_vsel), \
118 }
119
120/* NOTE: Rate table should be kept sorted in descending order. */
121
122struct samsung_pll_rate_table {
123 unsigned int rate;
124 unsigned int pdiv;
125 unsigned int mdiv;
126 unsigned int sdiv;
127 unsigned int kdiv;
128 unsigned int afc;
129 unsigned int mfr;
130 unsigned int mrr;
131 unsigned int vsel;
132};
133
134#endif /* __SAMSUNG_CLK_PLL_H */