Re: [PATCH 1/2] phy: qcom: add Synopsys eUSB2 PHY driver

2024-04-05 Thread Neil Armstrong

On 05/04/2024 10:35, Neil Armstrong wrote:

Add a driver for the new Synopsys eUSB2 PHY found in the SM8550
and SM8650 SoCs.

Signed-off-by: Neil Armstrong 
---
  drivers/phy/qcom/Kconfig   |   8 +
  drivers/phy/qcom/Makefile  |   1 +
  drivers/phy/qcom/phy-qcom-snps-eusb2.c | 365 +
  3 files changed, 374 insertions(+)

diff --git a/drivers/phy/qcom/Kconfig b/drivers/phy/qcom/Kconfig
index b9fe608c279..3aae1813352 100644
--- a/drivers/phy/qcom/Kconfig
+++ b/drivers/phy/qcom/Kconfig
@@ -27,6 +27,14 @@ config PHY_QCOM_USB_SNPS_FEMTO_V2
  High-Speed PHY driver. This driver supports the Hi-Speed PHY which
  is usually paired with Synopsys DWC3 USB IPs on MSM SOCs.
  
+config PHY_QCOM_SNPS_EUSB2

+   tristate "Qualcomm Synopsys eUSB2 High-Speed PHY"
+   depends on PHY && ARCH_SNAPDRAGON
+   help
+ Enable this to support the Qualcomm Synopsys DesignWare eUSB2
+ High-Speed PHY driver. This driver supports the Hi-Speed PHY which
+ is usually paired with Synopsys DWC3 USB IPs on MSM SOCs.
+
  config PHY_QCOM_USB_HS_28NM
tristate "Qualcomm 28nm High-Speed PHY"
depends on PHY && ARCH_SNAPDRAGON
diff --git a/drivers/phy/qcom/Makefile b/drivers/phy/qcom/Makefile
index 5f4db4a5378..a5153061dfb 100644
--- a/drivers/phy/qcom/Makefile
+++ b/drivers/phy/qcom/Makefile
@@ -2,5 +2,6 @@ obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
  obj-$(CONFIG_MSM8916_USB_PHY) += msm8916-usbh-phy.o
  obj-$(CONFIG_PHY_QCOM_QUSB2) += phy-qcom-qusb2.o
  obj-$(CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2) += phy-qcom-snps-femto-v2.o
+obj-$(CONFIG_PHY_QCOM_SNPS_EUSB2) += phy-qcom-snps-eusb2.o
  obj-$(CONFIG_PHY_QCOM_USB_HS_28NM) += phy-qcom-usb-hs-28nm.o
  obj-$(CONFIG_PHY_QCOM_USB_SS) += phy-qcom-usb-ss.o
diff --git a/drivers/phy/qcom/phy-qcom-snps-eusb2.c 
b/drivers/phy/qcom/phy-qcom-snps-eusb2.c
new file mode 100644
index 000..853b88458b7
--- /dev/null
+++ b/drivers/phy/qcom/phy-qcom-snps-eusb2.c
@@ -0,0 +1,365 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2023-2024, Linaro Limited
+ *
+ * Based on the Linux phy-qcom-snps-eusb2.c driver
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define USB_PHY_UTMI_CTRL0 (0x3c)
+#define SLEEPM BIT(0)
+#define OPMODE_MASKGENMASK(4, 3)
+#define OPMODE_NONDRIVING  BIT(3)
+
+#define USB_PHY_UTMI_CTRL5 (0x50)
+#define PORBIT(1)
+
+#define USB_PHY_HS_PHY_CTRL_COMMON0(0x54)
+#define PHY_ENABLE BIT(0)
+#define SIDDQ_SEL  BIT(1)
+#define SIDDQ  BIT(2)
+#define RETENABLEN BIT(3)
+#define FSEL_MASK  GENMASK(6, 4)
+#define FSEL_19_2_MHZ_VAL  (0x0)
+#define FSEL_38_4_MHZ_VAL  (0x4)
+
+#define USB_PHY_CFG_CTRL_1 (0x58)
+#define PHY_CFG_PLL_CPBIAS_CNTRL_MASK  GENMASK(7, 1)
+
+#define USB_PHY_CFG_CTRL_2 (0x5c)
+#define PHY_CFG_PLL_FB_DIV_7_0_MASKGENMASK(7, 0)
+#define DIV_7_0_19_2_MHZ_VAL   (0x90)
+#define DIV_7_0_38_4_MHZ_VAL   (0xc8)
+
+#define USB_PHY_CFG_CTRL_3 (0x60)
+#define PHY_CFG_PLL_FB_DIV_11_8_MASK   GENMASK(3, 0)
+#define DIV_11_8_19_2_MHZ_VAL  (0x1)
+#define DIV_11_8_38_4_MHZ_VAL  (0x0)
+
+#define PHY_CFG_PLL_REF_DIVGENMASK(7, 4)
+#define PLL_REF_DIV_VAL(0x0)
+
+#define USB_PHY_HS_PHY_CTRL2   (0x64)
+#define VBUSVLDEXT0BIT(0)
+#define USB2_SUSPEND_N BIT(2)
+#define USB2_SUSPEND_N_SEL BIT(3)
+#define VBUS_DET_EXT_SEL   BIT(4)
+
+#define USB_PHY_CFG_CTRL_4 (0x68)
+#define PHY_CFG_PLL_GMP_CNTRL_MASK GENMASK(1, 0)
+#define PHY_CFG_PLL_INT_CNTRL_MASK GENMASK(7, 2)
+
+#define USB_PHY_CFG_CTRL_5 (0x6c)
+#define PHY_CFG_PLL_PROP_CNTRL_MASKGENMASK(4, 0)
+#define PHY_CFG_PLL_VREF_TUNE_MASK GENMASK(7, 6)
+
+#define USB_PHY_CFG_CTRL_6 (0x70)
+#define PHY_CFG_PLL_VCO_CNTRL_MASK GENMASK(2, 0)
+
+#define USB_PHY_CFG_CTRL_7 (0x74)
+
+#define USB_PHY_CFG_CTRL_8 (0x78)
+#define PHY_CFG_TX_FSLS_VREF_TUNE_MASK GENMASK(1, 0)
+#define PHY_CFG_TX_FSLS_VREG_BYPASSBIT(2)
+#define PHY_CFG_TX_HS_VREF_TUNE_MASK   GENMASK(5, 3)
+#define PHY_CFG_TX_HS_XV_TUNE_MASK GENMASK(7, 6)
+
+#define USB_PHY_CFG_CTRL_9 (0x7c)
+#define PHY_CFG_TX_PREEMP_TUNE_MASKGENMASK(2, 0)
+#define PHY_CFG_TX_RES_TUNE_MASK   GENMASK(4, 3)
+#define PHY_CFG_TX_RISE_TUNE_MASK  GENMASK(6, 5)
+#define PHY_CFG_RCAL_BYPASSBIT(7)
+
+#define USB_PHY_CFG_CTRL_10(0x80)
+
+#define USB_PHY_CFG0   (0x94)
+#define DATAPATH_CTRL_OVERRIDE_EN  BIT(0)
+#define 

[PATCH 1/2] phy: qcom: add Synopsys eUSB2 PHY driver

2024-04-05 Thread Neil Armstrong
Add a driver for the new Synopsys eUSB2 PHY found in the SM8550
and SM8650 SoCs.

Signed-off-by: Neil Armstrong 
---
 drivers/phy/qcom/Kconfig   |   8 +
 drivers/phy/qcom/Makefile  |   1 +
 drivers/phy/qcom/phy-qcom-snps-eusb2.c | 365 +
 3 files changed, 374 insertions(+)

diff --git a/drivers/phy/qcom/Kconfig b/drivers/phy/qcom/Kconfig
index b9fe608c279..3aae1813352 100644
--- a/drivers/phy/qcom/Kconfig
+++ b/drivers/phy/qcom/Kconfig
@@ -27,6 +27,14 @@ config PHY_QCOM_USB_SNPS_FEMTO_V2
  High-Speed PHY driver. This driver supports the Hi-Speed PHY which
  is usually paired with Synopsys DWC3 USB IPs on MSM SOCs.
 
+config PHY_QCOM_SNPS_EUSB2
+   tristate "Qualcomm Synopsys eUSB2 High-Speed PHY"
+   depends on PHY && ARCH_SNAPDRAGON
+   help
+ Enable this to support the Qualcomm Synopsys DesignWare eUSB2
+ High-Speed PHY driver. This driver supports the Hi-Speed PHY which
+ is usually paired with Synopsys DWC3 USB IPs on MSM SOCs.
+
 config PHY_QCOM_USB_HS_28NM
tristate "Qualcomm 28nm High-Speed PHY"
depends on PHY && ARCH_SNAPDRAGON
diff --git a/drivers/phy/qcom/Makefile b/drivers/phy/qcom/Makefile
index 5f4db4a5378..a5153061dfb 100644
--- a/drivers/phy/qcom/Makefile
+++ b/drivers/phy/qcom/Makefile
@@ -2,5 +2,6 @@ obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
 obj-$(CONFIG_MSM8916_USB_PHY) += msm8916-usbh-phy.o
 obj-$(CONFIG_PHY_QCOM_QUSB2) += phy-qcom-qusb2.o
 obj-$(CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2) += phy-qcom-snps-femto-v2.o
+obj-$(CONFIG_PHY_QCOM_SNPS_EUSB2) += phy-qcom-snps-eusb2.o
 obj-$(CONFIG_PHY_QCOM_USB_HS_28NM) += phy-qcom-usb-hs-28nm.o
 obj-$(CONFIG_PHY_QCOM_USB_SS) += phy-qcom-usb-ss.o
diff --git a/drivers/phy/qcom/phy-qcom-snps-eusb2.c 
b/drivers/phy/qcom/phy-qcom-snps-eusb2.c
new file mode 100644
index 000..853b88458b7
--- /dev/null
+++ b/drivers/phy/qcom/phy-qcom-snps-eusb2.c
@@ -0,0 +1,365 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2023-2024, Linaro Limited
+ *
+ * Based on the Linux phy-qcom-snps-eusb2.c driver
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define USB_PHY_UTMI_CTRL0 (0x3c)
+#define SLEEPM BIT(0)
+#define OPMODE_MASKGENMASK(4, 3)
+#define OPMODE_NONDRIVING  BIT(3)
+
+#define USB_PHY_UTMI_CTRL5 (0x50)
+#define PORBIT(1)
+
+#define USB_PHY_HS_PHY_CTRL_COMMON0(0x54)
+#define PHY_ENABLE BIT(0)
+#define SIDDQ_SEL  BIT(1)
+#define SIDDQ  BIT(2)
+#define RETENABLEN BIT(3)
+#define FSEL_MASK  GENMASK(6, 4)
+#define FSEL_19_2_MHZ_VAL  (0x0)
+#define FSEL_38_4_MHZ_VAL  (0x4)
+
+#define USB_PHY_CFG_CTRL_1 (0x58)
+#define PHY_CFG_PLL_CPBIAS_CNTRL_MASK  GENMASK(7, 1)
+
+#define USB_PHY_CFG_CTRL_2 (0x5c)
+#define PHY_CFG_PLL_FB_DIV_7_0_MASKGENMASK(7, 0)
+#define DIV_7_0_19_2_MHZ_VAL   (0x90)
+#define DIV_7_0_38_4_MHZ_VAL   (0xc8)
+
+#define USB_PHY_CFG_CTRL_3 (0x60)
+#define PHY_CFG_PLL_FB_DIV_11_8_MASK   GENMASK(3, 0)
+#define DIV_11_8_19_2_MHZ_VAL  (0x1)
+#define DIV_11_8_38_4_MHZ_VAL  (0x0)
+
+#define PHY_CFG_PLL_REF_DIVGENMASK(7, 4)
+#define PLL_REF_DIV_VAL(0x0)
+
+#define USB_PHY_HS_PHY_CTRL2   (0x64)
+#define VBUSVLDEXT0BIT(0)
+#define USB2_SUSPEND_N BIT(2)
+#define USB2_SUSPEND_N_SEL BIT(3)
+#define VBUS_DET_EXT_SEL   BIT(4)
+
+#define USB_PHY_CFG_CTRL_4 (0x68)
+#define PHY_CFG_PLL_GMP_CNTRL_MASK GENMASK(1, 0)
+#define PHY_CFG_PLL_INT_CNTRL_MASK GENMASK(7, 2)
+
+#define USB_PHY_CFG_CTRL_5 (0x6c)
+#define PHY_CFG_PLL_PROP_CNTRL_MASKGENMASK(4, 0)
+#define PHY_CFG_PLL_VREF_TUNE_MASK GENMASK(7, 6)
+
+#define USB_PHY_CFG_CTRL_6 (0x70)
+#define PHY_CFG_PLL_VCO_CNTRL_MASK GENMASK(2, 0)
+
+#define USB_PHY_CFG_CTRL_7 (0x74)
+
+#define USB_PHY_CFG_CTRL_8 (0x78)
+#define PHY_CFG_TX_FSLS_VREF_TUNE_MASK GENMASK(1, 0)
+#define PHY_CFG_TX_FSLS_VREG_BYPASSBIT(2)
+#define PHY_CFG_TX_HS_VREF_TUNE_MASK   GENMASK(5, 3)
+#define PHY_CFG_TX_HS_XV_TUNE_MASK GENMASK(7, 6)
+
+#define USB_PHY_CFG_CTRL_9 (0x7c)
+#define PHY_CFG_TX_PREEMP_TUNE_MASKGENMASK(2, 0)
+#define PHY_CFG_TX_RES_TUNE_MASK   GENMASK(4, 3)
+#define PHY_CFG_TX_RISE_TUNE_MASK  GENMASK(6, 5)
+#define PHY_CFG_RCAL_BYPASSBIT(7)
+
+#define USB_PHY_CFG_CTRL_10(0x80)
+
+#define USB_PHY_CFG0   (0x94)
+#define DATAPATH_CTRL_OVERRIDE_EN  BIT(0)
+#define CMN_CTRL_OVERRIDE_EN   BIT(1)
+
+#define