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