kernel: update 3.14 to 3.14.18
[openwrt/staging/yousong.git] / target / linux / ipq806x / patches / 0129-clk-qcom-Add-support-for-NSS-GMAC-clocks-and-resets.patch
1 From 92fde23153240a6173645dabe4d99f4aa6570bb7 Mon Sep 17 00:00:00 2001
2 From: Stephen Boyd <sboyd@codeaurora.org>
3 Date: Mon, 28 Apr 2014 16:01:03 -0700
4 Subject: [PATCH 129/182] clk: qcom: Add support for NSS/GMAC clocks and
5 resets
6
7 The NSS driver expects one virtual clock that actually represents
8 two clocks (one for each UBI32 core). Register the ubi32 core
9 clocks and also make a wrapper virtual clock called nss_core_clk
10 to be used by the driver. This will properly handle switching the
11 rates of both clocks at the same time like how the NSS driver
12 expects it. Also add the TCM clock and the NSS resets.
13
14 Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
15 ---
16 drivers/clk/qcom/gcc-ipq806x.c | 710 +++++++++++++++++++++++++-
17 include/dt-bindings/clock/qcom,gcc-ipq806x.h | 3 +
18 include/dt-bindings/reset/qcom,gcc-ipq806x.h | 43 ++
19 3 files changed, 755 insertions(+), 1 deletion(-)
20
21 --- a/drivers/clk/qcom/gcc-ipq806x.c
22 +++ b/drivers/clk/qcom/gcc-ipq806x.c
23 @@ -32,6 +32,33 @@
24 #include "clk-branch.h"
25 #include "reset.h"
26
27 +static struct clk_pll pll0 = {
28 + .l_reg = 0x30c4,
29 + .m_reg = 0x30c8,
30 + .n_reg = 0x30cc,
31 + .config_reg = 0x30d4,
32 + .mode_reg = 0x30c0,
33 + .status_reg = 0x30d8,
34 + .status_bit = 16,
35 + .clkr.hw.init = &(struct clk_init_data){
36 + .name = "pll0",
37 + .parent_names = (const char *[]){ "pxo" },
38 + .num_parents = 1,
39 + .ops = &clk_pll_ops,
40 + },
41 +};
42 +
43 +static struct clk_regmap pll0_vote = {
44 + .enable_reg = 0x34c0,
45 + .enable_mask = BIT(0),
46 + .hw.init = &(struct clk_init_data){
47 + .name = "pll0_vote",
48 + .parent_names = (const char *[]){ "pll0" },
49 + .num_parents = 1,
50 + .ops = &clk_pll_vote_ops,
51 + },
52 +};
53 +
54 static struct clk_pll pll3 = {
55 .l_reg = 0x3164,
56 .m_reg = 0x3168,
57 @@ -102,11 +129,46 @@ static struct clk_regmap pll14_vote = {
58 },
59 };
60
61 +#define NSS_PLL_RATE(f, _l, _m, _n, i) \
62 + { \
63 + .freq = f, \
64 + .l = _l, \
65 + .m = _m, \
66 + .n = _n, \
67 + .ibits = i, \
68 + }
69 +
70 +static struct pll_freq_tbl pll18_freq_tbl[] = {
71 + NSS_PLL_RATE(550000000, 44, 0, 1, 0x01495625),
72 + NSS_PLL_RATE(733000000, 58, 16, 25, 0x014b5625),
73 +};
74 +
75 +static struct clk_pll pll18 = {
76 + .l_reg = 0x31a4,
77 + .m_reg = 0x31a8,
78 + .n_reg = 0x31ac,
79 + .config_reg = 0x31b4,
80 + .mode_reg = 0x31a0,
81 + .status_reg = 0x31b8,
82 + .status_bit = 16,
83 + .post_div_shift = 16,
84 + .post_div_width = 1,
85 + .freq_tbl = pll18_freq_tbl,
86 + .clkr.hw.init = &(struct clk_init_data){
87 + .name = "pll18",
88 + .parent_names = (const char *[]){ "pxo" },
89 + .num_parents = 1,
90 + .ops = &clk_pll_ops,
91 + },
92 +};
93 +
94 #define P_PXO 0
95 #define P_PLL8 1
96 #define P_PLL3 1
97 #define P_PLL0 2
98 #define P_CXO 2
99 +#define P_PLL14 3
100 +#define P_PLL18 4
101
102 static const u8 gcc_pxo_pll8_map[] = {
103 [P_PXO] = 0,
104 @@ -157,6 +219,22 @@ static const char *gcc_pxo_pll8_pll0_map
105 "pll0",
106 };
107
108 +static const u8 gcc_pxo_pll8_pll14_pll18_pll0_map[] = {
109 + [P_PXO] = 0,
110 + [P_PLL8] = 4,
111 + [P_PLL0] = 2,
112 + [P_PLL14] = 5,
113 + [P_PLL18] = 1,
114 +};
115 +
116 +static const char *gcc_pxo_pll8_pll14_pll18_pll0[] = {
117 + "pxo",
118 + "pll8_vote",
119 + "pll0_vote",
120 + "pll14",
121 + "pll18",
122 +};
123 +
124 static struct freq_tbl clk_tbl_gsbi_uart[] = {
125 { 1843200, P_PLL8, 2, 6, 625 },
126 { 3686400, P_PLL8, 2, 12, 625 },
127 @@ -2132,12 +2210,567 @@ static struct clk_branch usb_fs1_h_clk =
128 },
129 };
130
131 +static const struct freq_tbl clk_tbl_gmac[] = {
132 + { 133000000, P_PLL0, 1, 50, 301 },
133 + { }
134 +};
135 +
136 +static struct clk_dyn_rcg gmac_core1_src = {
137 + .ns_reg[0] = 0x3cac,
138 + .ns_reg[1] = 0x3cb0,
139 + .md_reg[0] = 0x3ca4,
140 + .md_reg[1] = 0x3ca8,
141 + .bank_reg = 0x3ca0,
142 + .mn[0] = {
143 + .mnctr_en_bit = 8,
144 + .mnctr_reset_bit = 7,
145 + .mnctr_mode_shift = 5,
146 + .n_val_shift = 16,
147 + .m_val_shift = 16,
148 + .width = 8,
149 + },
150 + .mn[1] = {
151 + .mnctr_en_bit = 8,
152 + .mnctr_reset_bit = 7,
153 + .mnctr_mode_shift = 5,
154 + .n_val_shift = 16,
155 + .m_val_shift = 16,
156 + .width = 8,
157 + },
158 + .s[0] = {
159 + .src_sel_shift = 0,
160 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
161 + },
162 + .s[1] = {
163 + .src_sel_shift = 0,
164 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
165 + },
166 + .p[0] = {
167 + .pre_div_shift = 3,
168 + .pre_div_width = 2,
169 + },
170 + .p[1] = {
171 + .pre_div_shift = 3,
172 + .pre_div_width = 2,
173 + },
174 + .mux_sel_bit = 0,
175 + .freq_tbl = clk_tbl_gmac,
176 + .clkr = {
177 + .enable_reg = 0x3ca0,
178 + .enable_mask = BIT(1),
179 + .hw.init = &(struct clk_init_data){
180 + .name = "gmac_core1_src",
181 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
182 + .num_parents = 5,
183 + .ops = &clk_dyn_rcg_ops,
184 + },
185 + },
186 +};
187 +
188 +static struct clk_branch gmac_core1_clk = {
189 + .halt_reg = 0x3c20,
190 + .halt_bit = 4,
191 + .hwcg_reg = 0x3cb4,
192 + .hwcg_bit = 6,
193 + .clkr = {
194 + .enable_reg = 0x3cb4,
195 + .enable_mask = BIT(4),
196 + .hw.init = &(struct clk_init_data){
197 + .name = "gmac_core1_clk",
198 + .parent_names = (const char *[]){
199 + "gmac_core1_src",
200 + },
201 + .num_parents = 1,
202 + .ops = &clk_branch_ops,
203 + .flags = CLK_SET_RATE_PARENT,
204 + },
205 + },
206 +};
207 +
208 +static struct clk_dyn_rcg gmac_core2_src = {
209 + .ns_reg[0] = 0x3ccc,
210 + .ns_reg[1] = 0x3cd0,
211 + .md_reg[0] = 0x3cc4,
212 + .md_reg[1] = 0x3cc8,
213 + .bank_reg = 0x3ca0,
214 + .mn[0] = {
215 + .mnctr_en_bit = 8,
216 + .mnctr_reset_bit = 7,
217 + .mnctr_mode_shift = 5,
218 + .n_val_shift = 16,
219 + .m_val_shift = 16,
220 + .width = 8,
221 + },
222 + .mn[1] = {
223 + .mnctr_en_bit = 8,
224 + .mnctr_reset_bit = 7,
225 + .mnctr_mode_shift = 5,
226 + .n_val_shift = 16,
227 + .m_val_shift = 16,
228 + .width = 8,
229 + },
230 + .s[0] = {
231 + .src_sel_shift = 0,
232 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
233 + },
234 + .s[1] = {
235 + .src_sel_shift = 0,
236 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
237 + },
238 + .p[0] = {
239 + .pre_div_shift = 3,
240 + .pre_div_width = 2,
241 + },
242 + .p[1] = {
243 + .pre_div_shift = 3,
244 + .pre_div_width = 2,
245 + },
246 + .mux_sel_bit = 0,
247 + .freq_tbl = clk_tbl_gmac,
248 + .clkr = {
249 + .enable_reg = 0x3cc0,
250 + .enable_mask = BIT(1),
251 + .hw.init = &(struct clk_init_data){
252 + .name = "gmac_core2_src",
253 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
254 + .num_parents = 5,
255 + .ops = &clk_dyn_rcg_ops,
256 + },
257 + },
258 +};
259 +
260 +static struct clk_branch gmac_core2_clk = {
261 + .halt_reg = 0x3c20,
262 + .halt_bit = 5,
263 + .hwcg_reg = 0x3cd4,
264 + .hwcg_bit = 6,
265 + .clkr = {
266 + .enable_reg = 0x3cd4,
267 + .enable_mask = BIT(4),
268 + .hw.init = &(struct clk_init_data){
269 + .name = "gmac_core2_clk",
270 + .parent_names = (const char *[]){
271 + "gmac_core2_src",
272 + },
273 + .num_parents = 1,
274 + .ops = &clk_branch_ops,
275 + .flags = CLK_SET_RATE_PARENT,
276 + },
277 + },
278 +};
279 +
280 +static struct clk_dyn_rcg gmac_core3_src = {
281 + .ns_reg[0] = 0x3cec,
282 + .ns_reg[1] = 0x3cf0,
283 + .md_reg[0] = 0x3ce4,
284 + .md_reg[1] = 0x3ce8,
285 + .bank_reg = 0x3ce0,
286 + .mn[0] = {
287 + .mnctr_en_bit = 8,
288 + .mnctr_reset_bit = 7,
289 + .mnctr_mode_shift = 5,
290 + .n_val_shift = 16,
291 + .m_val_shift = 16,
292 + .width = 8,
293 + },
294 + .mn[1] = {
295 + .mnctr_en_bit = 8,
296 + .mnctr_reset_bit = 7,
297 + .mnctr_mode_shift = 5,
298 + .n_val_shift = 16,
299 + .m_val_shift = 16,
300 + .width = 8,
301 + },
302 + .s[0] = {
303 + .src_sel_shift = 0,
304 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
305 + },
306 + .s[1] = {
307 + .src_sel_shift = 0,
308 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
309 + },
310 + .p[0] = {
311 + .pre_div_shift = 3,
312 + .pre_div_width = 2,
313 + },
314 + .p[1] = {
315 + .pre_div_shift = 3,
316 + .pre_div_width = 2,
317 + },
318 + .mux_sel_bit = 0,
319 + .freq_tbl = clk_tbl_gmac,
320 + .clkr = {
321 + .enable_reg = 0x3ce0,
322 + .enable_mask = BIT(1),
323 + .hw.init = &(struct clk_init_data){
324 + .name = "gmac_core3_src",
325 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
326 + .num_parents = 5,
327 + .ops = &clk_dyn_rcg_ops,
328 + },
329 + },
330 +};
331 +
332 +static struct clk_branch gmac_core3_clk = {
333 + .halt_reg = 0x3c20,
334 + .halt_bit = 6,
335 + .hwcg_reg = 0x3cf4,
336 + .hwcg_bit = 6,
337 + .clkr = {
338 + .enable_reg = 0x3cf4,
339 + .enable_mask = BIT(4),
340 + .hw.init = &(struct clk_init_data){
341 + .name = "gmac_core3_clk",
342 + .parent_names = (const char *[]){
343 + "gmac_core3_src",
344 + },
345 + .num_parents = 1,
346 + .ops = &clk_branch_ops,
347 + .flags = CLK_SET_RATE_PARENT,
348 + },
349 + },
350 +};
351 +
352 +static struct clk_dyn_rcg gmac_core4_src = {
353 + .ns_reg[0] = 0x3d0c,
354 + .ns_reg[1] = 0x3d10,
355 + .md_reg[0] = 0x3d04,
356 + .md_reg[1] = 0x3d08,
357 + .bank_reg = 0x3d00,
358 + .mn[0] = {
359 + .mnctr_en_bit = 8,
360 + .mnctr_reset_bit = 7,
361 + .mnctr_mode_shift = 5,
362 + .n_val_shift = 16,
363 + .m_val_shift = 16,
364 + .width = 8,
365 + },
366 + .mn[1] = {
367 + .mnctr_en_bit = 8,
368 + .mnctr_reset_bit = 7,
369 + .mnctr_mode_shift = 5,
370 + .n_val_shift = 16,
371 + .m_val_shift = 16,
372 + .width = 8,
373 + },
374 + .s[0] = {
375 + .src_sel_shift = 0,
376 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
377 + },
378 + .s[1] = {
379 + .src_sel_shift = 0,
380 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
381 + },
382 + .p[0] = {
383 + .pre_div_shift = 3,
384 + .pre_div_width = 2,
385 + },
386 + .p[1] = {
387 + .pre_div_shift = 3,
388 + .pre_div_width = 2,
389 + },
390 + .mux_sel_bit = 0,
391 + .freq_tbl = clk_tbl_gmac,
392 + .clkr = {
393 + .enable_reg = 0x3d00,
394 + .enable_mask = BIT(1),
395 + .hw.init = &(struct clk_init_data){
396 + .name = "gmac_core4_src",
397 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
398 + .num_parents = 5,
399 + .ops = &clk_dyn_rcg_ops,
400 + },
401 + },
402 +};
403 +
404 +static struct clk_branch gmac_core4_clk = {
405 + .halt_reg = 0x3c20,
406 + .halt_bit = 7,
407 + .hwcg_reg = 0x3d14,
408 + .hwcg_bit = 6,
409 + .clkr = {
410 + .enable_reg = 0x3d14,
411 + .enable_mask = BIT(4),
412 + .hw.init = &(struct clk_init_data){
413 + .name = "gmac_core4_clk",
414 + .parent_names = (const char *[]){
415 + "gmac_core4_src",
416 + },
417 + .num_parents = 1,
418 + .ops = &clk_branch_ops,
419 + .flags = CLK_SET_RATE_PARENT,
420 + },
421 + },
422 +};
423 +
424 +static const struct freq_tbl clk_tbl_nss_tcm[] = {
425 + { 266000000, P_PLL0, 3, 0, 0 },
426 + { 400000000, P_PLL0, 2, 0, 0 },
427 + { }
428 +};
429 +
430 +static struct clk_dyn_rcg nss_tcm_src = {
431 + .ns_reg[0] = 0x3dc4,
432 + .ns_reg[1] = 0x3dc8,
433 + .bank_reg = 0x3dc0,
434 + .s[0] = {
435 + .src_sel_shift = 0,
436 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
437 + },
438 + .s[1] = {
439 + .src_sel_shift = 0,
440 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
441 + },
442 + .p[0] = {
443 + .pre_div_shift = 3,
444 + .pre_div_width = 4,
445 + },
446 + .p[1] = {
447 + .pre_div_shift = 3,
448 + .pre_div_width = 4,
449 + },
450 + .mux_sel_bit = 0,
451 + .freq_tbl = clk_tbl_nss_tcm,
452 + .clkr = {
453 + .enable_reg = 0x3dc0,
454 + .enable_mask = BIT(1),
455 + .hw.init = &(struct clk_init_data){
456 + .name = "nss_tcm_src",
457 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
458 + .num_parents = 5,
459 + .ops = &clk_dyn_rcg_ops,
460 + },
461 + },
462 +};
463 +
464 +static struct clk_branch nss_tcm_clk = {
465 + .halt_reg = 0x3c20,
466 + .halt_bit = 14,
467 + .clkr = {
468 + .enable_reg = 0x3dd0,
469 + .enable_mask = BIT(6) | BIT(4),
470 + .hw.init = &(struct clk_init_data){
471 + .name = "nss_tcm_clk",
472 + .parent_names = (const char *[]){
473 + "nss_tcm_src",
474 + },
475 + .num_parents = 1,
476 + .ops = &clk_branch_ops,
477 + .flags = CLK_SET_RATE_PARENT,
478 + },
479 + },
480 +};
481 +
482 +static const struct freq_tbl clk_tbl_nss[] = {
483 + { 110000000, P_PLL18, 1, 1, 5 },
484 + { 275000000, P_PLL18, 2, 0, 0 },
485 + { 550000000, P_PLL18, 1, 0, 0 },
486 + { 733000000, P_PLL18, 1, 0, 0 },
487 + { }
488 +};
489 +
490 +static struct clk_dyn_rcg ubi32_core1_src_clk = {
491 + .ns_reg[0] = 0x3d2c,
492 + .ns_reg[1] = 0x3d30,
493 + .md_reg[0] = 0x3d24,
494 + .md_reg[1] = 0x3d28,
495 + .bank_reg = 0x3d20,
496 + .mn[0] = {
497 + .mnctr_en_bit = 8,
498 + .mnctr_reset_bit = 7,
499 + .mnctr_mode_shift = 5,
500 + .n_val_shift = 16,
501 + .m_val_shift = 16,
502 + .width = 8,
503 + },
504 + .mn[1] = {
505 + .mnctr_en_bit = 8,
506 + .mnctr_reset_bit = 7,
507 + .mnctr_mode_shift = 5,
508 + .n_val_shift = 16,
509 + .m_val_shift = 16,
510 + .width = 8,
511 + },
512 + .s[0] = {
513 + .src_sel_shift = 0,
514 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
515 + },
516 + .s[1] = {
517 + .src_sel_shift = 0,
518 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
519 + },
520 + .p[0] = {
521 + .pre_div_shift = 3,
522 + .pre_div_width = 2,
523 + },
524 + .p[1] = {
525 + .pre_div_shift = 3,
526 + .pre_div_width = 2,
527 + },
528 + .mux_sel_bit = 0,
529 + .freq_tbl = clk_tbl_nss,
530 + .clkr = {
531 + .enable_reg = 0x3d20,
532 + .enable_mask = BIT(1),
533 + .hw.init = &(struct clk_init_data){
534 + .name = "ubi32_core1_src_clk",
535 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
536 + .num_parents = 5,
537 + .ops = &clk_dyn_rcg_ops,
538 + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
539 + },
540 + },
541 +};
542 +
543 +static struct clk_dyn_rcg ubi32_core2_src_clk = {
544 + .ns_reg[0] = 0x3d4c,
545 + .ns_reg[1] = 0x3d50,
546 + .md_reg[0] = 0x3d44,
547 + .md_reg[1] = 0x3d48,
548 + .bank_reg = 0x3d40,
549 + .mn[0] = {
550 + .mnctr_en_bit = 8,
551 + .mnctr_reset_bit = 7,
552 + .mnctr_mode_shift = 5,
553 + .n_val_shift = 16,
554 + .m_val_shift = 16,
555 + .width = 8,
556 + },
557 + .mn[1] = {
558 + .mnctr_en_bit = 8,
559 + .mnctr_reset_bit = 7,
560 + .mnctr_mode_shift = 5,
561 + .n_val_shift = 16,
562 + .m_val_shift = 16,
563 + .width = 8,
564 + },
565 + .s[0] = {
566 + .src_sel_shift = 0,
567 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
568 + },
569 + .s[1] = {
570 + .src_sel_shift = 0,
571 + .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
572 + },
573 + .p[0] = {
574 + .pre_div_shift = 3,
575 + .pre_div_width = 2,
576 + },
577 + .p[1] = {
578 + .pre_div_shift = 3,
579 + .pre_div_width = 2,
580 + },
581 + .mux_sel_bit = 0,
582 + .freq_tbl = clk_tbl_nss,
583 + .clkr = {
584 + .enable_reg = 0x3d40,
585 + .enable_mask = BIT(1),
586 + .hw.init = &(struct clk_init_data){
587 + .name = "ubi32_core2_src_clk",
588 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
589 + .num_parents = 5,
590 + .ops = &clk_dyn_rcg_ops,
591 + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
592 + },
593 + },
594 +};
595 +
596 +static int nss_core_clk_set_rate(struct clk_hw *hw, unsigned long rate,
597 + unsigned long parent_rate)
598 +{
599 + int ret;
600 +
601 + ret = clk_dyn_rcg_ops.set_rate(&ubi32_core1_src_clk.clkr.hw, rate,
602 + parent_rate);
603 + if (ret)
604 + return ret;
605 +
606 + return clk_dyn_rcg_ops.set_rate(&ubi32_core2_src_clk.clkr.hw, rate,
607 + parent_rate);
608 +}
609 +
610 +static int
611 +nss_core_clk_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
612 + unsigned long parent_rate, u8 index)
613 +{
614 + int ret;
615 +
616 + ret = clk_dyn_rcg_ops.set_rate_and_parent(
617 + &ubi32_core1_src_clk.clkr.hw, rate, parent_rate, index);
618 + if (ret)
619 + return ret;
620 +
621 + ret = clk_dyn_rcg_ops.set_rate_and_parent(
622 + &ubi32_core2_src_clk.clkr.hw, rate, parent_rate, index);
623 + return ret;
624 +}
625 +
626 +static long nss_core_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
627 + unsigned long *p_rate, struct clk **p)
628 +{
629 + return clk_dyn_rcg_ops.determine_rate(&ubi32_core1_src_clk.clkr.hw,
630 + rate, p_rate, p);
631 +}
632 +
633 +static unsigned long
634 +nss_core_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
635 +{
636 + return clk_dyn_rcg_ops.recalc_rate(&ubi32_core1_src_clk.clkr.hw,
637 + parent_rate);
638 +}
639 +
640 +static u8 nss_core_clk_get_parent(struct clk_hw *hw)
641 +{
642 + return clk_dyn_rcg_ops.get_parent(&ubi32_core1_src_clk.clkr.hw);
643 +}
644 +
645 +static int nss_core_clk_set_parent(struct clk_hw *hw, u8 i)
646 +{
647 + int ret;
648 +
649 + ret = clk_dyn_rcg_ops.set_parent(&ubi32_core1_src_clk.clkr.hw, i);
650 + if (ret)
651 + return ret;
652 +
653 + return clk_dyn_rcg_ops.set_parent(&ubi32_core2_src_clk.clkr.hw, i);
654 +}
655 +
656 +static struct clk *nss_core_clk_get_safe_parent(struct clk_hw *hw)
657 +{
658 + return clk_get_parent_by_index(hw->clk,
659 + ubi32_core2_src_clk.s[0].parent_map[P_PLL8]);
660 +}
661 +
662 +static const struct clk_ops clk_ops_nss_core = {
663 + .set_rate = nss_core_clk_set_rate,
664 + .set_rate_and_parent = nss_core_clk_set_rate_and_parent,
665 + .determine_rate = nss_core_clk_determine_rate,
666 + .recalc_rate = nss_core_clk_recalc_rate,
667 + .get_parent = nss_core_clk_get_parent,
668 + .set_parent = nss_core_clk_set_parent,
669 + .get_safe_parent = nss_core_clk_get_safe_parent,
670 +};
671 +
672 +/* Virtual clock for nss core clocks */
673 +static struct clk_regmap nss_core_clk = {
674 + .hw.init = &(struct clk_init_data){
675 + .name = "nss_core_clk",
676 + .ops = &clk_ops_nss_core,
677 + .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
678 + .num_parents = 5,
679 + .flags = CLK_SET_RATE_PARENT,
680 + },
681 +};
682 +
683 static struct clk_regmap *gcc_ipq806x_clks[] = {
684 + [PLL0] = &pll0.clkr,
685 + [PLL0_VOTE] = &pll0_vote,
686 [PLL3] = &pll3.clkr,
687 [PLL8] = &pll8.clkr,
688 [PLL8_VOTE] = &pll8_vote,
689 [PLL14] = &pll14.clkr,
690 [PLL14_VOTE] = &pll14_vote,
691 + [PLL18] = &pll18.clkr,
692 [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
693 [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
694 [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
695 @@ -2232,6 +2865,19 @@ static struct clk_regmap *gcc_ipq806x_cl
696 [USB_FS1_XCVR_SRC] = &usb_fs1_xcvr_clk_src.clkr,
697 [USB_FS1_XCVR_CLK] = &usb_fs1_xcvr_clk.clkr,
698 [USB_FS1_SYSTEM_CLK] = &usb_fs1_sys_clk.clkr,
699 + [GMAC_CORE1_CLK_SRC] = &gmac_core1_src.clkr,
700 + [GMAC_CORE1_CLK] = &gmac_core1_clk.clkr,
701 + [GMAC_CORE2_CLK_SRC] = &gmac_core2_src.clkr,
702 + [GMAC_CORE2_CLK] = &gmac_core2_clk.clkr,
703 + [GMAC_CORE3_CLK_SRC] = &gmac_core3_src.clkr,
704 + [GMAC_CORE3_CLK] = &gmac_core3_clk.clkr,
705 + [GMAC_CORE4_CLK_SRC] = &gmac_core4_src.clkr,
706 + [GMAC_CORE4_CLK] = &gmac_core4_clk.clkr,
707 + [UBI32_CORE1_CLK_SRC] = &ubi32_core1_src_clk.clkr,
708 + [UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr,
709 + [NSSTCM_CLK_SRC] = &nss_tcm_src.clkr,
710 + [NSSTCM_CLK] = &nss_tcm_clk.clkr,
711 + [NSS_CORE_CLK] = &nss_core_clk,
712 };
713
714 static const struct qcom_reset_map gcc_ipq806x_resets[] = {
715 @@ -2350,6 +2996,48 @@ static const struct qcom_reset_map gcc_i
716 [USB30_1_PHY_RESET] = { 0x3b58, 0 },
717 [NSSFB0_RESET] = { 0x3b60, 6 },
718 [NSSFB1_RESET] = { 0x3b60, 7 },
719 + [UBI32_CORE1_CLKRST_CLAMP_RESET] = { 0x3d3c, 3},
720 + [UBI32_CORE1_CLAMP_RESET] = { 0x3d3c, 2 },
721 + [UBI32_CORE1_AHB_RESET] = { 0x3d3c, 1 },
722 + [UBI32_CORE1_AXI_RESET] = { 0x3d3c, 0 },
723 + [UBI32_CORE2_CLKRST_CLAMP_RESET] = { 0x3d5c, 3 },
724 + [UBI32_CORE2_CLAMP_RESET] = { 0x3d5c, 2 },
725 + [UBI32_CORE2_AHB_RESET] = { 0x3d5c, 1 },
726 + [UBI32_CORE2_AXI_RESET] = { 0x3d5c, 0 },
727 + [GMAC_CORE1_RESET] = { 0x3cbc, 0 },
728 + [GMAC_CORE2_RESET] = { 0x3cdc, 0 },
729 + [GMAC_CORE3_RESET] = { 0x3cfc, 0 },
730 + [GMAC_CORE4_RESET] = { 0x3d1c, 0 },
731 + [GMAC_AHB_RESET] = { 0x3e24, 0 },
732 + [NSS_CH0_RST_RX_CLK_N_RESET] = { 0x3b60, 0 },
733 + [NSS_CH0_RST_TX_CLK_N_RESET] = { 0x3b60, 1 },
734 + [NSS_CH0_RST_RX_125M_N_RESET] = { 0x3b60, 2 },
735 + [NSS_CH0_HW_RST_RX_125M_N_RESET] = { 0x3b60, 3 },
736 + [NSS_CH0_RST_TX_125M_N_RESET] = { 0x3b60, 4 },
737 + [NSS_CH1_RST_RX_CLK_N_RESET] = { 0x3b60, 5 },
738 + [NSS_CH1_RST_TX_CLK_N_RESET] = { 0x3b60, 6 },
739 + [NSS_CH1_RST_RX_125M_N_RESET] = { 0x3b60, 7 },
740 + [NSS_CH1_HW_RST_RX_125M_N_RESET] = { 0x3b60, 8 },
741 + [NSS_CH1_RST_TX_125M_N_RESET] = { 0x3b60, 9 },
742 + [NSS_CH2_RST_RX_CLK_N_RESET] = { 0x3b60, 10 },
743 + [NSS_CH2_RST_TX_CLK_N_RESET] = { 0x3b60, 11 },
744 + [NSS_CH2_RST_RX_125M_N_RESET] = { 0x3b60, 12 },
745 + [NSS_CH2_HW_RST_RX_125M_N_RESET] = { 0x3b60, 13 },
746 + [NSS_CH2_RST_TX_125M_N_RESET] = { 0x3b60, 14 },
747 + [NSS_CH3_RST_RX_CLK_N_RESET] = { 0x3b60, 15 },
748 + [NSS_CH3_RST_TX_CLK_N_RESET] = { 0x3b60, 16 },
749 + [NSS_CH3_RST_RX_125M_N_RESET] = { 0x3b60, 17 },
750 + [NSS_CH3_HW_RST_RX_125M_N_RESET] = { 0x3b60, 18 },
751 + [NSS_CH3_RST_TX_125M_N_RESET] = { 0x3b60, 19 },
752 + [NSS_RST_RX_250M_125M_N_RESET] = { 0x3b60, 20 },
753 + [NSS_RST_TX_250M_125M_N_RESET] = { 0x3b60, 21 },
754 + [NSS_QSGMII_TXPI_RST_N_RESET] = { 0x3b60, 22 },
755 + [NSS_QSGMII_CDR_RST_N_RESET] = { 0x3b60, 23 },
756 + [NSS_SGMII2_CDR_RST_N_RESET] = { 0x3b60, 24 },
757 + [NSS_SGMII3_CDR_RST_N_RESET] = { 0x3b60, 25 },
758 + [NSS_CAL_PRBS_RST_N_RESET] = { 0x3b60, 26 },
759 + [NSS_LCKDT_RST_N_RESET] = { 0x3b60, 27 },
760 + [NSS_SRDS_N_RESET] = { 0x3b60, 28 },
761 };
762
763 static const struct regmap_config gcc_ipq806x_regmap_config = {
764 @@ -2378,6 +3066,8 @@ static int gcc_ipq806x_probe(struct plat
765 {
766 struct clk *clk;
767 struct device *dev = &pdev->dev;
768 + struct regmap *regmap;
769 + int ret;
770
771 /* Temporary until RPM clocks supported */
772 clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 25000000);
773 @@ -2388,7 +3078,25 @@ static int gcc_ipq806x_probe(struct plat
774 if (IS_ERR(clk))
775 return PTR_ERR(clk);
776
777 - return qcom_cc_probe(pdev, &gcc_ipq806x_desc);
778 + ret = qcom_cc_probe(pdev, &gcc_ipq806x_desc);
779 + if (ret)
780 + return ret;
781 +
782 + regmap = dev_get_regmap(dev, NULL);
783 + if (!regmap)
784 + return -ENODEV;
785 +
786 + /* Setup PLL18 static bits */
787 + regmap_update_bits(regmap, 0x31a4, 0xffffffc0, 0x40000400);
788 + regmap_write(regmap, 0x31b0, 0x3080);
789 +
790 + /* Set GMAC footswitch sleep/wakeup values */
791 + regmap_write(regmap, 0x3cb8, 8);
792 + regmap_write(regmap, 0x3cd8, 8);
793 + regmap_write(regmap, 0x3cf8, 8);
794 + regmap_write(regmap, 0x3d18, 8);
795 +
796 + return 0;
797 }
798
799 static int gcc_ipq806x_remove(struct platform_device *pdev)
800 --- a/include/dt-bindings/clock/qcom,gcc-ipq806x.h
801 +++ b/include/dt-bindings/clock/qcom,gcc-ipq806x.h
802 @@ -289,5 +289,8 @@
803 #define UBI32_CORE2_CLK_SRC 277
804 #define UBI32_CORE1_CLK 278
805 #define UBI32_CORE2_CLK 279
806 +#define NSSTCM_CLK_SRC 280
807 +#define NSSTCM_CLK 281
808 +#define NSS_CORE_CLK 282 /* Virtual */
809
810 #endif
811 --- a/include/dt-bindings/reset/qcom,gcc-ipq806x.h
812 +++ b/include/dt-bindings/reset/qcom,gcc-ipq806x.h
813 @@ -129,4 +129,47 @@
814 #define USB30_1_PHY_RESET 112
815 #define NSSFB0_RESET 113
816 #define NSSFB1_RESET 114
817 +#define UBI32_CORE1_CLKRST_CLAMP_RESET 115
818 +#define UBI32_CORE1_CLAMP_RESET 116
819 +#define UBI32_CORE1_AHB_RESET 117
820 +#define UBI32_CORE1_AXI_RESET 118
821 +#define UBI32_CORE2_CLKRST_CLAMP_RESET 119
822 +#define UBI32_CORE2_CLAMP_RESET 120
823 +#define UBI32_CORE2_AHB_RESET 121
824 +#define UBI32_CORE2_AXI_RESET 122
825 +#define GMAC_CORE1_RESET 123
826 +#define GMAC_CORE2_RESET 124
827 +#define GMAC_CORE3_RESET 125
828 +#define GMAC_CORE4_RESET 126
829 +#define GMAC_AHB_RESET 127
830 +#define NSS_CH0_RST_RX_CLK_N_RESET 128
831 +#define NSS_CH0_RST_TX_CLK_N_RESET 129
832 +#define NSS_CH0_RST_RX_125M_N_RESET 130
833 +#define NSS_CH0_HW_RST_RX_125M_N_RESET 131
834 +#define NSS_CH0_RST_TX_125M_N_RESET 132
835 +#define NSS_CH1_RST_RX_CLK_N_RESET 133
836 +#define NSS_CH1_RST_TX_CLK_N_RESET 134
837 +#define NSS_CH1_RST_RX_125M_N_RESET 135
838 +#define NSS_CH1_HW_RST_RX_125M_N_RESET 136
839 +#define NSS_CH1_RST_TX_125M_N_RESET 137
840 +#define NSS_CH2_RST_RX_CLK_N_RESET 138
841 +#define NSS_CH2_RST_TX_CLK_N_RESET 139
842 +#define NSS_CH2_RST_RX_125M_N_RESET 140
843 +#define NSS_CH2_HW_RST_RX_125M_N_RESET 141
844 +#define NSS_CH2_RST_TX_125M_N_RESET 142
845 +#define NSS_CH3_RST_RX_CLK_N_RESET 143
846 +#define NSS_CH3_RST_TX_CLK_N_RESET 144
847 +#define NSS_CH3_RST_RX_125M_N_RESET 145
848 +#define NSS_CH3_HW_RST_RX_125M_N_RESET 146
849 +#define NSS_CH3_RST_TX_125M_N_RESET 147
850 +#define NSS_RST_RX_250M_125M_N_RESET 148
851 +#define NSS_RST_TX_250M_125M_N_RESET 149
852 +#define NSS_QSGMII_TXPI_RST_N_RESET 150
853 +#define NSS_QSGMII_CDR_RST_N_RESET 151
854 +#define NSS_SGMII2_CDR_RST_N_RESET 152
855 +#define NSS_SGMII3_CDR_RST_N_RESET 153
856 +#define NSS_CAL_PRBS_RST_N_RESET 154
857 +#define NSS_LCKDT_RST_N_RESET 155
858 +#define NSS_SRDS_N_RESET 156
859 +
860 #endif