* [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC
@ 2026-11-05 13:07 Luo Jie
2026-11-05 13:07 ` [PATCH 1/5] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Luo Jie @ 2026-11-05 13:07 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei, Luo Jie
The NSS (Network Subsystem) clock controller on the IPQ5210 SoC provides
clocks and resets to the networking related hardware blocks such as the
Packet Process Engine (PPE), the six ports, XGMAC PTP reference clocks,
PON, EIP crypto engine, and the SoC-integrated EPHY (2.5G Ethernet PHY).
Its parent clocks are sourced from the GCC and CMN PLL blocks.
The NSS NoC clocks are also enabled to use the icc-clk framework, enabling
the creation of interconnect paths for the network subsystem's connections
with these NoCs.
The patch series is organised as follows:
1/5 dt-bindings + clock/reset/interconnect ID headers for IPQ5210 NSSCC
2/5 NSS clock controller driver for IPQ5210
3/5 DTS: add CMN PLL node (carried from the CMN PLL series, see below)
4/5 DTS: switch xo_board to fixed-factor clock (carried from the CMN PLL series)
5/5 DTS: add NSS clock controller node in ipq5210.dtsi
Dependency:
The NSSCC DTS node (patch 5) consumes CMN PLL output clocks, so it depends
on the IPQ5210 CMN PLL DTS node. The CMN PLL bindings and driver have been
merged in v7.4-rc1, but its DTS patches are still under review in:
https://lore.kernel.org/all/20260906-qcom_ipq5210_cmnpll-v4-0-aec5ed642f4f@oss.qualcomm.com/
Patches 3 and 4 are included unchanged from that series (v4 11/12 and
12/12) so this series builds and passes dtbs_check on its own. If the
CMN PLL series lands first, patches 3 and 4 can be dropped. Patches 1-2
(clk) have no dependency and can be applied independently.
---
Luo Jie (5):
dt-bindings: clock: qcom: Add NSS clock controller for IPQ5210 SoC
clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
arm64: dts: qcom: ipq5210: Add CMN PLL device node
arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock
arm64: dts: qcom: ipq5210: Add NSS clock controller node
.../bindings/clock/qcom,ipq9574-nsscc.yaml | 47 +-
arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts | 22 +-
arch/arm64/boot/dts/qcom/ipq5210.dtsi | 67 +-
drivers/clk/qcom/Kconfig | 12 +
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/nsscc-ipq5210.c | 2203 ++++++++++++++++++++
include/dt-bindings/clock/qcom,ipq5210-nsscc.h | 106 +
include/dt-bindings/interconnect/qcom,ipq5210.h | 18 +
include/dt-bindings/reset/qcom,ipq5210-nsscc.h | 60 +
9 files changed, 2531 insertions(+), 5 deletions(-)
---
base-commit: 8b7179210b22f8e48a82c5ceacb9d56a9c4cfec4
change-id: 20261104-qcom_ipq5210_nsscc-fe4b2c8d4d18
Best regards,
--
Luo Jie <jie.luo@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/5] dt-bindings: clock: qcom: Add NSS clock controller for IPQ5210 SoC
2026-11-05 13:07 [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
@ 2026-11-05 13:07 ` Luo Jie
2026-11-05 13:07 ` [PATCH 2/5] clk: qcom: Add NSS clock controller driver " Luo Jie
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Luo Jie @ 2026-11-05 13:07 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei, Luo Jie
NSS clock controller provides the clocks and resets to the networking
blocks such as PPE (Packet Process Engine), UNIPHY (PCS) and EPHY on
IPQ5210 devices.
Add support for the compatible string "qcom,ipq5210-nsscc" based on the
existing IPQ9574/IPQ5424 NSS clock controller Device Tree binding. IPQ5210
additionally exposes a pair of EPHY-RAW Rx/Tx clock sources used to derive
the clocks for its integrated 2.5G Ethernet PHY, so extend the clocks and
clock-names lists with "ephy_rx" and "ephy_tx".
Also add master/slave ids for IPQ5210 networking interfaces, which are used
by the nsscc-ipq5210 driver for providing interconnect services using the
icc-clk framework.
Signed-off-by: Luo Jie <jie.luo@oss.qualcomm.com>
---
.../bindings/clock/qcom,ipq9574-nsscc.yaml | 47 ++++++++-
include/dt-bindings/clock/qcom,ipq5210-nsscc.h | 106 +++++++++++++++++++++
include/dt-bindings/interconnect/qcom,ipq5210.h | 18 ++++
include/dt-bindings/reset/qcom,ipq5210-nsscc.h | 60 ++++++++++++
4 files changed, 228 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq9574-nsscc.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq9574-nsscc.yaml
index a35bbc7b1924..dc7d90a99dc7 100644
--- a/Documentation/devicetree/bindings/clock/qcom,ipq9574-nsscc.yaml
+++ b/Documentation/devicetree/bindings/clock/qcom,ipq9574-nsscc.yaml
@@ -4,24 +4,28 @@
$id: http://devicetree.org/schemas/clock/qcom,ipq9574-nsscc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
-title: Qualcomm Networking Sub System Clock & Reset Controller on IPQ9574 and IPQ5424
+title: Qualcomm Networking Sub System Clock & Reset Controller on IPQ SoCs
maintainers:
- Bjorn Andersson <andersson@kernel.org>
+ - Luo Jie <jie.luo@oss.qualcomm.com>
description: |
Qualcomm networking sub system clock control module provides the clocks,
- resets on IPQ9574 and IPQ5424
+ resets on IPQ9574, IPQ5424 and IPQ5210
See also:
+ include/dt-bindings/clock/qcom,ipq5210-nsscc.h
include/dt-bindings/clock/qcom,ipq5424-nsscc.h
include/dt-bindings/clock/qcom,ipq9574-nsscc.h
+ include/dt-bindings/reset/qcom,ipq5210-nsscc.h
include/dt-bindings/reset/qcom,ipq5424-nsscc.h
include/dt-bindings/reset/qcom,ipq9574-nsscc.h
properties:
compatible:
enum:
+ - qcom,ipq5210-nsscc
- qcom,ipq5424-nsscc
- qcom,ipq9574-nsscc
@@ -42,6 +46,9 @@ properties:
- description: Uniphy2 NSS Rx clock source
- description: Uniphy2 NSS Tx clock source
- description: GCC NSSCC clock source
+ - description: CMN_PLL EPHY-RAW Rx clock source
+ - description: CMN_PLL EPHY-RAW Tx clock source
+ minItems: 11
'#interconnect-cells':
const: 1
@@ -63,6 +70,9 @@ properties:
- const: uniphy2_rx
- const: uniphy2_tx
- const: bus
+ - const: ephy_rx
+ - const: ephy_tx
+ minItems: 11
required:
- compatible
@@ -77,6 +87,8 @@ allOf:
const: qcom,ipq9574-nsscc
then:
properties:
+ clocks:
+ maxItems: 11
clock-names:
items:
- const: xo
@@ -90,8 +102,35 @@ allOf:
- const: uniphy2_rx
- const: uniphy2_tx
- const: bus
- else:
+ - if:
+ properties:
+ compatible:
+ const: qcom,ipq5424-nsscc
+ then:
+ properties:
+ clocks:
+ maxItems: 11
+ clock-names:
+ items:
+ - const: xo
+ - const: nss
+ - const: ppe
+ - const: gpll0_out
+ - const: uniphy0_rx
+ - const: uniphy0_tx
+ - const: uniphy1_rx
+ - const: uniphy1_tx
+ - const: uniphy2_rx
+ - const: uniphy2_tx
+ - const: bus
+ - if:
+ properties:
+ compatible:
+ const: qcom,ipq5210-nsscc
+ then:
properties:
+ clocks:
+ minItems: 13
clock-names:
items:
- const: xo
@@ -105,6 +144,8 @@ allOf:
- const: uniphy2_rx
- const: uniphy2_tx
- const: bus
+ - const: ephy_rx
+ - const: ephy_tx
unevaluatedProperties: false
diff --git a/include/dt-bindings/clock/qcom,ipq5210-nsscc.h b/include/dt-bindings/clock/qcom,ipq5210-nsscc.h
new file mode 100644
index 000000000000..62ead8d9b076
--- /dev/null
+++ b/include/dt-bindings/clock/qcom,ipq5210-nsscc.h
@@ -0,0 +1,106 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_QCOM_IPQ5210_NSSCC_H
+#define _DT_BINDINGS_CLOCK_QCOM_IPQ5210_NSSCC_H
+
+#define NSS_CC_PPE_CLK_SRC 0
+#define NSS_CC_PPE_SWITCH_IPE_CLK 1
+#define NSS_CC_PPE_SWITCH_BTQ_CLK 2
+#define NSS_CC_PPE_SWITCH_CLK 3
+#define NSS_CC_PPE_SWITCH_CFG_CLK 4
+#define NSS_CC_PPE_EDMA_CLK 5
+#define NSS_CC_PPE_EDMA_CFG_CLK 6
+#define NSS_CC_PORT1_MAC_CLK 7
+#define NSS_CC_PORT1_RX_CLK 8
+#define NSS_CC_PORT1_RX_CLK_SRC 9
+#define NSS_CC_PORT1_RX_DIV_CLK_SRC 10
+#define NSS_CC_PORT1_TX_CLK 11
+#define NSS_CC_PORT1_TX_CLK_SRC 12
+#define NSS_CC_PORT1_TX_DIV_CLK_SRC 13
+#define NSS_CC_PORT2_MAC_CLK 14
+#define NSS_CC_PORT2_RX_CLK 15
+#define NSS_CC_PORT2_RX_CLK_SRC 16
+#define NSS_CC_PORT2_RX_DIV_CLK_SRC 17
+#define NSS_CC_PORT2_TX_CLK 18
+#define NSS_CC_PORT2_TX_CLK_SRC 19
+#define NSS_CC_PORT2_TX_DIV_CLK_SRC 20
+#define NSS_CC_PORT3_MAC_CLK 21
+#define NSS_CC_PORT3_RX_CLK 22
+#define NSS_CC_PORT3_RX_CLK_SRC 23
+#define NSS_CC_PORT3_RX_DIV_CLK_SRC 24
+#define NSS_CC_PORT3_TX_CLK 25
+#define NSS_CC_PORT3_TX_CLK_SRC 26
+#define NSS_CC_PORT3_TX_DIV_CLK_SRC 27
+#define NSS_CC_PORT4_MAC_CLK 28
+#define NSS_CC_PORT4_RX_CLK 29
+#define NSS_CC_PORT4_RX_CLK_SRC 30
+#define NSS_CC_PORT4_RX_DIV_CLK_SRC 31
+#define NSS_CC_PORT4_TX_CLK 32
+#define NSS_CC_PORT4_TX_CLK_SRC 33
+#define NSS_CC_PORT4_TX_DIV_CLK_SRC 34
+#define NSS_CC_PORT5_MAC_CLK 35
+#define NSS_CC_PORT5_RX_CLK 36
+#define NSS_CC_PORT5_RX_CLK_SRC 37
+#define NSS_CC_PORT5_RX_DIV_CLK_SRC 38
+#define NSS_CC_PORT5_TX_CLK 39
+#define NSS_CC_PORT5_TX_CLK_SRC 40
+#define NSS_CC_PORT5_TX_DIV_CLK_SRC 41
+#define NSS_CC_PORT6_MAC_CLK 42
+#define NSS_CC_PORT6_RX_CLK 43
+#define NSS_CC_PORT6_RX_CLK_SRC 44
+#define NSS_CC_PORT6_RX_DIV_CLK_SRC 45
+#define NSS_CC_PORT6_TX_CLK 46
+#define NSS_CC_PORT6_TX_CLK_SRC 47
+#define NSS_CC_PORT6_TX_DIV_CLK_SRC 48
+#define NSS_CC_NSSNOC_PPE_CLK 49
+#define NSS_CC_NSSNOC_PPE_CFG_CLK 50
+#define NSS_CC_UNIPHY_PORT1_RX_CLK 51
+#define NSS_CC_UNIPHY_PORT1_TX_CLK 52
+#define NSS_CC_UNIPHY_PORT2_RX_CLK 53
+#define NSS_CC_UNIPHY_PORT2_TX_CLK 54
+#define NSS_CC_UNIPHY_PORT3_RX_CLK 55
+#define NSS_CC_UNIPHY_PORT3_TX_CLK 56
+#define NSS_CC_UNIPHY_PORT4_RX_CLK 57
+#define NSS_CC_UNIPHY_PORT4_TX_CLK 58
+#define NSS_CC_UNIPHY_PORT5_RX_CLK 59
+#define NSS_CC_UNIPHY_PORT5_TX_CLK 60
+#define NSS_CC_UNIPHY_PORT6_RX_CLK 61
+#define NSS_CC_UNIPHY_PORT6_TX_CLK 62
+#define NSS_CC_XGMAC0_PTP_REF_CLK 63
+#define NSS_CC_XGMAC0_PTP_REF_DIV_CLK_SRC 64
+#define NSS_CC_XGMAC1_PTP_REF_CLK 65
+#define NSS_CC_XGMAC1_PTP_REF_DIV_CLK_SRC 66
+#define NSS_CC_XGMAC2_PTP_REF_CLK 67
+#define NSS_CC_XGMAC2_PTP_REF_DIV_CLK_SRC 68
+#define NSS_CC_PON_CLK 69
+#define NSS_CC_EPHY_RX_CLK_SRC 70
+#define NSS_CC_EPHY_RX_CLK 71
+#define NSS_CC_EPHY_TX_CLK_SRC 72
+#define NSS_CC_EPHY_TX_CLK 73
+#define NSS_CC_UNIPHY_PORT1_RX_DIV4_CLK_SRC 74
+#define NSS_CC_UNIPHY_PORT1_TX_DIV4_CLK_SRC 75
+#define NSS_CC_UNIPHY_PORT2_RX_DIV4_CLK_SRC 76
+#define NSS_CC_UNIPHY_PORT2_TX_DIV4_CLK_SRC 77
+#define NSS_CC_UNIPHY_PORT3_RX_DIV4_CLK_SRC 78
+#define NSS_CC_UNIPHY_PORT3_TX_DIV4_CLK_SRC 79
+#define NSS_CC_UNIPHY_PORT4_RX_DIV4_CLK_SRC 80
+#define NSS_CC_UNIPHY_PORT4_TX_DIV4_CLK_SRC 81
+#define NSS_CC_UNIPHY_PORT1_RX_DIV4_CLK 82
+#define NSS_CC_UNIPHY_PORT1_TX_DIV4_CLK 83
+#define NSS_CC_UNIPHY_PORT2_RX_DIV4_CLK 84
+#define NSS_CC_UNIPHY_PORT2_TX_DIV4_CLK 85
+#define NSS_CC_UNIPHY_PORT3_RX_DIV4_CLK 86
+#define NSS_CC_UNIPHY_PORT3_TX_DIV4_CLK 87
+#define NSS_CC_UNIPHY_PORT4_RX_DIV4_CLK 88
+#define NSS_CC_UNIPHY_PORT4_TX_DIV4_CLK 89
+#define NSS_CC_EIP_BFDCD_CLK_SRC 90
+#define NSS_CC_EIP_CLK 91
+#define NSS_CC_NSSNOC_EIP_CLK 92
+#define NSS_CC_CFG_CLK_SRC 93
+#define NSS_CC_NSS_CSR_CLK 94
+#define NSS_CC_NSSNOC_NSS_CSR_CLK 95
+
+#endif
diff --git a/include/dt-bindings/interconnect/qcom,ipq5210.h b/include/dt-bindings/interconnect/qcom,ipq5210.h
new file mode 100644
index 000000000000..44f8d35a372a
--- /dev/null
+++ b/include/dt-bindings/interconnect/qcom,ipq5210.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef INTERCONNECT_QCOM_IPQ5210_H
+#define INTERCONNECT_QCOM_IPQ5210_H
+
+#define MASTER_NSSNOC_PPE 0
+#define SLAVE_NSSNOC_PPE 1
+#define MASTER_NSSNOC_PPE_CFG 2
+#define SLAVE_NSSNOC_PPE_CFG 3
+#define MASTER_NSSNOC_NSS_CSR 4
+#define SLAVE_NSSNOC_NSS_CSR 5
+#define MASTER_NSSNOC_EIP 6
+#define SLAVE_NSSNOC_EIP 7
+
+#endif /* INTERCONNECT_QCOM_IPQ5210_H */
diff --git a/include/dt-bindings/reset/qcom,ipq5210-nsscc.h b/include/dt-bindings/reset/qcom,ipq5210-nsscc.h
new file mode 100644
index 000000000000..0616a3623897
--- /dev/null
+++ b/include/dt-bindings/reset/qcom,ipq5210-nsscc.h
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef _DT_BINDINGS_RESET_QCOM_IPQ5210_NSSCC_H
+#define _DT_BINDINGS_RESET_QCOM_IPQ5210_NSSCC_H
+
+#define NSS_CC_PPE_BCR 0
+#define NSS_CC_PPE_SWITCH_IPE_CLK_ARES 1
+#define NSS_CC_PPE_SWITCH_BTQ_CLK_ARES 2
+#define NSS_CC_PPE_SWITCH_CLK_ARES 3
+#define NSS_CC_PPE_SWITCH_CFG_CLK_ARES 4
+#define NSS_CC_PPE_EDMA_CLK_ARES 5
+#define NSS_CC_PPE_EDMA_CFG_CLK_ARES 6
+#define NSS_CC_PORT1_MAC_CLK_ARES 7
+#define NSS_CC_PORT2_MAC_CLK_ARES 8
+#define NSS_CC_PORT3_MAC_CLK_ARES 9
+#define NSS_CC_PORT4_MAC_CLK_ARES 10
+#define NSS_CC_PORT5_MAC_CLK_ARES 11
+#define NSS_CC_PORT6_MAC_CLK_ARES 12
+#define NSS_CC_PON_CLK_ARES 13
+#define NSS_CC_XGMAC0_PTP_REF_CLK_ARES 14
+#define NSS_CC_XGMAC1_PTP_REF_CLK_ARES 15
+#define NSS_CC_XGMAC2_PTP_REF_CLK_ARES 16
+#define NSS_CC_NSSNOC_PPE_CLK_ARES 17
+#define NSS_CC_NSSNOC_PPE_CFG_CLK_ARES 18
+#define NSS_CC_PORT1_RX_CLK_ARES 19
+#define NSS_CC_PORT1_TX_CLK_ARES 20
+#define NSS_CC_PORT2_RX_CLK_ARES 21
+#define NSS_CC_PORT2_TX_CLK_ARES 22
+#define NSS_CC_PORT3_RX_CLK_ARES 23
+#define NSS_CC_PORT3_TX_CLK_ARES 24
+#define NSS_CC_PORT4_RX_CLK_ARES 25
+#define NSS_CC_PORT4_TX_CLK_ARES 26
+#define NSS_CC_PORT5_RX_CLK_ARES 27
+#define NSS_CC_PORT5_TX_CLK_ARES 28
+#define NSS_CC_PORT6_RX_CLK_ARES 29
+#define NSS_CC_PORT6_TX_CLK_ARES 30
+#define NSS_CC_EPHY_RX_CLK_ARES 31
+#define NSS_CC_EPHY_TX_CLK_ARES 32
+#define NSS_CC_UNIPHY_PORT1_RX_CLK_ARES 33
+#define NSS_CC_UNIPHY_PORT1_TX_CLK_ARES 34
+#define NSS_CC_UNIPHY_PORT2_RX_CLK_ARES 35
+#define NSS_CC_UNIPHY_PORT2_TX_CLK_ARES 36
+#define NSS_CC_UNIPHY_PORT3_RX_CLK_ARES 37
+#define NSS_CC_UNIPHY_PORT3_TX_CLK_ARES 38
+#define NSS_CC_UNIPHY_PORT4_RX_CLK_ARES 39
+#define NSS_CC_UNIPHY_PORT4_TX_CLK_ARES 40
+#define NSS_CC_UNIPHY_PORT5_RX_CLK_ARES 41
+#define NSS_CC_UNIPHY_PORT5_TX_CLK_ARES 42
+#define NSS_CC_UNIPHY_PORT6_RX_CLK_ARES 43
+#define NSS_CC_UNIPHY_PORT6_TX_CLK_ARES 44
+#define NSS_CC_EIP_CLK_ARES 45
+#define NSS_CC_NSSNOC_EIP_CLK_ARES 46
+#define NSS_CC_NSS_CSR_CLK_ARES 47
+#define NSS_CC_NSSNOC_NSS_CSR_CLK_ARES 48
+#define NSS_CC_DEBUG_CLK_ARES 49
+
+#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/5] clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
2026-11-05 13:07 [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
2026-11-05 13:07 ` [PATCH 1/5] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
@ 2026-11-05 13:07 ` Luo Jie
2026-11-06 13:08 ` sashiko-bot
2026-11-05 13:07 ` [PATCH 3/5] arm64: dts: qcom: ipq5210: Add CMN PLL device node Luo Jie
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Luo Jie @ 2026-11-05 13:07 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei, Luo Jie
The NSS (Network SubSystem) clock controller provides the clocks and resets
to the networking blocks such as PPE (Packet Process Engine), UNIPHY (PCS)
and the integrated Ethernet PHY on IPQ5210 devices.
The icc-clk framework is used to enable NoC related clocks to create paths
so that the networking blocks such as PPE can connect to these NoCs.
Signed-off-by: Luo Jie <jie.luo@oss.qualcomm.com>
---
drivers/clk/qcom/Kconfig | 12 +
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/nsscc-ipq5210.c | 2203 ++++++++++++++++++++++++++++++++++++++
3 files changed, 2216 insertions(+)
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
index 27d0ab24d50a..73382081c310 100644
--- a/drivers/clk/qcom/Kconfig
+++ b/drivers/clk/qcom/Kconfig
@@ -715,6 +715,18 @@ config IPQ_GCC_9650
i2c, USB, SD/eMMC, etc. Select this for the root clock
of ipq9650.
+config IPQ_NSSCC_5210
+ tristate "IPQ5210 NSS Clock Controller"
+ depends on ARM64 || COMPILE_TEST
+ depends on IPQ_GCC_5210
+ default m if ARCH_QCOM
+ help
+ Support for NSS clock controller on ipq5210 devices.
+ NSSCC receives the clock sources from GCC and CMN PLL.
+ It in turn supplies the clocks and resets to the networking hardware.
+ Say Y or M if you want to enable networking function on the
+ IPQ5210 devices.
+
config IPQ_NSSCC_5424
tristate "IPQ5424 NSS Clock Controller"
depends on ARM64 || COMPILE_TEST
diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
index 6affb5073f26..2b65ed4c35d6 100644
--- a/drivers/clk/qcom/Makefile
+++ b/drivers/clk/qcom/Makefile
@@ -79,6 +79,7 @@ obj-$(CONFIG_IPQ_GCC_806X) += gcc-ipq806x.o
obj-$(CONFIG_IPQ_GCC_8074) += gcc-ipq8074.o
obj-$(CONFIG_IPQ_GCC_9574) += gcc-ipq9574.o
obj-$(CONFIG_IPQ_GCC_9650) += gcc-ipq9650.o
+obj-$(CONFIG_IPQ_NSSCC_5210) += nsscc-ipq5210.o
obj-$(CONFIG_IPQ_NSSCC_5424) += nsscc-ipq5424.o
obj-$(CONFIG_IPQ_NSSCC_9574) += nsscc-ipq9574.o
obj-$(CONFIG_IPQ_LCC_806X) += lcc-ipq806x.o
diff --git a/drivers/clk/qcom/nsscc-ipq5210.c b/drivers/clk/qcom/nsscc-ipq5210.c
new file mode 100644
index 000000000000..ca749e0af323
--- /dev/null
+++ b/drivers/clk/qcom/nsscc-ipq5210.c
@@ -0,0 +1,2203 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/interconnect-provider.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm_clock.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,ipq5210-nsscc.h>
+#include <dt-bindings/interconnect/qcom,ipq5210.h>
+#include <dt-bindings/reset/qcom,ipq5210-nsscc.h>
+
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "clk-regmap-divider.h"
+#include "clk-regmap-mux.h"
+#include "common.h"
+#include "reset.h"
+
+/* Need to match the order of clocks in DT binding */
+enum {
+ DT_XO,
+ DT_CMN_PLL_NSS_CLK_375M,
+ DT_CMN_PLL_NSS_CLK_429M,
+ DT_GCC_GPLL0,
+ DT_UNIPHY0_NSS_RX_CLK,
+ DT_UNIPHY0_NSS_TX_CLK,
+ DT_UNIPHY1_NSS_RX_CLK,
+ DT_UNIPHY1_NSS_TX_CLK,
+ DT_UNIPHY2_NSS_RX_CLK,
+ DT_UNIPHY2_NSS_TX_CLK,
+ DT_GCC_NSSCC_CLK,
+ DT_EPHY_RX_CLK,
+ DT_EPHY_TX_CLK,
+};
+
+enum {
+ P_XO,
+ P_CMN_PLL_NSS_CLK_375M,
+ P_CMN_PLL_NSS_CLK_429M,
+ P_GCC_GPLL0,
+ P_UNIPHY0_NSS_RX_CLK,
+ P_UNIPHY0_NSS_TX_CLK,
+ P_UNIPHY1_NSS_RX_CLK,
+ P_UNIPHY1_NSS_TX_CLK,
+ P_UNIPHY2_NSS_RX_CLK,
+ P_UNIPHY2_NSS_TX_CLK,
+ P_EPHY_RX_CLK,
+ P_EPHY_TX_CLK,
+};
+
+static const struct parent_map nss_cc_parent_map_ppe_cfg[] = {
+ { P_XO, 0 },
+ { P_GCC_GPLL0, 2 },
+};
+
+static const struct parent_map nss_cc_parent_map_ppe[] = {
+ { P_XO, 0 },
+ { P_CMN_PLL_NSS_CLK_429M, 6 },
+};
+
+static const struct clk_parent_data nss_cc_ppe_parent_data_ppe_cfg[] = {
+ { .index = DT_XO },
+ { .index = DT_GCC_GPLL0 },
+};
+
+static const struct clk_parent_data nss_cc_ppe_parent_data_ppe[] = {
+ { .index = DT_XO },
+ { .index = DT_CMN_PLL_NSS_CLK_429M },
+};
+
+static const struct clk_parent_data nss_cc_ppe_parent_data_eip[] = {
+ { .index = DT_XO },
+ { .index = DT_CMN_PLL_NSS_CLK_375M },
+};
+
+static const struct parent_map nss_cc_parent_map_port1_3_rx[] = {
+ { P_XO, 0 },
+ { P_UNIPHY0_NSS_RX_CLK, 3 },
+};
+
+static const struct parent_map nss_cc_parent_map_port1_3_tx[] = {
+ { P_XO, 0 },
+ { P_UNIPHY0_NSS_TX_CLK, 4 },
+};
+
+static const struct parent_map nss_cc_parent_map_port4_rx[] = {
+ { P_XO, 0 },
+ { P_EPHY_RX_CLK, 1 },
+ { P_UNIPHY0_NSS_RX_CLK, 3 },
+};
+
+static const struct parent_map nss_cc_parent_map_port4_tx[] = {
+ { P_XO, 0 },
+ { P_UNIPHY0_NSS_TX_CLK, 4 },
+ { P_EPHY_TX_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_xo_ephy_uniphy0_rx[] = {
+ { .index = DT_XO },
+ { .index = DT_EPHY_RX_CLK },
+ { .index = DT_UNIPHY0_NSS_RX_CLK },
+};
+
+static const struct clk_parent_data gcc_xo_ephy_uniphy0_tx[] = {
+ { .index = DT_XO },
+ { .index = DT_UNIPHY0_NSS_TX_CLK },
+ { .index = DT_EPHY_TX_CLK },
+};
+
+static const struct clk_parent_data gcc_xo_uniphy0_gcc_rx[] = {
+ { .index = DT_XO },
+ { .index = DT_UNIPHY0_NSS_RX_CLK },
+};
+
+static const struct clk_parent_data gcc_xo_uniphy0_gcc_tx[] = {
+ { .index = DT_XO },
+ { .index = DT_UNIPHY0_NSS_TX_CLK },
+};
+
+static const struct parent_map nss_cc_parent_map_port5_rx[] = {
+ { P_XO, 0 },
+ { P_EPHY_RX_CLK, 1 },
+ { P_UNIPHY1_NSS_RX_CLK, 3 },
+};
+
+static const struct parent_map nss_cc_parent_map_port5_tx[] = {
+ { P_XO, 0 },
+ { P_UNIPHY1_NSS_TX_CLK, 4 },
+ { P_EPHY_TX_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_xo_ephy_uniphy1_rx[] = {
+ { .index = DT_XO },
+ { .index = DT_EPHY_RX_CLK },
+ { .index = DT_UNIPHY1_NSS_RX_CLK },
+};
+
+static const struct clk_parent_data gcc_xo_ephy_uniphy1_tx[] = {
+ { .index = DT_XO },
+ { .index = DT_UNIPHY1_NSS_TX_CLK },
+ { .index = DT_EPHY_TX_CLK },
+};
+
+static const struct parent_map nss_cc_parent_map_port6_rx[] = {
+ { P_XO, 0 },
+ { P_UNIPHY2_NSS_RX_CLK, 3 },
+};
+
+static const struct parent_map nss_cc_parent_map_port6_tx[] = {
+ { P_XO, 0 },
+ { P_UNIPHY2_NSS_TX_CLK, 4 },
+};
+
+static const struct clk_parent_data gcc_xo_uniphy2_rx[] = {
+ { .index = DT_XO },
+ { .index = DT_UNIPHY2_NSS_RX_CLK },
+};
+
+static const struct clk_parent_data gcc_xo_uniphy2_tx[] = {
+ { .index = DT_XO },
+ { .index = DT_UNIPHY2_NSS_TX_CLK },
+};
+
+static const struct freq_tbl ftbl_nss_cc_ppe_clk_src[] = {
+ F(24000000, P_XO, 1, 0, 0),
+ F(429000000, P_CMN_PLL_NSS_CLK_429M, 1, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_ppe_clk_src = {
+ .cmd_rcgr = 0x3ec,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_ppe,
+ .freq_tbl = ftbl_nss_cc_ppe_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_clk_src",
+ .parent_data = nss_cc_ppe_parent_data_ppe,
+ .num_parents = ARRAY_SIZE(nss_cc_ppe_parent_data_ppe),
+ .ops = &clk_rcg2_ops,
+ },
+};
+
+/*
+ * The XGMAC PTP reference clock rate needs to be configurable, so the
+ * PTP reference dividers use the writable divider ops.
+ */
+static struct clk_regmap_div nss_cc_xgmac0_ptp_ref_div_clk_src = {
+ .reg = 0x3f4,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_xgmac0_ptp_ref_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_xgmac1_ptp_ref_div_clk_src = {
+ .reg = 0x3f8,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_xgmac1_ptp_ref_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_xgmac2_ptp_ref_div_clk_src = {
+ .reg = 0x3fc,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_xgmac2_ptp_ref_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_branch nss_cc_ppe_switch_ipe_clk = {
+ .halt_reg = 0x424,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x424,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_switch_ipe_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ppe_switch_btq_clk = {
+ .halt_reg = 0x42c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x42c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_switch_btq_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ppe_switch_clk = {
+ .halt_reg = 0x434,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x434,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_switch_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ppe_switch_cfg_clk = {
+ .halt_reg = 0x43c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x43c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_switch_cfg_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ppe_edma_clk = {
+ .halt_reg = 0x440,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x440,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_edma_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ppe_edma_cfg_clk = {
+ .halt_reg = 0x448,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x448,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ppe_edma_cfg_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port1_mac_clk = {
+ .halt_reg = 0x44c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x44c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port1_mac_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port2_mac_clk = {
+ .halt_reg = 0x454,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x454,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port2_mac_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port3_mac_clk = {
+ .halt_reg = 0x45c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x45c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port3_mac_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port4_mac_clk = {
+ .halt_reg = 0x464,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x464,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port4_mac_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port5_mac_clk = {
+ .halt_reg = 0x46c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x46c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port5_mac_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port6_mac_clk = {
+ .halt_reg = 0x474,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x474,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port6_mac_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_pon_clk = {
+ .halt_reg = 0x47c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x47c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_pon_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_xgmac0_ptp_ref_clk = {
+ .halt_reg = 0x488,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x488,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_xgmac0_ptp_ref_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_xgmac0_ptp_ref_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_xgmac1_ptp_ref_clk = {
+ .halt_reg = 0x48c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x48c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_xgmac1_ptp_ref_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_xgmac1_ptp_ref_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_xgmac2_ptp_ref_clk = {
+ .halt_reg = 0x490,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x490,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_xgmac2_ptp_ref_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_xgmac2_ptp_ref_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_nssnoc_ppe_clk = {
+ .halt_reg = 0x4a4,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x4a4,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_nssnoc_ppe_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_nssnoc_ppe_cfg_clk = {
+ .halt_reg = 0x4a8,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x4a8,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_nssnoc_ppe_cfg_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ppe_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port1_rx_clk_src_25[] = {
+ C(P_UNIPHY0_NSS_RX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY0_NSS_RX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port1_rx_clk_src_125[] = {
+ C(P_UNIPHY0_NSS_RX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port1_3_rx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port1_rx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port1_rx_clk_src_125),
+ FMS(156250000, P_UNIPHY0_NSS_RX_CLK, 2, 0, 0),
+ FMS(312500000, P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
+ FMS(378788000, P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port1_rx_clk_src = {
+ .cmd_rcgr = 0x4b4,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port1_3_rx,
+ .freq_multi_tbl = ftbl_nss_cc_port1_3_rx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port1_rx_clk_src",
+ .parent_data = gcc_xo_uniphy0_gcc_rx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy0_gcc_rx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port1_rx_div_clk_src = {
+ .reg = 0x4bc,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port1_rx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_rx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port1_tx_clk_src_25[] = {
+ C(P_UNIPHY0_NSS_TX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY0_NSS_TX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port1_tx_clk_src_125[] = {
+ C(P_UNIPHY0_NSS_TX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port1_3_tx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port1_tx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port1_tx_clk_src_125),
+ FMS(156250000, P_UNIPHY0_NSS_TX_CLK, 2, 0, 0),
+ FMS(312500000, P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
+ FMS(378788000, P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port1_tx_clk_src = {
+ .cmd_rcgr = 0x4c0,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port1_3_tx,
+ .freq_multi_tbl = ftbl_nss_cc_port1_3_tx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port1_tx_clk_src",
+ .parent_data = gcc_xo_uniphy0_gcc_tx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy0_gcc_tx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port1_tx_div_clk_src = {
+ .reg = 0x4c8,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port1_tx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_tx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_rcg2 nss_cc_port2_rx_clk_src = {
+ .cmd_rcgr = 0x4cc,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port1_3_rx,
+ .freq_multi_tbl = ftbl_nss_cc_port1_3_rx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port2_rx_clk_src",
+ .parent_data = gcc_xo_uniphy0_gcc_rx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy0_gcc_rx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port2_rx_div_clk_src = {
+ .reg = 0x4d4,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port2_rx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_rx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_rcg2 nss_cc_port2_tx_clk_src = {
+ .cmd_rcgr = 0x4d8,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port1_3_tx,
+ .freq_multi_tbl = ftbl_nss_cc_port1_3_tx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port2_tx_clk_src",
+ .parent_data = gcc_xo_uniphy0_gcc_tx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy0_gcc_tx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port2_tx_div_clk_src = {
+ .reg = 0x4e0,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port2_tx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_tx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_rcg2 nss_cc_port3_rx_clk_src = {
+ .cmd_rcgr = 0x4e4,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port1_3_rx,
+ .freq_multi_tbl = ftbl_nss_cc_port1_3_rx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port3_rx_clk_src",
+ .parent_data = gcc_xo_uniphy0_gcc_rx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy0_gcc_rx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port3_rx_div_clk_src = {
+ .reg = 0x4ec,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port3_rx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_rx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_rcg2 nss_cc_port3_tx_clk_src = {
+ .cmd_rcgr = 0x4f0,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port1_3_tx,
+ .freq_multi_tbl = ftbl_nss_cc_port1_3_tx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port3_tx_clk_src",
+ .parent_data = gcc_xo_uniphy0_gcc_tx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy0_gcc_tx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port3_tx_div_clk_src = {
+ .reg = 0x4f8,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port3_tx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_tx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port4_rx_clk_src_25[] = {
+ C(P_UNIPHY0_NSS_RX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY0_NSS_RX_CLK, 5, 0, 0),
+ C(P_EPHY_RX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port4_rx_clk_src_125[] = {
+ C(P_UNIPHY0_NSS_RX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
+ C(P_EPHY_RX_CLK, 1, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port4_rx_clk_src_312p5[] = {
+ C(P_UNIPHY0_NSS_RX_CLK, 1, 0, 0),
+ C(P_EPHY_RX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port4_rx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port4_rx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port4_rx_clk_src_125),
+ FMS(156250000, P_UNIPHY0_NSS_RX_CLK, 2, 0, 0),
+ FM(312500000, ftbl_nss_cc_port4_rx_clk_src_312p5),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port4_rx_clk_src = {
+ .cmd_rcgr = 0x4fc,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port4_rx,
+ .freq_multi_tbl = ftbl_nss_cc_port4_rx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port4_rx_clk_src",
+ .parent_data = gcc_xo_ephy_uniphy0_rx,
+ .num_parents = ARRAY_SIZE(gcc_xo_ephy_uniphy0_rx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port4_rx_div_clk_src = {
+ .reg = 0x504,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port4_rx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_rx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port4_tx_clk_src_25[] = {
+ C(P_UNIPHY0_NSS_TX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY0_NSS_TX_CLK, 5, 0, 0),
+ C(P_EPHY_TX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port4_tx_clk_src_125[] = {
+ C(P_UNIPHY0_NSS_TX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
+ C(P_EPHY_TX_CLK, 1, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port4_tx_clk_src_312p5[] = {
+ C(P_UNIPHY0_NSS_TX_CLK, 1, 0, 0),
+ C(P_EPHY_TX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port4_tx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port4_tx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port4_tx_clk_src_125),
+ FMS(156250000, P_UNIPHY0_NSS_TX_CLK, 2, 0, 0),
+ FM(312500000, ftbl_nss_cc_port4_tx_clk_src_312p5),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port4_tx_clk_src = {
+ .cmd_rcgr = 0x508,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port4_tx,
+ .freq_multi_tbl = ftbl_nss_cc_port4_tx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port4_tx_clk_src",
+ .parent_data = gcc_xo_ephy_uniphy0_tx,
+ .num_parents = ARRAY_SIZE(gcc_xo_ephy_uniphy0_tx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port4_tx_div_clk_src = {
+ .reg = 0x510,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port4_tx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_tx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port5_rx_clk_src_25[] = {
+ C(P_UNIPHY1_NSS_RX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY1_NSS_RX_CLK, 5, 0, 0),
+ C(P_EPHY_RX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port5_rx_clk_src_125[] = {
+ C(P_UNIPHY1_NSS_RX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY1_NSS_RX_CLK, 1, 0, 0),
+ C(P_EPHY_RX_CLK, 1, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port5_rx_clk_src_312p5[] = {
+ C(P_UNIPHY1_NSS_RX_CLK, 1, 0, 0),
+ C(P_EPHY_RX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port5_rx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port5_rx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port5_rx_clk_src_125),
+ FMS(156250000, P_UNIPHY1_NSS_RX_CLK, 2, 0, 0),
+ FM(312500000, ftbl_nss_cc_port5_rx_clk_src_312p5),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port5_rx_clk_src = {
+ .cmd_rcgr = 0x514,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port5_rx,
+ .freq_multi_tbl = ftbl_nss_cc_port5_rx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port5_rx_clk_src",
+ .parent_data = gcc_xo_ephy_uniphy1_rx,
+ .num_parents = ARRAY_SIZE(gcc_xo_ephy_uniphy1_rx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port5_rx_div_clk_src = {
+ .reg = 0x51c,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port5_rx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port5_rx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port5_tx_clk_src_25[] = {
+ C(P_UNIPHY1_NSS_TX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY1_NSS_TX_CLK, 5, 0, 0),
+ C(P_EPHY_TX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port5_tx_clk_src_125[] = {
+ C(P_UNIPHY1_NSS_TX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY1_NSS_TX_CLK, 1, 0, 0),
+ C(P_EPHY_TX_CLK, 1, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port5_tx_clk_src_312p5[] = {
+ C(P_UNIPHY1_NSS_TX_CLK, 1, 0, 0),
+ C(P_EPHY_TX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port5_tx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port5_tx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port5_tx_clk_src_125),
+ FMS(156250000, P_UNIPHY1_NSS_TX_CLK, 2, 0, 0),
+ FM(312500000, ftbl_nss_cc_port5_tx_clk_src_312p5),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port5_tx_clk_src = {
+ .cmd_rcgr = 0x520,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port5_tx,
+ .freq_multi_tbl = ftbl_nss_cc_port5_tx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port5_tx_clk_src",
+ .parent_data = gcc_xo_ephy_uniphy1_tx,
+ .num_parents = ARRAY_SIZE(gcc_xo_ephy_uniphy1_tx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port5_tx_div_clk_src = {
+ .reg = 0x528,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port5_tx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port5_tx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port6_rx_clk_src_25[] = {
+ C(P_UNIPHY2_NSS_RX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY2_NSS_RX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port6_rx_clk_src_125[] = {
+ C(P_UNIPHY2_NSS_RX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY2_NSS_RX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port6_rx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port6_rx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port6_rx_clk_src_125),
+ FMS(156250000, P_UNIPHY2_NSS_RX_CLK, 2, 0, 0),
+ FMS(312500000, P_UNIPHY2_NSS_RX_CLK, 1, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port6_rx_clk_src = {
+ .cmd_rcgr = 0x52c,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port6_rx,
+ .freq_multi_tbl = ftbl_nss_cc_port6_rx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port6_rx_clk_src",
+ .parent_data = gcc_xo_uniphy2_rx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy2_rx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port6_rx_div_clk_src = {
+ .reg = 0x534,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port6_rx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port6_rx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static const struct freq_conf ftbl_nss_cc_port6_tx_clk_src_25[] = {
+ C(P_UNIPHY2_NSS_TX_CLK, 12.5, 0, 0),
+ C(P_UNIPHY2_NSS_TX_CLK, 5, 0, 0),
+};
+
+static const struct freq_conf ftbl_nss_cc_port6_tx_clk_src_125[] = {
+ C(P_UNIPHY2_NSS_TX_CLK, 2.5, 0, 0),
+ C(P_UNIPHY2_NSS_TX_CLK, 1, 0, 0),
+};
+
+static const struct freq_multi_tbl ftbl_nss_cc_port6_tx_clk_src[] = {
+ FMS(24000000, P_XO, 1, 0, 0),
+ FM(25000000, ftbl_nss_cc_port6_tx_clk_src_25),
+ FM(125000000, ftbl_nss_cc_port6_tx_clk_src_125),
+ FMS(156250000, P_UNIPHY2_NSS_TX_CLK, 2, 0, 0),
+ FMS(312500000, P_UNIPHY2_NSS_TX_CLK, 1, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_port6_tx_clk_src = {
+ .cmd_rcgr = 0x538,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_port6_tx,
+ .freq_multi_tbl = ftbl_nss_cc_port6_tx_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port6_tx_clk_src",
+ .parent_data = gcc_xo_uniphy2_tx,
+ .num_parents = ARRAY_SIZE(gcc_xo_uniphy2_tx),
+ .ops = &clk_rcg2_fm_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_port6_tx_div_clk_src = {
+ .reg = 0x540,
+ .shift = 0,
+ .width = 9,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_port6_tx_div_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port6_tx_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_branch nss_cc_port1_rx_clk = {
+ .halt_reg = 0x548,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x548,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port1_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port1_tx_clk = {
+ .halt_reg = 0x550,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x550,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port1_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port2_rx_clk = {
+ .halt_reg = 0x558,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x558,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port2_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port2_tx_clk = {
+ .halt_reg = 0x560,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x560,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port2_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port3_rx_clk = {
+ .halt_reg = 0x568,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x568,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port3_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port3_tx_clk = {
+ .halt_reg = 0x570,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x570,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port3_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port4_rx_clk = {
+ .halt_reg = 0x578,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x578,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port4_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port4_tx_clk = {
+ .halt_reg = 0x580,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x580,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port4_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port5_rx_clk = {
+ .halt_reg = 0x588,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x588,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port5_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port5_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port5_tx_clk = {
+ .halt_reg = 0x590,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x590,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port5_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port5_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port6_rx_clk = {
+ .halt_reg = 0x598,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x598,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port6_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port6_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_port6_tx_clk = {
+ .halt_reg = 0x5a0,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5a0,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_port6_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port6_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port1_rx_clk = {
+ .halt_reg = 0x5e0,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5e0,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port1_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port1_tx_clk = {
+ .halt_reg = 0x5e4,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5e4,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port1_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port2_rx_clk = {
+ .halt_reg = 0x5e8,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5e8,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port2_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port2_tx_clk = {
+ .halt_reg = 0x5ec,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5ec,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port2_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port3_rx_clk = {
+ .halt_reg = 0x5f0,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5f0,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port3_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port3_tx_clk = {
+ .halt_reg = 0x5f4,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5f4,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port3_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port4_rx_clk = {
+ .halt_reg = 0x5f8,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5f8,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port4_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port4_tx_clk = {
+ .halt_reg = 0x5fc,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x5fc,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port4_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port5_rx_clk = {
+ .halt_reg = 0x600,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x600,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port5_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port5_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port5_tx_clk = {
+ .halt_reg = 0x604,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x604,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port5_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port5_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port6_rx_clk = {
+ .halt_reg = 0x608,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x608,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port6_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port6_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port6_tx_clk = {
+ .halt_reg = 0x60c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x60c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port6_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port6_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_regmap_mux nss_cc_ephy_rx_mux_clk_src = {
+ .reg = 0x610,
+ .shift = 0,
+ .width = 1,
+ .clkr = {
+ .hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_ephy_rx_mux_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_rx_div_clk_src.clkr.hw,
+ &nss_cc_port5_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
+ .ops = &clk_regmap_mux_closest_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ephy_rx_clk = {
+ .halt_reg = 0x618,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x618,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ephy_rx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ephy_rx_mux_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_regmap_mux nss_cc_ephy_tx_mux_clk_src = {
+ .reg = 0x614,
+ .shift = 0,
+ .width = 1,
+ .clkr = {
+ .hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_ephy_tx_mux_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_tx_div_clk_src.clkr.hw,
+ &nss_cc_port5_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
+ .ops = &clk_regmap_mux_closest_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_ephy_tx_clk = {
+ .halt_reg = 0x61c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x61c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_ephy_tx_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_ephy_tx_mux_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port1_rx_div4_clk_src = {
+ .reg = 0x624,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port1_rx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port1_tx_div4_clk_src = {
+ .reg = 0x628,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port1_tx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port1_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port2_rx_div4_clk_src = {
+ .reg = 0x62c,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port2_rx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port2_tx_div4_clk_src = {
+ .reg = 0x630,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port2_tx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port2_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port3_rx_div4_clk_src = {
+ .reg = 0x634,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port3_rx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port3_tx_div4_clk_src = {
+ .reg = 0x638,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port3_tx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port3_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port4_rx_div4_clk_src = {
+ .reg = 0x63c,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port4_rx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_rx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_regmap_div nss_cc_uniphy_port4_tx_div4_clk_src = {
+ .reg = 0x640,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "nss_cc_uniphy_port4_tx_div4_clk_src",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_port4_tx_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .ops = &clk_regmap_div_ops,
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port1_rx_div4_clk = {
+ .halt_reg = 0x644,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x644,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port1_rx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port1_rx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port1_tx_div4_clk = {
+ .halt_reg = 0x648,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x648,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port1_tx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port1_tx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port2_rx_div4_clk = {
+ .halt_reg = 0x64c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x64c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port2_rx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port2_rx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port2_tx_div4_clk = {
+ .halt_reg = 0x650,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x650,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port2_tx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port2_tx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port3_rx_div4_clk = {
+ .halt_reg = 0x654,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x654,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port3_rx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port3_rx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port3_tx_div4_clk = {
+ .halt_reg = 0x658,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x658,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port3_tx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port3_tx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port4_rx_div4_clk = {
+ .halt_reg = 0x65c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x65c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port4_rx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port4_rx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_uniphy_port4_tx_div4_clk = {
+ .halt_reg = 0x660,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x660,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_uniphy_port4_tx_div4_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_uniphy_port4_tx_div4_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static const struct freq_tbl ftbl_nss_cc_eip_bfdcd_clk_src[] = {
+ F(375000000, P_CMN_PLL_NSS_CLK_375M, 1, 0, 0),
+ { }
+};
+
+static const struct parent_map nss_cc_parent_map_eip[] = {
+ { P_XO, 0 },
+ { P_CMN_PLL_NSS_CLK_375M, 5 },
+};
+
+static struct clk_rcg2 nss_cc_eip_bfdcd_clk_src = {
+ .cmd_rcgr = 0x6a8,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_eip,
+ .freq_tbl = ftbl_nss_cc_eip_bfdcd_clk_src,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_eip_bfdcd_clk_src",
+ .parent_data = nss_cc_ppe_parent_data_eip,
+ .num_parents = ARRAY_SIZE(nss_cc_ppe_parent_data_eip),
+ .ops = &clk_rcg2_ops,
+ },
+};
+
+static struct clk_branch nss_cc_eip_clk = {
+ .halt_reg = 0x6bc,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x6bc,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_eip_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_eip_bfdcd_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_nssnoc_eip_clk = {
+ .halt_reg = 0x6c4,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x6c4,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_nssnoc_eip_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_eip_bfdcd_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static const struct freq_tbl ftbl_nss_cc_cfg_clk_ppe_cfg[] = {
+ F(100000000, P_GCC_GPLL0, 8, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 nss_cc_cfg_clk_src = {
+ .cmd_rcgr = 0x70c,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = nss_cc_parent_map_ppe_cfg,
+ .freq_tbl = ftbl_nss_cc_cfg_clk_ppe_cfg,
+ .clkr.hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_cfg_clk_src",
+ .parent_data = nss_cc_ppe_parent_data_ppe_cfg,
+ .num_parents = ARRAY_SIZE(nss_cc_ppe_parent_data_ppe_cfg),
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_rcg2_ops,
+ },
+};
+
+static struct clk_branch nss_cc_nss_csr_clk = {
+ .halt_reg = 0x714,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x714,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_nss_csr_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_cfg_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch nss_cc_nssnoc_nss_csr_clk = {
+ .halt_reg = 0x718,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x718,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data){
+ .name = "nss_cc_nssnoc_nss_csr_clk",
+ .parent_hws = (const struct clk_hw*[]){
+ &nss_cc_cfg_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_regmap *nss_cc_ipq5210_clocks[] = {
+ [NSS_CC_PPE_CLK_SRC] = &nss_cc_ppe_clk_src.clkr,
+ [NSS_CC_PPE_SWITCH_IPE_CLK] = &nss_cc_ppe_switch_ipe_clk.clkr,
+ [NSS_CC_PPE_SWITCH_BTQ_CLK] = &nss_cc_ppe_switch_btq_clk.clkr,
+ [NSS_CC_PPE_SWITCH_CLK] = &nss_cc_ppe_switch_clk.clkr,
+ [NSS_CC_PPE_SWITCH_CFG_CLK] = &nss_cc_ppe_switch_cfg_clk.clkr,
+ [NSS_CC_PPE_EDMA_CLK] = &nss_cc_ppe_edma_clk.clkr,
+ [NSS_CC_PPE_EDMA_CFG_CLK] = &nss_cc_ppe_edma_cfg_clk.clkr,
+ [NSS_CC_PORT1_MAC_CLK] = &nss_cc_port1_mac_clk.clkr,
+ [NSS_CC_PORT1_RX_CLK] = &nss_cc_port1_rx_clk.clkr,
+ [NSS_CC_PORT1_RX_CLK_SRC] = &nss_cc_port1_rx_clk_src.clkr,
+ [NSS_CC_PORT1_RX_DIV_CLK_SRC] = &nss_cc_port1_rx_div_clk_src.clkr,
+ [NSS_CC_PORT1_TX_CLK] = &nss_cc_port1_tx_clk.clkr,
+ [NSS_CC_PORT1_TX_CLK_SRC] = &nss_cc_port1_tx_clk_src.clkr,
+ [NSS_CC_PORT1_TX_DIV_CLK_SRC] = &nss_cc_port1_tx_div_clk_src.clkr,
+ [NSS_CC_PORT2_MAC_CLK] = &nss_cc_port2_mac_clk.clkr,
+ [NSS_CC_PORT2_RX_CLK] = &nss_cc_port2_rx_clk.clkr,
+ [NSS_CC_PORT2_RX_CLK_SRC] = &nss_cc_port2_rx_clk_src.clkr,
+ [NSS_CC_PORT2_RX_DIV_CLK_SRC] = &nss_cc_port2_rx_div_clk_src.clkr,
+ [NSS_CC_PORT2_TX_CLK] = &nss_cc_port2_tx_clk.clkr,
+ [NSS_CC_PORT2_TX_CLK_SRC] = &nss_cc_port2_tx_clk_src.clkr,
+ [NSS_CC_PORT2_TX_DIV_CLK_SRC] = &nss_cc_port2_tx_div_clk_src.clkr,
+ [NSS_CC_PORT3_MAC_CLK] = &nss_cc_port3_mac_clk.clkr,
+ [NSS_CC_PORT3_RX_CLK] = &nss_cc_port3_rx_clk.clkr,
+ [NSS_CC_PORT3_RX_CLK_SRC] = &nss_cc_port3_rx_clk_src.clkr,
+ [NSS_CC_PORT3_RX_DIV_CLK_SRC] = &nss_cc_port3_rx_div_clk_src.clkr,
+ [NSS_CC_PORT3_TX_CLK] = &nss_cc_port3_tx_clk.clkr,
+ [NSS_CC_PORT3_TX_CLK_SRC] = &nss_cc_port3_tx_clk_src.clkr,
+ [NSS_CC_PORT3_TX_DIV_CLK_SRC] = &nss_cc_port3_tx_div_clk_src.clkr,
+ [NSS_CC_PORT4_MAC_CLK] = &nss_cc_port4_mac_clk.clkr,
+ [NSS_CC_PORT4_RX_CLK] = &nss_cc_port4_rx_clk.clkr,
+ [NSS_CC_PORT4_RX_CLK_SRC] = &nss_cc_port4_rx_clk_src.clkr,
+ [NSS_CC_PORT4_RX_DIV_CLK_SRC] = &nss_cc_port4_rx_div_clk_src.clkr,
+ [NSS_CC_PORT4_TX_CLK] = &nss_cc_port4_tx_clk.clkr,
+ [NSS_CC_PORT4_TX_CLK_SRC] = &nss_cc_port4_tx_clk_src.clkr,
+ [NSS_CC_PORT4_TX_DIV_CLK_SRC] = &nss_cc_port4_tx_div_clk_src.clkr,
+ [NSS_CC_PORT5_MAC_CLK] = &nss_cc_port5_mac_clk.clkr,
+ [NSS_CC_PORT5_RX_CLK] = &nss_cc_port5_rx_clk.clkr,
+ [NSS_CC_PORT5_RX_CLK_SRC] = &nss_cc_port5_rx_clk_src.clkr,
+ [NSS_CC_PORT5_RX_DIV_CLK_SRC] = &nss_cc_port5_rx_div_clk_src.clkr,
+ [NSS_CC_PORT5_TX_CLK] = &nss_cc_port5_tx_clk.clkr,
+ [NSS_CC_PORT5_TX_CLK_SRC] = &nss_cc_port5_tx_clk_src.clkr,
+ [NSS_CC_PORT5_TX_DIV_CLK_SRC] = &nss_cc_port5_tx_div_clk_src.clkr,
+ [NSS_CC_PORT6_MAC_CLK] = &nss_cc_port6_mac_clk.clkr,
+ [NSS_CC_PORT6_RX_CLK] = &nss_cc_port6_rx_clk.clkr,
+ [NSS_CC_PORT6_RX_CLK_SRC] = &nss_cc_port6_rx_clk_src.clkr,
+ [NSS_CC_PORT6_RX_DIV_CLK_SRC] = &nss_cc_port6_rx_div_clk_src.clkr,
+ [NSS_CC_PORT6_TX_CLK] = &nss_cc_port6_tx_clk.clkr,
+ [NSS_CC_PORT6_TX_CLK_SRC] = &nss_cc_port6_tx_clk_src.clkr,
+ [NSS_CC_PORT6_TX_DIV_CLK_SRC] = &nss_cc_port6_tx_div_clk_src.clkr,
+ [NSS_CC_NSSNOC_PPE_CLK] = &nss_cc_nssnoc_ppe_clk.clkr,
+ [NSS_CC_NSSNOC_PPE_CFG_CLK] = &nss_cc_nssnoc_ppe_cfg_clk.clkr,
+ [NSS_CC_UNIPHY_PORT1_RX_CLK] = &nss_cc_uniphy_port1_rx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT1_TX_CLK] = &nss_cc_uniphy_port1_tx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT2_RX_CLK] = &nss_cc_uniphy_port2_rx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT2_TX_CLK] = &nss_cc_uniphy_port2_tx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT3_RX_CLK] = &nss_cc_uniphy_port3_rx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT3_TX_CLK] = &nss_cc_uniphy_port3_tx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT4_RX_CLK] = &nss_cc_uniphy_port4_rx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT4_TX_CLK] = &nss_cc_uniphy_port4_tx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT5_RX_CLK] = &nss_cc_uniphy_port5_rx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT5_TX_CLK] = &nss_cc_uniphy_port5_tx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT6_RX_CLK] = &nss_cc_uniphy_port6_rx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT6_TX_CLK] = &nss_cc_uniphy_port6_tx_clk.clkr,
+ [NSS_CC_XGMAC0_PTP_REF_CLK] = &nss_cc_xgmac0_ptp_ref_clk.clkr,
+ [NSS_CC_XGMAC0_PTP_REF_DIV_CLK_SRC] = &nss_cc_xgmac0_ptp_ref_div_clk_src.clkr,
+ [NSS_CC_XGMAC1_PTP_REF_CLK] = &nss_cc_xgmac1_ptp_ref_clk.clkr,
+ [NSS_CC_XGMAC1_PTP_REF_DIV_CLK_SRC] = &nss_cc_xgmac1_ptp_ref_div_clk_src.clkr,
+ [NSS_CC_XGMAC2_PTP_REF_CLK] = &nss_cc_xgmac2_ptp_ref_clk.clkr,
+ [NSS_CC_XGMAC2_PTP_REF_DIV_CLK_SRC] = &nss_cc_xgmac2_ptp_ref_div_clk_src.clkr,
+ [NSS_CC_PON_CLK] = &nss_cc_pon_clk.clkr,
+ [NSS_CC_EPHY_RX_CLK_SRC] = &nss_cc_ephy_rx_mux_clk_src.clkr,
+ [NSS_CC_EPHY_RX_CLK] = &nss_cc_ephy_rx_clk.clkr,
+ [NSS_CC_EPHY_TX_CLK_SRC] = &nss_cc_ephy_tx_mux_clk_src.clkr,
+ [NSS_CC_EPHY_TX_CLK] = &nss_cc_ephy_tx_clk.clkr,
+ [NSS_CC_UNIPHY_PORT1_RX_DIV4_CLK_SRC] = &nss_cc_uniphy_port1_rx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT1_TX_DIV4_CLK_SRC] = &nss_cc_uniphy_port1_tx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT2_RX_DIV4_CLK_SRC] = &nss_cc_uniphy_port2_rx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT2_TX_DIV4_CLK_SRC] = &nss_cc_uniphy_port2_tx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT3_RX_DIV4_CLK_SRC] = &nss_cc_uniphy_port3_rx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT3_TX_DIV4_CLK_SRC] = &nss_cc_uniphy_port3_tx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT4_RX_DIV4_CLK_SRC] = &nss_cc_uniphy_port4_rx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT4_TX_DIV4_CLK_SRC] = &nss_cc_uniphy_port4_tx_div4_clk_src.clkr,
+ [NSS_CC_UNIPHY_PORT1_RX_DIV4_CLK] = &nss_cc_uniphy_port1_rx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT1_TX_DIV4_CLK] = &nss_cc_uniphy_port1_tx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT2_RX_DIV4_CLK] = &nss_cc_uniphy_port2_rx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT2_TX_DIV4_CLK] = &nss_cc_uniphy_port2_tx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT3_RX_DIV4_CLK] = &nss_cc_uniphy_port3_rx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT3_TX_DIV4_CLK] = &nss_cc_uniphy_port3_tx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT4_RX_DIV4_CLK] = &nss_cc_uniphy_port4_rx_div4_clk.clkr,
+ [NSS_CC_UNIPHY_PORT4_TX_DIV4_CLK] = &nss_cc_uniphy_port4_tx_div4_clk.clkr,
+ [NSS_CC_EIP_BFDCD_CLK_SRC] = &nss_cc_eip_bfdcd_clk_src.clkr,
+ [NSS_CC_EIP_CLK] = &nss_cc_eip_clk.clkr,
+ [NSS_CC_NSSNOC_EIP_CLK] = &nss_cc_nssnoc_eip_clk.clkr,
+ [NSS_CC_CFG_CLK_SRC] = &nss_cc_cfg_clk_src.clkr,
+ [NSS_CC_NSS_CSR_CLK] = &nss_cc_nss_csr_clk.clkr,
+ [NSS_CC_NSSNOC_NSS_CSR_CLK] = &nss_cc_nssnoc_nss_csr_clk.clkr,
+};
+
+static const struct qcom_reset_map nss_cc_ipq5210_resets[] = {
+ [NSS_CC_PPE_BCR] = { 0x3e8 },
+ [NSS_CC_PPE_SWITCH_IPE_CLK_ARES] = { 0x424, 2 },
+ [NSS_CC_PPE_SWITCH_BTQ_CLK_ARES] = { 0x42c, 2 },
+ [NSS_CC_PPE_SWITCH_CLK_ARES] = { 0x434, 2 },
+ [NSS_CC_PPE_SWITCH_CFG_CLK_ARES] = { 0x43c, 2 },
+ [NSS_CC_PPE_EDMA_CLK_ARES] = { 0x440, 2 },
+ [NSS_CC_PPE_EDMA_CFG_CLK_ARES] = { 0x448, 2 },
+ [NSS_CC_PORT1_MAC_CLK_ARES] = { 0x44c, 2 },
+ [NSS_CC_PORT2_MAC_CLK_ARES] = { 0x454, 2 },
+ [NSS_CC_PORT3_MAC_CLK_ARES] = { 0x45c, 2 },
+ [NSS_CC_PORT4_MAC_CLK_ARES] = { 0x464, 2 },
+ [NSS_CC_PORT5_MAC_CLK_ARES] = { 0x46c, 2 },
+ [NSS_CC_PORT6_MAC_CLK_ARES] = { 0x474, 2 },
+ [NSS_CC_PON_CLK_ARES] = { 0x47c, 2 },
+ [NSS_CC_XGMAC0_PTP_REF_CLK_ARES] = { 0x488, 2 },
+ [NSS_CC_XGMAC1_PTP_REF_CLK_ARES] = { 0x48c, 2 },
+ [NSS_CC_XGMAC2_PTP_REF_CLK_ARES] = { 0x490, 2 },
+ [NSS_CC_NSSNOC_PPE_CLK_ARES] = { 0x4a4, 2 },
+ [NSS_CC_NSSNOC_PPE_CFG_CLK_ARES] = { 0x4a8, 2 },
+ [NSS_CC_PORT1_RX_CLK_ARES] = { 0x548, 2 },
+ [NSS_CC_PORT1_TX_CLK_ARES] = { 0x550, 2 },
+ [NSS_CC_PORT2_RX_CLK_ARES] = { 0x558, 2 },
+ [NSS_CC_PORT2_TX_CLK_ARES] = { 0x560, 2 },
+ [NSS_CC_PORT3_RX_CLK_ARES] = { 0x568, 2 },
+ [NSS_CC_PORT3_TX_CLK_ARES] = { 0x570, 2 },
+ [NSS_CC_PORT4_RX_CLK_ARES] = { 0x578, 2 },
+ [NSS_CC_PORT4_TX_CLK_ARES] = { 0x580, 2 },
+ [NSS_CC_PORT5_RX_CLK_ARES] = { 0x588, 2 },
+ [NSS_CC_PORT5_TX_CLK_ARES] = { 0x590, 2 },
+ [NSS_CC_PORT6_RX_CLK_ARES] = { 0x598, 2 },
+ [NSS_CC_PORT6_TX_CLK_ARES] = { 0x5a0, 2 },
+ [NSS_CC_EPHY_RX_CLK_ARES] = { 0x618, 2 },
+ [NSS_CC_EPHY_TX_CLK_ARES] = { 0x61c, 2 },
+ [NSS_CC_UNIPHY_PORT1_RX_CLK_ARES] = { 0x5e0, 2 },
+ [NSS_CC_UNIPHY_PORT1_TX_CLK_ARES] = { 0x5e4, 2 },
+ [NSS_CC_UNIPHY_PORT2_RX_CLK_ARES] = { 0x5e8, 2 },
+ [NSS_CC_UNIPHY_PORT2_TX_CLK_ARES] = { 0x5ec, 2 },
+ [NSS_CC_UNIPHY_PORT3_RX_CLK_ARES] = { 0x5f0, 2 },
+ [NSS_CC_UNIPHY_PORT3_TX_CLK_ARES] = { 0x5f4, 2 },
+ [NSS_CC_UNIPHY_PORT4_RX_CLK_ARES] = { 0x5f8, 2 },
+ [NSS_CC_UNIPHY_PORT4_TX_CLK_ARES] = { 0x5fc, 2 },
+ [NSS_CC_UNIPHY_PORT5_RX_CLK_ARES] = { 0x600, 2 },
+ [NSS_CC_UNIPHY_PORT5_TX_CLK_ARES] = { 0x604, 2 },
+ [NSS_CC_UNIPHY_PORT6_RX_CLK_ARES] = { 0x608, 2 },
+ [NSS_CC_UNIPHY_PORT6_TX_CLK_ARES] = { 0x60c, 2 },
+ [NSS_CC_EIP_CLK_ARES] = { 0x6bc, 2 },
+ [NSS_CC_NSSNOC_EIP_CLK_ARES] = { 0x6c4, 2 },
+ [NSS_CC_NSS_CSR_CLK_ARES] = { 0x714, 2 },
+ [NSS_CC_NSSNOC_NSS_CSR_CLK_ARES] = { 0x718, 2 },
+ [NSS_CC_DEBUG_CLK_ARES] = { 0x770, 2 },
+};
+
+static const struct regmap_config nss_cc_ipq5210_regmap_config = {
+ .reg_bits = 32,
+ .reg_stride = 4,
+ .val_bits = 32,
+ .max_register = 0x800,
+ .fast_io = true,
+};
+
+static const struct qcom_icc_hws_data icc_ipq5210_nss_hws[] = {
+ { MASTER_NSSNOC_PPE, SLAVE_NSSNOC_PPE, NSS_CC_NSSNOC_PPE_CLK },
+ { MASTER_NSSNOC_PPE_CFG, SLAVE_NSSNOC_PPE_CFG, NSS_CC_NSSNOC_PPE_CFG_CLK },
+ { MASTER_NSSNOC_NSS_CSR, SLAVE_NSSNOC_NSS_CSR, NSS_CC_NSSNOC_NSS_CSR_CLK },
+ { MASTER_NSSNOC_EIP, SLAVE_NSSNOC_EIP, NSS_CC_NSSNOC_EIP_CLK },
+};
+
+#define IPQ_NSSCC_ID (5210 * 2) /* some unique value */
+
+static const struct qcom_cc_desc nss_cc_ipq5210_desc = {
+ .config = &nss_cc_ipq5210_regmap_config,
+ .clks = nss_cc_ipq5210_clocks,
+ .num_clks = ARRAY_SIZE(nss_cc_ipq5210_clocks),
+ .resets = nss_cc_ipq5210_resets,
+ .num_resets = ARRAY_SIZE(nss_cc_ipq5210_resets),
+ .icc_hws = icc_ipq5210_nss_hws,
+ .num_icc_hws = ARRAY_SIZE(icc_ipq5210_nss_hws),
+ .icc_first_node_id = IPQ_NSSCC_ID,
+};
+
+static const struct dev_pm_ops nss_cc_ipq5210_pm_ops = {
+ SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
+};
+
+static const struct of_device_id nss_cc_ipq5210_match_table[] = {
+ { .compatible = "qcom,ipq5210-nsscc" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, nss_cc_ipq5210_match_table);
+
+static int nss_cc_ipq5210_probe(struct platform_device *pdev)
+{
+ int ret;
+
+ ret = devm_pm_runtime_enable(&pdev->dev);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "Fail to enable runtime PM\n");
+
+ ret = devm_pm_clk_create(&pdev->dev);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "Fail to create PM clock\n");
+
+ ret = pm_clk_add(&pdev->dev, "bus");
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "Fail to add bus clock\n");
+
+ ret = pm_runtime_resume_and_get(&pdev->dev);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "Fail to resume\n");
+
+ ret = qcom_cc_probe(pdev, &nss_cc_ipq5210_desc);
+ pm_runtime_put(&pdev->dev);
+
+ return ret;
+}
+
+static struct platform_driver nss_cc_ipq5210_driver = {
+ .probe = nss_cc_ipq5210_probe,
+ .driver = {
+ .name = "qcom,ipq5210-nsscc",
+ .of_match_table = nss_cc_ipq5210_match_table,
+ .pm = &nss_cc_ipq5210_pm_ops,
+ .sync_state = icc_sync_state,
+ },
+};
+module_platform_driver(nss_cc_ipq5210_driver);
+
+MODULE_DESCRIPTION("Qualcomm Technologies, Inc. NSSCC IPQ5210 Driver");
+MODULE_LICENSE("GPL");
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/5] arm64: dts: qcom: ipq5210: Add CMN PLL device node
2026-11-05 13:07 [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
2026-11-05 13:07 ` [PATCH 1/5] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
2026-11-05 13:07 ` [PATCH 2/5] clk: qcom: Add NSS clock controller driver " Luo Jie
@ 2026-11-05 13:07 ` Luo Jie
2026-11-05 13:07 ` [PATCH 4/5] arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock Luo Jie
2026-11-05 13:07 ` [PATCH 5/5] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
4 siblings, 0 replies; 9+ messages in thread
From: Luo Jie @ 2026-11-05 13:07 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei, Luo Jie
Add CMN PLL node for enabling output clocks to the networking hardware
blocks on IPQ5210 devices.
The reference clock of CMN PLL is routed from XO to the CMN PLL through
the WiFi block.
XO (48 MHz or 96 MHz or 192 MHz)-->WiFi (multiplier/divider)--> 48 MHz
to CMN PLL.
Signed-off-by: Luo Jie <jie.luo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts | 15 +++++++++++++++
arch/arm64/boot/dts/qcom/ipq5210.dtsi | 26 +++++++++++++++++++++++++-
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts b/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
index 941f866ecfe9..61a53361138b 100644
--- a/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
+++ b/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
@@ -20,6 +20,17 @@ chosen {
};
};
+/*
+ * The bootstrap pins for the board select the XO clock frequency that
+ * supports 48 MHz, 96 MHz or 192 MHz. This setting automatically
+ * enables the right dividers, to ensure the reference clock output
+ * from WiFi to the CMN PLL is 48 MHz.
+ */
+&ref_48mhz_clk {
+ clock-div = <1>;
+ clock-mult = <1>;
+};
+
&sdhc {
max-frequency = <192000000>;
bus-width = <4>;
@@ -77,3 +88,7 @@ &uart1 {
&xo_board {
clock-frequency = <24000000>;
};
+
+&xo_clk {
+ clock-frequency = <48000000>;
+};
diff --git a/arch/arm64/boot/dts/qcom/ipq5210.dtsi b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
index 2cdc10529c48..52d851a0dc2b 100644
--- a/arch/arm64/boot/dts/qcom/ipq5210.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
@@ -3,8 +3,9 @@
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
*/
-#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/qcom,ipq5210-cmn-pll.h>
#include <dt-bindings/clock/qcom,ipq5210-gcc.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/reset/qcom,ipq5210-gcc.h>
/ {
@@ -13,6 +14,12 @@ / {
interrupt-parent = <&intc>;
clocks {
+ ref_48mhz_clk: ref-48mhz-clk {
+ compatible = "fixed-factor-clock";
+ clocks = <&xo_clk>;
+ #clock-cells = <0>;
+ };
+
sleep_clk: sleep-clk {
compatible = "fixed-clock";
#clock-cells = <0>;
@@ -22,6 +29,11 @@ xo_board: xo-board-clk {
compatible = "fixed-clock";
#clock-cells = <0>;
};
+
+ xo_clk: xo-clk {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ };
};
cpus {
@@ -130,6 +142,18 @@ soc@0 {
dma-ranges = <0 0 0 0 0x10 0>;
ranges = <0 0 0 0 0x10 0>;
+ cmn_pll: clock-controller@9b000 {
+ compatible = "qcom,ipq5210-cmn-pll";
+ reg = <0x0 0x0009b000 0x0 0x800>;
+ clocks = <&ref_48mhz_clk>,
+ <&gcc GCC_CMN_12GPLL_AHB_CLK>,
+ <&gcc GCC_CMN_12GPLL_SYS_CLK>;
+ clock-names = "ref", "ahb", "sys";
+ #clock-cells = <1>;
+ assigned-clocks = <&cmn_pll IPQ5210_CMN_PLL_CLK>;
+ assigned-clock-rates-u64 = /bits/ 64 <12000000000>;
+ };
+
tlmm: pinctrl@1000000 {
compatible = "qcom,ipq5210-tlmm";
reg = <0x0 0x01000000 0x0 0x300000>;
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/5] arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock
2026-11-05 13:07 [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
` (2 preceding siblings ...)
2026-11-05 13:07 ` [PATCH 3/5] arm64: dts: qcom: ipq5210: Add CMN PLL device node Luo Jie
@ 2026-11-05 13:07 ` Luo Jie
2026-11-06 13:08 ` sashiko-bot
2026-11-05 13:07 ` [PATCH 5/5] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
4 siblings, 1 reply; 9+ messages in thread
From: Luo Jie @ 2026-11-05 13:07 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei, Luo Jie
xo_board is fixed to 24 MHz, which is routed from WiFi output clock
48 MHz (also being the reference clock of CMN PLL) divided 2 by analog
block routing channel.
Signed-off-by: Luo Jie <jie.luo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts | 7 ++++++-
arch/arm64/boot/dts/qcom/ipq5210.dtsi | 3 ++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts b/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
index 61a53361138b..519307c6b61e 100644
--- a/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
+++ b/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
@@ -85,8 +85,13 @@ &uart1 {
status = "okay";
};
+/*
+ * The frequency of xo_board is fixed to 24 MHz, which is routed
+ * from WiFi output clock 48 MHz divided by 2.
+ */
&xo_board {
- clock-frequency = <24000000>;
+ clock-div = <2>;
+ clock-mult = <1>;
};
&xo_clk {
diff --git a/arch/arm64/boot/dts/qcom/ipq5210.dtsi b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
index 52d851a0dc2b..0c1ede0f73b2 100644
--- a/arch/arm64/boot/dts/qcom/ipq5210.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
@@ -26,7 +26,8 @@ sleep_clk: sleep-clk {
};
xo_board: xo-board-clk {
- compatible = "fixed-clock";
+ compatible = "fixed-factor-clock";
+ clocks = <&xo_clk>;
#clock-cells = <0>;
};
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/5] arm64: dts: qcom: ipq5210: Add NSS clock controller node
2026-11-05 13:07 [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
` (3 preceding siblings ...)
2026-11-05 13:07 ` [PATCH 4/5] arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock Luo Jie
@ 2026-11-05 13:07 ` Luo Jie
2026-11-06 13:08 ` sashiko-bot
4 siblings, 1 reply; 9+ messages in thread
From: Luo Jie @ 2026-11-05 13:07 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei, Luo Jie
NSS clock controller provides the clocks and resets to the networking
hardware blocks on the IPQ5210, such as PPE (Packet Process Engine) and
the integrated EPHY.
Note that the CMN PLL output clock names are reversed with respect to the
hardware block they actually feed: IPQ5210_PPE_CLK is wired to the NSS
hardware block, and IPQ5210_NSS_CLK is wired to the PPE hardware block.
Documentation is added in the DTS file to call this out and avoid
confusion.
Signed-off-by: Luo Jie <jie.luo@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/ipq5210.dtsi | 40 +++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/ipq5210.dtsi b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
index 0c1ede0f73b2..11915f8eb156 100644
--- a/arch/arm64/boot/dts/qcom/ipq5210.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
@@ -331,6 +331,46 @@ frame@b128000 {
status = "disabled";
};
};
+
+ nsscc: clock-controller@39b00000 {
+ compatible = "qcom,ipq5210-nsscc";
+ reg = <0x0 0x39b00000 0x0 0x100000>;
+ /*
+ * Note: CMN PLL output clock names below are reversed relative
+ * to the hardware block they feed - IPQ5210_PPE_CLK is wired to
+ * the NSS hardware block ("nss") and IPQ5210_NSS_CLK is wired
+ * to the PPE hardware block ("ppe").
+ */
+ clocks = <&xo_board>,
+ <&cmn_pll IPQ5210_PPE_CLK>,
+ <&cmn_pll IPQ5210_NSS_CLK>,
+ <&gcc GPLL0>,
+ <0>,
+ <0>,
+ <0>,
+ <0>,
+ <0>,
+ <0>,
+ <&gcc GCC_NSSCC_CLK>,
+ <&cmn_pll IPQ5210_EPHY_RAW_CLK>,
+ <&cmn_pll IPQ5210_EPHY_RAW_CLK>;
+ clock-names = "xo",
+ "nss",
+ "ppe",
+ "gpll0_out",
+ "uniphy0_rx",
+ "uniphy0_tx",
+ "uniphy1_rx",
+ "uniphy1_tx",
+ "uniphy2_rx",
+ "uniphy2_tx",
+ "bus",
+ "ephy_rx",
+ "ephy_tx";
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ #interconnect-cells = <1>;
+ };
};
timer {
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/5] clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
2026-11-05 13:07 ` [PATCH 2/5] clk: qcom: Add NSS clock controller driver " Luo Jie
@ 2026-11-06 13:08 ` sashiko-bot
0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-11-06 13:08 UTC (permalink / raw)
To: Luo Jie; +Cc: linux-clk, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Low] clk: qcom: nsscc-ipq5210: wrap .driver.pm with pm_ptr()
--
commit 32b660ef44d1803c715de35bfad45d1be9b88559
Author: Luo Jie <jie.luo@oss.qualcomm.com>
clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
This commit adds the NSS clock controller driver for the IPQ5210 SoC to
provide clocks, resets, and interconnect clock paths for networking blocks
such as PPE, UNIPHY, and the integrated Ethernet PHY.
> diff --git a/drivers/clk/qcom/nsscc-ipq5210.c b/drivers/clk/qcom/nsscc-ipq5210.c
> new file mode 100644
> index 0000000000000..ca749e0af3231
> --- /dev/null
> +++ b/drivers/clk/qcom/nsscc-ipq5210.c
[ ... ]
> +static const struct dev_pm_ops nss_cc_ipq5210_pm_ops = {
> + SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
> +};
> +
> +static const struct of_device_id nss_cc_ipq5210_match_table[] = {
> + { .compatible = "qcom,ipq5210-nsscc" },
> + { }
> +};
> +MODULE_DEVICE_TABLE(of, nss_cc_ipq5210_match_table);
> +
> +static int nss_cc_ipq5210_probe(struct platform_device *pdev)
> +{
> + int ret;
> +
> + ret = devm_pm_runtime_enable(&pdev->dev);
> + if (ret)
> + return dev_err_probe(&pdev->dev, ret, "Fail to enable runtime PM\n");
> +
> + ret = devm_pm_clk_create(&pdev->dev);
> + if (ret)
> + return dev_err_probe(&pdev->dev, ret, "Fail to create PM clock\n");
> +
> + ret = pm_clk_add(&pdev->dev, "bus");
> + if (ret)
> + return dev_err_probe(&pdev->dev, ret, "Fail to add bus clock\n");
> +
> + ret = pm_runtime_resume_and_get(&pdev->dev);
> + if (ret)
> + return dev_err_probe(&pdev->dev, ret, "Fail to resume\n");
> +
> + ret = qcom_cc_probe(pdev, &nss_cc_ipq5210_desc);
> + pm_runtime_put(&pdev->dev);
> +
> + return ret;
> +}
> +
> +static struct platform_driver nss_cc_ipq5210_driver = {
> + .probe = nss_cc_ipq5210_probe,
> + .driver = {
> + .name = "qcom,ipq5210-nsscc",
> + .of_match_table = nss_cc_ipq5210_match_table,
> + .pm = &nss_cc_ipq5210_pm_ops,
[Severity: Low]
This isn't a bug, but in nss_cc_ipq5210_driver, .driver.pm is assigned
&nss_cc_ipq5210_pm_ops unconditionally while nss_cc_ipq5210_pm_ops uses
SET_RUNTIME_PM_OPS().
Should nss_cc_ipq5210_pm_ops use RUNTIME_PM_OPS() and .driver.pm be wrapped
with pm_ptr(&nss_cc_ipq5210_pm_ops) so the structure and callbacks can be
dropped when CONFIG_PM is disabled?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261105-qcom_ipq5210_nsscc-v1-0-d4fcb5c32b51@oss.qualcomm.com?part=2
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 4/5] arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock
2026-11-05 13:07 ` [PATCH 4/5] arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock Luo Jie
@ 2026-11-06 13:08 ` sashiko-bot
0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-11-06 13:08 UTC (permalink / raw)
To: Luo Jie; +Cc: linux-clk, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] arm64: dts: qcom: ipq5210: xo_board uses xo_clk instead of
ref_48mhz_clk
--
commit 6f35f463dd9af9e90cdf14e9597dae99779f246f
Author: Luo Jie <jie.luo@oss.qualcomm.com>
arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock
This commit converts the IPQ5210 xo_board clock from a fixed-clock to a
fixed-factor-clock dividing its parent clock by 2 to produce 24 MHz.
> diff --git a/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts b/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
> index 61a53361138b1..519307c6b61e5 100644
> --- a/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
> +++ b/arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts
> @@ -85,8 +85,13 @@ &uart1 {
> status = "okay";
> };
>
> +/*
> + * The frequency of xo_board is fixed to 24 MHz, which is routed
> + * from WiFi output clock 48 MHz divided by 2.
> + */
> &xo_board {
> - clock-frequency = <24000000>;
> + clock-div = <2>;
> + clock-mult = <1>;
> };
>
> &xo_clk {
> diff --git a/arch/arm64/boot/dts/qcom/ipq5210.dtsi b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
> index 52d851a0dc2b7..0c1ede0f73b21 100644
> --- a/arch/arm64/boot/dts/qcom/ipq5210.dtsi
> +++ b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
> @@ -26,7 +26,8 @@ sleep_clk: sleep-clk {
> };
>
> xo_board: xo-board-clk {
> - compatible = "fixed-clock";
> + compatible = "fixed-factor-clock";
> + clocks = <&xo_clk>;
[Severity: Medium]
Should xo_board use <&ref_48mhz_clk> as its parent clock instead of
<&xo_clk>?
Both the commit message and the comment in ipq5210-rdp504.dts state that
xo_board is fixed to 24 MHz and routed from the 48 MHz WiFi output clock
(which is also the reference clock of the CMN PLL) divided by 2.
In ipq5210.dtsi and ipq5210-rdp504.dts, xo_clk represents the external board
crystal (which can be 48 MHz, 96 MHz, or 192 MHz depending on board
bootstrap pins), whereas ref_48mhz_clk represents the 48 MHz WiFi output
clock routed to cmn_pll:
arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts:
/*
* The bootstrap pins for the board select the XO clock frequency that
* supports 48 MHz, 96 MHz or 192 MHz. This setting automatically
* enables the right dividers, to ensure the reference clock output
* from WiFi to the CMN PLL is 48 MHz.
*/
&ref_48mhz_clk {
clock-div = <1>;
clock-mult = <1>;
};
arch/arm64/boot/dts/qcom/ipq5210.dtsi:
cmn_pll: clock-controller@9b000 {
compatible = "qcom,ipq5210-cmn-pll";
reg = <0x0 0x0009b000 0x0 0x800>;
clocks = <&ref_48mhz_clk>,
With clocks = <&xo_clk> and a fixed factor of 1/2, wouldn't xo_board and its
downstream consumers (gcc, sdhc, and nsscc) evaluate to 48 MHz or 96 MHz
instead of 24 MHz on IPQ5210 boards strapped for a 96 MHz or 192 MHz xo_clk?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261105-qcom_ipq5210_nsscc-v1-0-d4fcb5c32b51@oss.qualcomm.com?part=4
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 5/5] arm64: dts: qcom: ipq5210: Add NSS clock controller node
2026-11-05 13:07 ` [PATCH 5/5] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
@ 2026-11-06 13:08 ` sashiko-bot
0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-11-06 13:08 UTC (permalink / raw)
To: Luo Jie; +Cc: linux-clk, devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] arm64: dts: qcom: ipq5210: xo_board uses xo_clk instead of
ref_48mhz_clk
--
commit 405d44391cff203718eda5567f73dbca56529ae8
Author: Luo Jie <jie.luo@oss.qualcomm.com>
arm64: dts: qcom: ipq5210: Add NSS clock controller node
This commit adds the NSS clock controller (nsscc) device tree node to
ipq5210.dtsi to provide clocks and resets for the networking hardware blocks
on IPQ5210.
> diff --git a/arch/arm64/boot/dts/qcom/ipq5210.dtsi b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
> index 0c1ede0f73b21..11915f8eb1567 100644
> --- a/arch/arm64/boot/dts/qcom/ipq5210.dtsi
> +++ b/arch/arm64/boot/dts/qcom/ipq5210.dtsi
> @@ -331,6 +331,46 @@ frame@b128000 {
> status = "disabled";
> };
> };
> +
> + nsscc: clock-controller@39b00000 {
> + compatible = "qcom,ipq5210-nsscc";
> + reg = <0x0 0x39b00000 0x0 0x100000>;
> + /*
> + * Note: CMN PLL output clock names below are reversed relative
> + * to the hardware block they feed - IPQ5210_PPE_CLK is wired to
> + * the NSS hardware block ("nss") and IPQ5210_NSS_CLK is wired
> + * to the PPE hardware block ("ppe").
> + */
> + clocks = <&xo_board>,
[Severity: Medium]
Here nsscc consumes xo_board as its 24 MHz "xo" reference clock (expected by
ftbl_nss_cc_ppe_clk_src in drivers/clk/qcom/nsscc-ipq5210.c).
In arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts, the comments explain that the
board XO crystal (xo_clk) can be 48 MHz, 96 MHz, or 192 MHz, which is divided
down to a fixed 48 MHz WiFi output clock (ref_48mhz_clk), and xo_board is
routed from that 48 MHz WiFi output clock divided by 2:
/*
* The bootstrap pins for the board select the XO clock frequency that
* supports 48 MHz, 96 MHz or 192 MHz. This setting automatically
* enables the right dividers, to ensure the reference clock output
* from WiFi to the CMN PLL is 48 MHz.
*/
&ref_48mhz_clk {
clock-div = <1>;
clock-mult = <1>;
};
...
/*
* The frequency of xo_board is fixed to 24 MHz, which is routed
* from WiFi output clock 48 MHz divided by 2.
*/
&xo_board {
clock-div = <2>;
clock-mult = <1>;
};
However, in arch/arm64/boot/dts/qcom/ipq5210.dtsi (updated in commit
6f35f463dd9a ("arm64: dts: qcom: ipq5210: Convert xo_board to fixed factor
clock")), xo_board is parented to <&xo_clk> instead of <&ref_48mhz_clk>:
xo_board: xo-board-clk {
compatible = "fixed-factor-clock";
clocks = <&xo_clk>;
#clock-cells = <0>;
};
Unlike arch/arm64/boot/dts/qcom/ipq5424.dtsi (as well as ipq5332.dtsi and
ipq9574.dtsi), where xo_board uses clocks = <&ref_48mhz_clk>, parenting
xo_board directly to <&xo_clk> bypasses ref_48mhz_clk.
On IPQ5210 boards with a 96 MHz or 192 MHz xo_clk where xo_board uses
clock-div = <2>, wouldn't xo_board resolve to 48 MHz or 96 MHz instead of the
expected 24 MHz for nsscc, gcc, and sdhc? Should xo_board in ipq5210.dtsi have
clocks = <&ref_48mhz_clk> instead of <&xo_clk>?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261105-qcom_ipq5210_nsscc-v1-0-d4fcb5c32b51@oss.qualcomm.com?part=5
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-11-06 13:08 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-05 13:07 [PATCH 0/5] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
2026-11-05 13:07 ` [PATCH 1/5] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
2026-11-05 13:07 ` [PATCH 2/5] clk: qcom: Add NSS clock controller driver " Luo Jie
2026-11-06 13:08 ` sashiko-bot
2026-11-05 13:07 ` [PATCH 3/5] arm64: dts: qcom: ipq5210: Add CMN PLL device node Luo Jie
2026-11-05 13:07 ` [PATCH 4/5] arm64: dts: qcom: Update IPQ5210 xo_board to use fixed factor clock Luo Jie
2026-11-06 13:08 ` sashiko-bot
2026-11-05 13:07 ` [PATCH 5/5] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
2026-11-06 13:08 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox