* [PATCH v2 0/3] clk: qcom: Add NSS clock controller support for IPQ5210 SoC
@ 2026-11-11 10:00 Luo Jie
2026-11-11 10:00 ` [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Luo Jie @ 2026-11-11 10:00 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Luo Jie, Richard Cochran,
Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei
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/3 dt-bindings + clock/reset/interconnect ID headers for IPQ5210 NSSCC
2/3 NSS clock controller driver for IPQ5210
3/3 DTS: add NSS clock controller node in ipq5210.dtsi
Changes in v2:
- Use RUNTIME_PM_OPS() and pm_ptr() for dev_pm_ops.
- Rebase on next-20261110; drop the CMN PLL DTS patches, which are now
merged.
- Link to v1: https://patch.msgid.link/20261105-qcom_ipq5210_nsscc-v1-0-d4fcb5c32b51@oss.qualcomm.com
---
Luo Jie (3):
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 NSS clock controller node
.../bindings/clock/qcom,ipq9574-nsscc.yaml | 47 +-
arch/arm64/boot/dts/qcom/ipq5210.dtsi | 40 +
drivers/clk/qcom/Kconfig | 12 +
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/nsscc-ipq5210.c | 2202 ++++++++++++++++++++
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 +
8 files changed, 2483 insertions(+), 3 deletions(-)
---
base-commit: 793807ca13bf3072fc6d16ce6d90e9ab9beff2a5
change-id: 20261104-qcom_ipq5210_nsscc-fe4b2c8d4d18
Best regards,
--
Luo Jie <jie.luo@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller for IPQ5210 SoC
2026-11-11 10:00 [PATCH v2 0/3] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
@ 2026-11-11 10:00 ` Luo Jie
2026-11-12 10:57 ` Krzysztof Kozlowski
2026-11-11 10:00 ` [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver " Luo Jie
2026-11-11 10:00 ` [PATCH v2 3/3] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
2 siblings, 1 reply; 8+ messages in thread
From: Luo Jie @ 2026-11-11 10:00 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Luo Jie, Richard Cochran,
Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei
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] 8+ messages in thread
* [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
2026-11-11 10:00 [PATCH v2 0/3] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
2026-11-11 10:00 ` [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
@ 2026-11-11 10:00 ` Luo Jie
2026-11-11 14:30 ` Abel Vesa
2026-11-12 10:01 ` sashiko-bot
2026-11-11 10:00 ` [PATCH v2 3/3] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
2 siblings, 2 replies; 8+ messages in thread
From: Luo Jie @ 2026-11-11 10:00 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Luo Jie, Richard Cochran,
Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei
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 | 2202 ++++++++++++++++++++++++++++++++++++++
3 files changed, 2215 insertions(+)
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
index e6c58e8b1849..a63f568b1405 100644
--- a/drivers/clk/qcom/Kconfig
+++ b/drivers/clk/qcom/Kconfig
@@ -737,6 +737,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 f84d7343a3a4..a0d9b50f2caf 100644
--- a/drivers/clk/qcom/Makefile
+++ b/drivers/clk/qcom/Makefile
@@ -81,6 +81,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..97673d01c956
--- /dev/null
+++ b/drivers/clk/qcom/nsscc-ipq5210.c
@@ -0,0 +1,2202 @@
+// 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/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 = {
+ 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 = pm_ptr(&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] 8+ messages in thread
* [PATCH v2 3/3] arm64: dts: qcom: ipq5210: Add NSS clock controller node
2026-11-11 10:00 [PATCH v2 0/3] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
2026-11-11 10:00 ` [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
2026-11-11 10:00 ` [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver " Luo Jie
@ 2026-11-11 10:00 ` Luo Jie
2026-11-12 10:01 ` sashiko-bot
2 siblings, 1 reply; 8+ messages in thread
From: Luo Jie @ 2026-11-11 10:00 UTC (permalink / raw)
To: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Luo Jie, Richard Cochran,
Konrad Dybcio
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei
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] 8+ messages in thread
* Re: [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
2026-11-11 10:00 ` [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver " Luo Jie
@ 2026-11-11 14:30 ` Abel Vesa
2026-11-12 10:01 ` sashiko-bot
1 sibling, 0 replies; 8+ messages in thread
From: Abel Vesa @ 2026-11-11 14:30 UTC (permalink / raw)
To: Luo Jie
Cc: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio,
linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei
On 26-11-11 02:00:56, Luo Jie wrote:
> 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>
Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver for IPQ5210 SoC
2026-11-11 10:00 ` [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver " Luo Jie
2026-11-11 14:30 ` Abel Vesa
@ 2026-11-12 10:01 ` sashiko-bot
1 sibling, 0 replies; 8+ messages in thread
From: sashiko-bot @ 2026-11-12 10:01 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] clk: qcom: nsscc-ipq5210: CLK_SET_RATE_PARENT on XGMAC PTP
dividers
--
commit ba0d35b1d755dedd51b7ae9f8752c3443ce8f41c
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 IPQ5210, providing
clocks, resets, and interconnect clock paths for the networking subsystem.
> diff --git a/drivers/clk/qcom/nsscc-ipq5210.c b/drivers/clk/qcom/nsscc-ipq5210.c
> new file mode 100644
> index 0000000000000..97673d01c9569
> --- /dev/null
> +++ b/drivers/clk/qcom/nsscc-ipq5210.c
> @@ -0,0 +1,2202 @@
[ ... ]
> +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,
> + },
> +};
[Severity: Medium]
Should nss_cc_xgmac0_ptp_ref_div_clk_src,
nss_cc_xgmac1_ptp_ref_div_clk_src, and nss_cc_xgmac2_ptp_ref_div_clk_src
omit CLK_SET_RATE_PARENT now that they use writable clk_regmap_div_ops
(like nss_cc_uniphy_port1_rx_div4_clk_src)?
Because these 4-bit dividers can only divide the 429 MHz parent down to
429000000 / 16 = 26812500 Hz, requesting a PTP reference rate of 25 MHz or
24 MHz causes clk_divider_bestdiv() (with CLK_DIVIDER_ROUND_CLOSEST) to
select F(24000000, P_XO, 1, 0, 0) on nss_cc_ppe_clk_src. That reparents
the shared nss_cc_ppe_clk_src root clock from 429 MHz to the 24 MHz XO,
throttling the PPE switch, EDMA, MACs, PON, and NSSNOC PPE.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261111-qcom_ipq5210_nsscc-v2-0-7e2c1dda3ed2@oss.qualcomm.com?part=2
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 3/3] arm64: dts: qcom: ipq5210: Add NSS clock controller node
2026-11-11 10:00 ` [PATCH v2 3/3] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
@ 2026-11-12 10:01 ` sashiko-bot
0 siblings, 0 replies; 8+ messages in thread
From: sashiko-bot @ 2026-11-12 10:01 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 f6342940567706c16d7408b991562c108f13f6b3
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 blocks.
> 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>,
> + <&cmn_pll IPQ5210_PPE_CLK>,
[Severity: Medium]
Should xo_board be parented to <&ref_48mhz_clk> instead of <&xo_clk>?
arch/arm64/boot/dts/qcom/ipq5210.dtsi:
ref_48mhz_clk: ref-48mhz-clk {
compatible = "fixed-factor-clock";
clocks = <&xo_clk>;
#clock-cells = <0>;
};
...
xo_board: xo-board-clk {
compatible = "fixed-factor-clock";
clocks = <&xo_clk>;
#clock-cells = <0>;
};
arch/arm64/boot/dts/qcom/ipq5210-rdp504.dts notes that xo_clk can be
48 MHz, 96 MHz, or 192 MHz, which the WiFi block divides down to the
48 MHz ref_48mhz_clk, and that xo_board is a fixed 24 MHz clock routed
from that 48 MHz WiFi output clock divided by 2. Because xo_board uses
<&xo_clk> as its parent instead of <&ref_48mhz_clk> (unlike
ipq5424.dtsi, ipq5332.dtsi, and ipq9574.dtsi), on boards with a 96 MHz
or 192 MHz xo_clk, xo_board will resolve to 48 MHz or 96 MHz instead of
24 MHz, supplying the wrong XO reference rate to nsscc, gcc, and sdhc.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261111-qcom_ipq5210_nsscc-v2-0-7e2c1dda3ed2@oss.qualcomm.com?part=3
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller for IPQ5210 SoC
2026-11-11 10:00 ` [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
@ 2026-11-12 10:57 ` Krzysztof Kozlowski
0 siblings, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2026-11-12 10:57 UTC (permalink / raw)
To: Luo Jie
Cc: Bjorn Andersson, Abel Vesa, Stephen Boyd, Brian Masney,
Jerome Brunet, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Georgi Djakov, Philipp Zabel, Richard Cochran, Konrad Dybcio,
linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-pm,
netdev, quic_kkumarcs, quic_linchen, quic_leiwei
On Wed, Nov 11, 2026 at 02:00:55AM -0800, Luo Jie wrote:
> 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
Please place minItems at the beginning, before "items:".
>
> '#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
Same here
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-11-12 10:57 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-11 10:00 [PATCH v2 0/3] clk: qcom: Add NSS clock controller support for IPQ5210 SoC Luo Jie
2026-11-11 10:00 ` [PATCH v2 1/3] dt-bindings: clock: qcom: Add NSS clock controller " Luo Jie
2026-11-12 10:57 ` Krzysztof Kozlowski
2026-11-11 10:00 ` [PATCH v2 2/3] clk: qcom: Add NSS clock controller driver " Luo Jie
2026-11-11 14:30 ` Abel Vesa
2026-11-12 10:01 ` sashiko-bot
2026-11-11 10:00 ` [PATCH v2 3/3] arm64: dts: qcom: ipq5210: Add NSS clock controller node Luo Jie
2026-11-12 10:01 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox