* [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support
@ 2026-11-05 1:17 Hongliang Yang (杨宏亮)
2026-11-05 1:17 ` [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY Hongliang Yang (杨宏亮)
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Hongliang Yang (杨宏亮) @ 2026-11-05 1:17 UTC (permalink / raw)
To: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel,
Gary Yang (杨新伟),
Fugang Duan (段富刚)
Cc: linux-phy, linux-arm-kernel, devicetree, linux-kernel,
cix-kernel-upstream, Hongliang Yang (杨宏亮)
This series adds support for the USB3 PHY integrated in the CIX Sky1
SoC.
Patch 1 adds the device tree binding, patch 2 the PHY driver, and
patch 3 the SoC node plus the board enablement.
The PHY provides the SuperSpeed lanes for the Cadence USBSSP
controllers of the SoC. The block drives both USB3 lanes: it is
exposed as a single PHY provider with #phy-cells = <0>, and its
init/exit calls are reference counted so that both controllers can
share it.
Tested on Radxa Orion O6 (Sky1) together with the USBSSP controller
series: the PHY probes and USB 3.x devices enumerate at SuperSpeed.
The controller device tree nodes use the PHY phandle added here; the
USBSSP controller series is posted separately.
The series applies on top of v7.4-rc1.
Changes in v6:
- Drop the per-port child nodes; the PHY provider node itself is
referenced with #phy-cells = <0> and the driver exports a single
PHY instance shared by both controllers.
- Select REGMAP in the PHY Kconfig.
- Use dev_err_probe() for the reset, clock and regmap acquisition
failures in the probe path.
- Corrected the mail sender name: v5 was sent with a non-ASCII
display name in the From header, v6 uses the plain ASCII name
that matches the Signed-off-by.
Changes in v5:
- Documented the origin of the PHY initialization sequence.
- Return -ENODEV instead of -EINVAL when the OF match data is missing.
- Use dev_err_probe() when creating the child PHYs.
- Dropped the unused dev_set_drvdata() call.
- Guarded against underflow in sky1_u3phy_exit().
Changes in v4:
- Fixed the #size-cells property order and removed the unused phy.h
include and the redundant status properties of the PHY port nodes.
Hongliang Yang (3):
dt-bindings: phy: Add CIX Sky1 USB3 PHY
phy: cix: Add CIX Sky1 USB3 PHY driver
arm64: dts: cix: Add USB3 PHY nodes for Sky1
.../bindings/phy/cix,sky1-usb3-phy.yaml | 73 ++++
MAINTAINERS | 2 +
arch/arm64/boot/dts/cix/sky1-orion-o6.dts | 4 +
arch/arm64/boot/dts/cix/sky1.dtsi | 14 +
drivers/phy/Kconfig | 1 +
drivers/phy/Makefile | 1 +
drivers/phy/cix/Kconfig | 21 +
drivers/phy/cix/Makefile | 6 +
drivers/phy/cix/phy-cix-usb3.c | 404 ++++++++++++++++++
drivers/phy/cix/phy-cix-usbdp.h | 289 +++++++++++++
10 files changed, 815 insertions(+)
create mode 100644 Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml
create mode 100644 drivers/phy/cix/Kconfig
create mode 100644 drivers/phy/cix/Makefile
create mode 100644 drivers/phy/cix/phy-cix-usb3.c
create mode 100644 drivers/phy/cix/phy-cix-usbdp.h
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.54.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY
2026-11-05 1:17 [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Hongliang Yang (杨宏亮)
@ 2026-11-05 1:17 ` Hongliang Yang (杨宏亮)
2026-11-05 11:52 ` Krzysztof Kozlowski
2026-11-05 1:18 ` [PATCH v6 2/3] phy: cix: Add CIX Sky1 USB3 PHY driver Hongliang Yang (杨宏亮)
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Hongliang Yang (杨宏亮) @ 2026-11-05 1:17 UTC (permalink / raw)
To: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel,
Gary Yang (杨新伟),
Fugang Duan (段富刚)
Cc: linux-phy, linux-arm-kernel, devicetree, linux-kernel,
cix-kernel-upstream, Hongliang Yang (杨宏亮)
Add device tree binding for the CIX Sky1 USB3 PHY, a multi-port
SuperSpeedPlus PHY supporting up to two USB3 lanes. The PHY block
drives both lanes and all consumers share the same initialization
sequence, so the PHY provider node itself is referenced with a
single #phy-cells = <0> specifier.
Signed-off-by: Hongliang Yang <hongliang.yang@cixtech.com>
---
Changes in v6:
- Drop the per-port child nodes. The parent node is the PHY provider
with #phy-cells = <0>, as the block drives both lanes and the ports
share the initialization sequence.
---
.../bindings/phy/cix,sky1-usb3-phy.yaml | 73 +++++++++++++++++++
MAINTAINERS | 2 +
2 files changed, 75 insertions(+)
create mode 100644 Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml
diff --git a/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml b/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml
new file mode 100644
index 000000000000..dc471b387339
--- /dev/null
+++ b/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml
@@ -0,0 +1,73 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/phy/cix,sky1-usb3-phy.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: CIX Sky1 USB3 PHY
+
+maintainers:
+ - Hongliang Yang <hongliang.yang@cixtech.com>
+
+description:
+ The CIX Sky1 USB3 PHY is a multi-port SuperSpeedPlus PHY that
+ supports up to two USB3 lanes. The block drives both lanes and all
+ consumers share the same initialization sequence.
+
+properties:
+ compatible:
+ const: cix,sky1-usb3-phy
+
+ reg:
+ maxItems: 1
+
+ "#phy-cells":
+ const: 0
+
+ clocks:
+ items:
+ - description: APB register interface clock
+ - description: PHY reference clock
+
+ clock-names:
+ items:
+ - const: apb
+ - const: ref
+
+ resets:
+ items:
+ - description: PHY reset
+ - description: PHY APB preset
+
+ reset-names:
+ items:
+ - const: core
+ - const: apb
+
+required:
+ - compatible
+ - reg
+ - "#phy-cells"
+ - clocks
+ - clock-names
+ - resets
+ - reset-names
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/cix,sky1.h>
+ #include <dt-bindings/reset/cix,sky1-s5-system-control.h>
+
+ usb-phy@9210000 {
+ compatible = "cix,sky1-usb3-phy";
+ reg = <0x9210000 0x40000>;
+ #phy-cells = <0>;
+ clocks = <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>,
+ <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>;
+ clock-names = "apb", "ref";
+ resets = <&s5_syscon SKY1_USBPHY_SS_RST_N>,
+ <&s5_syscon SKY1_USBPHY_SS_PST_N>;
+ reset-names = "core", "apb";
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index 93abbb315065..b857e529e5e2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2903,8 +2903,10 @@ S: Maintained
T: git https://github.com/cixtech/linux-mainline.git
F: Documentation/devicetree/bindings/arm/cix.yaml
F: Documentation/devicetree/bindings/mailbox/cix,sky1-mbox.yaml
+F: Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml
F: arch/arm64/boot/dts/cix/
F: drivers/mailbox/cix-mailbox.c
+F: drivers/phy/cix/
K: \bcix\b
ARM/CLKDEV SUPPORT
--
2.54.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v6 2/3] phy: cix: Add CIX Sky1 USB3 PHY driver
2026-11-05 1:17 [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Hongliang Yang (杨宏亮)
2026-11-05 1:17 ` [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY Hongliang Yang (杨宏亮)
@ 2026-11-05 1:18 ` Hongliang Yang (杨宏亮)
2026-11-05 1:18 ` [PATCH v6 3/3] arm64: dts: cix: Add USB3 PHY nodes for Sky1 Hongliang Yang (杨宏亮)
2026-11-05 11:51 ` [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Krzysztof Kozlowski
3 siblings, 0 replies; 10+ messages in thread
From: Hongliang Yang (杨宏亮) @ 2026-11-05 1:18 UTC (permalink / raw)
To: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel,
Gary Yang (杨新伟),
Fugang Duan (段富刚)
Cc: linux-phy, linux-arm-kernel, devicetree, linux-kernel,
cix-kernel-upstream, Hongliang Yang (杨宏亮),
Conor Dooley
Add PHY driver for the USB3 PHY found on CIX Sky1 SoCs. The driver
handles initialization, reset, and clock management for the
multi-port USB3 PHY.
The PHY block drives both USB3 lanes, so a single PHY instance is
exported and its init/exit calls are reference counted, allowing both
controllers to share it.
Signed-off-by: Hongliang Yang <hongliang.yang@cixtech.com>
Reviewed-by: Conor Dooley <conor@kernel.org>
---
Changes in v6:
- Select REGMAP, the driver initializes the PHY registers through
regmap.
- Use dev_err_probe() for the reset, clock and regmap acquisition
failures.
- Export a single PHY instance instead of one PHY per usb-port child
node; the block drives both lanes and both consumers share it.
---
drivers/phy/Kconfig | 1 +
drivers/phy/Makefile | 1 +
drivers/phy/cix/Kconfig | 21 ++
drivers/phy/cix/Makefile | 6 +
drivers/phy/cix/phy-cix-usb3.c | 404 ++++++++++++++++++++++++++++++++
drivers/phy/cix/phy-cix-usbdp.h | 289 +++++++++++++++++++++++
6 files changed, 722 insertions(+)
create mode 100644 drivers/phy/cix/Kconfig
create mode 100644 drivers/phy/cix/Makefile
create mode 100644 drivers/phy/cix/phy-cix-usb3.c
create mode 100644 drivers/phy/cix/phy-cix-usbdp.h
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index 105fbe408aa2..876e5857634c 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -176,6 +176,7 @@ source "drivers/phy/axiado/Kconfig"
source "drivers/phy/broadcom/Kconfig"
source "drivers/phy/cadence/Kconfig"
source "drivers/phy/canaan/Kconfig"
+source "drivers/phy/cix/Kconfig"
source "drivers/phy/eswin/Kconfig"
source "drivers/phy/freescale/Kconfig"
source "drivers/phy/hisilicon/Kconfig"
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index c6dd02003bbe..5a31c5df1746 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_GENERIC_PHY) += allwinner/ \
broadcom/ \
cadence/ \
canaan/ \
+ cix/ \
eswin/ \
freescale/ \
hisilicon/ \
diff --git a/drivers/phy/cix/Kconfig b/drivers/phy/cix/Kconfig
new file mode 100644
index 000000000000..5b5e632557db
--- /dev/null
+++ b/drivers/phy/cix/Kconfig
@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Phy drivers for Cix PHYs
+#
+
+if ARCH_CIX || COMPILE_TEST
+
+config PHY_CIX_USB3
+ tristate "Cix USB3 PHY Driver"
+ depends on OF && HAS_IOMEM
+ select GENERIC_PHY
+ select REGMAP
+ help
+ Enable this to support the CIX USB3 PHY for TYPEA Connection.
+
+ This driver provides initialization and power management for
+ the USB3 PHY found on CIX Sky1 SoCs.
+
+ If unsure, say N.
+
+endif # ARCH_CIX || COMPILE_TEST
diff --git a/drivers/phy/cix/Makefile b/drivers/phy/cix/Makefile
new file mode 100644
index 000000000000..b46b1059b2ab
--- /dev/null
+++ b/drivers/phy/cix/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Makefile for the Cix phy drivers.
+#
+
+obj-$(CONFIG_PHY_CIX_USB3) += phy-cix-usb3.o
diff --git a/drivers/phy/cix/phy-cix-usb3.c b/drivers/phy/cix/phy-cix-usb3.c
new file mode 100644
index 000000000000..bc1a27eb75f5
--- /dev/null
+++ b/drivers/phy/cix/phy-cix-usb3.c
@@ -0,0 +1,404 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * phy driver for cdn_sd0803_t7g_typea
+ *
+ * Author: Hongliang Yang <hongliang.yang@cixtech.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of.h>
+#include <linux/property.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include "phy-cix-usbdp.h"
+
+struct cix_u3phy;
+
+struct cix_u3phy_cfg {
+ int (*u3phy_init)(struct cix_u3phy *u3phy);
+ int (*u3phy_exit)(struct cix_u3phy *u3phy);
+};
+
+/*
+ * Cadence SD0803 Type-A USB3 PHY initialization sequence for the CIX
+ * Sky1 SoC, taken from the vendor-provided PHY register programming
+ * sequence for this SoC.
+ */
+static const struct reg_sequence sky1_u3phy_conf[] = {
+ {CMN_SSM_BIAS_TMR, 0x0018},
+ {CMN_PLLSM0_PLLPRE_TMR, 0x0030},
+ {CMN_PLLSM0_PLLLOCK_TMR, 0x00f0},
+ {CMN_PLLSM1_PLLPRE_TMR, 0x0030},
+ {CMN_PLLSM1_PLLLOCK_TMR, 0x00f0},
+ {CMN_BGCAL_INIT_TMR, 0x0078},
+ {CMN_BGCAL_ITER_TMR, 0x0078},
+ {CMN_IBCAL_INIT_TMR, 0x0018},
+ {CMN_TXPUCAL_INIT_TMR, 0x001d},
+ {CMN_TXPDCAL_INIT_TMR, 0x001d},
+ {CMN_RXCAL_INIT_TMR, 0x02d0},
+ {CMN_SD_CAL_PLLCNT_START, 0x0137},
+ {RX_SDCAL0_INIT_TMR_LANE0, 0x0018},
+ {RX_SDCAL0_INIT_TMR_LANE1, 0x0018},
+ {RX_SDCAL0_ITER_TMR_LANE0, 0x0078},
+ {RX_SDCAL0_ITER_TMR_LANE1, 0x0078},
+ {RX_SDCAL1_INIT_TMR_LANE0, 0x0018},
+ {RX_SDCAL1_INIT_TMR_LANE1, 0x0018},
+ {RX_SDCAL1_ITER_TMR_LANE0, 0x0078},
+ {RX_SDCAL1_ITER_TMR_LANE1, 0x0078},
+ {TX_RCVDET_ST_TMR_LANE0, 0x0960},
+ {TX_RCVDET_ST_TMR_LANE1, 0x0960},
+
+ {PHY_PLL_CFG_0803, 0x0000},
+ {CMN_PDIAG_PLL0_CLK_SEL_M0, 0x8600},
+ {XCVR_DIAG_HSCLK_SEL_LANE0, 0x0000},
+ {XCVR_DIAG_HSCLK_SEL_LANE1, 0x0000},
+ {XCVR_DIAG_HSCLK_DIV_LANE0, 0x0001},
+ {XCVR_DIAG_HSCLK_DIV_LANE1, 0x0001},
+ {XCVR_DIAG_PLLDRC_CTRL_LANE0, 0x0041},
+ {XCVR_DIAG_PLLDRC_CTRL_LANE1, 0x0041},
+ {CMN_PLL0_DSM_DIAG_M0, 0x0004},
+ {CMN_PLL1_DSM_DIAG_M0, 0x0004},
+ {CMN_PDIAG_PLL1_ITRIM_M0, 0x003f},
+ {CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0b17},
+ {CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0b17},
+ {CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0e01},
+ {CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0e01},
+ {CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0d05},
+ {CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0d05},
+ {CMN_PLL0_INTDIV_M0, 0x01a0},
+ {CMN_PLL1_INTDIV_M0, 0x01a0},
+ {CMN_PLL0_FRACDIVL_M0, 0xaaab},
+ {CMN_PLL1_FRACDIVL_M0, 0xaaab},
+ {CMN_PLL0_FRACDIVH_M0, 0x0002},
+ {CMN_PLL1_FRACDIVH_M0, 0x0002},
+ {CMN_PLL0_HIGH_THR_M0, 0x0116},
+ {CMN_PLL1_HIGH_THR_M0, 0x0116},
+ {CMN_PDIAG_PLL0_CTRL_M0, 0x1002},
+ {CMN_PDIAG_PLL1_CTRL_M0, 0x1002},
+ {CMN_PLL0_SS_CTRL1_M0, 0x0001}, /* SSC enabled */
+ {CMN_PLL0_VCOCAL_INIT_TMR, 0x00f0},
+ {CMN_PLL1_VCOCAL_INIT_TMR, 0x00f0},
+ {CMN_PLL0_VCOCAL_ITER_TMR, 0x0004},
+ {CMN_PLL1_VCOCAL_ITER_TMR, 0x0004},
+ {CMN_PLL0_VCOCAL_REFTIM_START, 0x02f8},
+ {CMN_PLL1_VCOCAL_REFTIM_START, 0x02f8},
+ {CMN_PLL0_VCOCAL_PLLCNT_START, 0x02f8},
+ {CMN_PLL1_VCOCAL_PLLCNT_START, 0x02f8},
+ {CMN_PLL0_VCOCAL_TCTRL, 0x0003},
+ {CMN_PLL1_VCOCAL_TCTRL, 0x0003},
+ {CMN_PLL0_LOCK_REFCNT_START, 0x00bf},
+ {CMN_PLL1_LOCK_REFCNT_START, 0x00bf},
+ {CMN_PLL0_LOCK_PLLCNT_START, 0x00bf},
+ {CMN_PLL1_LOCK_PLLCNT_START, 0x00bf},
+ {CMN_PLL0_LOCK_PLLCNT_THR, 0x0003},
+ {CMN_PLL1_LOCK_PLLCNT_THR, 0x0003},
+ {PHY_PIPE_USB3_GEN2_PRE_CFG0_0803, 0x0a0a},
+ {PHY_PIPE_USB3_GEN2_POST_CFG0_0803, 0x1000},
+ {PHY_PIPE_USB3_GEN2_POST_CFG1_0803, 0x0010},
+ {CMN_CDIAG_CDB_PWRI_OVRD, 0x8200},
+ {CMN_CDIAG_XCVRC_PWRI_OVRD, 0x8200},
+ {TX_PSC_A0_LANE0, 0x02ff},
+ {TX_PSC_A0_LANE1, 0x02ff},
+ {TX_PSC_A1_LANE0, 0x06af},
+ {TX_PSC_A1_LANE1, 0x06af},
+ {TX_PSC_A2_LANE0, 0x06ae},
+ {TX_PSC_A2_LANE1, 0x06ae},
+ {TX_PSC_A3_LANE0, 0x06ae},
+ {TX_PSC_A3_LANE1, 0x06ae},
+ {RX_PSC_A0_LANE0, 0x0d1d},
+ {RX_PSC_A0_LANE1, 0x0d1d},
+ {RX_PSC_A1_LANE0, 0x0d1d},
+ {RX_PSC_A1_LANE1, 0x0d1d},
+ {RX_PSC_A2_LANE0, 0x0d00},
+ {RX_PSC_A2_LANE1, 0x0d00},
+ {RX_PSC_A3_LANE0, 0x0500},
+ {RX_PSC_A3_LANE1, 0x0500},
+ {TX_TXCC_CTRL_LANE0, 0x2a82},
+ {TX_TXCC_CTRL_LANE1, 0x2a82},
+ {TX_TXCC_CPOST_MULT_01_LANE0, 0x0014},
+ {TX_TXCC_CPOST_MULT_01_LANE1, 0x0014},
+ {TX_TXCC_MGNFS_MULT_000_LANE0, 0x0002},
+ {TX_TXCC_MGNFS_MULT_000_LANE1, 0x0002},
+ {RX_SIGDET_HL_FILT_TMR_LANE0, 0x0013},
+ {RX_SIGDET_HL_FILT_TMR_LANE1, 0x0013},
+ {RX_REE_GCSM1_CTRL_LANE0, 0x0000},
+ {RX_REE_GCSM1_CTRL_LANE1, 0x0000},
+ {RX_REE_ATTEN_THR_LANE0, 0x0c02},
+ {RX_REE_ATTEN_THR_LANE1, 0x0c02},
+ {RX_REE_SMGM_CTRL1_LANE0, 0x0330},
+ {RX_REE_SMGM_CTRL1_LANE1, 0x0330},
+ {RX_REE_SMGM_CTRL2_LANE0, 0x0300},
+ {RX_REE_SMGM_CTRL2_LANE1, 0x0300},
+ {XCVR_DIAG_PSC_OVRD_LANE0, 0x0003},
+ {XCVR_DIAG_PSC_OVRD_LANE1, 0x0003},
+ {RX_DIAG_SIGDET_TUNE_LANE0, 0x1004},
+ {RX_DIAG_SIGDET_TUNE_LANE1, 0x1004},
+ {RX_DIAG_NQST_CTRL_LANE0, 0x00f9},
+ {RX_DIAG_NQST_CTRL_LANE1, 0x00f9},
+ {RX_DIAG_DFE_AMP_TUNE_2_LANE0, 0x0c01},
+ {RX_DIAG_DFE_AMP_TUNE_2_LANE1, 0x0c01},
+ {RX_DIAG_DFE_AMP_TUNE_3_LANE0, 0x0002},
+ {RX_DIAG_DFE_AMP_TUNE_3_LANE1, 0x0002},
+ {RX_DIAG_PI_CAP_LANE0, 0x0000},
+ {RX_DIAG_PI_CAP_LANE1, 0x0000},
+ {RX_DIAG_PI_RATE_LANE0, 0x0031},
+ {RX_DIAG_PI_RATE_LANE1, 0x0031},
+ {RX_CDRLF_CNFG_LANE0, 0x018c},
+ {RX_CDRLF_CNFG_LANE1, 0x018c},
+ {RX_CDRLF_CNFG3_LANE0, 0x0003},
+ {RX_CDRLF_CNFG3_LANE1, 0x0003}
+};
+
+struct cix_u3phy {
+ struct device *dev;
+ void __iomem *base;
+ struct regmap *phy_regmap;
+ struct reset_control *preset;
+ struct reset_control *reset;
+ struct clk *apb_clk;
+ struct clk *ref_clk;
+ struct mutex mutex; /* mutex to protect access to individual PHYs */
+ bool init;
+ int init_count;
+ const struct cix_u3phy_cfg *cfg;
+};
+
+static int sky1_u3phy_exit(struct cix_u3phy *u3phy)
+{
+ if (WARN_ON(!u3phy->init_count))
+ return -EINVAL;
+
+ u3phy->init_count--;
+ if (u3phy->init && u3phy->init_count == 0) {
+ reset_control_assert(u3phy->reset);
+ reset_control_assert(u3phy->preset);
+ clk_disable_unprepare(u3phy->ref_clk);
+ clk_disable_unprepare(u3phy->apb_clk);
+ u3phy->init = false;
+ }
+ return 0;
+}
+
+static int sky1_u3phy_init(struct cix_u3phy *u3phy)
+{
+ int ret;
+
+ if (!u3phy->init) {
+ /* usb rcsu reset is default deassert */
+ reset_control_assert(u3phy->reset);
+ reset_control_assert(u3phy->preset);
+ ret = clk_prepare_enable(u3phy->apb_clk);
+ if (ret) {
+ dev_err(u3phy->dev, "Failed to prepare_enable u3phy apb clock\n");
+ return ret;
+ }
+ ret = clk_prepare_enable(u3phy->ref_clk);
+ if (ret) {
+ dev_err(u3phy->dev, "Failed to prepare_enable u3phy ref clock\n");
+ goto disable_apb_clk;
+ }
+ reset_control_deassert(u3phy->preset);
+ ret = regmap_multi_reg_write(u3phy->phy_regmap, sky1_u3phy_conf,
+ ARRAY_SIZE(sky1_u3phy_conf));
+ if (ret) {
+ dev_err(u3phy->dev, "Failed to write the reg sequence\n");
+ goto assert_reset_preset;
+ }
+ u3phy->init = true;
+ reset_control_deassert(u3phy->reset);
+ }
+ u3phy->init_count++;
+ return 0;
+
+assert_reset_preset:
+ reset_control_assert(u3phy->preset);
+ reset_control_assert(u3phy->reset);
+ clk_disable_unprepare(u3phy->ref_clk);
+disable_apb_clk:
+ clk_disable_unprepare(u3phy->apb_clk);
+ return ret;
+}
+
+static const struct cix_u3phy_cfg sky1_u3phy_cfg = {
+ .u3phy_init = sky1_u3phy_init,
+ .u3phy_exit = sky1_u3phy_exit
+};
+
+static int u3phy_regmap_write(void *context, unsigned int reg, unsigned int val)
+{
+ struct cix_u3phy *u3phy = context;
+ u32 offset = reg << 2;
+
+ writel(val, u3phy->base + offset);
+ return 0;
+}
+
+static int u3phy_regmap_read(void *context, unsigned int reg, unsigned int *val)
+{
+ struct cix_u3phy *u3phy = context;
+ u32 offset = reg << 2;
+
+ *val = readl(u3phy->base + offset);
+ return 0;
+}
+
+static const struct regmap_config cix_u3phy_regmap_cfg = {
+ .reg_bits = 32,
+ .reg_stride = 1,
+ .val_bits = 16,
+ .fast_io = true,
+ .reg_write = u3phy_regmap_write,
+ .reg_read = u3phy_regmap_read,
+};
+
+static int cix_usb3_phy_power_on(struct cix_u3phy *u3phy)
+{
+ int ret;
+ const struct cix_u3phy_cfg *phy_cfgs = u3phy->cfg;
+
+ if (phy_cfgs->u3phy_init) {
+ ret = phy_cfgs->u3phy_init(u3phy);
+ if (ret) {
+ dev_err(u3phy->dev, "failed to init udphy\n");
+ return ret;
+ }
+ }
+ return 0;
+}
+
+static int cix_usb3_phy_power_off(struct cix_u3phy *u3phy)
+{
+ int ret;
+ const struct cix_u3phy_cfg *phy_cfgs = u3phy->cfg;
+
+ if (phy_cfgs->u3phy_exit) {
+ ret = phy_cfgs->u3phy_exit(u3phy);
+ if (ret) {
+ dev_err(u3phy->dev, "failed to exit udphy\n");
+ return ret;
+ }
+ }
+ return 0;
+}
+
+static int cix_u3phy_init(struct phy *phy)
+{
+ struct cix_u3phy *u3phy = phy_get_drvdata(phy);
+ int ret = 0;
+
+ mutex_lock(&u3phy->mutex);
+ ret = cix_usb3_phy_power_on(u3phy);
+ mutex_unlock(&u3phy->mutex);
+ return ret;
+}
+
+static int cix_u3phy_exit(struct phy *phy)
+{
+ struct cix_u3phy *u3phy = phy_get_drvdata(phy);
+ int ret = 0;
+
+ mutex_lock(&u3phy->mutex);
+ ret = cix_usb3_phy_power_off(u3phy);
+ mutex_unlock(&u3phy->mutex);
+ return ret;
+}
+
+static const struct phy_ops cix_u3phy_ops = {
+ .init = cix_u3phy_init,
+ .exit = cix_u3phy_exit,
+ .owner = THIS_MODULE,
+};
+
+static int cix_u3phy_probe(struct platform_device *pdev)
+{
+ struct cix_u3phy *u3phy;
+ struct device *dev = &pdev->dev;
+ struct phy_provider *phy_provider;
+ struct device_node *np = dev->of_node;
+ struct phy *phy;
+ int ret;
+
+ u3phy = devm_kzalloc(dev, sizeof(*u3phy), GFP_KERNEL);
+ if (!u3phy)
+ return -ENOMEM;
+ u3phy->dev = dev;
+ u3phy->cfg = device_get_match_data(dev);
+ if (!u3phy->cfg) {
+ dev_err(dev, "no OF data can be matched with %pOF node\n", np);
+ return -ENODEV;
+ }
+ u3phy->reset = devm_reset_control_get_exclusive(dev, "core");
+ if (IS_ERR(u3phy->reset))
+ return dev_err_probe(dev, PTR_ERR(u3phy->reset),
+ "failed to get core reset\n");
+ u3phy->preset = devm_reset_control_get_exclusive(dev, "apb");
+ if (IS_ERR(u3phy->preset))
+ return dev_err_probe(dev, PTR_ERR(u3phy->preset),
+ "failed to get APB reset\n");
+ u3phy->apb_clk = devm_clk_get(dev, "apb");
+ if (IS_ERR(u3phy->apb_clk))
+ return dev_err_probe(dev, PTR_ERR(u3phy->apb_clk),
+ "failed to get APB clock\n");
+ u3phy->ref_clk = devm_clk_get(dev, "ref");
+ if (IS_ERR(u3phy->ref_clk))
+ return dev_err_probe(dev, PTR_ERR(u3phy->ref_clk),
+ "failed to get reference clock\n");
+ u3phy->base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(u3phy->base))
+ return PTR_ERR(u3phy->base);
+ u3phy->phy_regmap = devm_regmap_init(dev, NULL, u3phy, &cix_u3phy_regmap_cfg);
+ if (IS_ERR(u3phy->phy_regmap))
+ return dev_err_probe(dev, PTR_ERR(u3phy->phy_regmap),
+ "failed to init PHY regmap\n");
+ ret = devm_mutex_init(dev, &u3phy->mutex);
+ if (ret)
+ return ret;
+ /*
+ * The PHY block drives both USB3 lanes and both controllers share
+ * the same initialization sequence, so a single PHY instance is
+ * exported and its init/exit calls are reference counted.
+ */
+ phy = devm_phy_create(dev, NULL, &cix_u3phy_ops);
+ if (IS_ERR(phy))
+ return dev_err_probe(dev, PTR_ERR(phy), "failed to create phy\n");
+ phy_set_drvdata(phy, u3phy);
+
+ /* keep the PHY in reset until a consumer calls phy_init() */
+ reset_control_assert(u3phy->reset);
+ reset_control_assert(u3phy->preset);
+
+ phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
+ if (IS_ERR(phy_provider))
+ return dev_err_probe(dev, PTR_ERR(phy_provider),
+ "failed to register phy provider\n");
+ return 0;
+}
+
+static const struct of_device_id cix_u3phy_dt_match[] = {
+ {
+ .compatible = "cix,sky1-usb3-phy",
+ .data = &sky1_u3phy_cfg
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, cix_u3phy_dt_match);
+
+static struct platform_driver cix_usb3_phy_driver = {
+ .probe = cix_u3phy_probe,
+ .driver = {
+ .name = "cix-usb3-phy",
+ .of_match_table = cix_u3phy_dt_match,
+ },
+};
+
+module_platform_driver(cix_usb3_phy_driver);
+
+MODULE_AUTHOR("Hongliang Yang <hongliang.yang@cixtech.com>");
+MODULE_DESCRIPTION("Cix USB3 Only PHY driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/phy/cix/phy-cix-usbdp.h b/drivers/phy/cix/phy-cix-usbdp.h
new file mode 100644
index 000000000000..af88fc112a3e
--- /dev/null
+++ b/drivers/phy/cix/phy-cix-usbdp.h
@@ -0,0 +1,289 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _PHY_CIX_USBDP_H
+#define _PHY_CIX_USBDP_H
+
+#define CMN_SSM_BIAS_TMR 0x0022
+#define CMN_PLLSM0_PLLPRE_TMR 0x002a
+#define CMN_PLLSM0_PLLLOCK_TMR 0x002c
+#define CMN_PLLSM1_PLLPRE_TMR 0x0032
+#define CMN_PLLSM1_PLLLOCK_TMR 0x0034
+#define CMN_BGCAL_INIT_TMR 0x0064
+#define CMN_BGCAL_ITER_TMR 0x0065
+#define CMN_IBCAL_INIT_TMR 0x0074
+#define CMN_PLL0_SS_CTRL1_M0 0x0098
+#define CMN_PLL0_SS_CTRL2_M0 0x0099
+#define CMN_PLL0_SS_CTRL3_M0 0x009a
+#define CMN_PLL0_SS_CTRL4_M0 0x009b
+#define CMN_PLL1_SS_CTRL1_M0 0x00d8
+#define CMN_PLL1_SS_CTRL2_M0 0x00d9
+#define CMN_PLL1_SS_CTRL3_M0 0x00da
+#define CMN_PLL1_SS_CTRL4_M0 0x00db
+#define CMN_TXPUCAL_INIT_TMR 0x0104
+#define CMN_TXPDCAL_INIT_TMR 0x010c
+#define CMN_RXCAL_INIT_TMR 0x0114
+#define CMN_SD_CAL_PLLCNT_START 0x0128
+#define CMN_PDIAG_PLL1_ITRIM_M0 0x01c3
+#define CMN_DIAG_GPANA_0 0x01f0
+
+#define RX_SDCAL0_INIT_TMR_LANE0 0x8044
+#define RX_SDCAL0_INIT_TMR_LANE1 0x8244
+#define RX_SDCAL0_INIT_TMR_LANE2 0x8444
+#define RX_SDCAL0_INIT_TMR_LANE3 0x8644
+
+#define RX_SDCAL0_ITER_TMR_LANE0 0x8045
+#define RX_SDCAL0_ITER_TMR_LANE1 0x8245
+#define RX_SDCAL0_ITER_TMR_LANE2 0x8445
+#define RX_SDCAL0_ITER_TMR_LANE3 0x8645
+
+#define RX_SDCAL1_INIT_TMR_LANE0 0x804c
+#define RX_SDCAL1_INIT_TMR_LANE1 0x824c
+#define RX_SDCAL1_INIT_TMR_LANE2 0x844c
+#define RX_SDCAL1_INIT_TMR_LANE3 0x864c
+
+#define RX_SDCAL1_ITER_TMR_LANE0 0x804d
+#define RX_SDCAL1_ITER_TMR_LANE1 0x824d
+#define RX_SDCAL1_ITER_TMR_LANE2 0x844d
+#define RX_SDCAL1_ITER_TMR_LANE3 0x864d
+
+#define TX_RCVDET_ST_TMR_LANE0 0x4123
+#define TX_RCVDET_ST_TMR_LANE1 0x4323
+#define TX_RCVDET_ST_TMR_LANE2 0x4523
+#define TX_RCVDET_ST_TMR_LANE3 0x4723
+
+#define CMN_PDIAG_PLL0_CLK_SEL_M0 0x01a1
+#define CMN_PDIAG_PLL1_CLK_SEL_M0 0x01c1
+
+#define XCVR_DIAG_HSCLK_SEL_LANE0 0x40e6
+#define XCVR_DIAG_HSCLK_SEL_LANE1 0x42e6
+#define XCVR_DIAG_HSCLK_SEL_LANE2 0x44e6
+#define XCVR_DIAG_HSCLK_SEL_LANE3 0x46e6
+
+#define XCVR_DIAG_HSCLK_DIV_LANE0 0x40e7
+#define XCVR_DIAG_HSCLK_DIV_LANE1 0x42e7
+#define XCVR_DIAG_HSCLK_DIV_LANE2 0x44e7
+#define XCVR_DIAG_HSCLK_DIV_LANE3 0x46e7
+
+#define XCVR_DIAG_PLLDRC_CTRL_LANE0 0x40e5
+#define XCVR_DIAG_PLLDRC_CTRL_LANE1 0x42e5
+#define XCVR_DIAG_PLLDRC_CTRL_LANE2 0x44e5
+#define XCVR_DIAG_PLLDRC_CTRL_LANE3 0x46e5
+
+#define XCVR_DIAG_BIDI_CTRL_LANE0 0x40ea
+#define XCVR_DIAG_BIDI_CTRL_LANE1 0x42ea
+#define XCVR_DIAG_BIDI_CTRL_LANE2 0x44ea
+#define XCVR_DIAG_BIDI_CTRL_LANE3 0x46ea
+
+#define CMN_PLL0_DSM_DIAG_M0 0x0094
+#define CMN_PLL1_DSM_DIAG_M0 0x00d4
+#define CMN_PDIAG_PLL0_CP_PADJ_M0 0x01a4
+#define CMN_PDIAG_PLL1_CP_PADJ_M0 0x01c4
+
+#define CMN_PDIAG_PLL0_CP_IADJ_M0 0x01a5
+#define CMN_PDIAG_PLL1_CP_IADJ_M0 0x01c5
+#define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01a6
+#define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01c6
+
+#define CMN_PLL0_INTDIV_M0 0x0090
+#define CMN_PLL1_INTDIV_M0 0x00d0
+#define CMN_PLL0_FRACDIVL_M0 0x0091
+#define CMN_PLL1_FRACDIVL_M0 0x00d1
+
+#define CMN_PLL0_FRACDIVH_M0 0x0092
+#define CMN_PLL1_FRACDIVH_M0 0x00d2
+#define CMN_PLL0_HIGH_THR_M0 0x0093
+#define CMN_PLL1_HIGH_THR_M0 0x00d3
+
+#define CMN_PDIAG_PLL0_CTRL_M0 0x01a0
+#define CMN_PDIAG_PLL1_CTRL_M0 0x01c0
+
+#define CMN_PLL0_VCOCAL_TCTRL 0x0082
+#define CMN_PLL1_VCOCAL_TCTRL 0x00c2
+
+#define CMN_PLL0_VCOCAL_INIT_TMR 0x0084
+#define CMN_PLL1_VCOCAL_INIT_TMR 0x00c4
+
+#define CMN_PLL0_VCOCAL_ITER_TMR 0x0085
+#define CMN_PLL1_VCOCAL_ITER_TMR 0x00c5
+
+#define CMN_PLL0_VCOCAL_REFTIM_START 0x0086
+#define CMN_PLL1_VCOCAL_REFTIM_START 0x00c6
+
+#define CMN_PLL0_VCOCAL_PLLCNT_START 0x0088
+#define CMN_PLL1_VCOCAL_PLLCNT_START 0x00c8
+
+#define CMN_PLL0_LOCK_REFCNT_START 0x009c
+#define CMN_PLL1_LOCK_REFCNT_START 0x00dc
+
+#define CMN_PLL0_LOCK_PLLCNT_START 0x009e
+#define CMN_PLL1_LOCK_PLLCNT_START 0x00de
+
+#define CMN_PLL0_LOCK_PLLCNT_THR 0x009f
+#define CMN_PLL1_LOCK_PLLCNT_THR 0x00df
+
+#define PHY_PMA_LANE_MAP 0xc010
+#define PHY_LANE_OFF_CTRL 0xc011
+
+#define PHY_PIPE_USB3_GEN2_PRE_CFG0 0xc018
+#define PHY_PIPE_USB3_GEN2_POST_CFG0 0xc01a
+#define PHY_PIPE_USB3_GEN2_POST_CFG1 0xc01b
+
+#define CMN_CDIAG_CDB_PWRI_OVRD 0x0041
+#define CMN_CDIAG_XCVRC_PWRI_OVRD 0x0047
+
+#define TX_PSC_A0_LANE0 0x4100
+#define TX_PSC_A0_LANE1 0x4300
+#define TX_PSC_A0_LANE2 0x4500
+#define TX_PSC_A0_LANE3 0x4700
+
+#define TX_PSC_A1_LANE0 0x4101
+#define TX_PSC_A1_LANE1 0x4301
+#define TX_PSC_A1_LANE3 0x4701
+
+#define TX_PSC_A2_LANE0 0x4102
+#define TX_PSC_A2_LANE1 0x4302
+#define TX_PSC_A2_LANE2 0x4502
+#define TX_PSC_A2_LANE3 0x4702
+
+#define TX_PSC_A3_LANE0 0x4103
+#define TX_PSC_A3_LANE1 0x4303
+#define TX_PSC_A3_LANE2 0x4503
+#define TX_PSC_A3_LANE3 0x4703
+
+#define RX_PSC_A0_LANE0 0x8000
+#define RX_PSC_A0_LANE1 0x8200
+#define RX_PSC_A0_LANE2 0x8400
+#define RX_PSC_A0_LANE3 0x8600
+
+#define RX_PSC_A1_LANE0 0x8001
+#define RX_PSC_A1_LANE1 0x8201
+#define RX_PSC_A1_LANE2 0x8401
+
+#define RX_PSC_A2_LANE0 0x8002
+#define RX_PSC_A2_LANE1 0x8202
+#define RX_PSC_A2_LANE2 0x8402
+#define RX_PSC_A2_LANE3 0x8602
+
+#define RX_PSC_A3_LANE0 0x8003
+#define RX_PSC_A3_LANE1 0x8203
+#define RX_PSC_A3_LANE2 0x8403
+#define RX_PSC_A3_LANE3 0x8603
+
+#define RX_PSC_CAL_LANE0 0x8006
+#define RX_PSC_CAL_LANE1 0x8206
+#define RX_PSC_CAL_LANE2 0x8406
+#define RX_PSC_CAL_LANE3 0x8606
+
+#define TX_TXCC_CTRL_LANE0 0x4040
+#define TX_TXCC_CTRL_LANE1 0x4240
+#define TX_TXCC_CTRL_LANE2 0x4440
+#define TX_TXCC_CTRL_LANE3 0x4640
+
+#define TX_TXCC_CPOST_MULT_00_LANE0 0x404c
+#define TX_TXCC_CPOST_MULT_00_LANE1 0x424c
+#define TX_TXCC_CPOST_MULT_00_LANE2 0x444c
+#define TX_TXCC_CPOST_MULT_00_LANE3 0x464c
+
+#define TX_TXCC_CPOST_MULT_01_LANE0 0x404d
+#define TX_TXCC_CPOST_MULT_01_LANE1 0x424d
+#define TX_TXCC_CPOST_MULT_01_LANE3 0x464d
+
+#define TX_TXCC_MGNFS_MULT_000_LANE0 0x4050
+#define TX_TXCC_MGNFS_MULT_000_LANE1 0x4250
+#define TX_TXCC_MGNFS_MULT_000_LANE2 0x4450
+#define TX_TXCC_MGNFS_MULT_000_LANE3 0x4650
+
+#define TX_DIAG_ACYA_LANE0 0x41E7
+#define TX_DIAG_ACYA_LANE1 0x43E7
+#define TX_DIAG_ACYA_LANE2 0x45E7
+#define TX_DIAG_ACYA_LANE3 0x47E7
+
+#define DRV_DIAG_TX_DRV_LANE0 0x40c6
+#define DRV_DIAG_TX_DRV_LANE1 0x42c6
+#define DRV_DIAG_TX_DRV_LANE2 0x44c6
+#define DRV_DIAG_TX_DRV_LANE3 0x46c6
+
+#define RX_SIGDET_HL_FILT_TMR_LANE0 0x8090
+#define RX_SIGDET_HL_FILT_TMR_LANE1 0x8290
+#define RX_SIGDET_HL_FILT_TMR_LANE2 0x8490
+
+#define RX_REE_GCSM1_CTRL_LANE0 0x8108
+#define RX_REE_GCSM1_CTRL_LANE1 0x8308
+#define RX_REE_GCSM1_CTRL_LANE2 0x8508
+#define RX_REE_GCSM1_CTRL_LANE3 0x8708
+
+#define RX_REE_GCSM2_CTRL_LANE0 0x8110
+#define RX_REE_GCSM2_CTRL_LANE1 0x8310
+#define RX_REE_GCSM2_CTRL_LANE2 0x8510
+#define RX_REE_GCSM2_CTRL_LANE3 0x8710
+
+#define RX_REE_PERGCSM_CTRL_LANE0 0x8118
+#define RX_REE_PERGCSM_CTRL_LANE1 0x8318
+#define RX_REE_PERGCSM_CTRL_LANE2 0x8518
+#define RX_REE_PERGCSM_CTRL_LANE3 0x8718
+
+#define RX_REE_ATTEN_THR_LANE0 0x8149
+#define RX_REE_ATTEN_THR_LANE1 0x8349
+#define RX_REE_ATTEN_THR_LANE2 0x8549
+
+#define RX_REE_SMGM_CTRL1_LANE0 0x8177
+#define RX_REE_SMGM_CTRL1_LANE1 0x8377
+#define RX_REE_SMGM_CTRL1_LANE2 0x8577
+
+#define RX_REE_SMGM_CTRL2_LANE0 0x8178
+#define RX_REE_SMGM_CTRL2_LANE1 0x8378
+#define RX_REE_SMGM_CTRL2_LANE2 0x8578
+
+#define XCVR_DIAG_PSC_OVRD_LANE0 0x40eb
+#define XCVR_DIAG_PSC_OVRD_LANE1 0x42eb
+#define XCVR_DIAG_PSC_OVRD_LANE2 0x44eb
+
+#define RX_DIAG_SIGDET_TUNE_LANE0 0x81e8
+#define RX_DIAG_SIGDET_TUNE_LANE1 0x83e8
+#define RX_DIAG_SIGDET_TUNE_LANE2 0x85e8
+
+#define RX_DIAG_NQST_CTRL_LANE0 0x81e5
+#define RX_DIAG_NQST_CTRL_LANE1 0x83e5
+#define RX_DIAG_NQST_CTRL_LANE2 0x85e5
+
+#define RX_DIAG_DFE_AMP_TUNE_2_LANE0 0x81e2
+#define RX_DIAG_DFE_AMP_TUNE_2_LANE1 0x83e2
+#define RX_DIAG_DFE_AMP_TUNE_2_LANE2 0x85e2
+
+#define RX_DIAG_DFE_AMP_TUNE_3_LANE0 0x81e3
+#define RX_DIAG_DFE_AMP_TUNE_3_LANE1 0x83e3
+#define RX_DIAG_DFE_AMP_TUNE_3_LANE2 0x85e3
+
+#define RX_DIAG_PI_CAP_LANE0 0x81f5
+#define RX_DIAG_PI_CAP_LANE1 0x83f5
+#define RX_DIAG_PI_CAP_LANE2 0x85f5
+
+#define RX_DIAG_PI_RATE_LANE0 0x81f4
+#define RX_DIAG_PI_RATE_LANE1 0x83f4
+#define RX_DIAG_PI_RATE_LANE2 0x85f4
+
+#define RX_DIAG_ACYA_LANE0 0x81ff
+#define RX_DIAG_ACYA_LANE3 0x87ff
+
+#define RX_CDRLF_CNFG_LANE0 0x8080
+#define RX_CDRLF_CNFG_LANE1 0x8280
+#define RX_CDRLF_CNFG_LANE2 0x8480
+
+#define RX_CDRLF_CNFG3_LANE0 0x8082
+#define RX_CDRLF_CNFG3_LANE1 0x8282
+#define RX_CDRLF_CNFG3_LANE2 0x8482
+
+#define PHY_PMA_PLL_CTRL 0xe003
+
+#define PHY_PMA_ISO_PLL_CTRL0 0xe005
+#define PHY_PMA_ISO_PLL_CTRL1 0xe006
+
+/* Bits */
+
+#define PHY_PLL_CFG_0803 0xC00E
+/* 0803 phy register */
+#define PHY_PIPE_USB3_GEN2_PRE_CFG0_0803 0xc01c
+#define PHY_PIPE_USB3_GEN2_POST_CFG0_0803 0xc01e
+#define PHY_PIPE_USB3_GEN2_POST_CFG1_0803 0xc01f
+
+#endif
--
2.54.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v6 3/3] arm64: dts: cix: Add USB3 PHY nodes for Sky1
2026-11-05 1:17 [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Hongliang Yang (杨宏亮)
2026-11-05 1:17 ` [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY Hongliang Yang (杨宏亮)
2026-11-05 1:18 ` [PATCH v6 2/3] phy: cix: Add CIX Sky1 USB3 PHY driver Hongliang Yang (杨宏亮)
@ 2026-11-05 1:18 ` Hongliang Yang (杨宏亮)
2026-11-05 11:51 ` [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Krzysztof Kozlowski
3 siblings, 0 replies; 10+ messages in thread
From: Hongliang Yang (杨宏亮) @ 2026-11-05 1:18 UTC (permalink / raw)
To: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel,
Gary Yang (杨新伟),
Fugang Duan (段富刚)
Cc: linux-phy, linux-arm-kernel, devicetree, linux-kernel,
cix-kernel-upstream, Hongliang Yang (杨宏亮)
Add the USB3 PHY node for the CIX Sky1 SoC and enable the PHY on the
Radxa Orion O6 board.
Signed-off-by: Hongliang Yang <hongliang.yang@cixtech.com>
---
Changes in v6:
- Describe the PHY as a single provider with #phy-cells = <0> instead
of one child node per port.
---
arch/arm64/boot/dts/cix/sky1-orion-o6.dts | 4 ++++
arch/arm64/boot/dts/cix/sky1.dtsi | 14 ++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/arch/arm64/boot/dts/cix/sky1-orion-o6.dts b/arch/arm64/boot/dts/cix/sky1-orion-o6.dts
index e39c87774c12..5d57dd9ea299 100644
--- a/arch/arm64/boot/dts/cix/sky1-orion-o6.dts
+++ b/arch/arm64/boot/dts/cix/sky1-orion-o6.dts
@@ -117,3 +117,7 @@ &s5_gpio2 {
&uart2 {
status = "okay";
};
+
+&usb3_phy4 {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi b/arch/arm64/boot/dts/cix/sky1.dtsi
index 0a820f45feb9..c081b63a9848 100644
--- a/arch/arm64/boot/dts/cix/sky1.dtsi
+++ b/arch/arm64/boot/dts/cix/sky1.dtsi
@@ -606,6 +606,20 @@ mbox_ap2sfh: mailbox@80a0000 {
cix,mbox-dir = "tx";
};
+ usb3_phy4: usb-phy@9210000 {
+ compatible = "cix,sky1-usb3-phy";
+ reg = <0x00 0x09210000 0x00 0x40000>;
+ #phy-cells = <0>;
+ clocks = <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>,
+ <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>;
+ clock-names = "apb", "ref";
+ resets = <&s5_syscon SKY1_USBPHY_SS_RST_N>,
+ <&s5_syscon SKY1_USBPHY_SS_PST_N>;
+ reset-names = "core", "apb";
+
+ status = "disabled";
+ };
+
pcie_x8_rc: pcie@a010000 {
compatible = "cix,sky1-pcie-host";
reg = <0x00 0x0a010000 0x00 0x10000>,
--
2.54.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support
2026-11-05 1:17 [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Hongliang Yang (杨宏亮)
` (2 preceding siblings ...)
2026-11-05 1:18 ` [PATCH v6 3/3] arm64: dts: cix: Add USB3 PHY nodes for Sky1 Hongliang Yang (杨宏亮)
@ 2026-11-05 11:51 ` Krzysztof Kozlowski
2026-11-11 3:09 ` Hongliang Yang
3 siblings, 1 reply; 10+ messages in thread
From: Krzysztof Kozlowski @ 2026-11-05 11:51 UTC (permalink / raw)
To: Hongliang Yang (杨宏亮)
Cc: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel,
Gary Yang (杨新伟),
Fugang Duan (段富刚),
linux-phy, linux-arm-kernel, devicetree, linux-kernel,
cix-kernel-upstream
On Thu, Nov 05, 2026 at 01:17:56AM +0000, Hongliang Yang (杨宏亮) wrote:
> This series adds support for the USB3 PHY integrated in the CIX Sky1
> SoC.
>
> Patch 1 adds the device tree binding, patch 2 the PHY driver, and
> patch 3 the SoC node plus the board enablement.
>
> The PHY provides the SuperSpeed lanes for the Cadence USBSSP
> controllers of the SoC. The block drives both USB3 lanes: it is
> exposed as a single PHY provider with #phy-cells = <0>, and its
> init/exit calls are reference counted so that both controllers can
> share it.
>
> Tested on Radxa Orion O6 (Sky1) together with the USBSSP controller
> series: the PHY probes and USB 3.x devices enumerate at SuperSpeed.
>
> The controller device tree nodes use the PHY phandle added here; the
> USBSSP controller series is posted separately.
>
> The series applies on top of v7.4-rc1.
>
> Changes in v6:
> - Drop the per-port child nodes; the PHY provider node itself is
> referenced with #phy-cells = <0> and the driver exports a single
> PHY instance shared by both controllers.
> - Select REGMAP in the PHY Kconfig.
> - Use dev_err_probe() for the reset, clock and regmap acquisition
> failures in the probe path.
> - Corrected the mail sender name: v5 was sent with a non-ASCII
> display name in the From header, v6 uses the plain ASCII name
> that matches the Signed-off-by.
No, you did not.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY
2026-11-05 1:17 ` [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY Hongliang Yang (杨宏亮)
@ 2026-11-05 11:52 ` Krzysztof Kozlowski
2026-11-11 3:09 ` Hongliang Yang
0 siblings, 1 reply; 10+ messages in thread
From: Krzysztof Kozlowski @ 2026-11-05 11:52 UTC (permalink / raw)
To: Hongliang Yang (杨宏亮)
Cc: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel,
Gary Yang (杨新伟),
Fugang Duan (段富刚),
linux-phy, linux-arm-kernel, devicetree, linux-kernel,
cix-kernel-upstream
On Thu, Nov 05, 2026 at 01:17:59AM +0000, Hongliang Yang (杨宏亮) wrote:
> Add device tree binding for the CIX Sky1 USB3 PHY, a multi-port
> SuperSpeedPlus PHY supporting up to two USB3 lanes. The PHY block
> drives both lanes and all consumers share the same initialization
> sequence, so the PHY provider node itself is referenced with a
> single #phy-cells = <0> specifier.
So previously you had two phys, now you have only one. Confusing. Where
did the second phy go?
>
> Signed-off-by: Hongliang Yang <hongliang.yang@cixtech.com>
Same issue as last time.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support
2026-11-05 11:51 ` [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Krzysztof Kozlowski
@ 2026-11-11 3:09 ` Hongliang Yang
2026-11-11 7:51 ` Krzysztof Kozlowski
0 siblings, 1 reply; 10+ messages in thread
From: Hongliang Yang @ 2026-11-11 3:09 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Hongliang Yang, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Philipp Zabel, Gary Yang, Fugang Duan, linux-phy,
linux-arm-kernel, devicetree, linux-kernel, cix-kernel-upstream
> > Corrected the mail sender name: v5 was sent with a non-ASCII
> > display name in the From header, v6 uses the plain ASCII name
> > that matches the Signed-off-by.
>
> No, you did not.
You are right, I did not, and the changelog claim was wrong. The From
of the v6 PHY series still carried the non-ASCII display name:
From: Hongliang Yang (杨宏亮) <hongliang.yang@cixtech.com>
The mail system rewrites the display name of outgoing mail from the
account name, so the change did not survive the trip to the list, and I
wrote the changelog entry before checking what actually arrived.
It is fixed now. The USBSSP controller v7 series, sent on Nov 6, arrived
with
From: Hongliang Yang <hongliang.yang@cixtech.com>
and the PHY v7 series will be sent the same way. I will check the
archived copy of the outgoing mail before claiming it again.
Best regards,
Hongliang Yang
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY
2026-11-05 11:52 ` Krzysztof Kozlowski
@ 2026-11-11 3:09 ` Hongliang Yang
2026-11-11 7:52 ` Krzysztof Kozlowski
0 siblings, 1 reply; 10+ messages in thread
From: Hongliang Yang @ 2026-11-11 3:09 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Hongliang Yang, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Philipp Zabel, Gary Yang, Fugang Duan, linux-phy,
linux-arm-kernel, devicetree, linux-kernel, cix-kernel-upstream
> So previously you had two phys, now you have only one. Confusing. Where
> did the second phy go?
The second PHY did not go anywhere. It is the second lane of the same
block, and it has no resources of its own.
v5 described one child node per lane:
usb-phy@9210000 {
...
usb-port@0 {
reg = <0>;
#phy-cells = <0>;
};
usb-port@1 {
reg = <1>;
#phy-cells = <0>;
};
};
Those child nodes had no register range, clocks or resets of their own;
everything they described belongs to the parent. Both lanes are
programmed through the same register block, with the same clocks and
resets, and by the same initialization sequence, so a consumer has
nothing to configure per lane. The two children only mirrored the two
controllers.
v6 makes the parent the provider, with #phy-cells = <0>, and both
controllers reference the same phandle:
usb3_phy4: usb-phy@9210000 {
compatible = "cix,sky1-usb3-phy";
reg = <0x9210000 0x40000>;
clocks = <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>,
<&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>;
clock-names = "apb", "ref";
resets = <&s5_syscon SKY1_USBPHY_SS_RST_N>,
<&s5_syscon SKY1_USBPHY_SS_PST_N>;
reset-names = "core", "apb";
#phy-cells = <0>;
};
&usb4 {
phys = <&usb3_phy4>;
phy-names = "cdns3,usb3-phy";
};
&usb5 {
phys = <&usb3_phy4>;
phy-names = "cdns3,usb3-phy";
};
The driver reference counts phy_init() and phy_exit(), so the block is
initialized once, when the first consumer comes up, and stays powered
while any of the two is active.
The v6 changelog only said that the per-port child nodes were dropped and
did not say why, which is what made the change look like a PHY had gone
missing. The binding description and the commit message of v7 state the
reason, and I will resend the series with that.
Also, the example in the USBSSP binding still referenced two phandles in
the v5 form, which did not help; that is fixed in the USB series.
Best regards,
Hongliang Yang
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support
2026-11-11 3:09 ` Hongliang Yang
@ 2026-11-11 7:51 ` Krzysztof Kozlowski
0 siblings, 0 replies; 10+ messages in thread
From: Krzysztof Kozlowski @ 2026-11-11 7:51 UTC (permalink / raw)
To: Hongliang Yang
Cc: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel, Gary Yang,
Fugang Duan, linux-phy, linux-arm-kernel, devicetree,
linux-kernel, cix-kernel-upstream
On 11/11/2026 04:09, Hongliang Yang wrote:
>>> Corrected the mail sender name: v5 was sent with a non-ASCII
>>> display name in the From header, v6 uses the plain ASCII name
>>> that matches the Signed-off-by.
>>
>> No, you did not.
>
> You are right, I did not, and the changelog claim was wrong. The From
LLM reply? Just be aware that's straight way to become deprioritized in
maintianer's queue.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY
2026-11-11 3:09 ` Hongliang Yang
@ 2026-11-11 7:52 ` Krzysztof Kozlowski
0 siblings, 0 replies; 10+ messages in thread
From: Krzysztof Kozlowski @ 2026-11-11 7:52 UTC (permalink / raw)
To: Hongliang Yang
Cc: Vinod Koul, Neil Armstrong, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Philipp Zabel, Gary Yang,
Fugang Duan, linux-phy, linux-arm-kernel, devicetree,
linux-kernel, cix-kernel-upstream
On 11/11/2026 04:09, Hongliang Yang wrote:
>> So previously you had two phys, now you have only one. Confusing. Where
>> did the second phy go?
>
> The second PHY did not go anywhere. It is the second lane of the same
> block, and it has no resources of its own.
>
> v5 described one child node per lane:
>
> usb-phy@9210000 {
> ...
> usb-port@0 {
> reg = <0>;
> #phy-cells = <0>;
> };
>
> usb-port@1 {
> reg = <1>;
> #phy-cells = <0>;
> };
> };
>
This clearly shows two phys - each node with cell=0, means each having
one phy. Two nodes, so two phys.
> Those child nodes had no register range, clocks or resets of their own;
> everything they described belongs to the parent. Both lanes are
> programmed through the same register block, with the same clocks and
> resets, and by the same initialization sequence, so a consumer has
> nothing to configure per lane. The two children only mirrored the two
> controllers.
>
> v6 makes the parent the provider, with #phy-cells = <0>, and both
> controllers reference the same phandle:
>
> usb3_phy4: usb-phy@9210000 {
> compatible = "cix,sky1-usb3-phy";
> reg = <0x9210000 0x40000>;
> clocks = <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>,
> <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>;
> clock-names = "apb", "ref";
> resets = <&s5_syscon SKY1_USBPHY_SS_RST_N>,
> <&s5_syscon SKY1_USBPHY_SS_PST_N>;
> reset-names = "core", "apb";
> #phy-cells = <0>;
> };
I saw the code, why are you pasting the same? What happened with the
second phy?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-11-11 7:52 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-05 1:17 [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Hongliang Yang (杨宏亮)
2026-11-05 1:17 ` [PATCH v6 1/3] dt-bindings: phy: Add CIX Sky1 USB3 PHY Hongliang Yang (杨宏亮)
2026-11-05 11:52 ` Krzysztof Kozlowski
2026-11-11 3:09 ` Hongliang Yang
2026-11-11 7:52 ` Krzysztof Kozlowski
2026-11-05 1:18 ` [PATCH v6 2/3] phy: cix: Add CIX Sky1 USB3 PHY driver Hongliang Yang (杨宏亮)
2026-11-05 1:18 ` [PATCH v6 3/3] arm64: dts: cix: Add USB3 PHY nodes for Sky1 Hongliang Yang (杨宏亮)
2026-11-05 11:51 ` [PATCH v6 0/3] phy: Add CIX Sky1 USB3 PHY support Krzysztof Kozlowski
2026-11-11 3:09 ` Hongliang Yang
2026-11-11 7:51 ` Krzysztof Kozlowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®