1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
6 #include <linux/clk-provider.h>
7 #include <linux/kernel.h>
8 #include <linux/module.h>
10 #include <linux/regmap.h>
11 #include <linux/phy.h>
12 #include <linux/mdio.h>
13 #include <linux/clk.h>
14 #include <linux/gpio/consumer.h>
16 #include <dt-bindings/clock/qcom,qca8k-nsscc.h>
17 #include <dt-bindings/reset/qcom,qca8k-nsscc.h>
19 #include "clk-branch.h"
21 #include "clk-regmap.h"
22 #include "clk-regmap-divider.h"
23 #include "clk-regmap-mux.h"
27 #define QCA8K_CLK_REG_BASE 0x800000
28 #define QCA8K_HIGH_ADDR_PREFIX 0x18
29 #define QCA8K_LOW_ADDR_PREFIX 0x10
30 #define QCA8K_CFG_PAGE_REG 0xc
31 #define QCA8K_CLK_REG_MASK GENMASK(4, 0)
32 #define QCA8K_CLK_PHY_ADDR_MASK GENMASK(7, 5)
33 #define QCA8K_CLK_PAGE_MASK GENMASK(23, 8)
34 #define QCA8K_REG_DATA_UPPER_16_BITS BIT(1)
42 DT_UNIPHY1_RX312P5M_CLK,
43 DT_UNIPHY1_TX312P5M_CLK,
60 static const struct clk_parent_data nss_cc_uniphy1_tx312p5m_data[] = {
62 { .index = DT_UNIPHY1_TX312P5M_CLK },
65 static const struct parent_map nss_cc_uniphy1_tx312p5m_map[] = {
67 { P_UNIPHY1_TX312P5M, 1 },
70 static struct clk_rcg2 nss_cc_switch_core_clk_src = {
73 .parent_map = nss_cc_uniphy1_tx312p5m_map,
74 .clkr.hw.init = &(const struct clk_init_data) {
75 .name = "nss_cc_switch_core_clk_src",
76 .parent_data = nss_cc_uniphy1_tx312p5m_data,
77 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_tx312p5m_data),
78 .ops = &clk_rcg2_mux_closest_ops,
82 static struct clk_branch nss_cc_switch_core_clk = {
84 .halt_check = BRANCH_HALT,
87 .enable_mask = BIT(0),
88 .hw.init = &(const struct clk_init_data) {
89 .name = "nss_cc_switch_core_clk",
90 .parent_hws = (const struct clk_hw *[]) {
91 &nss_cc_switch_core_clk_src.clkr.hw,
94 .flags = CLK_SET_RATE_PARENT,
95 .ops = &clk_branch2_prepare_ops,
100 static struct clk_branch nss_cc_apb_bridge_clk = {
102 .halt_check = BRANCH_HALT,
105 .enable_mask = BIT(0),
106 .hw.init = &(const struct clk_init_data) {
107 .name = "nss_cc_apb_bridge_clk",
108 .parent_hws = (const struct clk_hw *[]) {
109 &nss_cc_switch_core_clk_src.clkr.hw,
112 .flags = CLK_SET_RATE_PARENT,
113 .ops = &clk_branch2_prepare_ops,
118 static const struct clk_parent_data nss_cc_uniphy1_tx_data[] = {
120 { .index = DT_UNIPHY1_TX_CLK },
123 static const struct parent_map nss_cc_uniphy1_tx_map[] = {
128 static struct clk_rcg2 nss_cc_mac0_tx_clk_src = {
131 .parent_map = nss_cc_uniphy1_tx_map,
132 .clkr.hw.init = &(const struct clk_init_data) {
133 .name = "nss_cc_mac0_tx_clk_src",
134 .parent_data = nss_cc_uniphy1_tx_data,
135 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_tx_data),
136 .flags = CLK_SET_RATE_PARENT,
137 .ops = &clk_rcg2_mux_closest_ops,
141 static struct clk_regmap_div nss_cc_mac0_tx_div_clk_src = {
146 .hw.init = &(const struct clk_init_data) {
147 .name = "nss_cc_mac0_tx_div_clk_src",
148 .parent_hws = (const struct clk_hw *[]) {
149 &nss_cc_mac0_tx_clk_src.clkr.hw,
152 .flags = CLK_SET_RATE_PARENT,
153 .ops = &clk_regmap_div_ops,
158 static struct clk_branch nss_cc_mac0_tx_clk = {
160 .halt_check = BRANCH_HALT,
163 .enable_mask = BIT(0),
164 .hw.init = &(const struct clk_init_data) {
165 .name = "nss_cc_mac0_tx_clk",
166 .parent_hws = (const struct clk_hw *[]) {
167 &nss_cc_mac0_tx_div_clk_src.clkr.hw,
170 .flags = CLK_SET_RATE_PARENT,
171 .ops = &clk_branch2_prepare_ops,
176 static struct clk_branch nss_cc_mac0_tx_srds1_clk = {
178 .halt_check = BRANCH_HALT,
181 .enable_mask = BIT(0),
182 .hw.init = &(const struct clk_init_data) {
183 .name = "nss_cc_mac0_tx_srds1_clk",
184 .parent_hws = (const struct clk_hw *[]) {
185 &nss_cc_mac0_tx_div_clk_src.clkr.hw,
188 .flags = CLK_SET_RATE_PARENT,
189 .ops = &clk_branch2_prepare_ops,
194 static const struct clk_parent_data nss_cc_uniphy1_rx_tx_data[] = {
196 { .index = DT_UNIPHY1_RX_CLK },
197 { .index = DT_UNIPHY1_TX_CLK },
200 static const struct parent_map nss_cc_uniphy1_rx_tx_map[] = {
206 static struct clk_rcg2 nss_cc_mac0_rx_clk_src = {
209 .parent_map = nss_cc_uniphy1_rx_tx_map,
210 .clkr.hw.init = &(const struct clk_init_data) {
211 .name = "nss_cc_mac0_rx_clk_src",
212 .parent_data = nss_cc_uniphy1_rx_tx_data,
213 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_rx_tx_data),
214 .flags = CLK_SET_RATE_PARENT,
215 .ops = &clk_rcg2_mux_closest_ops,
219 static struct clk_regmap_div nss_cc_mac0_rx_div_clk_src = {
224 .hw.init = &(const struct clk_init_data) {
225 .name = "nss_cc_mac0_rx_div_clk_src",
226 .parent_hws = (const struct clk_hw *[]) {
227 &nss_cc_mac0_rx_clk_src.clkr.hw,
230 .flags = CLK_SET_RATE_PARENT,
231 .ops = &clk_regmap_div_ops,
236 static struct clk_branch nss_cc_mac0_rx_clk = {
238 .halt_check = BRANCH_HALT,
241 .enable_mask = BIT(0),
242 .hw.init = &(const struct clk_init_data) {
243 .name = "nss_cc_mac0_rx_clk",
244 .parent_hws = (const struct clk_hw *[]) {
245 &nss_cc_mac0_rx_div_clk_src.clkr.hw,
248 .flags = CLK_SET_RATE_PARENT,
249 .ops = &clk_branch2_prepare_ops,
254 static struct clk_branch nss_cc_mac0_rx_srds1_clk = {
256 .halt_check = BRANCH_HALT,
259 .enable_mask = BIT(0),
260 .hw.init = &(const struct clk_init_data) {
261 .name = "nss_cc_mac0_rx_srds1_clk",
262 .parent_hws = (const struct clk_hw *[]) {
263 &nss_cc_mac0_rx_div_clk_src.clkr.hw,
266 .flags = CLK_SET_RATE_PARENT,
267 .ops = &clk_branch2_prepare_ops,
272 static const struct clk_parent_data nss_cc_uniphy1_rx_tx312p5m_data[] = {
274 { .index = DT_UNIPHY1_TX312P5M_CLK },
275 { .index = DT_UNIPHY1_RX312P5M_CLK },
278 static const struct parent_map nss_cc_uniphy1_rx_tx312p5m_map[] = {
280 { P_UNIPHY1_TX312P5M, 6 },
281 { P_UNIPHY1_RX312P5M, 7 },
284 static const struct freq_conf ftbl_nss_cc_mac1_tx_clk_src_25[] = {
285 C(P_UNIPHY1_TX312P5M, 12.5, 0, 0),
286 C(P_UNIPHY1_RX312P5M, 12.5, 0, 0),
289 static const struct freq_conf ftbl_nss_cc_mac1_tx_clk_src_125[] = {
290 C(P_UNIPHY1_TX312P5M, 2.5, 0, 0),
291 C(P_UNIPHY1_RX312P5M, 2.5, 0, 0),
294 static const struct freq_conf ftbl_nss_cc_mac1_tx_clk_src_312p5[] = {
295 C(P_UNIPHY1_TX312P5M, 1, 0, 0),
296 C(P_UNIPHY1_RX312P5M, 1, 0, 0),
299 static const struct freq_multi_tbl ftbl_nss_cc_mac1_tx_clk_src[] = {
300 FM(25000000, ftbl_nss_cc_mac1_tx_clk_src_25),
301 FMS(50000000, P_XO, 1, 0, 0),
302 FM(125000000, ftbl_nss_cc_mac1_tx_clk_src_125),
303 FM(312500000, ftbl_nss_cc_mac1_tx_clk_src_312p5),
307 static struct clk_rcg2 nss_cc_mac1_tx_clk_src = {
309 .freq_multi_tbl = ftbl_nss_cc_mac1_tx_clk_src,
311 .parent_map = nss_cc_uniphy1_rx_tx312p5m_map,
312 .clkr.hw.init = &(const struct clk_init_data) {
313 .name = "nss_cc_mac1_tx_clk_src",
314 .parent_data = nss_cc_uniphy1_rx_tx312p5m_data,
315 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_rx_tx312p5m_data),
316 .ops = &clk_rcg2_fm_ops,
320 static struct clk_regmap_div nss_cc_mac1_tx_div_clk_src = {
325 .hw.init = &(const struct clk_init_data) {
326 .name = "nss_cc_mac1_tx_div_clk_src",
327 .parent_hws = (const struct clk_hw *[]) {
328 &nss_cc_mac1_tx_clk_src.clkr.hw,
331 .flags = CLK_SET_RATE_PARENT,
332 .ops = &clk_regmap_div_ops,
337 static struct clk_regmap_div nss_cc_mac1_srds1_ch0_xgmii_rx_div_clk_src = {
342 .hw.init = &(const struct clk_init_data) {
343 .name = "nss_cc_mac1_srds1_ch0_xgmii_rx_div_clk_src",
344 .parent_hws = (const struct clk_hw *[]) {
345 &nss_cc_mac1_tx_clk_src.clkr.hw,
348 .flags = CLK_SET_RATE_PARENT,
349 .ops = &clk_regmap_div_ops,
354 static struct clk_branch nss_cc_mac1_srds1_ch0_rx_clk = {
356 .halt_check = BRANCH_HALT,
359 .enable_mask = BIT(0),
360 .hw.init = &(const struct clk_init_data) {
361 .name = "nss_cc_mac1_srds1_ch0_rx_clk",
362 .parent_hws = (const struct clk_hw *[]) {
363 &nss_cc_mac1_tx_div_clk_src.clkr.hw,
366 .flags = CLK_SET_RATE_PARENT,
367 .ops = &clk_branch2_prepare_ops,
372 static struct clk_branch nss_cc_mac1_tx_clk = {
374 .halt_check = BRANCH_HALT,
377 .enable_mask = BIT(0),
378 .hw.init = &(const struct clk_init_data) {
379 .name = "nss_cc_mac1_tx_clk",
380 .parent_hws = (const struct clk_hw *[]) {
381 &nss_cc_mac1_tx_div_clk_src.clkr.hw,
384 .flags = CLK_SET_RATE_PARENT,
385 .ops = &clk_branch2_prepare_ops,
390 static struct clk_branch nss_cc_mac1_gephy0_tx_clk = {
392 .halt_check = BRANCH_HALT,
395 .enable_mask = BIT(0),
396 .hw.init = &(const struct clk_init_data) {
397 .name = "nss_cc_mac1_gephy0_tx_clk",
398 .parent_hws = (const struct clk_hw *[]) {
399 &nss_cc_mac1_tx_div_clk_src.clkr.hw,
402 .flags = CLK_SET_RATE_PARENT,
403 .ops = &clk_branch2_prepare_ops,
408 static struct clk_branch nss_cc_mac1_srds1_ch0_xgmii_rx_clk = {
410 .halt_check = BRANCH_HALT,
413 .enable_mask = BIT(0),
414 .hw.init = &(const struct clk_init_data) {
415 .name = "nss_cc_mac1_srds1_ch0_xgmii_rx_clk",
416 .parent_hws = (const struct clk_hw *[]) {
417 &nss_cc_mac1_srds1_ch0_xgmii_rx_div_clk_src.clkr.hw,
420 .flags = CLK_SET_RATE_PARENT,
421 .ops = &clk_branch2_prepare_ops,
426 static const struct clk_parent_data nss_cc_uniphy1_tx312p5m_prx_data[] = {
428 { .index = DT_UNIPHY1_TX312P5M_CLK },
431 static const struct parent_map nss_cc_uniphy1_tx312p5m_prx_map[] = {
433 { P_UNIPHY1_TX312P5M, 6 },
436 static const struct freq_tbl ftbl_nss_cc_mac1_rx_clk_src[] = {
437 F(25000000, P_UNIPHY1_TX312P5M, 12.5, 0, 0),
438 F(50000000, P_XO, 1, 0, 0),
439 F(125000000, P_UNIPHY1_TX312P5M, 2.5, 0, 0),
440 F(312500000, P_UNIPHY1_TX312P5M, 1, 0, 0),
444 static struct clk_rcg2 nss_cc_mac1_rx_clk_src = {
446 .freq_tbl = ftbl_nss_cc_mac1_rx_clk_src,
448 .parent_map = nss_cc_uniphy1_tx312p5m_prx_map,
449 .clkr.hw.init = &(const struct clk_init_data) {
450 .name = "nss_cc_mac1_rx_clk_src",
451 .parent_data = nss_cc_uniphy1_tx312p5m_prx_data,
452 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_tx312p5m_prx_data),
453 .ops = &clk_rcg2_ops,
457 static struct clk_regmap_div nss_cc_mac1_rx_div_clk_src = {
462 .hw.init = &(const struct clk_init_data) {
463 .name = "nss_cc_mac1_rx_div_clk_src",
464 .parent_hws = (const struct clk_hw *[]) {
465 &nss_cc_mac1_rx_clk_src.clkr.hw,
468 .flags = CLK_SET_RATE_PARENT,
469 .ops = &clk_regmap_div_ops,
474 static struct clk_regmap_div nss_cc_mac1_srds1_ch0_xgmii_tx_div_clk_src = {
479 .hw.init = &(const struct clk_init_data) {
480 .name = "nss_cc_mac1_srds1_ch0_xgmii_tx_div_clk_src",
481 .parent_hws = (const struct clk_hw *[]) {
482 &nss_cc_mac1_rx_clk_src.clkr.hw,
485 .flags = CLK_SET_RATE_PARENT,
486 .ops = &clk_regmap_div_ops,
491 static struct clk_branch nss_cc_mac1_srds1_ch0_tx_clk = {
493 .halt_check = BRANCH_HALT,
496 .enable_mask = BIT(0),
497 .hw.init = &(const struct clk_init_data) {
498 .name = "nss_cc_mac1_srds1_ch0_tx_clk",
499 .parent_hws = (const struct clk_hw *[]) {
500 &nss_cc_mac1_rx_div_clk_src.clkr.hw,
503 .flags = CLK_SET_RATE_PARENT,
504 .ops = &clk_branch2_prepare_ops,
509 static struct clk_branch nss_cc_mac1_rx_clk = {
511 .halt_check = BRANCH_HALT,
514 .enable_mask = BIT(0),
515 .hw.init = &(const struct clk_init_data) {
516 .name = "nss_cc_mac1_rx_clk",
517 .parent_hws = (const struct clk_hw *[]) {
518 &nss_cc_mac1_rx_div_clk_src.clkr.hw,
521 .flags = CLK_SET_RATE_PARENT,
522 .ops = &clk_branch2_prepare_ops,
527 static struct clk_branch nss_cc_mac1_gephy0_rx_clk = {
529 .halt_check = BRANCH_HALT,
532 .enable_mask = BIT(0),
533 .hw.init = &(const struct clk_init_data) {
534 .name = "nss_cc_mac1_gephy0_rx_clk",
535 .parent_hws = (const struct clk_hw *[]) {
536 &nss_cc_mac1_rx_div_clk_src.clkr.hw,
539 .flags = CLK_SET_RATE_PARENT,
540 .ops = &clk_branch2_prepare_ops,
545 static struct clk_branch nss_cc_mac1_srds1_ch0_xgmii_tx_clk = {
547 .halt_check = BRANCH_HALT,
550 .enable_mask = BIT(0),
551 .hw.init = &(const struct clk_init_data) {
552 .name = "nss_cc_mac1_srds1_ch0_xgmii_tx_clk",
553 .parent_hws = (const struct clk_hw *[]) {
554 &nss_cc_mac1_srds1_ch0_xgmii_tx_div_clk_src.clkr.hw,
557 .flags = CLK_SET_RATE_PARENT,
558 .ops = &clk_branch2_prepare_ops,
563 static struct clk_rcg2 nss_cc_mac2_tx_clk_src = {
565 .freq_multi_tbl = ftbl_nss_cc_mac1_tx_clk_src,
567 .parent_map = nss_cc_uniphy1_rx_tx312p5m_map,
568 .clkr.hw.init = &(const struct clk_init_data) {
569 .name = "nss_cc_mac2_tx_clk_src",
570 .parent_data = nss_cc_uniphy1_rx_tx312p5m_data,
571 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_rx_tx312p5m_data),
572 .ops = &clk_rcg2_fm_ops,
576 static struct clk_regmap_div nss_cc_mac2_tx_div_clk_src = {
581 .hw.init = &(const struct clk_init_data) {
582 .name = "nss_cc_mac2_tx_div_clk_src",
583 .parent_hws = (const struct clk_hw *[]) {
584 &nss_cc_mac2_tx_clk_src.clkr.hw,
587 .flags = CLK_SET_RATE_PARENT,
588 .ops = &clk_regmap_div_ops,
593 static struct clk_regmap_div nss_cc_mac2_srds1_ch1_xgmii_rx_div_clk_src = {
598 .hw.init = &(const struct clk_init_data) {
599 .name = "nss_cc_mac2_srds1_ch1_xgmii_rx_div_clk_src",
600 .parent_hws = (const struct clk_hw *[]) {
601 &nss_cc_mac2_tx_clk_src.clkr.hw,
604 .flags = CLK_SET_RATE_PARENT,
605 .ops = &clk_regmap_div_ops,
610 static struct clk_branch nss_cc_mac2_srds1_ch1_rx_clk = {
612 .halt_check = BRANCH_HALT,
615 .enable_mask = BIT(0),
616 .hw.init = &(const struct clk_init_data) {
617 .name = "nss_cc_mac2_srds1_ch1_rx_clk",
618 .parent_hws = (const struct clk_hw *[]) {
619 &nss_cc_mac2_tx_div_clk_src.clkr.hw,
622 .flags = CLK_SET_RATE_PARENT,
623 .ops = &clk_branch2_prepare_ops,
628 static struct clk_branch nss_cc_mac2_tx_clk = {
630 .halt_check = BRANCH_HALT,
633 .enable_mask = BIT(0),
634 .hw.init = &(const struct clk_init_data) {
635 .name = "nss_cc_mac2_tx_clk",
636 .parent_hws = (const struct clk_hw *[]) {
637 &nss_cc_mac2_tx_div_clk_src.clkr.hw,
640 .flags = CLK_SET_RATE_PARENT,
641 .ops = &clk_branch2_prepare_ops,
646 static struct clk_branch nss_cc_mac2_gephy1_tx_clk = {
648 .halt_check = BRANCH_HALT,
651 .enable_mask = BIT(0),
652 .hw.init = &(const struct clk_init_data) {
653 .name = "nss_cc_mac2_gephy1_tx_clk",
654 .parent_hws = (const struct clk_hw *[]) {
655 &nss_cc_mac2_tx_div_clk_src.clkr.hw,
658 .flags = CLK_SET_RATE_PARENT,
659 .ops = &clk_branch2_prepare_ops,
664 static struct clk_branch nss_cc_mac2_srds1_ch1_xgmii_rx_clk = {
666 .halt_check = BRANCH_HALT,
669 .enable_mask = BIT(0),
670 .hw.init = &(const struct clk_init_data) {
671 .name = "nss_cc_mac2_srds1_ch1_xgmii_rx_clk",
672 .parent_hws = (const struct clk_hw *[]) {
673 &nss_cc_mac2_srds1_ch1_xgmii_rx_div_clk_src.clkr.hw,
676 .flags = CLK_SET_RATE_PARENT,
677 .ops = &clk_branch2_prepare_ops,
682 static struct clk_rcg2 nss_cc_mac2_rx_clk_src = {
684 .freq_tbl = ftbl_nss_cc_mac1_rx_clk_src,
686 .parent_map = nss_cc_uniphy1_tx312p5m_prx_map,
687 .clkr.hw.init = &(const struct clk_init_data) {
688 .name = "nss_cc_mac2_rx_clk_src",
689 .parent_data = nss_cc_uniphy1_tx312p5m_prx_data,
690 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_tx312p5m_prx_data),
691 .ops = &clk_rcg2_ops,
695 static struct clk_regmap_div nss_cc_mac2_rx_div_clk_src = {
700 .hw.init = &(const struct clk_init_data) {
701 .name = "nss_cc_mac2_rx_div_clk_src",
702 .parent_hws = (const struct clk_hw *[]) {
703 &nss_cc_mac2_rx_clk_src.clkr.hw,
706 .flags = CLK_SET_RATE_PARENT,
707 .ops = &clk_regmap_div_ops,
712 static struct clk_regmap_div nss_cc_mac2_srds1_ch1_xgmii_tx_div_clk_src = {
717 .hw.init = &(const struct clk_init_data) {
718 .name = "nss_cc_mac2_srds1_ch1_xgmii_tx_div_clk_src",
719 .parent_hws = (const struct clk_hw *[]) {
720 &nss_cc_mac2_rx_clk_src.clkr.hw,
723 .flags = CLK_SET_RATE_PARENT,
724 .ops = &clk_regmap_div_ops,
729 static struct clk_branch nss_cc_mac2_srds1_ch1_tx_clk = {
731 .halt_check = BRANCH_HALT,
734 .enable_mask = BIT(0),
735 .hw.init = &(const struct clk_init_data) {
736 .name = "nss_cc_mac2_srds1_ch1_tx_clk",
737 .parent_hws = (const struct clk_hw *[]) {
738 &nss_cc_mac2_rx_div_clk_src.clkr.hw,
741 .flags = CLK_SET_RATE_PARENT,
742 .ops = &clk_branch2_prepare_ops,
747 static struct clk_branch nss_cc_mac2_rx_clk = {
749 .halt_check = BRANCH_HALT,
752 .enable_mask = BIT(0),
753 .hw.init = &(const struct clk_init_data) {
754 .name = "nss_cc_mac2_rx_clk",
755 .parent_hws = (const struct clk_hw *[]) {
756 &nss_cc_mac2_rx_div_clk_src.clkr.hw,
759 .flags = CLK_SET_RATE_PARENT,
760 .ops = &clk_branch2_prepare_ops,
765 static struct clk_branch nss_cc_mac2_gephy1_rx_clk = {
767 .halt_check = BRANCH_HALT,
770 .enable_mask = BIT(0),
771 .hw.init = &(const struct clk_init_data) {
772 .name = "nss_cc_mac2_gephy1_rx_clk",
773 .parent_hws = (const struct clk_hw *[]) {
774 &nss_cc_mac2_rx_div_clk_src.clkr.hw,
777 .flags = CLK_SET_RATE_PARENT,
778 .ops = &clk_branch2_prepare_ops,
783 static struct clk_branch nss_cc_mac2_srds1_ch1_xgmii_tx_clk = {
785 .halt_check = BRANCH_HALT,
788 .enable_mask = BIT(0),
789 .hw.init = &(const struct clk_init_data) {
790 .name = "nss_cc_mac2_srds1_ch1_xgmii_tx_clk",
791 .parent_hws = (const struct clk_hw *[]) {
792 &nss_cc_mac2_srds1_ch1_xgmii_tx_div_clk_src.clkr.hw,
795 .flags = CLK_SET_RATE_PARENT,
796 .ops = &clk_branch2_prepare_ops,
801 static struct clk_rcg2 nss_cc_mac3_tx_clk_src = {
803 .freq_multi_tbl = ftbl_nss_cc_mac1_tx_clk_src,
805 .parent_map = nss_cc_uniphy1_rx_tx312p5m_map,
806 .clkr.hw.init = &(const struct clk_init_data) {
807 .name = "nss_cc_mac3_tx_clk_src",
808 .parent_data = nss_cc_uniphy1_rx_tx312p5m_data,
809 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_rx_tx312p5m_data),
810 .ops = &clk_rcg2_fm_ops,
814 static struct clk_regmap_div nss_cc_mac3_tx_div_clk_src = {
819 .hw.init = &(const struct clk_init_data) {
820 .name = "nss_cc_mac3_tx_div_clk_src",
821 .parent_hws = (const struct clk_hw *[]) {
822 &nss_cc_mac3_tx_clk_src.clkr.hw,
825 .flags = CLK_SET_RATE_PARENT,
826 .ops = &clk_regmap_div_ops,
831 static struct clk_regmap_div nss_cc_mac3_srds1_ch2_xgmii_rx_div_clk_src = {
836 .hw.init = &(const struct clk_init_data) {
837 .name = "nss_cc_mac3_srds1_ch2_xgmii_rx_div_clk_src",
838 .parent_hws = (const struct clk_hw *[]) {
839 &nss_cc_mac3_tx_clk_src.clkr.hw,
842 .flags = CLK_SET_RATE_PARENT,
843 .ops = &clk_regmap_div_ops,
848 static struct clk_branch nss_cc_mac3_srds1_ch2_rx_clk = {
850 .halt_check = BRANCH_HALT,
853 .enable_mask = BIT(0),
854 .hw.init = &(const struct clk_init_data) {
855 .name = "nss_cc_mac3_srds1_ch2_rx_clk",
856 .parent_hws = (const struct clk_hw *[]) {
857 &nss_cc_mac3_tx_div_clk_src.clkr.hw,
860 .flags = CLK_SET_RATE_PARENT,
861 .ops = &clk_branch2_prepare_ops,
866 static struct clk_branch nss_cc_mac3_tx_clk = {
868 .halt_check = BRANCH_HALT,
871 .enable_mask = BIT(0),
872 .hw.init = &(const struct clk_init_data) {
873 .name = "nss_cc_mac3_tx_clk",
874 .parent_hws = (const struct clk_hw *[]) {
875 &nss_cc_mac3_tx_div_clk_src.clkr.hw,
878 .flags = CLK_SET_RATE_PARENT,
879 .ops = &clk_branch2_prepare_ops,
884 static struct clk_branch nss_cc_mac3_gephy2_tx_clk = {
886 .halt_check = BRANCH_HALT,
889 .enable_mask = BIT(0),
890 .hw.init = &(const struct clk_init_data) {
891 .name = "nss_cc_mac3_gephy2_tx_clk",
892 .parent_hws = (const struct clk_hw *[]) {
893 &nss_cc_mac3_tx_div_clk_src.clkr.hw,
896 .flags = CLK_SET_RATE_PARENT,
897 .ops = &clk_branch2_prepare_ops,
902 static struct clk_branch nss_cc_mac3_srds1_ch2_xgmii_rx_clk = {
904 .halt_check = BRANCH_HALT,
907 .enable_mask = BIT(0),
908 .hw.init = &(const struct clk_init_data) {
909 .name = "nss_cc_mac3_srds1_ch2_xgmii_rx_clk",
910 .parent_hws = (const struct clk_hw *[]) {
911 &nss_cc_mac3_srds1_ch2_xgmii_rx_div_clk_src.clkr.hw,
914 .flags = CLK_SET_RATE_PARENT,
915 .ops = &clk_branch2_prepare_ops,
920 static struct clk_rcg2 nss_cc_mac3_rx_clk_src = {
922 .freq_tbl = ftbl_nss_cc_mac1_rx_clk_src,
924 .parent_map = nss_cc_uniphy1_tx312p5m_prx_map,
925 .clkr.hw.init = &(const struct clk_init_data) {
926 .name = "nss_cc_mac3_rx_clk_src",
927 .parent_data = nss_cc_uniphy1_tx312p5m_prx_data,
928 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_tx312p5m_prx_data),
929 .ops = &clk_rcg2_ops,
933 static struct clk_regmap_div nss_cc_mac3_rx_div_clk_src = {
938 .hw.init = &(const struct clk_init_data) {
939 .name = "nss_cc_mac3_rx_div_clk_src",
940 .parent_hws = (const struct clk_hw *[]) {
941 &nss_cc_mac3_rx_clk_src.clkr.hw,
944 .flags = CLK_SET_RATE_PARENT,
945 .ops = &clk_regmap_div_ops,
950 static struct clk_regmap_div nss_cc_mac3_srds1_ch2_xgmii_tx_div_clk_src = {
955 .hw.init = &(const struct clk_init_data) {
956 .name = "nss_cc_mac3_srds1_ch2_xgmii_tx_div_clk_src",
957 .parent_hws = (const struct clk_hw *[]) {
958 &nss_cc_mac3_rx_clk_src.clkr.hw,
961 .flags = CLK_SET_RATE_PARENT,
962 .ops = &clk_regmap_div_ops,
967 static struct clk_branch nss_cc_mac3_srds1_ch2_tx_clk = {
969 .halt_check = BRANCH_HALT,
972 .enable_mask = BIT(0),
973 .hw.init = &(const struct clk_init_data) {
974 .name = "nss_cc_mac3_srds1_ch2_tx_clk",
975 .parent_hws = (const struct clk_hw *[]) {
976 &nss_cc_mac3_rx_div_clk_src.clkr.hw,
979 .flags = CLK_SET_RATE_PARENT,
980 .ops = &clk_branch2_prepare_ops,
985 static struct clk_branch nss_cc_mac3_rx_clk = {
987 .halt_check = BRANCH_HALT,
990 .enable_mask = BIT(0),
991 .hw.init = &(const struct clk_init_data) {
992 .name = "nss_cc_mac3_rx_clk",
993 .parent_hws = (const struct clk_hw *[]) {
994 &nss_cc_mac3_rx_div_clk_src.clkr.hw,
997 .flags = CLK_SET_RATE_PARENT,
998 .ops = &clk_branch2_prepare_ops,
1003 static struct clk_branch nss_cc_mac3_gephy2_rx_clk = {
1005 .halt_check = BRANCH_HALT,
1008 .enable_mask = BIT(0),
1009 .hw.init = &(const struct clk_init_data) {
1010 .name = "nss_cc_mac3_gephy2_rx_clk",
1011 .parent_hws = (const struct clk_hw *[]) {
1012 &nss_cc_mac3_rx_div_clk_src.clkr.hw,
1015 .flags = CLK_SET_RATE_PARENT,
1016 .ops = &clk_branch2_prepare_ops,
1021 static struct clk_branch nss_cc_mac3_srds1_ch2_xgmii_tx_clk = {
1023 .halt_check = BRANCH_HALT,
1026 .enable_mask = BIT(0),
1027 .hw.init = &(const struct clk_init_data) {
1028 .name = "nss_cc_mac3_srds1_ch2_xgmii_tx_clk",
1029 .parent_hws = (const struct clk_hw *[]) {
1030 &nss_cc_mac3_srds1_ch2_xgmii_tx_div_clk_src.clkr.hw,
1033 .flags = CLK_SET_RATE_PARENT,
1034 .ops = &clk_branch2_prepare_ops,
1039 static const struct clk_parent_data nss_cc_uniphy0_rx_uniphy1_rx_tx312p5m_data[] = {
1041 { .index = DT_UNIPHY0_RX_CLK },
1042 { .index = DT_UNIPHY1_TX312P5M_CLK },
1043 { .index = DT_UNIPHY1_RX312P5M_CLK },
1046 static const struct parent_map nss_cc_uniphy0_rx_uniphy1_rx_tx312p5m_map[] = {
1048 { P_UNIPHY0_RX, 1 },
1049 { P_UNIPHY1_TX312P5M, 3 },
1050 { P_UNIPHY1_RX312P5M, 7 },
1053 static const struct freq_conf ftbl_nss_cc_mac4_tx_clk_src_25[] = {
1054 C(P_UNIPHY0_RX, 12.5, 0, 0),
1055 C(P_UNIPHY0_RX, 5, 0, 0),
1056 C(P_UNIPHY1_TX312P5M, 12.5, 0, 0),
1057 C(P_UNIPHY1_RX312P5M, 12.5, 0, 0),
1060 static const struct freq_conf ftbl_nss_cc_mac4_tx_clk_src_125[] = {
1061 C(P_UNIPHY0_RX, 1, 0, 0),
1062 C(P_UNIPHY0_RX, 2.5, 0, 0),
1063 C(P_UNIPHY1_TX312P5M, 2.5, 0, 0),
1064 C(P_UNIPHY1_RX312P5M, 2.5, 0, 0),
1067 static const struct freq_conf ftbl_nss_cc_mac4_tx_clk_src_312p5[] = {
1068 C(P_UNIPHY0_RX, 1, 0, 0),
1069 C(P_UNIPHY1_TX312P5M, 1, 0, 0),
1070 C(P_UNIPHY1_RX312P5M, 1, 0, 0),
1073 static const struct freq_multi_tbl ftbl_nss_cc_mac4_tx_clk_src[] = {
1074 FM(25000000, ftbl_nss_cc_mac4_tx_clk_src_25),
1075 FMS(50000000, P_XO, 1, 0, 0),
1076 FM(125000000, ftbl_nss_cc_mac4_tx_clk_src_125),
1077 FM(312500000, ftbl_nss_cc_mac4_tx_clk_src_312p5),
1081 static struct clk_rcg2 nss_cc_mac4_tx_clk_src = {
1083 .freq_multi_tbl = ftbl_nss_cc_mac4_tx_clk_src,
1085 .parent_map = nss_cc_uniphy0_rx_uniphy1_rx_tx312p5m_map,
1086 .clkr.hw.init = &(const struct clk_init_data) {
1087 .name = "nss_cc_mac4_tx_clk_src",
1088 .parent_data = nss_cc_uniphy0_rx_uniphy1_rx_tx312p5m_data,
1089 .num_parents = ARRAY_SIZE(nss_cc_uniphy0_rx_uniphy1_rx_tx312p5m_data),
1090 .ops = &clk_rcg2_fm_ops,
1094 static struct clk_regmap_div nss_cc_mac4_tx_div_clk_src = {
1099 .hw.init = &(const struct clk_init_data) {
1100 .name = "nss_cc_mac4_tx_div_clk_src",
1101 .parent_hws = (const struct clk_hw *[]) {
1102 &nss_cc_mac4_tx_clk_src.clkr.hw,
1105 .flags = CLK_SET_RATE_PARENT,
1106 .ops = &clk_regmap_div_ops,
1111 static struct clk_regmap_div nss_cc_mac4_srds1_ch3_xgmii_rx_div_clk_src = {
1116 .hw.init = &(const struct clk_init_data) {
1117 .name = "nss_cc_mac4_srds1_ch3_xgmii_rx_div_clk_src",
1118 .parent_hws = (const struct clk_hw *[]) {
1119 &nss_cc_mac4_tx_clk_src.clkr.hw,
1122 .flags = CLK_SET_RATE_PARENT,
1123 .ops = &clk_regmap_div_ops,
1128 static struct clk_branch nss_cc_mac4_srds1_ch3_rx_clk = {
1130 .halt_check = BRANCH_HALT,
1132 .enable_reg = 0x110,
1133 .enable_mask = BIT(0),
1134 .hw.init = &(const struct clk_init_data) {
1135 .name = "nss_cc_mac4_srds1_ch3_rx_clk",
1136 .parent_hws = (const struct clk_hw *[]) {
1137 &nss_cc_mac4_tx_div_clk_src.clkr.hw,
1140 .flags = CLK_SET_RATE_PARENT,
1141 .ops = &clk_branch2_prepare_ops,
1146 static struct clk_branch nss_cc_mac4_tx_clk = {
1148 .halt_check = BRANCH_HALT,
1150 .enable_reg = 0x114,
1151 .enable_mask = BIT(0),
1152 .hw.init = &(const struct clk_init_data) {
1153 .name = "nss_cc_mac4_tx_clk",
1154 .parent_hws = (const struct clk_hw *[]) {
1155 &nss_cc_mac4_tx_div_clk_src.clkr.hw,
1158 .flags = CLK_SET_RATE_PARENT,
1159 .ops = &clk_branch2_prepare_ops,
1164 static struct clk_branch nss_cc_mac4_gephy3_tx_clk = {
1166 .halt_check = BRANCH_HALT,
1168 .enable_reg = 0x118,
1169 .enable_mask = BIT(0),
1170 .hw.init = &(const struct clk_init_data) {
1171 .name = "nss_cc_mac4_gephy3_tx_clk",
1172 .parent_hws = (const struct clk_hw *[]) {
1173 &nss_cc_mac4_tx_div_clk_src.clkr.hw,
1176 .flags = CLK_SET_RATE_PARENT,
1177 .ops = &clk_branch2_prepare_ops,
1182 static struct clk_branch nss_cc_mac4_srds1_ch3_xgmii_rx_clk = {
1184 .halt_check = BRANCH_HALT,
1186 .enable_reg = 0x11c,
1187 .enable_mask = BIT(0),
1188 .hw.init = &(const struct clk_init_data) {
1189 .name = "nss_cc_mac4_srds1_ch3_xgmii_rx_clk",
1190 .parent_hws = (const struct clk_hw *[]) {
1191 &nss_cc_mac4_srds1_ch3_xgmii_rx_div_clk_src.clkr.hw,
1194 .flags = CLK_SET_RATE_PARENT,
1195 .ops = &clk_branch2_prepare_ops,
1200 static const struct clk_parent_data nss_cc_uniphy0_tx_uniphy1_tx312p5m_data[] = {
1202 { .index = DT_UNIPHY0_TX_CLK },
1203 { .index = DT_UNIPHY1_TX312P5M_CLK },
1206 static const struct parent_map nss_cc_uniphy0_tx_uniphy1_tx312p5m_map[] = {
1208 { P_UNIPHY0_TX, 2 },
1209 { P_UNIPHY1_TX312P5M, 3 },
1212 static const struct freq_conf ftbl_nss_cc_mac4_rx_clk_src_25[] = {
1213 C(P_UNIPHY0_TX, 12.5, 0, 0),
1214 C(P_UNIPHY0_TX, 5, 0, 0),
1215 C(P_UNIPHY1_TX312P5M, 12.5, 0, 0),
1218 static const struct freq_conf ftbl_nss_cc_mac4_rx_clk_src_125[] = {
1219 C(P_UNIPHY0_TX, 1, 0, 0),
1220 C(P_UNIPHY0_TX, 2.5, 0, 0),
1221 C(P_UNIPHY1_TX312P5M, 2.5, 0, 0),
1224 static const struct freq_conf ftbl_nss_cc_mac4_rx_clk_src_312p5[] = {
1225 C(P_UNIPHY0_TX, 1, 0, 0),
1226 C(P_UNIPHY1_TX312P5M, 1, 0, 0),
1229 static const struct freq_multi_tbl ftbl_nss_cc_mac4_rx_clk_src[] = {
1230 FM(25000000, ftbl_nss_cc_mac4_rx_clk_src_25),
1231 FMS(50000000, P_XO, 1, 0, 0),
1232 FM(125000000, ftbl_nss_cc_mac4_rx_clk_src_125),
1233 FM(312500000, ftbl_nss_cc_mac4_rx_clk_src_312p5),
1237 static struct clk_rcg2 nss_cc_mac4_rx_clk_src = {
1239 .freq_multi_tbl = ftbl_nss_cc_mac4_rx_clk_src,
1241 .parent_map = nss_cc_uniphy0_tx_uniphy1_tx312p5m_map,
1242 .clkr.hw.init = &(const struct clk_init_data) {
1243 .name = "nss_cc_mac4_rx_clk_src",
1244 .parent_data = nss_cc_uniphy0_tx_uniphy1_tx312p5m_data,
1245 .num_parents = ARRAY_SIZE(nss_cc_uniphy0_tx_uniphy1_tx312p5m_data),
1246 .ops = &clk_rcg2_fm_ops,
1250 static struct clk_regmap_div nss_cc_mac4_rx_div_clk_src = {
1255 .hw.init = &(const struct clk_init_data) {
1256 .name = "nss_cc_mac4_rx_div_clk_src",
1257 .parent_hws = (const struct clk_hw *[]) {
1258 &nss_cc_mac4_rx_clk_src.clkr.hw,
1261 .flags = CLK_SET_RATE_PARENT,
1262 .ops = &clk_regmap_div_ops,
1267 static struct clk_regmap_div nss_cc_mac4_srds1_ch3_xgmii_tx_div_clk_src = {
1272 .hw.init = &(const struct clk_init_data) {
1273 .name = "nss_cc_mac4_srds1_ch3_xgmii_tx_div_clk_src",
1274 .parent_hws = (const struct clk_hw *[]) {
1275 &nss_cc_mac4_rx_clk_src.clkr.hw,
1278 .flags = CLK_SET_RATE_PARENT,
1279 .ops = &clk_regmap_div_ops,
1284 static struct clk_branch nss_cc_mac4_srds1_ch3_tx_clk = {
1286 .halt_check = BRANCH_HALT,
1288 .enable_reg = 0x130,
1289 .enable_mask = BIT(0),
1290 .hw.init = &(const struct clk_init_data) {
1291 .name = "nss_cc_mac4_srds1_ch3_tx_clk",
1292 .parent_hws = (const struct clk_hw *[]) {
1293 &nss_cc_mac4_rx_div_clk_src.clkr.hw,
1296 .flags = CLK_SET_RATE_PARENT,
1297 .ops = &clk_branch2_prepare_ops,
1302 static struct clk_branch nss_cc_mac4_rx_clk = {
1304 .halt_check = BRANCH_HALT,
1306 .enable_reg = 0x134,
1307 .enable_mask = BIT(0),
1308 .hw.init = &(const struct clk_init_data) {
1309 .name = "nss_cc_mac4_rx_clk",
1310 .parent_hws = (const struct clk_hw *[]) {
1311 &nss_cc_mac4_rx_div_clk_src.clkr.hw,
1314 .flags = CLK_SET_RATE_PARENT,
1315 .ops = &clk_branch2_prepare_ops,
1320 static struct clk_branch nss_cc_mac4_gephy3_rx_clk = {
1322 .halt_check = BRANCH_HALT,
1324 .enable_reg = 0x138,
1325 .enable_mask = BIT(0),
1326 .hw.init = &(const struct clk_init_data) {
1327 .name = "nss_cc_mac4_gephy3_rx_clk",
1328 .parent_hws = (const struct clk_hw *[]) {
1329 &nss_cc_mac4_rx_div_clk_src.clkr.hw,
1332 .flags = CLK_SET_RATE_PARENT,
1333 .ops = &clk_branch2_prepare_ops,
1338 static struct clk_branch nss_cc_mac4_srds1_ch3_xgmii_tx_clk = {
1340 .halt_check = BRANCH_HALT,
1342 .enable_reg = 0x13c,
1343 .enable_mask = BIT(0),
1344 .hw.init = &(const struct clk_init_data) {
1345 .name = "nss_cc_mac4_srds1_ch3_xgmii_tx_clk",
1346 .parent_hws = (const struct clk_hw *[]) {
1347 &nss_cc_mac4_srds1_ch3_xgmii_tx_div_clk_src.clkr.hw,
1350 .flags = CLK_SET_RATE_PARENT,
1351 .ops = &clk_branch2_prepare_ops,
1356 static const struct clk_parent_data nss_cc_uniphy0_tx_data[] = {
1358 { .index = DT_UNIPHY0_TX_CLK },
1361 static const struct parent_map nss_cc_uniphy0_tx_map[] = {
1363 { P_UNIPHY0_TX, 2 },
1366 static struct clk_rcg2 nss_cc_mac5_tx_clk_src = {
1369 .parent_map = nss_cc_uniphy0_tx_map,
1370 .clkr.hw.init = &(const struct clk_init_data) {
1371 .name = "nss_cc_mac5_tx_clk_src",
1372 .parent_data = nss_cc_uniphy0_tx_data,
1373 .num_parents = ARRAY_SIZE(nss_cc_uniphy0_tx_data),
1374 .flags = CLK_SET_RATE_PARENT,
1375 .ops = &clk_rcg2_mux_closest_ops,
1379 static struct clk_regmap_div nss_cc_mac5_tx_div_clk_src = {
1384 .hw.init = &(const struct clk_init_data) {
1385 .name = "nss_cc_mac5_tx_div_clk_src",
1386 .parent_hws = (const struct clk_hw *[]) {
1387 &nss_cc_mac5_tx_clk_src.clkr.hw,
1390 .flags = CLK_SET_RATE_PARENT,
1391 .ops = &clk_regmap_div_ops,
1396 static struct clk_branch nss_cc_mac5_tx_clk = {
1398 .halt_check = BRANCH_HALT,
1400 .enable_reg = 0x14c,
1401 .enable_mask = BIT(0),
1402 .hw.init = &(const struct clk_init_data) {
1403 .name = "nss_cc_mac5_tx_clk",
1404 .parent_hws = (const struct clk_hw *[]) {
1405 &nss_cc_mac5_tx_div_clk_src.clkr.hw,
1408 .flags = CLK_SET_RATE_PARENT,
1409 .ops = &clk_branch2_prepare_ops,
1414 static const struct clk_parent_data nss_cc_uniphy0_rx_tx_data[] = {
1416 { .index = DT_UNIPHY0_RX_CLK },
1417 { .index = DT_UNIPHY0_TX_CLK },
1420 static const struct parent_map nss_cc_uniphy0_rx_tx_map[] = {
1422 { P_UNIPHY0_RX, 1 },
1423 { P_UNIPHY0_TX, 2 },
1426 static struct clk_rcg2 nss_cc_mac5_rx_clk_src = {
1429 .parent_map = nss_cc_uniphy0_rx_tx_map,
1430 .clkr.hw.init = &(const struct clk_init_data) {
1431 .name = "nss_cc_mac5_rx_clk_src",
1432 .parent_data = nss_cc_uniphy0_rx_tx_data,
1433 .num_parents = ARRAY_SIZE(nss_cc_uniphy0_rx_tx_data),
1434 .flags = CLK_SET_RATE_PARENT,
1435 .ops = &clk_rcg2_mux_closest_ops,
1439 static struct clk_regmap_div nss_cc_mac5_rx_div_clk_src = {
1444 .hw.init = &(const struct clk_init_data) {
1445 .name = "nss_cc_mac5_rx_div_clk_src",
1446 .parent_hws = (const struct clk_hw *[]) {
1447 &nss_cc_mac5_rx_clk_src.clkr.hw,
1450 .flags = CLK_SET_RATE_PARENT,
1451 .ops = &clk_regmap_div_ops,
1456 static struct clk_branch nss_cc_mac5_rx_clk = {
1458 .halt_check = BRANCH_HALT,
1460 .enable_reg = 0x160,
1461 .enable_mask = BIT(0),
1462 .hw.init = &(const struct clk_init_data) {
1463 .name = "nss_cc_mac5_rx_clk",
1464 .parent_hws = (const struct clk_hw *[]) {
1465 &nss_cc_mac5_rx_div_clk_src.clkr.hw,
1468 .flags = CLK_SET_RATE_PARENT,
1469 .ops = &clk_branch2_prepare_ops,
1474 static const struct parent_map nss_cc_mac4_rx_div_mac5_tx_div_map[] = {
1475 { P_MAC4_RX_DIV, 0 },
1476 { P_MAC5_TX_DIV, 1 },
1479 static struct clk_regmap_mux nss_cc_mac5_tx_srds0_clk_src = {
1483 .parent_map = nss_cc_mac4_rx_div_mac5_tx_div_map,
1485 .hw.init = &(const struct clk_init_data) {
1486 .name = "nss_cc_mac5_tx_srds0_clk_src",
1487 .parent_hws = (const struct clk_hw *[]) {
1488 &nss_cc_mac4_rx_div_clk_src.clkr.hw,
1489 &nss_cc_mac5_tx_div_clk_src.clkr.hw,
1492 .flags = CLK_SET_RATE_PARENT,
1493 .ops = &clk_regmap_mux_closest_ops,
1498 static struct clk_branch nss_cc_mac5_tx_srds0_clk = {
1500 .halt_check = BRANCH_HALT,
1502 .enable_reg = 0x150,
1503 .enable_mask = BIT(0),
1504 .hw.init = &(const struct clk_init_data) {
1505 .name = "nss_cc_mac5_tx_srds0_clk",
1506 .parent_hws = (const struct clk_hw *[]) {
1507 &nss_cc_mac5_tx_srds0_clk_src.clkr.hw,
1510 .flags = CLK_SET_RATE_PARENT,
1511 .ops = &clk_branch2_prepare_ops,
1516 static const struct parent_map nss_cc_mac4_tx_div_mac5_rx_div_map[] = {
1517 { P_MAC4_TX_DIV, 0 },
1518 { P_MAC5_RX_DIV, 1 },
1521 static struct clk_regmap_mux nss_cc_mac5_rx_srds0_clk_src = {
1525 .parent_map = nss_cc_mac4_tx_div_mac5_rx_div_map,
1527 .hw.init = &(const struct clk_init_data) {
1528 .name = "nss_cc_mac5_rx_srds0_clk_src",
1529 .parent_hws = (const struct clk_hw *[]) {
1530 &nss_cc_mac4_tx_div_clk_src.clkr.hw,
1531 &nss_cc_mac5_rx_div_clk_src.clkr.hw,
1534 .flags = CLK_SET_RATE_PARENT,
1535 .ops = &clk_regmap_mux_closest_ops,
1540 static struct clk_branch nss_cc_mac5_rx_srds0_clk = {
1542 .halt_check = BRANCH_HALT,
1544 .enable_reg = 0x164,
1545 .enable_mask = BIT(0),
1546 .hw.init = &(const struct clk_init_data) {
1547 .name = "nss_cc_mac5_rx_srds0_clk",
1548 .parent_hws = (const struct clk_hw *[]) {
1549 &nss_cc_mac5_rx_srds0_clk_src.clkr.hw,
1552 .flags = CLK_SET_RATE_PARENT,
1553 .ops = &clk_branch2_prepare_ops,
1558 static const struct parent_map nss_cc_uniphy1_tx312p5m_map2[] = {
1560 { P_UNIPHY1_TX312P5M, 2 },
1563 static const struct freq_tbl ftbl_nss_cc_ahb_clk_src[] = {
1564 F(50000000, P_XO, 1, 0, 0),
1565 F(104170000, P_UNIPHY1_TX312P5M, 3, 0, 0),
1569 static struct clk_rcg2 nss_cc_ahb_clk_src = {
1571 .freq_tbl = ftbl_nss_cc_ahb_clk_src,
1573 .parent_map = nss_cc_uniphy1_tx312p5m_map2,
1574 .clkr.hw.init = &(const struct clk_init_data) {
1575 .name = "nss_cc_ahb_clk_src",
1576 .parent_data = nss_cc_uniphy1_tx312p5m_data,
1577 .num_parents = ARRAY_SIZE(nss_cc_uniphy1_tx312p5m_data),
1578 .ops = &clk_rcg2_ops,
1582 static struct clk_branch nss_cc_ahb_clk = {
1584 .halt_check = BRANCH_HALT,
1586 .enable_reg = 0x170,
1587 .enable_mask = BIT(0),
1588 .hw.init = &(const struct clk_init_data) {
1589 .name = "nss_cc_ahb_clk",
1590 .parent_hws = (const struct clk_hw *[]) {
1591 &nss_cc_ahb_clk_src.clkr.hw,
1594 .flags = CLK_SET_RATE_PARENT,
1595 .ops = &clk_branch2_prepare_ops,
1600 static struct clk_branch nss_cc_sec_ctrl_ahb_clk = {
1602 .halt_check = BRANCH_HALT,
1604 .enable_reg = 0x174,
1605 .enable_mask = BIT(0),
1606 .hw.init = &(const struct clk_init_data) {
1607 .name = "nss_cc_sec_ctrl_ahb_clk",
1608 .parent_hws = (const struct clk_hw *[]) {
1609 &nss_cc_ahb_clk_src.clkr.hw,
1612 .flags = CLK_SET_RATE_PARENT,
1613 .ops = &clk_branch2_prepare_ops,
1618 static struct clk_branch nss_cc_tlmm_clk = {
1620 .halt_check = BRANCH_HALT,
1622 .enable_reg = 0x178,
1623 .enable_mask = BIT(0),
1624 .hw.init = &(const struct clk_init_data) {
1625 .name = "nss_cc_tlmm_clk",
1626 .parent_hws = (const struct clk_hw *[]) {
1627 &nss_cc_ahb_clk_src.clkr.hw,
1630 .flags = CLK_SET_RATE_PARENT,
1631 .ops = &clk_branch2_prepare_ops,
1636 static struct clk_branch nss_cc_tlmm_ahb_clk = {
1638 .halt_check = BRANCH_HALT,
1640 .enable_reg = 0x190,
1641 .enable_mask = BIT(0),
1642 .hw.init = &(const struct clk_init_data) {
1643 .name = "nss_cc_tlmm_ahb_clk",
1644 .parent_hws = (const struct clk_hw *[]) {
1645 &nss_cc_ahb_clk_src.clkr.hw,
1648 .flags = CLK_SET_RATE_PARENT,
1649 .ops = &clk_branch2_prepare_ops,
1654 static struct clk_branch nss_cc_cnoc_ahb_clk = {
1656 .halt_check = BRANCH_HALT,
1658 .enable_reg = 0x194,
1659 .enable_mask = BIT(0),
1660 .hw.init = &(const struct clk_init_data) {
1661 .name = "nss_cc_cnoc_ahb_clk",
1662 .parent_hws = (const struct clk_hw *[]) {
1663 &nss_cc_ahb_clk_src.clkr.hw,
1666 .flags = CLK_SET_RATE_PARENT,
1667 .ops = &clk_branch2_prepare_ops,
1672 static struct clk_branch nss_cc_mdio_ahb_clk = {
1674 .halt_check = BRANCH_HALT,
1676 .enable_reg = 0x198,
1677 .enable_mask = BIT(0),
1678 .hw.init = &(const struct clk_init_data) {
1679 .name = "nss_cc_mdio_ahb_clk",
1680 .parent_hws = (const struct clk_hw *[]) {
1681 &nss_cc_ahb_clk_src.clkr.hw,
1684 .flags = CLK_SET_RATE_PARENT,
1685 .ops = &clk_branch2_prepare_ops,
1690 static struct clk_branch nss_cc_mdio_master_ahb_clk = {
1692 .halt_check = BRANCH_HALT,
1694 .enable_reg = 0x19c,
1695 .enable_mask = BIT(0),
1696 .hw.init = &(const struct clk_init_data) {
1697 .name = "nss_cc_mdio_master_ahb_clk",
1698 .parent_hws = (const struct clk_hw *[]) {
1699 &nss_cc_ahb_clk_src.clkr.hw,
1702 .flags = CLK_SET_RATE_PARENT,
1703 .ops = &clk_branch2_prepare_ops,
1708 static const struct clk_parent_data nss_cc_xo_data[] = {
1712 static const struct parent_map nss_cc_xo_map[] = {
1716 static const struct freq_tbl ftbl_nss_cc_sys_clk_src[] = {
1717 F(25000000, P_XO, 2, 0, 0),
1721 static struct clk_rcg2 nss_cc_sys_clk_src = {
1723 .freq_tbl = ftbl_nss_cc_sys_clk_src,
1725 .parent_map = nss_cc_xo_map,
1726 .clkr.hw.init = &(const struct clk_init_data) {
1727 .name = "nss_cc_sys_clk_src",
1728 .parent_data = nss_cc_xo_data,
1729 .num_parents = ARRAY_SIZE(nss_cc_xo_data),
1730 .ops = &clk_rcg2_ops,
1734 static struct clk_branch nss_cc_srds0_sys_clk = {
1736 .halt_check = BRANCH_HALT,
1738 .enable_reg = 0x1a8,
1739 .enable_mask = BIT(0),
1740 .hw.init = &(const struct clk_init_data) {
1741 .name = "nss_cc_srds0_sys_clk",
1742 .parent_hws = (const struct clk_hw *[]) {
1743 &nss_cc_sys_clk_src.clkr.hw,
1746 .ops = &clk_branch2_prepare_ops,
1751 static struct clk_branch nss_cc_srds1_sys_clk = {
1753 .halt_check = BRANCH_HALT,
1755 .enable_reg = 0x1ac,
1756 .enable_mask = BIT(0),
1757 .hw.init = &(const struct clk_init_data) {
1758 .name = "nss_cc_srds1_sys_clk",
1759 .parent_hws = (const struct clk_hw *[]) {
1760 &nss_cc_sys_clk_src.clkr.hw,
1763 .ops = &clk_branch2_prepare_ops,
1768 static struct clk_branch nss_cc_gephy0_sys_clk = {
1770 .halt_check = BRANCH_HALT,
1772 .enable_reg = 0x1b0,
1773 .enable_mask = BIT(0),
1774 .hw.init = &(const struct clk_init_data) {
1775 .name = "nss_cc_gephy0_sys_clk",
1776 .parent_hws = (const struct clk_hw *[]) {
1777 &nss_cc_sys_clk_src.clkr.hw,
1780 .ops = &clk_branch2_prepare_ops,
1785 static struct clk_branch nss_cc_gephy1_sys_clk = {
1787 .halt_check = BRANCH_HALT,
1789 .enable_reg = 0x1b4,
1790 .enable_mask = BIT(0),
1791 .hw.init = &(const struct clk_init_data) {
1792 .name = "nss_cc_gephy1_sys_clk",
1793 .parent_hws = (const struct clk_hw *[]) {
1794 &nss_cc_sys_clk_src.clkr.hw,
1797 .ops = &clk_branch2_prepare_ops,
1802 static struct clk_branch nss_cc_gephy2_sys_clk = {
1804 .halt_check = BRANCH_HALT,
1806 .enable_reg = 0x1b8,
1807 .enable_mask = BIT(0),
1808 .hw.init = &(const struct clk_init_data) {
1809 .name = "nss_cc_gephy2_sys_clk",
1810 .parent_hws = (const struct clk_hw *[]) {
1811 &nss_cc_sys_clk_src.clkr.hw,
1814 .ops = &clk_branch2_prepare_ops,
1819 static struct clk_branch nss_cc_gephy3_sys_clk = {
1821 .halt_check = BRANCH_HALT,
1823 .enable_reg = 0x1bc,
1824 .enable_mask = BIT(0),
1825 .hw.init = &(const struct clk_init_data) {
1826 .name = "nss_cc_gephy3_sys_clk",
1827 .parent_hws = (const struct clk_hw *[]) {
1828 &nss_cc_sys_clk_src.clkr.hw,
1831 .ops = &clk_branch2_prepare_ops,
1836 static struct clk_regmap *nss_cc_qca8k_clocks[] = {
1837 [NSS_CC_SWITCH_CORE_CLK_SRC] = &nss_cc_switch_core_clk_src.clkr,
1838 [NSS_CC_SWITCH_CORE_CLK] = &nss_cc_switch_core_clk.clkr,
1839 [NSS_CC_APB_BRIDGE_CLK] = &nss_cc_apb_bridge_clk.clkr,
1840 [NSS_CC_MAC0_TX_CLK_SRC] = &nss_cc_mac0_tx_clk_src.clkr,
1841 [NSS_CC_MAC0_TX_DIV_CLK_SRC] = &nss_cc_mac0_tx_div_clk_src.clkr,
1842 [NSS_CC_MAC0_TX_CLK] = &nss_cc_mac0_tx_clk.clkr,
1843 [NSS_CC_MAC0_TX_SRDS1_CLK] = &nss_cc_mac0_tx_srds1_clk.clkr,
1844 [NSS_CC_MAC0_RX_CLK_SRC] = &nss_cc_mac0_rx_clk_src.clkr,
1845 [NSS_CC_MAC0_RX_DIV_CLK_SRC] = &nss_cc_mac0_rx_div_clk_src.clkr,
1846 [NSS_CC_MAC0_RX_CLK] = &nss_cc_mac0_rx_clk.clkr,
1847 [NSS_CC_MAC0_RX_SRDS1_CLK] = &nss_cc_mac0_rx_srds1_clk.clkr,
1848 [NSS_CC_MAC1_TX_CLK_SRC] = &nss_cc_mac1_tx_clk_src.clkr,
1849 [NSS_CC_MAC1_TX_DIV_CLK_SRC] = &nss_cc_mac1_tx_div_clk_src.clkr,
1850 [NSS_CC_MAC1_SRDS1_CH0_XGMII_RX_DIV_CLK_SRC] =
1851 &nss_cc_mac1_srds1_ch0_xgmii_rx_div_clk_src.clkr,
1852 [NSS_CC_MAC1_SRDS1_CH0_RX_CLK] = &nss_cc_mac1_srds1_ch0_rx_clk.clkr,
1853 [NSS_CC_MAC1_TX_CLK] = &nss_cc_mac1_tx_clk.clkr,
1854 [NSS_CC_MAC1_GEPHY0_TX_CLK] = &nss_cc_mac1_gephy0_tx_clk.clkr,
1855 [NSS_CC_MAC1_SRDS1_CH0_XGMII_RX_CLK] = &nss_cc_mac1_srds1_ch0_xgmii_rx_clk.clkr,
1856 [NSS_CC_MAC1_RX_CLK_SRC] = &nss_cc_mac1_rx_clk_src.clkr,
1857 [NSS_CC_MAC1_RX_DIV_CLK_SRC] = &nss_cc_mac1_rx_div_clk_src.clkr,
1858 [NSS_CC_MAC1_SRDS1_CH0_XGMII_TX_DIV_CLK_SRC] =
1859 &nss_cc_mac1_srds1_ch0_xgmii_tx_div_clk_src.clkr,
1860 [NSS_CC_MAC1_SRDS1_CH0_TX_CLK] = &nss_cc_mac1_srds1_ch0_tx_clk.clkr,
1861 [NSS_CC_MAC1_RX_CLK] = &nss_cc_mac1_rx_clk.clkr,
1862 [NSS_CC_MAC1_GEPHY0_RX_CLK] = &nss_cc_mac1_gephy0_rx_clk.clkr,
1863 [NSS_CC_MAC1_SRDS1_CH0_XGMII_TX_CLK] = &nss_cc_mac1_srds1_ch0_xgmii_tx_clk.clkr,
1864 [NSS_CC_MAC2_TX_CLK_SRC] = &nss_cc_mac2_tx_clk_src.clkr,
1865 [NSS_CC_MAC2_TX_DIV_CLK_SRC] = &nss_cc_mac2_tx_div_clk_src.clkr,
1866 [NSS_CC_MAC2_SRDS1_CH1_XGMII_RX_DIV_CLK_SRC] =
1867 &nss_cc_mac2_srds1_ch1_xgmii_rx_div_clk_src.clkr,
1868 [NSS_CC_MAC2_SRDS1_CH1_RX_CLK] = &nss_cc_mac2_srds1_ch1_rx_clk.clkr,
1869 [NSS_CC_MAC2_TX_CLK] = &nss_cc_mac2_tx_clk.clkr,
1870 [NSS_CC_MAC2_GEPHY1_TX_CLK] = &nss_cc_mac2_gephy1_tx_clk.clkr,
1871 [NSS_CC_MAC2_SRDS1_CH1_XGMII_RX_CLK] = &nss_cc_mac2_srds1_ch1_xgmii_rx_clk.clkr,
1872 [NSS_CC_MAC2_RX_CLK_SRC] = &nss_cc_mac2_rx_clk_src.clkr,
1873 [NSS_CC_MAC2_RX_DIV_CLK_SRC] = &nss_cc_mac2_rx_div_clk_src.clkr,
1874 [NSS_CC_MAC2_SRDS1_CH1_XGMII_TX_DIV_CLK_SRC] =
1875 &nss_cc_mac2_srds1_ch1_xgmii_tx_div_clk_src.clkr,
1876 [NSS_CC_MAC2_SRDS1_CH1_TX_CLK] = &nss_cc_mac2_srds1_ch1_tx_clk.clkr,
1877 [NSS_CC_MAC2_RX_CLK] = &nss_cc_mac2_rx_clk.clkr,
1878 [NSS_CC_MAC2_GEPHY1_RX_CLK] = &nss_cc_mac2_gephy1_rx_clk.clkr,
1879 [NSS_CC_MAC2_SRDS1_CH1_XGMII_TX_CLK] = &nss_cc_mac2_srds1_ch1_xgmii_tx_clk.clkr,
1880 [NSS_CC_MAC3_TX_CLK_SRC] = &nss_cc_mac3_tx_clk_src.clkr,
1881 [NSS_CC_MAC3_TX_DIV_CLK_SRC] = &nss_cc_mac3_tx_div_clk_src.clkr,
1882 [NSS_CC_MAC3_SRDS1_CH2_XGMII_RX_DIV_CLK_SRC] =
1883 &nss_cc_mac3_srds1_ch2_xgmii_rx_div_clk_src.clkr,
1884 [NSS_CC_MAC3_SRDS1_CH2_RX_CLK] = &nss_cc_mac3_srds1_ch2_rx_clk.clkr,
1885 [NSS_CC_MAC3_TX_CLK] = &nss_cc_mac3_tx_clk.clkr,
1886 [NSS_CC_MAC3_GEPHY2_TX_CLK] = &nss_cc_mac3_gephy2_tx_clk.clkr,
1887 [NSS_CC_MAC3_SRDS1_CH2_XGMII_RX_CLK] = &nss_cc_mac3_srds1_ch2_xgmii_rx_clk.clkr,
1888 [NSS_CC_MAC3_RX_CLK_SRC] = &nss_cc_mac3_rx_clk_src.clkr,
1889 [NSS_CC_MAC3_RX_DIV_CLK_SRC] = &nss_cc_mac3_rx_div_clk_src.clkr,
1890 [NSS_CC_MAC3_SRDS1_CH2_XGMII_TX_DIV_CLK_SRC] =
1891 &nss_cc_mac3_srds1_ch2_xgmii_tx_div_clk_src.clkr,
1892 [NSS_CC_MAC3_SRDS1_CH2_TX_CLK] = &nss_cc_mac3_srds1_ch2_tx_clk.clkr,
1893 [NSS_CC_MAC3_RX_CLK] = &nss_cc_mac3_rx_clk.clkr,
1894 [NSS_CC_MAC3_GEPHY2_RX_CLK] = &nss_cc_mac3_gephy2_rx_clk.clkr,
1895 [NSS_CC_MAC3_SRDS1_CH2_XGMII_TX_CLK] = &nss_cc_mac3_srds1_ch2_xgmii_tx_clk.clkr,
1896 [NSS_CC_MAC4_TX_CLK_SRC] = &nss_cc_mac4_tx_clk_src.clkr,
1897 [NSS_CC_MAC4_TX_DIV_CLK_SRC] = &nss_cc_mac4_tx_div_clk_src.clkr,
1898 [NSS_CC_MAC4_SRDS1_CH3_XGMII_RX_DIV_CLK_SRC] =
1899 &nss_cc_mac4_srds1_ch3_xgmii_rx_div_clk_src.clkr,
1900 [NSS_CC_MAC4_SRDS1_CH3_RX_CLK] = &nss_cc_mac4_srds1_ch3_rx_clk.clkr,
1901 [NSS_CC_MAC4_TX_CLK] = &nss_cc_mac4_tx_clk.clkr,
1902 [NSS_CC_MAC4_GEPHY3_TX_CLK] = &nss_cc_mac4_gephy3_tx_clk.clkr,
1903 [NSS_CC_MAC4_SRDS1_CH3_XGMII_RX_CLK] = &nss_cc_mac4_srds1_ch3_xgmii_rx_clk.clkr,
1904 [NSS_CC_MAC4_RX_CLK_SRC] = &nss_cc_mac4_rx_clk_src.clkr,
1905 [NSS_CC_MAC4_RX_DIV_CLK_SRC] = &nss_cc_mac4_rx_div_clk_src.clkr,
1906 [NSS_CC_MAC4_SRDS1_CH3_XGMII_TX_DIV_CLK_SRC] =
1907 &nss_cc_mac4_srds1_ch3_xgmii_tx_div_clk_src.clkr,
1908 [NSS_CC_MAC4_SRDS1_CH3_TX_CLK] = &nss_cc_mac4_srds1_ch3_tx_clk.clkr,
1909 [NSS_CC_MAC4_RX_CLK] = &nss_cc_mac4_rx_clk.clkr,
1910 [NSS_CC_MAC4_GEPHY3_RX_CLK] = &nss_cc_mac4_gephy3_rx_clk.clkr,
1911 [NSS_CC_MAC4_SRDS1_CH3_XGMII_TX_CLK] = &nss_cc_mac4_srds1_ch3_xgmii_tx_clk.clkr,
1912 [NSS_CC_MAC5_TX_CLK_SRC] = &nss_cc_mac5_tx_clk_src.clkr,
1913 [NSS_CC_MAC5_TX_DIV_CLK_SRC] = &nss_cc_mac5_tx_div_clk_src.clkr,
1914 [NSS_CC_MAC5_TX_SRDS0_CLK] = &nss_cc_mac5_tx_srds0_clk.clkr,
1915 [NSS_CC_MAC5_TX_CLK] = &nss_cc_mac5_tx_clk.clkr,
1916 [NSS_CC_MAC5_RX_CLK_SRC] = &nss_cc_mac5_rx_clk_src.clkr,
1917 [NSS_CC_MAC5_RX_DIV_CLK_SRC] = &nss_cc_mac5_rx_div_clk_src.clkr,
1918 [NSS_CC_MAC5_RX_SRDS0_CLK] = &nss_cc_mac5_rx_srds0_clk.clkr,
1919 [NSS_CC_MAC5_RX_CLK] = &nss_cc_mac5_rx_clk.clkr,
1920 [NSS_CC_MAC5_TX_SRDS0_CLK_SRC] = &nss_cc_mac5_tx_srds0_clk_src.clkr,
1921 [NSS_CC_MAC5_RX_SRDS0_CLK_SRC] = &nss_cc_mac5_rx_srds0_clk_src.clkr,
1922 [NSS_CC_AHB_CLK_SRC] = &nss_cc_ahb_clk_src.clkr,
1923 [NSS_CC_AHB_CLK] = &nss_cc_ahb_clk.clkr,
1924 [NSS_CC_SEC_CTRL_AHB_CLK] = &nss_cc_sec_ctrl_ahb_clk.clkr,
1925 [NSS_CC_TLMM_CLK] = &nss_cc_tlmm_clk.clkr,
1926 [NSS_CC_TLMM_AHB_CLK] = &nss_cc_tlmm_ahb_clk.clkr,
1927 [NSS_CC_CNOC_AHB_CLK] = &nss_cc_cnoc_ahb_clk.clkr,
1928 [NSS_CC_MDIO_AHB_CLK] = &nss_cc_mdio_ahb_clk.clkr,
1929 [NSS_CC_MDIO_MASTER_AHB_CLK] = &nss_cc_mdio_master_ahb_clk.clkr,
1930 [NSS_CC_SYS_CLK_SRC] = &nss_cc_sys_clk_src.clkr,
1931 [NSS_CC_SRDS0_SYS_CLK] = &nss_cc_srds0_sys_clk.clkr,
1932 [NSS_CC_SRDS1_SYS_CLK] = &nss_cc_srds1_sys_clk.clkr,
1933 [NSS_CC_GEPHY0_SYS_CLK] = &nss_cc_gephy0_sys_clk.clkr,
1934 [NSS_CC_GEPHY1_SYS_CLK] = &nss_cc_gephy1_sys_clk.clkr,
1935 [NSS_CC_GEPHY2_SYS_CLK] = &nss_cc_gephy2_sys_clk.clkr,
1936 [NSS_CC_GEPHY3_SYS_CLK] = &nss_cc_gephy3_sys_clk.clkr,
1939 static const struct qcom_reset_map nss_cc_qca8k_resets[] = {
1940 [NSS_CC_SWITCH_CORE_ARES] = { 0xc, 2 },
1941 [NSS_CC_APB_BRIDGE_ARES] = { 0x10, 2 },
1942 [NSS_CC_MAC0_TX_ARES] = { 0x20, 2 },
1943 [NSS_CC_MAC0_TX_SRDS1_ARES] = { 0x24, 2 },
1944 [NSS_CC_MAC0_RX_ARES] = { 0x34, 2 },
1945 [NSS_CC_MAC0_RX_SRDS1_ARES] = { 0x3c, 2 },
1946 [NSS_CC_MAC1_SRDS1_CH0_RX_ARES] = { 0x50, 2 },
1947 [NSS_CC_MAC1_TX_ARES] = { 0x54, 2 },
1948 [NSS_CC_MAC1_GEPHY0_TX_ARES] = { 0x58, 2 },
1949 [NSS_CC_MAC1_SRDS1_CH0_XGMII_RX_ARES] = { 0x5c, 2 },
1950 [NSS_CC_MAC1_SRDS1_CH0_TX_ARES] = { 0x70, 2 },
1951 [NSS_CC_MAC1_RX_ARES] = { 0x74, 2 },
1952 [NSS_CC_MAC1_GEPHY0_RX_ARES] = { 0x78, 2 },
1953 [NSS_CC_MAC1_SRDS1_CH0_XGMII_TX_ARES] = { 0x7c, 2 },
1954 [NSS_CC_MAC2_SRDS1_CH1_RX_ARES] = { 0x90, 2 },
1955 [NSS_CC_MAC2_TX_ARES] = { 0x94, 2 },
1956 [NSS_CC_MAC2_GEPHY1_TX_ARES] = { 0x98, 2 },
1957 [NSS_CC_MAC2_SRDS1_CH1_XGMII_RX_ARES] = { 0x9c, 2 },
1958 [NSS_CC_MAC2_SRDS1_CH1_TX_ARES] = { 0xb0, 2 },
1959 [NSS_CC_MAC2_RX_ARES] = { 0xb4, 2 },
1960 [NSS_CC_MAC2_GEPHY1_RX_ARES] = { 0xb8, 2 },
1961 [NSS_CC_MAC2_SRDS1_CH1_XGMII_TX_ARES] = { 0xbc, 2 },
1962 [NSS_CC_MAC3_SRDS1_CH2_RX_ARES] = { 0xd0, 2 },
1963 [NSS_CC_MAC3_TX_ARES] = { 0xd4, 2 },
1964 [NSS_CC_MAC3_GEPHY2_TX_ARES] = { 0xd8, 2 },
1965 [NSS_CC_MAC3_SRDS1_CH2_XGMII_RX_ARES] = { 0xdc, 2 },
1966 [NSS_CC_MAC3_SRDS1_CH2_TX_ARES] = { 0xf0, 2 },
1967 [NSS_CC_MAC3_RX_ARES] = { 0xf4, 2 },
1968 [NSS_CC_MAC3_GEPHY2_RX_ARES] = { 0xf8, 2 },
1969 [NSS_CC_MAC3_SRDS1_CH2_XGMII_TX_ARES] = { 0xfc, 2 },
1970 [NSS_CC_MAC4_SRDS1_CH3_RX_ARES] = { 0x110, 2 },
1971 [NSS_CC_MAC4_TX_ARES] = { 0x114, 2 },
1972 [NSS_CC_MAC4_GEPHY3_TX_ARES] = { 0x118, 2 },
1973 [NSS_CC_MAC4_SRDS1_CH3_XGMII_RX_ARES] = { 0x11c, 2 },
1974 [NSS_CC_MAC4_SRDS1_CH3_TX_ARES] = { 0x130, 2 },
1975 [NSS_CC_MAC4_RX_ARES] = { 0x134, 2 },
1976 [NSS_CC_MAC4_GEPHY3_RX_ARES] = { 0x138, 2 },
1977 [NSS_CC_MAC4_SRDS1_CH3_XGMII_TX_ARES] = { 0x13c, 2 },
1978 [NSS_CC_MAC5_TX_ARES] = { 0x14c, 2 },
1979 [NSS_CC_MAC5_TX_SRDS0_ARES] = { 0x150, 2 },
1980 [NSS_CC_MAC5_RX_ARES] = { 0x160, 2 },
1981 [NSS_CC_MAC5_RX_SRDS0_ARES] = { 0x164, 2 },
1982 [NSS_CC_AHB_ARES] = { 0x170, 2 },
1983 [NSS_CC_SEC_CTRL_AHB_ARES] = { 0x174, 2 },
1984 [NSS_CC_TLMM_ARES] = { 0x178, 2 },
1985 [NSS_CC_TLMM_AHB_ARES] = { 0x190, 2 },
1986 [NSS_CC_CNOC_AHB_ARES] = { 0x194, 2 }, /* reset CNOC AHB & APB */
1987 [NSS_CC_MDIO_AHB_ARES] = { 0x198, 2 },
1988 [NSS_CC_MDIO_MASTER_AHB_ARES] = { 0x19c, 2 },
1989 [NSS_CC_SRDS0_SYS_ARES] = { 0x1a8, 2 },
1990 [NSS_CC_SRDS1_SYS_ARES] = { 0x1ac, 2 },
1991 [NSS_CC_GEPHY0_SYS_ARES] = { 0x1b0, 2 },
1992 [NSS_CC_GEPHY1_SYS_ARES] = { 0x1b4, 2 },
1993 [NSS_CC_GEPHY2_SYS_ARES] = { 0x1b8, 2 },
1994 [NSS_CC_GEPHY3_SYS_ARES] = { 0x1bc, 2 },
1995 [NSS_CC_SEC_CTRL_ARES] = { 0x1c8, 2 },
1996 [NSS_CC_SEC_CTRL_SENSE_ARES] = { 0x1d0, 2 },
1997 [NSS_CC_SLEEP_ARES] = { 0x1e0, 2 },
1998 [NSS_CC_DEBUG_ARES] = { 0x1e8, 2 },
1999 [NSS_CC_GEPHY0_ARES] = { 0x304, 0 },
2000 [NSS_CC_GEPHY1_ARES] = { 0x304, 1 },
2001 [NSS_CC_GEPHY2_ARES] = { 0x304, 2 },
2002 [NSS_CC_GEPHY3_ARES] = { 0x304, 3 },
2003 [NSS_CC_DSP_ARES] = { 0x304, 4 },
2004 [NSS_CC_GEPHY_FULL_ARES] = { .reg = 0x304, .bitmask = GENMASK(4, 0) },
2005 [NSS_CC_GLOBAL_ARES] = { 0x308, 0 },
2006 [NSS_CC_XPCS_ARES] = { 0x30c, 0 },
2009 /* For each read/write operation of clock register, there are three MDIO frames
2010 * sent to the device.
2012 * 1. The high address part[23:8] of register is packaged into the first MDIO frame
2013 * for selecting page.
2014 * 2. The low address part[7:0] of register is packaged into the second MDIO frame
2015 * with the low 16bit data to read/write.
2016 * 3. The low address part[7:0] of register is packaged into the last MDIO frame
2017 * with the high 16bit data to read/write.
2019 * The clause22 MDIO frame format used by device is as below.
2020 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2021 * | ST| OP| ADDR | REG | TA| DATA |
2022 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2024 static inline void convert_reg_to_mii_addr(u32 regaddr, u16 *reg, u16 *phy_addr, u16 *page)
2026 *reg = FIELD_GET(QCA8K_CLK_REG_MASK, regaddr);
2027 *phy_addr = FIELD_GET(QCA8K_CLK_PHY_ADDR_MASK, regaddr) | QCA8K_LOW_ADDR_PREFIX;
2028 *page = FIELD_GET(QCA8K_CLK_PAGE_MASK, regaddr);
2031 static int qca8k_mii_read(struct mii_bus *bus, u16 switch_phy_id, u32 reg, u32 *val)
2035 ret = __mdiobus_read(bus, switch_phy_id, reg);
2039 ret = __mdiobus_read(bus, switch_phy_id, (reg | QCA8K_REG_DATA_UPPER_16_BITS));
2041 *val = data | ret << 16;
2045 dev_err_ratelimited(&bus->dev, "fail to read qca8k mii register\n");
2047 return ret < 0 ? ret : 0;
2050 static void qca8k_mii_write(struct mii_bus *bus, u16 switch_phy_id, u32 reg, u32 val)
2054 ret = __mdiobus_write(bus, switch_phy_id, reg, lower_16_bits(val));
2056 ret = __mdiobus_write(bus, switch_phy_id, (reg | QCA8K_REG_DATA_UPPER_16_BITS),
2057 upper_16_bits(val));
2060 dev_err_ratelimited(&bus->dev, "fail to write qca8k mii register\n");
2063 static int qca8k_mii_page_set(struct mii_bus *bus, u16 switch_phy_id, u32 reg, u16 page)
2067 ret = __mdiobus_write(bus, switch_phy_id, reg, page);
2069 dev_err_ratelimited(&bus->dev, "fail to set page\n");
2074 static int qca8k_regmap_read(void *context, unsigned int regaddr, unsigned int *val)
2076 struct mii_bus *bus = context;
2077 u16 reg, phy_addr, page;
2080 regaddr += QCA8K_CLK_REG_BASE;
2081 convert_reg_to_mii_addr(regaddr, ®, &phy_addr, &page);
2083 mutex_lock(&bus->mdio_lock);
2084 ret = qca8k_mii_page_set(bus, QCA8K_HIGH_ADDR_PREFIX, QCA8K_CFG_PAGE_REG, page);
2086 goto qca8k_read_exit;
2088 ret = qca8k_mii_read(bus, phy_addr, reg, val);
2091 mutex_unlock(&bus->mdio_lock);
2095 static int qca8k_regmap_write(void *context, unsigned int regaddr, unsigned int val)
2097 struct mii_bus *bus = context;
2098 u16 reg, phy_addr, page;
2101 regaddr += QCA8K_CLK_REG_BASE;
2102 convert_reg_to_mii_addr(regaddr, ®, &phy_addr, &page);
2104 mutex_lock(&bus->mdio_lock);
2105 ret = qca8k_mii_page_set(bus, QCA8K_HIGH_ADDR_PREFIX, QCA8K_CFG_PAGE_REG, page);
2107 goto qca8k_write_exit;
2109 qca8k_mii_write(bus, phy_addr, reg, val);
2112 mutex_unlock(&bus->mdio_lock);
2116 static int qca8k_regmap_update_bits(void *context, unsigned int regaddr,
2117 unsigned int mask, unsigned int value)
2119 struct mii_bus *bus = context;
2120 u16 reg, phy_addr, page;
2124 regaddr += QCA8K_CLK_REG_BASE;
2125 convert_reg_to_mii_addr(regaddr, ®, &phy_addr, &page);
2127 mutex_lock(&bus->mdio_lock);
2128 ret = qca8k_mii_page_set(bus, QCA8K_HIGH_ADDR_PREFIX, QCA8K_CFG_PAGE_REG, page);
2130 goto qca8k_update_exit;
2132 ret = qca8k_mii_read(bus, phy_addr, reg, &val);
2134 goto qca8k_update_exit;
2138 qca8k_mii_write(bus, phy_addr, reg, val);
2141 mutex_unlock(&bus->mdio_lock);
2145 static const struct regmap_config nss_cc_qca8k_regmap_config = {
2149 .max_register = 0x30c,
2150 .reg_read = qca8k_regmap_read,
2151 .reg_write = qca8k_regmap_write,
2152 .reg_update_bits = qca8k_regmap_update_bits,
2153 .disable_locking = true,
2156 static const struct qcom_cc_desc nss_cc_qca8k_desc = {
2157 .config = &nss_cc_qca8k_regmap_config,
2158 .clks = nss_cc_qca8k_clocks,
2159 .num_clks = ARRAY_SIZE(nss_cc_qca8k_clocks),
2160 .resets = nss_cc_qca8k_resets,
2161 .num_resets = ARRAY_SIZE(nss_cc_qca8k_resets),
2165 * The reference clock of QCA8k NSSCC needs to be enabled to make sure
2166 * the GPIO reset taking effect.
2168 static int nss_cc_qca8k_clock_enable_and_reset(struct device *dev)
2170 struct gpio_desc *gpiod;
2173 clk = devm_clk_get_enabled(dev, NULL);
2175 return PTR_ERR(clk);
2177 gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
2178 if (IS_ERR(gpiod)) {
2179 return PTR_ERR(gpiod);
2182 gpiod_set_value_cansleep(gpiod, 0);
2188 static int nss_cc_qca8k_probe(struct mdio_device *mdiodev)
2190 struct regmap *regmap;
2193 ret = nss_cc_qca8k_clock_enable_and_reset(&mdiodev->dev);
2195 return dev_err_probe(&mdiodev->dev, ret, "Fail to reset NSSCC\n");
2197 regmap = devm_regmap_init(&mdiodev->dev, NULL, mdiodev->bus, nss_cc_qca8k_desc.config);
2199 return dev_err_probe(&mdiodev->dev, PTR_ERR(regmap), "Failed to init regmap\n");
2201 return qcom_cc_really_probe(&mdiodev->dev, &nss_cc_qca8k_desc, regmap);
2204 static const struct of_device_id nss_cc_qca8k_match_table[] = {
2205 { .compatible = "qcom,qca8084-nsscc" },
2208 MODULE_DEVICE_TABLE(of, nss_cc_qca8k_match_table);
2210 static struct mdio_driver nss_cc_qca8k_driver = {
2212 .name = "qcom,qca8k-nsscc",
2213 .of_match_table = nss_cc_qca8k_match_table,
2215 .probe = nss_cc_qca8k_probe,
2218 mdio_module_driver(nss_cc_qca8k_driver);
2220 MODULE_DESCRIPTION("QCOM NSS_CC QCA8K Driver");
2221 MODULE_LICENSE("GPL");