aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/meson/gxbb.c
diff options
context:
space:
mode:
authorJerome Brunet <jbrunet@baylibre.com>2018-08-01 10:00:52 -0400
committerJerome Brunet <jbrunet@baylibre.com>2018-09-26 06:01:57 -0400
commit87173557d2f6d28ba6e19f8aaf6b7f3d45d51511 (patch)
treeb3d6f9bd85962dcdaa1776cb69023541bfc94111 /drivers/clk/meson/gxbb.c
parent2303a9ca693e585a558497ad737728fec97e2b8a (diff)
clk: meson: clk-pll: remove od parameters
Remove od parameters from pll clocks and add post dividers clocks instead. Some clock, especially the one which feature several ods, may provide output between those ods. Also, some drivers, such as the hdmi driver, may require a more detailed control of the clock dividers, compared to what CCF would perform automatically. One added benefit of removing ods is that it also greatly reduce the size of the rate parameter tables. In the future, we could possibly take the predivider 'n' out of this driver as well. To do so, we will need to understand the constraints for the PLL to lock and whether or not it depends on the input clock rate. Acked-by: Neil Armstrong <narmstrong@baylibre.com> Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Tested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Diffstat (limited to 'drivers/clk/meson/gxbb.c')
-rw-r--r--drivers/clk/meson/gxbb.c484
1 files changed, 228 insertions, 256 deletions
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
index 01e3f80e88cc..af59f2607dc1 100644
--- a/drivers/clk/meson/gxbb.c
+++ b/drivers/clk/meson/gxbb.c
@@ -19,163 +19,70 @@
19static DEFINE_SPINLOCK(meson_clk_lock); 19static DEFINE_SPINLOCK(meson_clk_lock);
20 20
21static const struct pll_rate_table gxbb_gp0_pll_rate_table[] = { 21static const struct pll_rate_table gxbb_gp0_pll_rate_table[] = {
22 PLL_RATE(96000000, 32, 1, 3), 22 PLL_RATE(768000000, 32, 1),
23 PLL_RATE(99000000, 33, 1, 3), 23 PLL_RATE(792000000, 33, 1),
24 PLL_RATE(102000000, 34, 1, 3), 24 PLL_RATE(816000000, 34, 1),
25 PLL_RATE(105000000, 35, 1, 3), 25 PLL_RATE(840000000, 35, 1),
26 PLL_RATE(108000000, 36, 1, 3), 26 PLL_RATE(864000000, 36, 1),
27 PLL_RATE(111000000, 37, 1, 3), 27 PLL_RATE(888000000, 37, 1),
28 PLL_RATE(114000000, 38, 1, 3), 28 PLL_RATE(912000000, 38, 1),
29 PLL_RATE(117000000, 39, 1, 3), 29 PLL_RATE(936000000, 39, 1),
30 PLL_RATE(120000000, 40, 1, 3), 30 PLL_RATE(960000000, 40, 1),
31 PLL_RATE(123000000, 41, 1, 3), 31 PLL_RATE(984000000, 41, 1),
32 PLL_RATE(126000000, 42, 1, 3), 32 PLL_RATE(1008000000, 42, 1),
33 PLL_RATE(129000000, 43, 1, 3), 33 PLL_RATE(1032000000, 43, 1),
34 PLL_RATE(132000000, 44, 1, 3), 34 PLL_RATE(1056000000, 44, 1),
35 PLL_RATE(135000000, 45, 1, 3), 35 PLL_RATE(1080000000, 45, 1),
36 PLL_RATE(138000000, 46, 1, 3), 36 PLL_RATE(1104000000, 46, 1),
37 PLL_RATE(141000000, 47, 1, 3), 37 PLL_RATE(1128000000, 47, 1),
38 PLL_RATE(144000000, 48, 1, 3), 38 PLL_RATE(1152000000, 48, 1),
39 PLL_RATE(147000000, 49, 1, 3), 39 PLL_RATE(1176000000, 49, 1),
40 PLL_RATE(150000000, 50, 1, 3), 40 PLL_RATE(1200000000, 50, 1),
41 PLL_RATE(153000000, 51, 1, 3), 41 PLL_RATE(1224000000, 51, 1),
42 PLL_RATE(156000000, 52, 1, 3), 42 PLL_RATE(1248000000, 52, 1),
43 PLL_RATE(159000000, 53, 1, 3), 43 PLL_RATE(1272000000, 53, 1),
44 PLL_RATE(162000000, 54, 1, 3), 44 PLL_RATE(1296000000, 54, 1),
45 PLL_RATE(165000000, 55, 1, 3), 45 PLL_RATE(1320000000, 55, 1),
46 PLL_RATE(168000000, 56, 1, 3), 46 PLL_RATE(1344000000, 56, 1),
47 PLL_RATE(171000000, 57, 1, 3), 47 PLL_RATE(1368000000, 57, 1),
48 PLL_RATE(174000000, 58, 1, 3), 48 PLL_RATE(1392000000, 58, 1),
49 PLL_RATE(177000000, 59, 1, 3), 49 PLL_RATE(1416000000, 59, 1),
50 PLL_RATE(180000000, 60, 1, 3), 50 PLL_RATE(1440000000, 60, 1),
51 PLL_RATE(183000000, 61, 1, 3), 51 PLL_RATE(1464000000, 61, 1),
52 PLL_RATE(186000000, 62, 1, 3), 52 PLL_RATE(1488000000, 62, 1),
53 PLL_RATE(192000000, 32, 1, 2),
54 PLL_RATE(198000000, 33, 1, 2),
55 PLL_RATE(204000000, 34, 1, 2),
56 PLL_RATE(210000000, 35, 1, 2),
57 PLL_RATE(216000000, 36, 1, 2),
58 PLL_RATE(222000000, 37, 1, 2),
59 PLL_RATE(228000000, 38, 1, 2),
60 PLL_RATE(234000000, 39, 1, 2),
61 PLL_RATE(240000000, 40, 1, 2),
62 PLL_RATE(246000000, 41, 1, 2),
63 PLL_RATE(252000000, 42, 1, 2),
64 PLL_RATE(258000000, 43, 1, 2),
65 PLL_RATE(264000000, 44, 1, 2),
66 PLL_RATE(270000000, 45, 1, 2),
67 PLL_RATE(276000000, 46, 1, 2),
68 PLL_RATE(282000000, 47, 1, 2),
69 PLL_RATE(288000000, 48, 1, 2),
70 PLL_RATE(294000000, 49, 1, 2),
71 PLL_RATE(300000000, 50, 1, 2),
72 PLL_RATE(306000000, 51, 1, 2),
73 PLL_RATE(312000000, 52, 1, 2),
74 PLL_RATE(318000000, 53, 1, 2),
75 PLL_RATE(324000000, 54, 1, 2),
76 PLL_RATE(330000000, 55, 1, 2),
77 PLL_RATE(336000000, 56, 1, 2),
78 PLL_RATE(342000000, 57, 1, 2),
79 PLL_RATE(348000000, 58, 1, 2),
80 PLL_RATE(354000000, 59, 1, 2),
81 PLL_RATE(360000000, 60, 1, 2),
82 PLL_RATE(366000000, 61, 1, 2),
83 PLL_RATE(372000000, 62, 1, 2),
84 PLL_RATE(384000000, 32, 1, 1),
85 PLL_RATE(396000000, 33, 1, 1),
86 PLL_RATE(408000000, 34, 1, 1),
87 PLL_RATE(420000000, 35, 1, 1),
88 PLL_RATE(432000000, 36, 1, 1),
89 PLL_RATE(444000000, 37, 1, 1),
90 PLL_RATE(456000000, 38, 1, 1),
91 PLL_RATE(468000000, 39, 1, 1),
92 PLL_RATE(480000000, 40, 1, 1),
93 PLL_RATE(492000000, 41, 1, 1),
94 PLL_RATE(504000000, 42, 1, 1),
95 PLL_RATE(516000000, 43, 1, 1),
96 PLL_RATE(528000000, 44, 1, 1),
97 PLL_RATE(540000000, 45, 1, 1),
98 PLL_RATE(552000000, 46, 1, 1),
99 PLL_RATE(564000000, 47, 1, 1),
100 PLL_RATE(576000000, 48, 1, 1),
101 PLL_RATE(588000000, 49, 1, 1),
102 PLL_RATE(600000000, 50, 1, 1),
103 PLL_RATE(612000000, 51, 1, 1),
104 PLL_RATE(624000000, 52, 1, 1),
105 PLL_RATE(636000000, 53, 1, 1),
106 PLL_RATE(648000000, 54, 1, 1),
107 PLL_RATE(660000000, 55, 1, 1),
108 PLL_RATE(672000000, 56, 1, 1),
109 PLL_RATE(684000000, 57, 1, 1),
110 PLL_RATE(696000000, 58, 1, 1),
111 PLL_RATE(708000000, 59, 1, 1),
112 PLL_RATE(720000000, 60, 1, 1),
113 PLL_RATE(732000000, 61, 1, 1),
114 PLL_RATE(744000000, 62, 1, 1),
115 PLL_RATE(768000000, 32, 1, 0),
116 PLL_RATE(792000000, 33, 1, 0),
117 PLL_RATE(816000000, 34, 1, 0),
118 PLL_RATE(840000000, 35, 1, 0),
119 PLL_RATE(864000000, 36, 1, 0),
120 PLL_RATE(888000000, 37, 1, 0),
121 PLL_RATE(912000000, 38, 1, 0),
122 PLL_RATE(936000000, 39, 1, 0),
123 PLL_RATE(960000000, 40, 1, 0),
124 PLL_RATE(984000000, 41, 1, 0),
125 PLL_RATE(1008000000, 42, 1, 0),
126 PLL_RATE(1032000000, 43, 1, 0),
127 PLL_RATE(1056000000, 44, 1, 0),
128 PLL_RATE(1080000000, 45, 1, 0),
129 PLL_RATE(1104000000, 46, 1, 0),
130 PLL_RATE(1128000000, 47, 1, 0),
131 PLL_RATE(1152000000, 48, 1, 0),
132 PLL_RATE(1176000000, 49, 1, 0),
133 PLL_RATE(1200000000, 50, 1, 0),
134 PLL_RATE(1224000000, 51, 1, 0),
135 PLL_RATE(1248000000, 52, 1, 0),
136 PLL_RATE(1272000000, 53, 1, 0),
137 PLL_RATE(1296000000, 54, 1, 0),
138 PLL_RATE(1320000000, 55, 1, 0),
139 PLL_RATE(1344000000, 56, 1, 0),
140 PLL_RATE(1368000000, 57, 1, 0),
141 PLL_RATE(1392000000, 58, 1, 0),
142 PLL_RATE(1416000000, 59, 1, 0),
143 PLL_RATE(1440000000, 60, 1, 0),
144 PLL_RATE(1464000000, 61, 1, 0),
145 PLL_RATE(1488000000, 62, 1, 0),
146 { /* sentinel */ }, 53 { /* sentinel */ },
147}; 54};
148 55
149static const struct pll_rate_table gxl_gp0_pll_rate_table[] = { 56static const struct pll_rate_table gxl_gp0_pll_rate_table[] = {
150 PLL_RATE(504000000, 42, 1, 1), 57 PLL_RATE(1008000000, 42, 1),
151 PLL_RATE(516000000, 43, 1, 1), 58 PLL_RATE(1032000000, 43, 1),
152 PLL_RATE(528000000, 44, 1, 1), 59 PLL_RATE(1056000000, 44, 1),
153 PLL_RATE(540000000, 45, 1, 1), 60 PLL_RATE(1080000000, 45, 1),
154 PLL_RATE(552000000, 46, 1, 1), 61 PLL_RATE(1104000000, 46, 1),
155 PLL_RATE(564000000, 47, 1, 1), 62 PLL_RATE(1128000000, 47, 1),
156 PLL_RATE(576000000, 48, 1, 1), 63 PLL_RATE(1152000000, 48, 1),
157 PLL_RATE(588000000, 49, 1, 1), 64 PLL_RATE(1176000000, 49, 1),
158 PLL_RATE(600000000, 50, 1, 1), 65 PLL_RATE(1200000000, 50, 1),
159 PLL_RATE(612000000, 51, 1, 1), 66 PLL_RATE(1224000000, 51, 1),
160 PLL_RATE(624000000, 52, 1, 1), 67 PLL_RATE(1248000000, 52, 1),
161 PLL_RATE(636000000, 53, 1, 1), 68 PLL_RATE(1272000000, 53, 1),
162 PLL_RATE(648000000, 54, 1, 1), 69 PLL_RATE(1296000000, 54, 1),
163 PLL_RATE(660000000, 55, 1, 1), 70 PLL_RATE(1320000000, 55, 1),
164 PLL_RATE(672000000, 56, 1, 1), 71 PLL_RATE(1344000000, 56, 1),
165 PLL_RATE(684000000, 57, 1, 1), 72 PLL_RATE(1368000000, 57, 1),
166 PLL_RATE(696000000, 58, 1, 1), 73 PLL_RATE(1392000000, 58, 1),
167 PLL_RATE(708000000, 59, 1, 1), 74 PLL_RATE(1416000000, 59, 1),
168 PLL_RATE(720000000, 60, 1, 1), 75 PLL_RATE(1440000000, 60, 1),
169 PLL_RATE(732000000, 61, 1, 1), 76 PLL_RATE(1464000000, 61, 1),
170 PLL_RATE(744000000, 62, 1, 1), 77 PLL_RATE(1488000000, 62, 1),
171 PLL_RATE(756000000, 63, 1, 1), 78 PLL_RATE(1512000000, 63, 1),
172 PLL_RATE(768000000, 64, 1, 1), 79 PLL_RATE(1536000000, 64, 1),
173 PLL_RATE(780000000, 65, 1, 1), 80 PLL_RATE(1560000000, 65, 1),
174 PLL_RATE(792000000, 66, 1, 1), 81 PLL_RATE(1584000000, 66, 1),
175 { /* sentinel */ }, 82 { /* sentinel */ },
176}; 83};
177 84
178static struct clk_regmap gxbb_fixed_pll = { 85static struct clk_regmap gxbb_fixed_pll_dco = {
179 .data = &(struct meson_clk_pll_data){ 86 .data = &(struct meson_clk_pll_data){
180 .en = { 87 .en = {
181 .reg_off = HHI_MPLL_CNTL, 88 .reg_off = HHI_MPLL_CNTL,
@@ -192,11 +99,6 @@ static struct clk_regmap gxbb_fixed_pll = {
192 .shift = 9, 99 .shift = 9,
193 .width = 5, 100 .width = 5,
194 }, 101 },
195 .od = {
196 .reg_off = HHI_MPLL_CNTL,
197 .shift = 16,
198 .width = 2,
199 },
200 .frac = { 102 .frac = {
201 .reg_off = HHI_MPLL_CNTL2, 103 .reg_off = HHI_MPLL_CNTL2,
202 .shift = 0, 104 .shift = 0,
@@ -214,13 +116,32 @@ static struct clk_regmap gxbb_fixed_pll = {
214 }, 116 },
215 }, 117 },
216 .hw.init = &(struct clk_init_data){ 118 .hw.init = &(struct clk_init_data){
217 .name = "fixed_pll", 119 .name = "fixed_pll_dco",
218 .ops = &meson_clk_pll_ro_ops, 120 .ops = &meson_clk_pll_ro_ops,
219 .parent_names = (const char *[]){ "xtal" }, 121 .parent_names = (const char *[]){ "xtal" },
220 .num_parents = 1, 122 .num_parents = 1,
221 }, 123 },
222}; 124};
223 125
126static struct clk_regmap gxbb_fixed_pll = {
127 .data = &(struct clk_regmap_div_data){
128 .offset = HHI_MPLL_CNTL,
129 .shift = 16,
130 .width = 2,
131 .flags = CLK_DIVIDER_POWER_OF_TWO,
132 },
133 .hw.init = &(struct clk_init_data){
134 .name = "fixed_pll",
135 .ops = &clk_regmap_divider_ro_ops,
136 .parent_names = (const char *[]){ "fixed_pll_dco" },
137 .num_parents = 1,
138 /*
139 * This clock won't ever change at runtime so
140 * CLK_SET_RATE_PARENT is not required
141 */
142 },
143};
144
224static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = { 145static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
225 .mult = 2, 146 .mult = 2,
226 .div = 1, 147 .div = 1,
@@ -232,7 +153,7 @@ static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
232 }, 153 },
233}; 154};
234 155
235static struct clk_regmap gxbb_hdmi_pll = { 156static struct clk_regmap gxbb_hdmi_pll_dco = {
236 .data = &(struct meson_clk_pll_data){ 157 .data = &(struct meson_clk_pll_data){
237 .en = { 158 .en = {
238 .reg_off = HHI_HDMI_PLL_CNTL, 159 .reg_off = HHI_HDMI_PLL_CNTL,
@@ -254,21 +175,6 @@ static struct clk_regmap gxbb_hdmi_pll = {
254 .shift = 0, 175 .shift = 0,
255 .width = 12, 176 .width = 12,
256 }, 177 },
257 .od = {
258 .reg_off = HHI_HDMI_PLL_CNTL2,
259 .shift = 16,
260 .width = 2,
261 },
262 .od2 = {
263 .reg_off = HHI_HDMI_PLL_CNTL2,
264 .shift = 22,
265 .width = 2,
266 },
267 .od3 = {
268 .reg_off = HHI_HDMI_PLL_CNTL2,
269 .shift = 18,
270 .width = 2,
271 },
272 .l = { 178 .l = {
273 .reg_off = HHI_HDMI_PLL_CNTL, 179 .reg_off = HHI_HDMI_PLL_CNTL,
274 .shift = 31, 180 .shift = 31,
@@ -281,7 +187,7 @@ static struct clk_regmap gxbb_hdmi_pll = {
281 }, 187 },
282 }, 188 },
283 .hw.init = &(struct clk_init_data){ 189 .hw.init = &(struct clk_init_data){
284 .name = "hdmi_pll", 190 .name = "hdmi_pll_dco",
285 .ops = &meson_clk_pll_ro_ops, 191 .ops = &meson_clk_pll_ro_ops,
286 .parent_names = (const char *[]){ "hdmi_pll_pre_mult" }, 192 .parent_names = (const char *[]){ "hdmi_pll_pre_mult" },
287 .num_parents = 1, 193 .num_parents = 1,
@@ -293,74 +199,103 @@ static struct clk_regmap gxbb_hdmi_pll = {
293 }, 199 },
294}; 200};
295 201
202static struct clk_regmap gxbb_hdmi_pll_od = {
203 .data = &(struct clk_regmap_div_data){
204 .offset = HHI_HDMI_PLL_CNTL2,
205 .shift = 16,
206 .width = 2,
207 .flags = CLK_DIVIDER_POWER_OF_TWO,
208 },
209 .hw.init = &(struct clk_init_data){
210 .name = "hdmi_pll_od",
211 .ops = &clk_regmap_divider_ro_ops,
212 .parent_names = (const char *[]){ "hdmi_pll_dco" },
213 .num_parents = 1,
214 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
215 },
216};
217
218static struct clk_regmap gxbb_hdmi_pll_od2 = {
219 .data = &(struct clk_regmap_div_data){
220 .offset = HHI_HDMI_PLL_CNTL2,
221 .shift = 22,
222 .width = 2,
223 .flags = CLK_DIVIDER_POWER_OF_TWO,
224 },
225 .hw.init = &(struct clk_init_data){
226 .name = "hdmi_pll_od2",
227 .ops = &clk_regmap_divider_ro_ops,
228 .parent_names = (const char *[]){ "hdmi_pll_od" },
229 .num_parents = 1,
230 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
231 },
232};
233
234static struct clk_regmap gxbb_hdmi_pll = {
235 .data = &(struct clk_regmap_div_data){
236 .offset = HHI_HDMI_PLL_CNTL2,
237 .shift = 18,
238 .width = 2,
239 .flags = CLK_DIVIDER_POWER_OF_TWO,
240 },
241 .hw.init = &(struct clk_init_data){
242 .name = "hdmi_pll",
243 .ops = &clk_regmap_divider_ro_ops,
244 .parent_names = (const char *[]){ "hdmi_pll_od2" },
245 .num_parents = 1,
246 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
247 },
248};
249
250static struct clk_regmap gxl_hdmi_pll_od = {
251 .data = &(struct clk_regmap_div_data){
252 .offset = HHI_HDMI_PLL_CNTL + 8,
253 .shift = 21,
254 .width = 2,
255 .flags = CLK_DIVIDER_POWER_OF_TWO,
256 },
257 .hw.init = &(struct clk_init_data){
258 .name = "hdmi_pll_od",
259 .ops = &clk_regmap_divider_ro_ops,
260 .parent_names = (const char *[]){ "hdmi_pll_dco" },
261 .num_parents = 1,
262 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
263 },
264};
265
266static struct clk_regmap gxl_hdmi_pll_od2 = {
267 .data = &(struct clk_regmap_div_data){
268 .offset = HHI_HDMI_PLL_CNTL + 8,
269 .shift = 23,
270 .width = 2,
271 .flags = CLK_DIVIDER_POWER_OF_TWO,
272 },
273 .hw.init = &(struct clk_init_data){
274 .name = "hdmi_pll_od2",
275 .ops = &clk_regmap_divider_ro_ops,
276 .parent_names = (const char *[]){ "hdmi_pll_od" },
277 .num_parents = 1,
278 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
279 },
280};
281
296static struct clk_regmap gxl_hdmi_pll = { 282static struct clk_regmap gxl_hdmi_pll = {
297 .data = &(struct meson_clk_pll_data){ 283 .data = &(struct clk_regmap_div_data){
298 .en = { 284 .offset = HHI_HDMI_PLL_CNTL + 8,
299 .reg_off = HHI_HDMI_PLL_CNTL, 285 .shift = 19,
300 .shift = 30, 286 .width = 2,
301 .width = 1, 287 .flags = CLK_DIVIDER_POWER_OF_TWO,
302 },
303 .m = {
304 .reg_off = HHI_HDMI_PLL_CNTL,
305 .shift = 0,
306 .width = 9,
307 },
308 .n = {
309 .reg_off = HHI_HDMI_PLL_CNTL,
310 .shift = 9,
311 .width = 5,
312 },
313 .frac = {
314 /*
315 * On gxl, there is a register shift due to
316 * HHI_HDMI_PLL_CNTL1 which does not exist on gxbb,
317 * so we compute the register offset based on the PLL
318 * base to get it right
319 */
320 .reg_off = HHI_HDMI_PLL_CNTL + 4,
321 .shift = 0,
322 .width = 12,
323 },
324 .od = {
325 .reg_off = HHI_HDMI_PLL_CNTL + 8,
326 .shift = 21,
327 .width = 2,
328 },
329 .od2 = {
330 .reg_off = HHI_HDMI_PLL_CNTL + 8,
331 .shift = 23,
332 .width = 2,
333 },
334 .od3 = {
335 .reg_off = HHI_HDMI_PLL_CNTL + 8,
336 .shift = 19,
337 .width = 2,
338 },
339 .l = {
340 .reg_off = HHI_HDMI_PLL_CNTL,
341 .shift = 31,
342 .width = 1,
343 },
344 .rst = {
345 .reg_off = HHI_HDMI_PLL_CNTL,
346 .shift = 29,
347 .width = 1,
348 },
349 }, 288 },
350 .hw.init = &(struct clk_init_data){ 289 .hw.init = &(struct clk_init_data){
351 .name = "hdmi_pll", 290 .name = "hdmi_pll",
352 .ops = &meson_clk_pll_ro_ops, 291 .ops = &clk_regmap_divider_ro_ops,
353 .parent_names = (const char *[]){ "xtal" }, 292 .parent_names = (const char *[]){ "hdmi_pll_od2" },
354 .num_parents = 1, 293 .num_parents = 1,
355 /* 294 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
356 * Display directly handle hdmi pll registers ATM, we need
357 * NOCACHE to keep our view of the clock as accurate as possible
358 */
359 .flags = CLK_GET_RATE_NOCACHE,
360 }, 295 },
361}; 296};
362 297
363static struct clk_regmap gxbb_sys_pll = { 298static struct clk_regmap gxbb_sys_pll_dco = {
364 .data = &(struct meson_clk_pll_data){ 299 .data = &(struct meson_clk_pll_data){
365 .en = { 300 .en = {
366 .reg_off = HHI_SYS_PLL_CNTL, 301 .reg_off = HHI_SYS_PLL_CNTL,
@@ -377,11 +312,6 @@ static struct clk_regmap gxbb_sys_pll = {
377 .shift = 9, 312 .shift = 9,
378 .width = 5, 313 .width = 5,
379 }, 314 },
380 .od = {
381 .reg_off = HHI_SYS_PLL_CNTL,
382 .shift = 10,
383 .width = 2,
384 },
385 .l = { 315 .l = {
386 .reg_off = HHI_SYS_PLL_CNTL, 316 .reg_off = HHI_SYS_PLL_CNTL,
387 .shift = 31, 317 .shift = 31,
@@ -394,20 +324,36 @@ static struct clk_regmap gxbb_sys_pll = {
394 }, 324 },
395 }, 325 },
396 .hw.init = &(struct clk_init_data){ 326 .hw.init = &(struct clk_init_data){
397 .name = "sys_pll", 327 .name = "sys_pll_dco",
398 .ops = &meson_clk_pll_ro_ops, 328 .ops = &meson_clk_pll_ro_ops,
399 .parent_names = (const char *[]){ "xtal" }, 329 .parent_names = (const char *[]){ "xtal" },
400 .num_parents = 1, 330 .num_parents = 1,
401 }, 331 },
402}; 332};
403 333
334static struct clk_regmap gxbb_sys_pll = {
335 .data = &(struct clk_regmap_div_data){
336 .offset = HHI_SYS_PLL_CNTL,
337 .shift = 10,
338 .width = 2,
339 .flags = CLK_DIVIDER_POWER_OF_TWO,
340 },
341 .hw.init = &(struct clk_init_data){
342 .name = "sys_pll",
343 .ops = &clk_regmap_divider_ro_ops,
344 .parent_names = (const char *[]){ "sys_pll_dco" },
345 .num_parents = 1,
346 .flags = CLK_SET_RATE_PARENT,
347 },
348};
349
404static const struct reg_sequence gxbb_gp0_init_regs[] = { 350static const struct reg_sequence gxbb_gp0_init_regs[] = {
405 { .reg = HHI_GP0_PLL_CNTL2, .def = 0x69c80000 }, 351 { .reg = HHI_GP0_PLL_CNTL2, .def = 0x69c80000 },
406 { .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a5590c4 }, 352 { .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a5590c4 },
407 { .reg = HHI_GP0_PLL_CNTL4, .def = 0x0000500d }, 353 { .reg = HHI_GP0_PLL_CNTL4, .def = 0x0000500d },
408}; 354};
409 355
410static struct clk_regmap gxbb_gp0_pll = { 356static struct clk_regmap gxbb_gp0_pll_dco = {
411 .data = &(struct meson_clk_pll_data){ 357 .data = &(struct meson_clk_pll_data){
412 .en = { 358 .en = {
413 .reg_off = HHI_GP0_PLL_CNTL, 359 .reg_off = HHI_GP0_PLL_CNTL,
@@ -424,11 +370,6 @@ static struct clk_regmap gxbb_gp0_pll = {
424 .shift = 9, 370 .shift = 9,
425 .width = 5, 371 .width = 5,
426 }, 372 },
427 .od = {
428 .reg_off = HHI_GP0_PLL_CNTL,
429 .shift = 16,
430 .width = 2,
431 },
432 .l = { 373 .l = {
433 .reg_off = HHI_GP0_PLL_CNTL, 374 .reg_off = HHI_GP0_PLL_CNTL,
434 .shift = 31, 375 .shift = 31,
@@ -444,7 +385,7 @@ static struct clk_regmap gxbb_gp0_pll = {
444 .init_count = ARRAY_SIZE(gxbb_gp0_init_regs), 385 .init_count = ARRAY_SIZE(gxbb_gp0_init_regs),
445 }, 386 },
446 .hw.init = &(struct clk_init_data){ 387 .hw.init = &(struct clk_init_data){
447 .name = "gp0_pll", 388 .name = "gp0_pll_dco",
448 .ops = &meson_clk_pll_ops, 389 .ops = &meson_clk_pll_ops,
449 .parent_names = (const char *[]){ "xtal" }, 390 .parent_names = (const char *[]){ "xtal" },
450 .num_parents = 1, 391 .num_parents = 1,
@@ -459,7 +400,7 @@ static const struct reg_sequence gxl_gp0_init_regs[] = {
459 { .reg = HHI_GP0_PLL_CNTL5, .def = 0x00078000 }, 400 { .reg = HHI_GP0_PLL_CNTL5, .def = 0x00078000 },
460}; 401};
461 402
462static struct clk_regmap gxl_gp0_pll = { 403static struct clk_regmap gxl_gp0_pll_dco = {
463 .data = &(struct meson_clk_pll_data){ 404 .data = &(struct meson_clk_pll_data){
464 .en = { 405 .en = {
465 .reg_off = HHI_GP0_PLL_CNTL, 406 .reg_off = HHI_GP0_PLL_CNTL,
@@ -476,11 +417,6 @@ static struct clk_regmap gxl_gp0_pll = {
476 .shift = 9, 417 .shift = 9,
477 .width = 5, 418 .width = 5,
478 }, 419 },
479 .od = {
480 .reg_off = HHI_GP0_PLL_CNTL,
481 .shift = 16,
482 .width = 2,
483 },
484 .frac = { 420 .frac = {
485 .reg_off = HHI_GP0_PLL_CNTL1, 421 .reg_off = HHI_GP0_PLL_CNTL1,
486 .shift = 0, 422 .shift = 0,
@@ -501,13 +437,29 @@ static struct clk_regmap gxl_gp0_pll = {
501 .init_count = ARRAY_SIZE(gxl_gp0_init_regs), 437 .init_count = ARRAY_SIZE(gxl_gp0_init_regs),
502 }, 438 },
503 .hw.init = &(struct clk_init_data){ 439 .hw.init = &(struct clk_init_data){
504 .name = "gp0_pll", 440 .name = "gp0_pll_dco",
505 .ops = &meson_clk_pll_ops, 441 .ops = &meson_clk_pll_ops,
506 .parent_names = (const char *[]){ "xtal" }, 442 .parent_names = (const char *[]){ "xtal" },
507 .num_parents = 1, 443 .num_parents = 1,
508 }, 444 },
509}; 445};
510 446
447static struct clk_regmap gxbb_gp0_pll = {
448 .data = &(struct clk_regmap_div_data){
449 .offset = HHI_GP0_PLL_CNTL,
450 .shift = 16,
451 .width = 2,
452 .flags = CLK_DIVIDER_POWER_OF_TWO,
453 },
454 .hw.init = &(struct clk_init_data){
455 .name = "gp0_pll",
456 .ops = &clk_regmap_divider_ops,
457 .parent_names = (const char *[]){ "gp0_pll_dco" },
458 .num_parents = 1,
459 .flags = CLK_SET_RATE_PARENT,
460 },
461};
462
511static struct clk_fixed_factor gxbb_fclk_div2_div = { 463static struct clk_fixed_factor gxbb_fclk_div2_div = {
512 .mult = 1, 464 .mult = 1,
513 .div = 2, 465 .div = 2,
@@ -1965,6 +1917,12 @@ static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
1965 [CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw, 1917 [CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
1966 [CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw, 1918 [CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
1967 [CLKID_GEN_CLK] = &gxbb_gen_clk.hw, 1919 [CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
1920 [CLKID_FIXED_PLL_DCO] = &gxbb_fixed_pll_dco.hw,
1921 [CLKID_HDMI_PLL_DCO] = &gxbb_hdmi_pll_dco.hw,
1922 [CLKID_HDMI_PLL_OD] = &gxbb_hdmi_pll_od.hw,
1923 [CLKID_HDMI_PLL_OD2] = &gxbb_hdmi_pll_od2.hw,
1924 [CLKID_SYS_PLL_DCO] = &gxbb_sys_pll_dco.hw,
1925 [CLKID_GP0_PLL_DCO] = &gxbb_gp0_pll_dco.hw,
1968 [NR_CLKS] = NULL, 1926 [NR_CLKS] = NULL,
1969 }, 1927 },
1970 .num = NR_CLKS, 1928 .num = NR_CLKS,
@@ -1980,7 +1938,7 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
1980 [CLKID_FCLK_DIV4] = &gxbb_fclk_div4.hw, 1938 [CLKID_FCLK_DIV4] = &gxbb_fclk_div4.hw,
1981 [CLKID_FCLK_DIV5] = &gxbb_fclk_div5.hw, 1939 [CLKID_FCLK_DIV5] = &gxbb_fclk_div5.hw,
1982 [CLKID_FCLK_DIV7] = &gxbb_fclk_div7.hw, 1940 [CLKID_FCLK_DIV7] = &gxbb_fclk_div7.hw,
1983 [CLKID_GP0_PLL] = &gxl_gp0_pll.hw, 1941 [CLKID_GP0_PLL] = &gxbb_gp0_pll.hw,
1984 [CLKID_MPEG_SEL] = &gxbb_mpeg_clk_sel.hw, 1942 [CLKID_MPEG_SEL] = &gxbb_mpeg_clk_sel.hw,
1985 [CLKID_MPEG_DIV] = &gxbb_mpeg_clk_div.hw, 1943 [CLKID_MPEG_DIV] = &gxbb_mpeg_clk_div.hw,
1986 [CLKID_CLK81] = &gxbb_clk81.hw, 1944 [CLKID_CLK81] = &gxbb_clk81.hw,
@@ -2130,19 +2088,29 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
2130 [CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw, 2088 [CLKID_GEN_CLK_SEL] = &gxbb_gen_clk_sel.hw,
2131 [CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw, 2089 [CLKID_GEN_CLK_DIV] = &gxbb_gen_clk_div.hw,
2132 [CLKID_GEN_CLK] = &gxbb_gen_clk.hw, 2090 [CLKID_GEN_CLK] = &gxbb_gen_clk.hw,
2091 [CLKID_FIXED_PLL_DCO] = &gxbb_fixed_pll_dco.hw,
2092 [CLKID_HDMI_PLL_DCO] = &gxbb_hdmi_pll_dco.hw,
2093 [CLKID_HDMI_PLL_OD] = &gxl_hdmi_pll_od.hw,
2094 [CLKID_HDMI_PLL_OD2] = &gxl_hdmi_pll_od2.hw,
2095 [CLKID_SYS_PLL_DCO] = &gxbb_sys_pll_dco.hw,
2096 [CLKID_GP0_PLL_DCO] = &gxl_gp0_pll_dco.hw,
2133 [NR_CLKS] = NULL, 2097 [NR_CLKS] = NULL,
2134 }, 2098 },
2135 .num = NR_CLKS, 2099 .num = NR_CLKS,
2136}; 2100};
2137 2101
2138static struct clk_regmap *const gxbb_clk_regmaps[] = { 2102static struct clk_regmap *const gxbb_clk_regmaps[] = {
2139 &gxbb_gp0_pll, 2103 &gxbb_gp0_pll_dco,
2140 &gxbb_hdmi_pll, 2104 &gxbb_hdmi_pll,
2105 &gxbb_hdmi_pll_od,
2106 &gxbb_hdmi_pll_od2,
2141}; 2107};
2142 2108
2143static struct clk_regmap *const gxl_clk_regmaps[] = { 2109static struct clk_regmap *const gxl_clk_regmaps[] = {
2144 &gxl_gp0_pll, 2110 &gxl_gp0_pll_dco,
2145 &gxl_hdmi_pll, 2111 &gxl_hdmi_pll,
2112 &gxl_hdmi_pll_od,
2113 &gxl_hdmi_pll_od2,
2146}; 2114};
2147 2115
2148static struct clk_regmap *const gx_clk_regmaps[] = { 2116static struct clk_regmap *const gx_clk_regmaps[] = {
@@ -2297,6 +2265,10 @@ static struct clk_regmap *const gx_clk_regmaps[] = {
2297 &gxbb_gen_clk_sel, 2265 &gxbb_gen_clk_sel,
2298 &gxbb_gen_clk_div, 2266 &gxbb_gen_clk_div,
2299 &gxbb_gen_clk, 2267 &gxbb_gen_clk,
2268 &gxbb_fixed_pll_dco,
2269 &gxbb_hdmi_pll_dco,
2270 &gxbb_sys_pll_dco,
2271 &gxbb_gp0_pll,
2300}; 2272};
2301 2273
2302struct clkc_data { 2274struct clkc_data {