Re: [PATCH v5 06/16] phy: rockchip: Add Rockchip USB TypeC PHY driver

2020-05-14 Thread Kever Yang



On 2020/5/13 下午3:15, Frank Wang wrote:

From: Jagan Teki 

Add USB TYPEC PHY driver for rockchip platform.

Referenced from Linux TypeC PHY driver, currently
supporting usb3-port and dp-port need to add it
in the future.

Signed-off-by: Frank Wang 
Signed-off-by: Jagan Teki 

Reviewed-by: Kever Yang 

Thanks,
- Kever

---
  drivers/phy/rockchip/Kconfig  |   7 +
  drivers/phy/rockchip/Makefile |   1 +
  drivers/phy/rockchip/phy-rockchip-typec.c | 796 ++
  3 files changed, 804 insertions(+)
  create mode 100644 drivers/phy/rockchip/phy-rockchip-typec.c

diff --git a/drivers/phy/rockchip/Kconfig b/drivers/phy/rockchip/Kconfig
index d73ac695e1..84cc7c876d 100644
--- a/drivers/phy/rockchip/Kconfig
+++ b/drivers/phy/rockchip/Kconfig
@@ -11,4 +11,11 @@ config PHY_ROCKCHIP_INNO_USB2
help
  Support for Rockchip USB2.0 PHY with Innosilicon IP block.
  
+config PHY_ROCKCHIP_TYPEC

+   bool "Rockchip TYPEC PHY Driver"
+   depends on ARCH_ROCKCHIP
+   select PHY
+   help
+ Enable this to support the Rockchip USB TYPEC PHY.
+
  endmenu
diff --git a/drivers/phy/rockchip/Makefile b/drivers/phy/rockchip/Makefile
index 9b0cbc6acf..95b2f8a3c0 100644
--- a/drivers/phy/rockchip/Makefile
+++ b/drivers/phy/rockchip/Makefile
@@ -4,3 +4,4 @@
  #
  
  obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)	+= phy-rockchip-inno-usb2.o

+obj-$(CONFIG_PHY_ROCKCHIP_TYPEC)   += phy-rockchip-typec.o
diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c 
b/drivers/phy/rockchip/phy-rockchip-typec.c
new file mode 100644
index 00..c9c8e1c542
--- /dev/null
+++ b/drivers/phy/rockchip/phy-rockchip-typec.c
@@ -0,0 +1,796 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ROCKCHIP Type-C PHY driver.
+ *
+ * Copyright (C) 2020 Amarula Solutions(India)
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Chris Zhong 
+ * Kever Yang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define usleep_range(a, b) udelay((b))
+
+#define CMN_SSM_BANDGAP(0x21 << 2)
+#define CMN_SSM_BIAS   (0x22 << 2)
+#define CMN_PLLSM0_PLLEN   (0x29 << 2)
+#define CMN_PLLSM0_PLLPRE  (0x2a << 2)
+#define CMN_PLLSM0_PLLVREF (0x2b << 2)
+#define CMN_PLLSM0_PLLLOCK (0x2c << 2)
+#define CMN_PLLSM1_PLLEN   (0x31 << 2)
+#define CMN_PLLSM1_PLLPRE  (0x32 << 2)
+#define CMN_PLLSM1_PLLVREF (0x33 << 2)
+#define CMN_PLLSM1_PLLLOCK (0x34 << 2)
+#define CMN_PLLSM1_USER_DEF_CTRL   (0x37 << 2)
+#define CMN_ICAL_OVRD  (0xc1 << 2)
+#define CMN_PLL0_VCOCAL_OVRD   (0x83 << 2)
+#define CMN_PLL0_VCOCAL_INIT   (0x84 << 2)
+#define CMN_PLL0_VCOCAL_ITER   (0x85 << 2)
+#define CMN_PLL0_LOCK_REFCNT_START (0x90 << 2)
+#define CMN_PLL0_LOCK_PLLCNT_START (0x92 << 2)
+#define CMN_PLL0_LOCK_PLLCNT_THR   (0x93 << 2)
+#define CMN_PLL0_INTDIV(0x94 << 2)
+#define CMN_PLL0_FRACDIV   (0x95 << 2)
+#define CMN_PLL0_HIGH_THR  (0x96 << 2)
+#define CMN_PLL0_DSM_DIAG  (0x97 << 2)
+#define CMN_PLL0_SS_CTRL1  (0x98 << 2)
+#define CMN_PLL0_SS_CTRL2  (0x99 << 2)
+#define CMN_PLL1_VCOCAL_START  (0xa1 << 2)
+#define CMN_PLL1_VCOCAL_OVRD   (0xa3 << 2)
+#define CMN_PLL1_VCOCAL_INIT   (0xa4 << 2)
+#define CMN_PLL1_VCOCAL_ITER   (0xa5 << 2)
+#define CMN_PLL1_LOCK_REFCNT_START (0xb0 << 2)
+#define CMN_PLL1_LOCK_PLLCNT_START (0xb2 << 2)
+#define CMN_PLL1_LOCK_PLLCNT_THR   (0xb3 << 2)
+#define CMN_PLL1_INTDIV(0xb4 << 2)
+#define CMN_PLL1_FRACDIV   (0xb5 << 2)
+#define CMN_PLL1_HIGH_THR  (0xb6 << 2)
+#define CMN_PLL1_DSM_DIAG  (0xb7 << 2)
+#define CMN_PLL1_SS_CTRL1  (0xb8 << 2)
+#define CMN_PLL1_SS_CTRL2  (0xb9 << 2)
+#define CMN_RXCAL_OVRD (0xd1 << 2)
+
+#define CMN_TXPUCAL_CTRL   (0xe0 << 2)
+#define CMN_TXPUCAL_OVRD   (0xe1 << 2)
+#define CMN_TXPDCAL_CTRL   (0xf0 << 2)
+#define CMN_TXPDCAL_OVRD   (0xf1 << 2)
+
+/* For CMN_TXPUCAL_CTRL, CMN_TXPDCAL_CTRL */
+#define CMN_TXPXCAL_START  BIT(15)
+#define CMN_TXPXCAL_DONE   BIT(14)
+#define CMN_TXPXCAL_NO_RESPONSEBIT(13)
+#define CMN_TXPXCAL_CURRENT_RESPONSE   BIT(12)
+
+#define CMN_TXPU_ADJ_CTRL  (0x108 << 2)
+#define CMN_TXPD_ADJ_CTRL  (0x10c << 2)
+
+/*
+ * For CMN_TXPUCAL_CTRL, CMN_TXPDCAL_CTRL,
+ * CMN_TXPU_ADJ_CTRL, CMN_TXPDCAL_CTRL
+ *
+ * NOTE: some of these registers are documented to be 2's complement
+ * signed numbers, but then documented to be always positive.  Weird.
+ * In such a case, using CMN_CALIB_CODE_POS() avoids the 

[PATCH v5 06/16] phy: rockchip: Add Rockchip USB TypeC PHY driver

2020-05-13 Thread Frank Wang
From: Jagan Teki 

Add USB TYPEC PHY driver for rockchip platform.

Referenced from Linux TypeC PHY driver, currently
supporting usb3-port and dp-port need to add it
in the future.

Signed-off-by: Frank Wang 
Signed-off-by: Jagan Teki 
---
 drivers/phy/rockchip/Kconfig  |   7 +
 drivers/phy/rockchip/Makefile |   1 +
 drivers/phy/rockchip/phy-rockchip-typec.c | 796 ++
 3 files changed, 804 insertions(+)
 create mode 100644 drivers/phy/rockchip/phy-rockchip-typec.c

diff --git a/drivers/phy/rockchip/Kconfig b/drivers/phy/rockchip/Kconfig
index d73ac695e1..84cc7c876d 100644
--- a/drivers/phy/rockchip/Kconfig
+++ b/drivers/phy/rockchip/Kconfig
@@ -11,4 +11,11 @@ config PHY_ROCKCHIP_INNO_USB2
help
  Support for Rockchip USB2.0 PHY with Innosilicon IP block.
 
+config PHY_ROCKCHIP_TYPEC
+   bool "Rockchip TYPEC PHY Driver"
+   depends on ARCH_ROCKCHIP
+   select PHY
+   help
+ Enable this to support the Rockchip USB TYPEC PHY.
+
 endmenu
diff --git a/drivers/phy/rockchip/Makefile b/drivers/phy/rockchip/Makefile
index 9b0cbc6acf..95b2f8a3c0 100644
--- a/drivers/phy/rockchip/Makefile
+++ b/drivers/phy/rockchip/Makefile
@@ -4,3 +4,4 @@
 #
 
 obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)   += phy-rockchip-inno-usb2.o
+obj-$(CONFIG_PHY_ROCKCHIP_TYPEC)   += phy-rockchip-typec.o
diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c 
b/drivers/phy/rockchip/phy-rockchip-typec.c
new file mode 100644
index 00..c9c8e1c542
--- /dev/null
+++ b/drivers/phy/rockchip/phy-rockchip-typec.c
@@ -0,0 +1,796 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ROCKCHIP Type-C PHY driver.
+ *
+ * Copyright (C) 2020 Amarula Solutions(India)
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Chris Zhong 
+ * Kever Yang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define usleep_range(a, b) udelay((b))
+
+#define CMN_SSM_BANDGAP(0x21 << 2)
+#define CMN_SSM_BIAS   (0x22 << 2)
+#define CMN_PLLSM0_PLLEN   (0x29 << 2)
+#define CMN_PLLSM0_PLLPRE  (0x2a << 2)
+#define CMN_PLLSM0_PLLVREF (0x2b << 2)
+#define CMN_PLLSM0_PLLLOCK (0x2c << 2)
+#define CMN_PLLSM1_PLLEN   (0x31 << 2)
+#define CMN_PLLSM1_PLLPRE  (0x32 << 2)
+#define CMN_PLLSM1_PLLVREF (0x33 << 2)
+#define CMN_PLLSM1_PLLLOCK (0x34 << 2)
+#define CMN_PLLSM1_USER_DEF_CTRL   (0x37 << 2)
+#define CMN_ICAL_OVRD  (0xc1 << 2)
+#define CMN_PLL0_VCOCAL_OVRD   (0x83 << 2)
+#define CMN_PLL0_VCOCAL_INIT   (0x84 << 2)
+#define CMN_PLL0_VCOCAL_ITER   (0x85 << 2)
+#define CMN_PLL0_LOCK_REFCNT_START (0x90 << 2)
+#define CMN_PLL0_LOCK_PLLCNT_START (0x92 << 2)
+#define CMN_PLL0_LOCK_PLLCNT_THR   (0x93 << 2)
+#define CMN_PLL0_INTDIV(0x94 << 2)
+#define CMN_PLL0_FRACDIV   (0x95 << 2)
+#define CMN_PLL0_HIGH_THR  (0x96 << 2)
+#define CMN_PLL0_DSM_DIAG  (0x97 << 2)
+#define CMN_PLL0_SS_CTRL1  (0x98 << 2)
+#define CMN_PLL0_SS_CTRL2  (0x99 << 2)
+#define CMN_PLL1_VCOCAL_START  (0xa1 << 2)
+#define CMN_PLL1_VCOCAL_OVRD   (0xa3 << 2)
+#define CMN_PLL1_VCOCAL_INIT   (0xa4 << 2)
+#define CMN_PLL1_VCOCAL_ITER   (0xa5 << 2)
+#define CMN_PLL1_LOCK_REFCNT_START (0xb0 << 2)
+#define CMN_PLL1_LOCK_PLLCNT_START (0xb2 << 2)
+#define CMN_PLL1_LOCK_PLLCNT_THR   (0xb3 << 2)
+#define CMN_PLL1_INTDIV(0xb4 << 2)
+#define CMN_PLL1_FRACDIV   (0xb5 << 2)
+#define CMN_PLL1_HIGH_THR  (0xb6 << 2)
+#define CMN_PLL1_DSM_DIAG  (0xb7 << 2)
+#define CMN_PLL1_SS_CTRL1  (0xb8 << 2)
+#define CMN_PLL1_SS_CTRL2  (0xb9 << 2)
+#define CMN_RXCAL_OVRD (0xd1 << 2)
+
+#define CMN_TXPUCAL_CTRL   (0xe0 << 2)
+#define CMN_TXPUCAL_OVRD   (0xe1 << 2)
+#define CMN_TXPDCAL_CTRL   (0xf0 << 2)
+#define CMN_TXPDCAL_OVRD   (0xf1 << 2)
+
+/* For CMN_TXPUCAL_CTRL, CMN_TXPDCAL_CTRL */
+#define CMN_TXPXCAL_START  BIT(15)
+#define CMN_TXPXCAL_DONE   BIT(14)
+#define CMN_TXPXCAL_NO_RESPONSEBIT(13)
+#define CMN_TXPXCAL_CURRENT_RESPONSE   BIT(12)
+
+#define CMN_TXPU_ADJ_CTRL  (0x108 << 2)
+#define CMN_TXPD_ADJ_CTRL  (0x10c << 2)
+
+/*
+ * For CMN_TXPUCAL_CTRL, CMN_TXPDCAL_CTRL,
+ * CMN_TXPU_ADJ_CTRL, CMN_TXPDCAL_CTRL
+ *
+ * NOTE: some of these registers are documented to be 2's complement
+ * signed numbers, but then documented to be always positive.  Weird.
+ * In such a case, using CMN_CALIB_CODE_POS() avoids the unnecessary
+ * sign extension.
+ */
+#define CMN_CALIB_CODE_WIDTH   7
+#define