linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/10] Add support for usb on Hikey960
@ 2019-02-18 11:23 Yu Chen
  2019-02-18 11:23 ` [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Yu Chen
                   ` (10 more replies)
  0 siblings, 11 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen

The patchset adds support for usb functionality of Hikey960, includes:
- dwc3 driver for Hisilicon Kirin Soc hi3660
- usb driver for HiKey960 board
- some adjustment in dwc3, usb gadget and typec driver
- dts for support usb of HiKey960

---
v2:
* This patchset based on patchset https://lkml.org/lkml/2019/1/25/344
of Heikki Krogerus
---

Yu Chen (10):
  dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  dt-bindings: misc: Add bindings for HiSilicon usb hub and data role
    switch functionality on HiKey960
  usb: dwc3: dwc3-of-simple: Add support for dwc3 of Hisilicon Soc
    Platform
  usb: dwc3: Add two quirks for Hisilicon Kirin Soc Platform
  phy: Add usb phy support for hi3660 Soc of Hisilicon
  usb: roles: Add usb role switch notifier.
  usb: dwc3: Registering a role switch in the DRD code.
  hikey960: Support usb functionality of Hikey960
  usb: gadget: Add configfs attribuite for controling
    match_existing_only
  dts: hi3660: Add support for usb on Hikey960

 .../bindings/misc/hisilicon-hikey-usb.txt          |  35 ++++
 .../devicetree/bindings/phy/phy-hi3660-usb3.txt    |  21 ++
 MAINTAINERS                                        |   8 +
 arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts  |  54 +++++
 arch/arm64/boot/dts/hisilicon/hi3660.dtsi          |  73 +++++++
 drivers/misc/Kconfig                               |   6 +
 drivers/misc/Makefile                              |   1 +
 drivers/misc/hisi_hikey_usb.c                      | 181 ++++++++++++++++
 drivers/phy/hisilicon/Kconfig                      |  10 +
 drivers/phy/hisilicon/Makefile                     |   1 +
 drivers/phy/hisilicon/phy-hi3660-usb3.c            | 232 +++++++++++++++++++++
 drivers/usb/dwc3/core.c                            |  43 ++++
 drivers/usb/dwc3/core.h                            |   9 +
 drivers/usb/dwc3/drd.c                             |  45 ++++
 drivers/usb/dwc3/dwc3-of-simple.c                  |   4 +-
 drivers/usb/dwc3/gadget.c                          |   2 +-
 drivers/usb/gadget/configfs.c                      |  32 +++
 drivers/usb/roles/class.c                          |  20 +-
 include/linux/usb/role.h                           |  46 ++++
 19 files changed, 820 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
 create mode 100644 Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
 create mode 100644 drivers/misc/hisi_hikey_usb.c
 create mode 100644 drivers/phy/hisilicon/phy-hi3660-usb3.c

-- 
2.15.0-rc2


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 20:18   ` Rob Herring
  2019-02-18 11:23 ` [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960 Yu Chen
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Rob Herring,
	Mark Rutland, Binghui Wang

This patch adds binding documentation for supporting the hi3660 usb
phy on boards like the HiKey960.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
v1:
* Fix some format error as suggested by Rob.
v2:
* Change hi3660 usb PHY to hi3660 USB PHY
---
---
 .../devicetree/bindings/phy/phy-hi3660-usb3.txt     | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt

diff --git a/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
new file mode 100644
index 000000000000..f9a3d56cfdd2
--- /dev/null
+++ b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
@@ -0,0 +1,21 @@
+Hisilicon hi3660 USB PHY
+-----------------------
+
+Required properties:
+- compatible: should be "hisilicon,hi3660-usb-phy"
+- #phy-cells: must be 0
+- hisilicon,pericrg-syscon: phandle of syscon used to control phy.
+- hisilicon,pctrl-syscon: phandle of syscon used to control phy.
+- hisilicon,usb3-otg-bc-syscon: phandle of syscon used to control phy.
+- hisilicon,eye-diagram-param: parameter set for phy
+Refer to phy/phy-bindings.txt for the generic PHY binding properties
+
+Example:
+	usb-phy {
+		compatible = "hisilicon,hi3660-usb-phy";
+		#phy-cells = <0>;
+		hisilicon,pericrg-syscon = <&crg_ctrl>;
+		hisilicon,pctrl-syscon = <&pctrl>;
+		hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;
+		hisilicon,eye-diagram-param = <0x22466e4>;
+	};
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
  2019-02-18 11:23 ` [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-19  8:25   ` Sergei Shtylyov
  2019-02-18 11:23 ` [PATCH v2 03/10] usb: dwc3: dwc3-of-simple: Add support for dwc3 of Hisilicon Soc Platform Yu Chen
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Sergei Shtylyov,
	Rob Herring, Mark Rutland, Binghui Wang

This patch adds binding documentation to support usb hub and usb
data role switch of Hisilicon HiKey960 Board.

Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
v1:
* Fix some format errors as suggested by Sergei.
* Modify gpio description to use gpiod API.
v2:
* Remove information about Hikey.
* Fix gpio description.
* Remove device_type of endpoint.
---
---
 .../bindings/misc/hisilicon-hikey-usb.txt          | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt

diff --git a/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt b/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
new file mode 100644
index 000000000000..c2b789b515df
--- /dev/null
+++ b/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
@@ -0,0 +1,35 @@
+Support usb hub and usb data role switch of Hisilicon HiKey960 Board.
+
+-----------------------------
+
+Required properties:
+- compatible: "hisilicon,gpio-hubv1","hisilicon,hikey960-usb"
+- typec-vbus-gpios: gpio to control the vbus of typeC port
+- typec-vbus-enable-val: gpio value that enable the vbus of typeC port
+- otg-switch-gpios: gpio to switch DP & DM between the hub and typeC port
+- hub-vdd33-en-gpios: gpio to enable the power of hub
+- pinctrl-0: pinctrl config
+
+Example
+-----
+
+	hisi_hikey_usb: hisi_hikey_usb {
+		compatible = "hisilicon,hikey960-usb";
+		typec-vbus-gpios = <&gpio25 2 0>;
+		typec-vbus-enable-val = <1>;
+		otg-switch-gpios = <&gpio25 6 0>;
+		hub-vdd33-en-gpios = <&gpio5 6 0>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&usbhub5734_pmx_func>;
+
+		port {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			hikey_usb_ep: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&dwc3_role_switch_notify>;
+			};
+		};
+
+	};
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 03/10] usb: dwc3: dwc3-of-simple: Add support for dwc3 of Hisilicon Soc Platform
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
  2019-02-18 11:23 ` [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Yu Chen
  2019-02-18 11:23 ` [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960 Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 11:23 ` [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin " Yu Chen
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen

This patch adds support for the poweron and shutdown of dwc3 core
on Hisilicon Soc Platform.
---
 drivers/usb/dwc3/dwc3-of-simple.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c
index 4c2771c5e727..0ed09d876542 100644
--- a/drivers/usb/dwc3/dwc3-of-simple.c
+++ b/drivers/usb/dwc3/dwc3-of-simple.c
@@ -98,7 +98,8 @@ static int dwc3_of_simple_probe(struct platform_device *pdev)
 	 * Some controllers need to toggle the usb3-otg reset before trying to
 	 * initialize the PHY, otherwise the PHY times out.
 	 */
-	if (of_device_is_compatible(np, "rockchip,rk3399-dwc3"))
+	if (of_device_is_compatible(np, "rockchip,rk3399-dwc3") ||
+			of_device_is_compatible(np, "hisilicon,hi3660-dwc3"))
 		simple->need_reset = true;
 
 	if (of_device_is_compatible(np, "amlogic,meson-axg-dwc3") ||
@@ -243,6 +244,7 @@ static const struct of_device_id of_dwc3_simple_match[] = {
 	{ .compatible = "amlogic,meson-axg-dwc3" },
 	{ .compatible = "amlogic,meson-gxl-dwc3" },
 	{ .compatible = "allwinner,sun50i-h6-dwc3" },
+	{ .compatible = "hisilicon,hi3660-dwc3" },
 	{ /* Sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, of_dwc3_simple_match);
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin Soc Platform
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (2 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 03/10] usb: dwc3: dwc3-of-simple: Add support for dwc3 of Hisilicon Soc Platform Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 12:21   ` Andy Shevchenko
  2019-02-18 11:23 ` [PATCH v2 05/10] phy: Add usb phy support for hi3660 Soc of Hisilicon Yu Chen
                   ` (6 subsequent siblings)
  10 siblings, 1 reply; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Andy Shevchenko,
	Felipe Balbi, Greg Kroah-Hartman, Binghui Wang

There are tow quirks for DesignWare USB3 DRD Core of Hisilicon Kirin Soc.
1)SPLIT_BOUNDARY_DISABLE should be set for Host mode
2)A GCTL soft reset should be executed when switch mode

Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
v2:
* Fix data type of reg from int to u32.
---
---
 drivers/usb/dwc3/core.c   | 43 +++++++++++++++++++++++++++++++++++++++++++
 drivers/usb/dwc3/core.h   |  7 +++++++
 drivers/usb/dwc3/gadget.c |  2 +-
 3 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index a1b126f90261..017b0527f6ab 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -112,11 +112,25 @@ void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode)
 	dwc->current_dr_role = mode;
 }
 
+static void dwc3_gctl_core_soft_reset(struct dwc3 *dwc)
+{
+	u32 reg;
+
+	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
+	reg |= (DWC3_GCTL_CORESOFTRESET);
+	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
+
+	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
+	reg &= ~(DWC3_GCTL_CORESOFTRESET);
+	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
+}
+
 static void __dwc3_set_mode(struct work_struct *work)
 {
 	struct dwc3 *dwc = work_to_dwc(work);
 	unsigned long flags;
 	int ret;
+	u32 reg;
 
 	if (dwc->dr_mode != USB_DR_MODE_OTG)
 		return;
@@ -156,6 +170,10 @@ static void __dwc3_set_mode(struct work_struct *work)
 
 	dwc3_set_prtcap(dwc, dwc->desired_dr_role);
 
+	/* Execute a GCTL Core Soft Reset when switch mode */
+	if (dwc->gctl_reset_quirk)
+		dwc3_gctl_core_soft_reset(dwc);
+
 	spin_unlock_irqrestore(&dwc->lock, flags);
 
 	switch (dwc->desired_dr_role) {
@@ -169,6 +187,11 @@ static void __dwc3_set_mode(struct work_struct *work)
 			phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_HOST);
 			phy_set_mode(dwc->usb3_generic_phy, PHY_MODE_USB_HOST);
 			phy_calibrate(dwc->usb2_generic_phy);
+			if (dwc->dis_split_quirk) {
+				reg = dwc3_readl(dwc->regs, DWC3_GUCTL3);
+				reg |= DWC3_GUCTL3_SPLITDISABLE;
+				dwc3_writel(dwc->regs, DWC3_GUCTL3, reg);
+			}
 		}
 		break;
 	case DWC3_GCTL_PRTCAP_DEVICE:
@@ -1306,6 +1329,11 @@ static void dwc3_get_properties(struct dwc3 *dwc)
 	dwc->dis_metastability_quirk = device_property_read_bool(dev,
 				"snps,dis_metastability_quirk");
 
+	dwc->dis_split_quirk = device_property_read_bool(dev,
+				"snps,dis-split-quirk");
+	dwc->gctl_reset_quirk = device_property_read_bool(dev,
+				"snps,gctl-reset-quirk");
+
 	dwc->lpm_nyet_threshold = lpm_nyet_threshold;
 	dwc->tx_de_emphasis = tx_de_emphasis;
 
@@ -1825,10 +1853,25 @@ static int dwc3_resume(struct device *dev)
 
 	return 0;
 }
+
+static void dwc3_complete(struct device *dev)
+{
+	struct dwc3	*dwc = dev_get_drvdata(dev);
+	u32		reg;
+
+	if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST &&
+			dwc->dis_split_quirk) {
+		dev_dbg(dwc->dev, "set DWC3_GUCTL3_SPLITDISABLE\n");
+		reg = dwc3_readl(dwc->regs, DWC3_GUCTL3);
+		reg |= DWC3_GUCTL3_SPLITDISABLE;
+		dwc3_writel(dwc->regs, DWC3_GUCTL3, reg);
+	}
+}
 #endif /* CONFIG_PM_SLEEP */
 
 static const struct dev_pm_ops dwc3_dev_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume)
+	.complete = dwc3_complete,
 	SET_RUNTIME_PM_OPS(dwc3_runtime_suspend, dwc3_runtime_resume,
 			dwc3_runtime_idle)
 };
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index df876418cb78..402b3c29eb26 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -136,6 +136,7 @@
 #define DWC3_GEVNTCOUNT(n)	(0xc40c + ((n) * 0x10))
 
 #define DWC3_GHWPARAMS8		0xc600
+#define DWC3_GUCTL3		0xc60c
 #define DWC3_GFLADJ		0xc630
 
 /* Device Registers */
@@ -370,6 +371,9 @@
 /* Global User Control Register 2 */
 #define DWC3_GUCTL2_RST_ACTBITLATER		BIT(14)
 
+/* Global User Control Register 3 */
+#define DWC3_GUCTL3_SPLITDISABLE		BIT(14)
+
 /* Device Configuration Register */
 #define DWC3_DCFG_DEVADDR(addr)	((addr) << 3)
 #define DWC3_DCFG_DEVADDR_MASK	DWC3_DCFG_DEVADDR(0x7f)
@@ -1210,6 +1214,9 @@ struct dwc3 {
 
 	unsigned		dis_metastability_quirk:1;
 
+	unsigned		dis_split_quirk:1;
+	unsigned		gctl_reset_quirk:1;
+
 	u16			imod_interval;
 };
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 07bd31bb2f8a..21c0072cdf38 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -269,7 +269,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
 {
 	const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;
 	struct dwc3		*dwc = dep->dwc;
-	u32			timeout = 1000;
+	u32			timeout = 5000;
 	u32			saved_config = 0;
 	u32			reg;
 
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 05/10] phy: Add usb phy support for hi3660 Soc of Hisilicon
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (3 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin " Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 11:23 ` [PATCH v2 06/10] usb: roles: Add usb role switch notifier Yu Chen
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Andy Shevchenko,
	Kishon Vijay Abraham I, David S. Miller, Greg Kroah-Hartman,
	Mauro Carvalho Chehab, Andrew Morton, Arnd Bergmann, Shawn Guo,
	Pengcheng Li, Jianguo Sun, Masahiro Yamada, Jiancheng Xue,
	Binghui Wang

This driver handles usb phy power on and shutdown for hi3660 Soc of
Hisilicon.

Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Kishon Vijay Abraham I <kishon@ti.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Pengcheng Li <lpc.li@hisilicon.com>
Cc: Jianguo Sun <sunjianguo1@huawei.com>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Jiancheng Xue <xuejiancheng@hisilicon.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
v1:
* Remove unused code and add comment for time delay as suggested by
Kishon Vijay Abraham I.
v2:
* Fix license declaration.
* Remove redundant parens.
* Remove unused member variables in struct hi3660_priv.
---
---
 MAINTAINERS                             |   8 ++
 drivers/phy/hisilicon/Kconfig           |  10 ++
 drivers/phy/hisilicon/Makefile          |   1 +
 drivers/phy/hisilicon/phy-hi3660-usb3.c | 232 ++++++++++++++++++++++++++++++++
 4 files changed, 251 insertions(+)
 create mode 100644 drivers/phy/hisilicon/phy-hi3660-usb3.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 4d04cebb4a71..8dc289faa2c4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -15790,6 +15790,14 @@ L:	linux-usb@vger.kernel.org
 S:	Maintained
 F:	drivers/usb/roles/intel-xhci-usb-role-switch.c
 
+USB IP DRIVER FOR HISILICON KIRIN
+M:	Yu Chen <chenyu56@huawei.com>
+M:	Binghui Wang <wangbinghui@hisilicon.com>
+L:	linux-usb@vger.kernel.org
+S:	Maintained
+F:	Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
+F:	drivers/phy/hisilicon/phy-hi3660-usb3.c
+
 USB ISP116X DRIVER
 M:	Olav Kongas <ok@artecdesign.ee>
 L:	linux-usb@vger.kernel.org
diff --git a/drivers/phy/hisilicon/Kconfig b/drivers/phy/hisilicon/Kconfig
index b40ee54a1a50..3c142f08987c 100644
--- a/drivers/phy/hisilicon/Kconfig
+++ b/drivers/phy/hisilicon/Kconfig
@@ -12,6 +12,16 @@ config PHY_HI6220_USB
 
 	  To compile this driver as a module, choose M here.
 
+config PHY_HI3660_USB
+	tristate "hi3660 USB PHY support"
+	depends on (ARCH_HISI && ARM64) || COMPILE_TEST
+	select GENERIC_PHY
+	select MFD_SYSCON
+	help
+	  Enable this to support the HISILICON HI3660 USB PHY.
+
+	  To compile this driver as a module, choose M here.
+
 config PHY_HISTB_COMBPHY
 	tristate "HiSilicon STB SoCs COMBPHY support"
 	depends on (ARCH_HISI && ARM64) || COMPILE_TEST
diff --git a/drivers/phy/hisilicon/Makefile b/drivers/phy/hisilicon/Makefile
index f662a4fe18d8..75ba64e2faf8 100644
--- a/drivers/phy/hisilicon/Makefile
+++ b/drivers/phy/hisilicon/Makefile
@@ -1,4 +1,5 @@
 obj-$(CONFIG_PHY_HI6220_USB)		+= phy-hi6220-usb.o
+obj-$(CONFIG_PHY_HI3660_USB)		+= phy-hi3660-usb3.o
 obj-$(CONFIG_PHY_HISTB_COMBPHY)		+= phy-histb-combphy.o
 obj-$(CONFIG_PHY_HISI_INNO_USB2)	+= phy-hisi-inno-usb2.o
 obj-$(CONFIG_PHY_HIX5HD2_SATA)		+= phy-hix5hd2-sata.o
diff --git a/drivers/phy/hisilicon/phy-hi3660-usb3.c b/drivers/phy/hisilicon/phy-hi3660-usb3.c
new file mode 100644
index 000000000000..97184e6f0d41
--- /dev/null
+++ b/drivers/phy/hisilicon/phy-hi3660-usb3.c
@@ -0,0 +1,232 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Phy provider for USB 3.0 controller on HiSilicon 3660 platform
+ *
+ * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
+ *		http://www.huawei.com
+ *
+ * Authors: Yu Chen <chenyu56@huawei.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#define PERI_CRG_CLK_EN4			0x40
+#define PERI_CRG_CLK_DIS4			0x44
+#define GT_CLK_USB3OTG_REF			BIT(0)
+#define GT_ACLK_USB3OTG				BIT(1)
+
+#define PERI_CRG_RSTEN4				0x90
+#define PERI_CRG_RSTDIS4			0x94
+#define IP_RST_USB3OTGPHY_POR			BIT(3)
+#define IP_RST_USB3OTG				BIT(5)
+
+#define PERI_CRG_ISODIS				0x148
+#define USB_REFCLK_ISO_EN			BIT(25)
+
+#define PCTRL_PERI_CTRL3			0x10
+#define PCTRL_PERI_CTRL3_MSK_START		16
+#define USB_TCXO_EN				BIT(1)
+
+#define PCTRL_PERI_CTRL24			0x64
+#define SC_CLK_USB3PHY_3MUX1_SEL		BIT(25)
+
+#define USBOTG3_CTRL0				0x00
+#define SC_USB3PHY_ABB_GT_EN			BIT(15)
+
+#define USBOTG3_CTRL2				0x08
+#define USBOTG3CTRL2_POWERDOWN_HSP		BIT(0)
+#define USBOTG3CTRL2_POWERDOWN_SSP		BIT(1)
+
+#define USBOTG3_CTRL3				0x0C
+#define USBOTG3_CTRL3_VBUSVLDEXT		BIT(6)
+#define USBOTG3_CTRL3_VBUSVLDEXTSEL		BIT(5)
+
+#define USBOTG3_CTRL4				0x10
+
+#define USBOTG3_CTRL7				0x1c
+#define REF_SSP_EN				BIT(16)
+
+#define HI3660_USB_DEFAULT_PHY_PARAM		0x1c466e3
+
+struct hi3660_priv {
+	struct device *dev;
+	struct regmap *peri_crg;
+	struct regmap *pctrl;
+	struct regmap *otg_bc;
+	u32 eye_diagram_param;
+};
+
+static int hi3660_phy_init(struct phy *phy)
+{
+	struct hi3660_priv *priv = phy_get_drvdata(phy);
+	u32 val, mask;
+	int ret;
+
+	/* usb refclk iso disable */
+	ret = regmap_write(priv->peri_crg, PERI_CRG_ISODIS, USB_REFCLK_ISO_EN);
+	if (ret)
+		goto out;
+
+	/* enable usb_tcxo_en */
+	val = USB_TCXO_EN | (USB_TCXO_EN << PCTRL_PERI_CTRL3_MSK_START);
+	ret = regmap_write(priv->pctrl, PCTRL_PERI_CTRL3, val);
+	if (ret)
+		goto out;
+
+	/* assert phy */
+	val = IP_RST_USB3OTGPHY_POR | IP_RST_USB3OTG;
+	ret = regmap_write(priv->peri_crg, PERI_CRG_RSTEN4, val);
+	if (ret)
+		goto out;
+
+	/* enable phy ref clk */
+	val = SC_USB3PHY_ABB_GT_EN;
+	mask = val;
+	ret = regmap_update_bits(priv->otg_bc, USBOTG3_CTRL0, mask, val);
+	if (ret)
+		goto out;
+
+	val = REF_SSP_EN;
+	mask = val;
+	ret = regmap_update_bits(priv->otg_bc, USBOTG3_CTRL7, mask, val);
+	if (ret)
+		goto out;
+
+	/* exit from IDDQ mode */
+	mask = USBOTG3CTRL2_POWERDOWN_HSP | USBOTG3CTRL2_POWERDOWN_SSP;
+	ret = regmap_update_bits(priv->otg_bc, USBOTG3_CTRL2, mask, 0);
+	if (ret)
+		goto out;
+
+	/* delay for exit from IDDQ mode */
+	usleep_range(100, 100);
+
+	/* deassert phy */
+	val = IP_RST_USB3OTGPHY_POR | IP_RST_USB3OTG;
+	ret = regmap_write(priv->peri_crg, PERI_CRG_RSTDIS4, val);
+	if (ret)
+		goto out;
+
+	/* delay for phy deasserted */
+	usleep_range(10000, 15000);
+
+	/* fake vbus valid signal */
+	val = USBOTG3_CTRL3_VBUSVLDEXT | USBOTG3_CTRL3_VBUSVLDEXTSEL;
+	mask = val;
+	ret = regmap_update_bits(priv->otg_bc, USBOTG3_CTRL3, mask, val);
+	if (ret)
+		goto out;
+
+	/* delay for vbus valid */
+	usleep_range(100, 100);
+
+	ret = regmap_write(priv->otg_bc, USBOTG3_CTRL4,
+			priv->eye_diagram_param);
+	if (ret)
+		goto out;
+
+	return 0;
+out:
+	dev_err(priv->dev, "failed to init phy ret: %d\n", ret);
+	return ret;
+}
+
+static int hi3660_phy_exit(struct phy *phy)
+{
+	struct hi3660_priv *priv = phy_get_drvdata(phy);
+	u32 val;
+	int ret;
+
+	/* assert phy */
+	val = IP_RST_USB3OTGPHY_POR;
+	ret = regmap_write(priv->peri_crg, PERI_CRG_RSTEN4, val);
+	if (ret)
+		goto out;
+
+	/* disable usb_tcxo_en */
+	val = USB_TCXO_EN << PCTRL_PERI_CTRL3_MSK_START;
+	ret = regmap_write(priv->pctrl, PCTRL_PERI_CTRL3, val);
+	if (ret)
+		goto out;
+
+	return 0;
+out:
+	dev_err(priv->dev, "failed to exit phy ret: %d\n", ret);
+	return ret;
+}
+
+static struct phy_ops hi3660_phy_ops = {
+	.init		= hi3660_phy_init,
+	.exit		= hi3660_phy_exit,
+	.owner		= THIS_MODULE,
+};
+
+static int hi3660_phy_probe(struct platform_device *pdev)
+{
+	struct phy_provider *phy_provider;
+	struct device *dev = &pdev->dev;
+	struct phy *phy;
+	struct hi3660_priv *priv;
+
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	priv->dev = dev;
+	priv->peri_crg = syscon_regmap_lookup_by_phandle(dev->of_node,
+					"hisilicon,pericrg-syscon");
+	if (IS_ERR(priv->peri_crg)) {
+		dev_err(dev, "no hisilicon,pericrg-syscon\n");
+		return PTR_ERR(priv->peri_crg);
+	}
+
+	priv->pctrl = syscon_regmap_lookup_by_phandle(dev->of_node,
+					"hisilicon,pctrl-syscon");
+	if (IS_ERR(priv->pctrl)) {
+		dev_err(dev, "no hisilicon,pctrl-syscon\n");
+		return PTR_ERR(priv->pctrl);
+	}
+
+	priv->otg_bc = syscon_regmap_lookup_by_phandle(dev->of_node,
+					"hisilicon,usb3-otg-bc-syscon");
+	if (IS_ERR(priv->otg_bc)) {
+		dev_err(dev, "no hisilicon,usb3-otg-bc-syscon\n");
+		return PTR_ERR(priv->otg_bc);
+	}
+
+	if (of_property_read_u32(dev->of_node, "hisilicon,eye-diagram-param",
+		&(priv->eye_diagram_param)))
+		priv->eye_diagram_param = HI3660_USB_DEFAULT_PHY_PARAM;
+
+	phy = devm_phy_create(dev, NULL, &hi3660_phy_ops);
+	if (IS_ERR(phy))
+		return PTR_ERR(phy);
+
+	phy_set_drvdata(phy, priv);
+	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
+	return PTR_ERR_OR_ZERO(phy_provider);
+}
+
+static const struct of_device_id hi3660_phy_of_match[] = {
+	{.compatible = "hisilicon,hi3660-usb-phy",},
+	{ }
+};
+MODULE_DEVICE_TABLE(of, hi3660_phy_of_match);
+
+static struct platform_driver hi3660_phy_driver = {
+	.probe	= hi3660_phy_probe,
+	.driver = {
+		.name	= "hi3660-usb-phy",
+		.of_match_table	= hi3660_phy_of_match,
+	}
+};
+module_platform_driver(hi3660_phy_driver);
+
+MODULE_AUTHOR("Yu Chen <chenyu56@huawei.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("Hilisicon Hi3660 USB3 PHY Driver");
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 06/10] usb: roles: Add usb role switch notifier.
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (4 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 05/10] phy: Add usb phy support for hi3660 Soc of Hisilicon Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 11:23 ` [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code Yu Chen
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Greg Kroah-Hartman,
	Heikki Krogerus, Hans de Goede, Andy Shevchenko

This patch adds notifier for drivers want to be informed of the usb role switch.

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: John Stultz <john.stultz@linaro.org>
Suggested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
 drivers/usb/roles/class.c | 20 +++++++++++++++++++-
 include/linux/usb/role.h  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c
index f45d8df5cfb8..e2caaa665d6e 100644
--- a/drivers/usb/roles/class.c
+++ b/drivers/usb/roles/class.c
@@ -20,6 +20,7 @@ struct usb_role_switch {
 	struct device dev;
 	struct mutex lock; /* device lock*/
 	enum usb_role role;
+	struct blocking_notifier_head nh;
 
 	/* From descriptor */
 	struct device *usb2_port;
@@ -49,8 +50,10 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role)
 	mutex_lock(&sw->lock);
 
 	ret = sw->set(sw->dev.parent, role);
-	if (!ret)
+	if (!ret) {
 		sw->role = role;
+		blocking_notifier_call_chain(&sw->nh, role, NULL);
+	}
 
 	mutex_unlock(&sw->lock);
 
@@ -58,6 +61,20 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role)
 }
 EXPORT_SYMBOL_GPL(usb_role_switch_set_role);
 
+int usb_role_switch_register_notifier(struct usb_role_switch *sw,
+				      struct notifier_block *nb)
+{
+	return blocking_notifier_chain_register(&sw->nh, nb);
+}
+EXPORT_SYMBOL_GPL(usb_role_switch_register_notifier);
+
+int usb_role_switch_unregister_notifier(struct usb_role_switch *sw,
+					struct notifier_block *nb)
+{
+	return blocking_notifier_chain_unregister(&sw->nh, nb);
+}
+EXPORT_SYMBOL_GPL(usb_role_switch_unregister_notifier);
+
 /**
  * usb_role_switch_get_role - Get the USB role for a switch
  * @sw: USB role switch
@@ -271,6 +288,7 @@ usb_role_switch_register(struct device *parent,
 		return ERR_PTR(-ENOMEM);
 
 	mutex_init(&sw->lock);
+	BLOCKING_INIT_NOTIFIER_HEAD(&sw->nh);
 
 	sw->allow_userspace_control = desc->allow_userspace_control;
 	sw->usb2_port = desc->usb2_port;
diff --git a/include/linux/usb/role.h b/include/linux/usb/role.h
index 9684a8734757..9e1ca663387a 100644
--- a/include/linux/usb/role.h
+++ b/include/linux/usb/role.h
@@ -41,6 +41,8 @@ struct usb_role_switch_desc {
 	bool allow_userspace_control;
 };
 
+
+#if IS_ENABLED(CONFIG_USB_ROLE_SWITCH)
 int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role);
 enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw);
 struct usb_role_switch *usb_role_switch_get(struct device *dev);
@@ -50,5 +52,49 @@ struct usb_role_switch *
 usb_role_switch_register(struct device *parent,
 			 const struct usb_role_switch_desc *desc);
 void usb_role_switch_unregister(struct usb_role_switch *sw);
+int usb_role_switch_register_notifier(struct usb_role_switch *sw,
+				      struct notifier_block *nb);
+int usb_role_switch_unregister_notifier(struct usb_role_switch *sw,
+					struct notifier_block *nb);
+#else
+static inline int usb_role_switch_set_role(struct usb_role_switch *sw,
+		enum usb_role role)
+{
+	return 0;
+}
+
+static inline enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw)
+{
+	return USB_ROLE_NONE;
+}
+
+static inline struct usb_role_switch *usb_role_switch_get(struct device *dev)
+{
+	return ERR_PTR(-ENODEV);
+}
+
+static inline void usb_role_switch_put(struct usb_role_switch *sw) { }
+
+static inline struct usb_role_switch *
+usb_role_switch_register(struct device *parent,
+			 const struct usb_role_switch_desc *desc)
+{
+	return ERR_PTR(-ENODEV);
+}
+
+static inline void usb_role_switch_unregister(struct usb_role_switch *sw) { }
+
+static int usb_role_switch_register_notifier(struct usb_role_switch *sw,
+				      struct notifier_block *nb)
+{
+	return -ENODEV;
+}
+
+static int usb_role_switch_unregister_notifier(struct usb_role_switch *sw,
+					struct notifier_block *nb)
+{
+	return -ENODEV;
+}
+#endif
 
 #endif /* __LINUX_USB_ROLE_H */
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code.
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (5 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 06/10] usb: roles: Add usb role switch notifier Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 17:30   ` Valentin Schneider
  2019-02-19  2:57   ` Jun Li
  2019-02-18 11:23 ` [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960 Yu Chen
                   ` (3 subsequent siblings)
  10 siblings, 2 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Felipe Balbi,
	Greg Kroah-Hartman, Heikki Krogerus

The Type-C drivers use USB role switch API to inform the
system about the negotiated data role, so registering a role
switch in the DRD code in order to support platforms with
USB Type-C connectors.

Cc: John Stultz <john.stultz@linaro.org>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Suggested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
v2:
* Assign fwnode in dwc3_role_switch.
---
---
 drivers/usb/dwc3/core.h |  2 ++
 drivers/usb/dwc3/drd.c  | 45 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 402b3c29eb26..7385544b9936 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -25,6 +25,7 @@
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
 #include <linux/usb/otg.h>
+#include <linux/usb/role.h>
 #include <linux/ulpi/interface.h>
 
 #include <linux/phy/phy.h>
@@ -1083,6 +1084,7 @@ struct dwc3 {
 	struct extcon_dev	*edev;
 	struct notifier_block	edev_nb;
 	enum usb_phy_interface	hsphy_mode;
+	struct usb_role_switch	*role_sw;
 
 	u32			fladj;
 	u32			irq_gadget;
diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c
index 869725d15c74..cf977bb0d62e 100644
--- a/drivers/usb/dwc3/drd.c
+++ b/drivers/usb/dwc3/drd.c
@@ -474,8 +474,42 @@ static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc)
 	return edev;
 }
 
+static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role)
+{
+	u32 mode;
+
+	switch (role) {
+	case USB_ROLE_HOST:
+		mode = DWC3_GCTL_PRTCAP_HOST;
+		break;
+	case USB_ROLE_DEVICE:
+		mode = DWC3_GCTL_PRTCAP_DEVICE;
+		break;
+	default:
+		mode = DWC3_GCTL_PRTCAP_HOST;
+		break;
+	};
+
+	dwc3_set_mode(dev_get_drvdata(dev), mode);
+	return 0;
+}
+
+static enum usb_role dwc3_usb_role_switch_get(struct device *dev)
+{
+	struct dwc3 *dwc = dev_get_drvdata(dev);
+	unsigned long flags;
+	enum usb_role role;
+
+	spin_lock_irqsave(&dwc->lock, flags);
+	role = dwc->current_otg_role;
+	spin_unlock_irqrestore(&dwc->lock, flags);
+
+	return role;
+}
+
 int dwc3_drd_init(struct dwc3 *dwc)
 {
+	struct usb_role_switch_desc dwc3_role_switch = {0};
 	int ret, irq;
 
 	dwc->edev = dwc3_get_extcon(dwc);
@@ -522,6 +556,15 @@ int dwc3_drd_init(struct dwc3 *dwc)
 		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
 	}
 
+	dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
+	dwc3_role_switch.set = dwc3_usb_role_switch_set;
+	dwc3_role_switch.get = dwc3_usb_role_switch_get;
+	dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);
+	if (ret) {
+		dwc3_drd_exit(dwc);
+		return PTR_ERR(dwc->role_sw);
+	}
+
 	return 0;
 }
 
@@ -557,4 +600,6 @@ void dwc3_drd_exit(struct dwc3 *dwc)
 
 	if (!dwc->edev)
 		free_irq(dwc->otg_irq, dwc);
+
+	usb_role_switch_unregister(dwc->role_sw);
 }
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (6 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-19  2:50   ` Chunfeng Yun
  2019-02-18 11:23 ` [PATCH v2 09/10] usb: gadget: Add configfs attribuite for controling match_existing_only Yu Chen
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Andy Shevchenko,
	Arnd Bergmann, Greg Kroah-Hartman, Binghui Wang, Heikki Krogerus

This driver handles usb hub power on and typeC port event of HiKey960 board:
1)DP&DM switching between usb hub and typeC port base on typeC port
state
2)Control power of usb hub on Hikey960
3)Control vbus of typeC port

Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>

---
v1:
* Using gpiod API with the gpios.
* Removing registering usb role switch.
* Registering usb role switch notifier.
v2:
* Fix license declaration.
* Add configuration of  gpio direction.
* Remove some log print.
---
---
 drivers/misc/Kconfig          |   6 ++
 drivers/misc/Makefile         |   1 +
 drivers/misc/hisi_hikey_usb.c | 181 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 188 insertions(+)
 create mode 100644 drivers/misc/hisi_hikey_usb.c

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index f417b06e11c5..8d8b717759e2 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -521,6 +521,12 @@ config PVPANIC
 	  a paravirtualized device provided by QEMU; it lets a virtual machine
 	  (guest) communicate panic events to the host.
 
+config HISI_HIKEY_USB
+	tristate "USB functionality of HiSilicon Hikey Platform"
+	depends on OF && GPIOLIB
+	help
+	  If you say yes here you get support for usb functionality of HiSilicon Hikey Platform.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index e39ccbbc1b3a..dc8892b13a1a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL)		+= ocxl/
 obj-y				+= cardreader/
 obj-$(CONFIG_PVPANIC)   	+= pvpanic.o
+obj-$(CONFIG_HISI_HIKEY_USB)	+= hisi_hikey_usb.o
diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c
new file mode 100644
index 000000000000..70013f8e76f0
--- /dev/null
+++ b/drivers/misc/hisi_hikey_usb.c
@@ -0,0 +1,181 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Support for usb functionality of Hikey series boards
+ * based on Hisilicon Kirin Soc.
+ *
+ * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
+ *		http://www.huawei.com
+ *
+ * Authors: Yu Chen <chenyu56@huawei.com>
+ */
+
+#include <linux/gpio/consumer.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/usb/role.h>
+
+#define DEVICE_DRIVER_NAME "hisi_hikey_usb"
+
+#define HUB_VBUS_POWER_ON 1
+#define HUB_VBUS_POWER_OFF 0
+#define USB_SWITCH_TO_HUB 1
+#define USB_SWITCH_TO_TYPEC 0
+
+struct hisi_hikey_usb {
+	struct gpio_desc *otg_switch;
+	struct gpio_desc *typec_vbus;
+	struct gpio_desc *hub_vbus;
+	int typec_vbus_enable_val;
+
+	struct usb_role_switch *role_sw;
+	struct notifier_block nb;
+};
+
+static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value)
+{
+	gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value);
+}
+
+static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
+		int switch_to)
+{
+	gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to);
+}
+
+static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
+		int value)
+{
+	gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value);
+}
+
+static int hisi_hikey_role_switch(struct notifier_block *nb,
+			unsigned long state, void *data)
+{
+	struct hisi_hikey_usb *hisi_hikey_usb;
+
+	hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb);
+
+	switch (state) {
+	case USB_ROLE_NONE:
+		usb_typec_power_ctrl(hisi_hikey_usb,
+				!hisi_hikey_usb->typec_vbus_enable_val);
+		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB);
+		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON);
+		break;
+	case USB_ROLE_HOST:
+		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
+		usb_typec_power_ctrl(hisi_hikey_usb,
+				hisi_hikey_usb->typec_vbus_enable_val);
+		break;
+	case USB_ROLE_DEVICE:
+		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
+		usb_typec_power_ctrl(hisi_hikey_usb,
+				!hisi_hikey_usb->typec_vbus_enable_val);
+		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int hisi_hikey_usb_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *root = dev->of_node;
+	struct hisi_hikey_usb *hisi_hikey_usb;
+	int ret;
+
+	hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL);
+	if (!hisi_hikey_usb)
+		return -ENOMEM;
+
+	hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch;
+
+	ret = of_property_read_u32(root, "typec-vbus-enable-val",
+				   &hisi_hikey_usb->typec_vbus_enable_val);
+	if (ret)
+		hisi_hikey_usb->typec_vbus_enable_val = 1;
+
+	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
+			hisi_hikey_usb->typec_vbus_enable_val ?
+			GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
+	if (!hisi_hikey_usb->typec_vbus)
+		return -ENOENT;
+	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
+		return PTR_ERR(hisi_hikey_usb->typec_vbus);
+
+	gpiod_direction_output(hisi_hikey_usb->typec_vbus,
+			!hisi_hikey_usb->typec_vbus_enable_val);
+
+	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN);
+	if (!hisi_hikey_usb->otg_switch)
+		return -ENOENT;
+	else if (IS_ERR(hisi_hikey_usb->otg_switch))
+		return PTR_ERR(hisi_hikey_usb->otg_switch);
+
+	gpiod_direction_output(hisi_hikey_usb->otg_switch, USB_SWITCH_TO_HUB);
+
+	/* hub-vdd33-en is optional */
+	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
+			GPIOD_OUT_LOW);
+	if (IS_ERR(hisi_hikey_usb->hub_vbus))
+		return PTR_ERR(hisi_hikey_usb->hub_vbus);
+
+	gpiod_direction_output(hisi_hikey_usb->hub_vbus, HUB_VBUS_POWER_ON);
+
+	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
+	if (!hisi_hikey_usb->role_sw)
+		return -EPROBE_DEFER;
+	else if (IS_ERR(hisi_hikey_usb->role_sw))
+		return PTR_ERR(hisi_hikey_usb->role_sw);
+
+	ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw,
+			&hisi_hikey_usb->nb);
+	if (ret) {
+		usb_role_switch_put(hisi_hikey_usb->role_sw);
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, hisi_hikey_usb);
+
+	return 0;
+}
+
+static int  hisi_hikey_usb_remove(struct platform_device *pdev)
+{
+	struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev);
+
+	usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw,
+			&hisi_hikey_usb->nb);
+
+	usb_role_switch_put(hisi_hikey_usb->role_sw);
+
+	return 0;
+}
+
+static const struct of_device_id id_table_hisi_hikey_usb[] = {
+	{.compatible = "hisilicon,gpio_hubv1"},
+	{.compatible = "hisilicon,hikey960_usb"},
+	{}
+};
+
+static struct platform_driver hisi_hikey_usb_driver = {
+	.probe = hisi_hikey_usb_probe,
+	.remove = hisi_hikey_usb_remove,
+	.driver = {
+		.name = DEVICE_DRIVER_NAME,
+		.of_match_table = id_table_hisi_hikey_usb,
+	},
+};
+
+module_platform_driver(hisi_hikey_usb_driver);
+
+MODULE_AUTHOR("Yu Chen <chenyu56@huawei.com>");
+MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey");
+MODULE_LICENSE("GPL v2");
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 09/10] usb: gadget: Add configfs attribuite for controling match_existing_only
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (7 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960 Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 11:23 ` [PATCH v2 10/10] dts: hi3660: Add support for usb on Hikey960 Yu Chen
  2019-02-18 17:30 ` [PATCH v2 00/10] " Valentin Schneider
  10 siblings, 0 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Andy Shevchenko,
	Felipe Balbi, Greg Kroah-Hartman, Binghui Wang

Currently the "match_existing_only" of usb_gadget_driver in configfs is
set to one which is not flexible.
Dwc3 udc will be removed when usb core switch to host mode. This causes
failure of writing name of dwc3 udc to configfs's UDC attribuite.
To fix this we need to add a way to change the config of
"match_existing_only".
There are systems like Android do not support udev, so adding
"match_existing_only" attribute to allow configuration by user is cost little.
This patch adds a configfs attribuite for controling match_existing_only
which allow user to config "match_existing_only".

Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
 drivers/usb/gadget/configfs.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 025129942894..be85104bfab9 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -291,6 +291,36 @@ static ssize_t gadget_dev_desc_UDC_store(struct config_item *item,
 	return ret;
 }
 
+static ssize_t gadget_driver_match_existing_only_store(struct config_item *item,
+		const char *page, size_t len)
+{
+	struct gadget_info *gi = to_gadget_info(item);
+	struct usb_gadget_driver *gadget_driver = &(gi->composite.gadget_driver);
+	bool match_existing_only;
+	int ret;
+
+	ret = kstrtobool(page, &match_existing_only);
+	if (ret)
+		return ret;
+
+	if (match_existing_only)
+		gadget_driver->match_existing_only = 1;
+	else
+		gadget_driver->match_existing_only = 0;
+
+	return len;
+}
+
+static ssize_t gadget_driver_match_existing_only_show(struct config_item *item,
+		char *page)
+{
+	struct gadget_info *gi = to_gadget_info(item);
+	struct usb_gadget_driver *gadget_driver = &(gi->composite.gadget_driver);
+	bool match_existing_only = !!gadget_driver->match_existing_only;
+
+	return sprintf(page, "%s\n", match_existing_only ? "true" : "false");
+}
+
 CONFIGFS_ATTR(gadget_dev_desc_, bDeviceClass);
 CONFIGFS_ATTR(gadget_dev_desc_, bDeviceSubClass);
 CONFIGFS_ATTR(gadget_dev_desc_, bDeviceProtocol);
@@ -300,6 +330,7 @@ CONFIGFS_ATTR(gadget_dev_desc_, idProduct);
 CONFIGFS_ATTR(gadget_dev_desc_, bcdDevice);
 CONFIGFS_ATTR(gadget_dev_desc_, bcdUSB);
 CONFIGFS_ATTR(gadget_dev_desc_, UDC);
+CONFIGFS_ATTR(gadget_, driver_match_existing_only);
 
 static struct configfs_attribute *gadget_root_attrs[] = {
 	&gadget_dev_desc_attr_bDeviceClass,
@@ -311,6 +342,7 @@ static struct configfs_attribute *gadget_root_attrs[] = {
 	&gadget_dev_desc_attr_bcdDevice,
 	&gadget_dev_desc_attr_bcdUSB,
 	&gadget_dev_desc_attr_UDC,
+	&gadget_attr_driver_match_existing_only,
 	NULL,
 };
 
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v2 10/10] dts: hi3660: Add support for usb on Hikey960
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (8 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 09/10] usb: gadget: Add configfs attribuite for controling match_existing_only Yu Chen
@ 2019-02-18 11:23 ` Yu Chen
  2019-02-18 17:30 ` [PATCH v2 00/10] " Valentin Schneider
  10 siblings, 0 replies; 31+ messages in thread
From: Yu Chen @ 2019-02-18 11:23 UTC (permalink / raw)
  To: linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Yu Chen, Wei Xu, Rob Herring,
	Mark Rutland, linux-arm-kernel, Binghui Wang

This patch adds support for usb on Hikey960.

Cc: Wei Xu <xuwei5@hisilicon.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: John Stultz <john.stultz@linaro.org>
Cc: Binghui Wang <wangbinghui@hisilicon.com>
Signed-off-by: Yu Chen <chenyu56@huawei.com>
---
v2:
* Remove device_type property.
* Add property "usb-role-switch".
---
---
 arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts | 54 +++++++++++++++++
 arch/arm64/boot/dts/hisilicon/hi3660.dtsi         | 73 +++++++++++++++++++++++
 2 files changed, 127 insertions(+)

diff --git a/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts b/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
index 46435466f1ab..2cada9d44046 100644
--- a/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
+++ b/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
@@ -13,6 +13,7 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
 #include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/usb/pd.h>
 
 / {
 	model = "HiKey960";
@@ -196,6 +197,27 @@
 			method = "smc";
 		};
 	};
+
+	hisi_hikey_usb: hisi_hikey_usb {
+		compatible = "hisilicon,hikey960_usb";
+		typec-vbus-gpios = <&gpio25 2 0>;
+		typec-vbus-enable-val = <1>;
+		otg-switch-gpios = <&gpio25 6 0>;
+		hub-vdd33-en-gpios = <&gpio5 6 0>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&usbhub5734_pmx_func>;
+
+		port {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			hikey_usb_ep: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&dwc3_role_switch_notify>;
+			};
+		};
+	};
+
 };
 
 /*
@@ -526,6 +548,38 @@
 &i2c1 {
 	status = "okay";
 
+	rt1711h: rt1711h@4e {
+		compatible = "richtek,rt1711h";
+		reg = <0x4e>;
+		status = "ok";
+		interrupt-parent = <&gpio27>;
+		interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&usb_cfg_func>;
+
+		usb_con: connector {
+			compatible = "usb-c-connector";
+			label = "USB-C";
+			data-role = "dual";
+			power-role = "dual";
+			try-power-role = "sink";
+			source-pdos = <PDO_FIXED(5000, 500, PDO_FIXED_USB_COMM)>;
+			sink-pdos = <PDO_FIXED(5000, 500, PDO_FIXED_USB_COMM)
+				PDO_VAR(5000, 5000, 1000)>;
+			op-sink-microwatt = <10000000>;
+		};
+
+		port {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			rt1711h_ep: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&dwc3_role_switch>;
+			};
+		};
+	};
+
 	adv7533: adv7533@39 {
 		status = "ok";
 		compatible = "adi,adv7533";
diff --git a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
index 20ae40df61d5..a2808c53c538 100644
--- a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
@@ -355,6 +355,12 @@
 			#clock-cells = <1>;
 		};
 
+		pmctrl: pmctrl@fff31000 {
+			compatible = "hisilicon,hi3660-pmctrl", "syscon";
+			reg = <0x0 0xfff31000 0x0 0x1000>;
+			#clock-cells = <1>;
+		};
+
 		pmuctrl: crg_ctrl@fff34000 {
 			compatible = "hisilicon,hi3660-pmuctrl", "syscon";
 			reg = <0x0 0xfff34000 0x0 0x1000>;
@@ -1134,5 +1140,72 @@
 				};
 			};
 		};
+
+		usb3_otg_bc: usb3_otg_bc@ff200000 {
+			compatible = "syscon";
+			reg = <0x0 0xff200000 0x0 0x1000>;
+		};
+
+		usb_phy: usb-phy {
+			compatible = "hisilicon,hi3660-usb-phy";
+			#phy-cells = <0>;
+			hisilicon,pericrg-syscon = <&crg_ctrl>;
+			hisilicon,pctrl-syscon = <&pctrl>;
+			hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;
+			hisilicon,eye-diagram-param = <0x22466e4>;
+		};
+
+		usb3: hisi_dwc3 {
+			compatible = "hisilicon,hi3660-dwc3";
+			#address-cells = <2>;
+			#size-cells = <2>;
+			ranges;
+
+			clocks = <&crg_ctrl HI3660_CLK_ABB_USB>,
+				 <&crg_ctrl HI3660_ACLK_GATE_USB3OTG>;
+			clock-names = "clk_usb3phy_ref", "aclk_usb3otg";
+
+			assigned-clocks = <&crg_ctrl HI3660_ACLK_GATE_USB3OTG>;
+			assigned-clock-rates = <229000000>;
+			resets = <&crg_rst 0x90 8>,
+				 <&crg_rst 0x90 7>,
+				 <&crg_rst 0x90 6>,
+				 <&crg_rst 0x90 5>;
+
+			dwc3: dwc3@ff100000 {
+				compatible = "snps,dwc3";
+				reg = <0x0 0xff100000 0x0 0x100000>;
+				interrupts = <0 159 4>, <0 161 4>;
+				phys = <&usb_phy>;
+				phy-names = "usb3-phy";
+				dr_mode = "otg";
+				maximum-speed = "super-speed";
+				phy_type = "utmi";
+				snps,dis-del-phy-power-chg-quirk;
+				snps,lfps_filter_quirk;
+				snps,dis_u2_susphy_quirk;
+				snps,dis_u3_susphy_quirk;
+				snps,tx_de_emphasis_quirk;
+				snps,tx_de_emphasis = <1>;
+				snps,dis_enblslpm_quirk;
+				snps,gctl-reset-quirk;
+				usb-role-switch;
+
+				port {
+					#address-cells = <1>;
+					#size-cells = <0>;
+
+					dwc3_role_switch: endpoint@0 {
+						reg = <0>;
+						remote-endpoint = <&rt1711h_ep>;
+					};
+
+					dwc3_role_switch_notify: endpoint@1 {
+						reg = <1>;
+						remote-endpoint = <&hikey_usb_ep>;
+					};
+				};
+			};
+		};
 	};
 };
-- 
2.15.0-rc2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin Soc Platform
  2019-02-18 11:23 ` [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin " Yu Chen
@ 2019-02-18 12:21   ` Andy Shevchenko
  2019-02-18 12:31     ` Chen Yu
  0 siblings, 1 reply; 31+ messages in thread
From: Andy Shevchenko @ 2019-02-18 12:21 UTC (permalink / raw)
  To: Yu Chen
  Cc: USB, devicetree, Linux Kernel Mailing List, John Stultz,
	Suzhuangluan, Kongfei, liuyu712, wanghu17, butao, Yao Chen,
	fangshengzhou, lipengcheng8, songxiaowei, xu yiping, xuyoujun4,
	yudongbin, zangleigang, Felipe Balbi, Greg Kroah-Hartman,
	Binghui Wang

On Mon, Feb 18, 2019 at 1:23 PM Yu Chen <chenyu56@huawei.com> wrote:
>
> There are tow quirks for DesignWare USB3 DRD Core of Hisilicon Kirin Soc.
> 1)SPLIT_BOUNDARY_DISABLE should be set for Host mode
> 2)A GCTL soft reset should be executed when switch mode

Thus, it must be two patches, no?

> +static void dwc3_gctl_core_soft_reset(struct dwc3 *dwc)
> +{
> +       u32 reg;
> +
> +       reg = dwc3_readl(dwc->regs, DWC3_GCTL);

> +       reg |= (DWC3_GCTL_CORESOFTRESET);

Redundant parens.

> +       dwc3_writel(dwc->regs, DWC3_GCTL, reg);
> +
> +       reg = dwc3_readl(dwc->regs, DWC3_GCTL);

> +       reg &= ~(DWC3_GCTL_CORESOFTRESET);

Ditto.

> +       dwc3_writel(dwc->regs, DWC3_GCTL, reg);
> +}

> +static void dwc3_complete(struct device *dev)
> +{

> +       struct dwc3     *dwc = dev_get_drvdata(dev);
> +       u32             reg;

Indentation style is different to the other functions in the same patch.
Use simple space here.

> +       if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST &&
> +                       dwc->dis_split_quirk) {
> +               dev_dbg(dwc->dev, "set DWC3_GUCTL3_SPLITDISABLE\n");
> +               reg = dwc3_readl(dwc->regs, DWC3_GUCTL3);
> +               reg |= DWC3_GUCTL3_SPLITDISABLE;
> +               dwc3_writel(dwc->regs, DWC3_GUCTL3, reg);
> +       }
> +}

> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -269,7 +269,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
>  {
>         const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;
>         struct dwc3             *dwc = dep->dwc;

> -       u32                     timeout = 1000;
> +       u32                     timeout = 5000;

I don't see anything about this change in commit message. Moreoever,
it looks like it must be a separate logical change with its own
description.

>         u32                     saved_config = 0;
>         u32                     reg;


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin Soc Platform
  2019-02-18 12:21   ` Andy Shevchenko
@ 2019-02-18 12:31     ` Chen Yu
  0 siblings, 0 replies; 31+ messages in thread
From: Chen Yu @ 2019-02-18 12:31 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: liuyu712, USB, devicetree, Linux Kernel Mailing List,
	John Stultz, Suzhuangluan, Kongfei, wanghu17, butao, Yao Chen,
	fangshengzhou, lipengcheng8, songxiaowei, xu yiping, xuyoujun4,
	yudongbin, zangleigang, Felipe Balbi, Greg Kroah-Hartman,
	Binghui Wang

Hi,

On 2019/2/18 20:21, Andy Shevchenko wrote:
> On Mon, Feb 18, 2019 at 1:23 PM Yu Chen <chenyu56@huawei.com> wrote:
>>
>> There are tow quirks for DesignWare USB3 DRD Core of Hisilicon Kirin Soc.
>> 1)SPLIT_BOUNDARY_DISABLE should be set for Host mode
>> 2)A GCTL soft reset should be executed when switch mode
> 
> Thus, it must be two patches, no?
> 
>> +static void dwc3_gctl_core_soft_reset(struct dwc3 *dwc)
>> +{
>> +       u32 reg;
>> +
>> +       reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> 
>> +       reg |= (DWC3_GCTL_CORESOFTRESET);
> 
> Redundant parens.
> 
>> +       dwc3_writel(dwc->regs, DWC3_GCTL, reg);
>> +
>> +       reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> 
>> +       reg &= ~(DWC3_GCTL_CORESOFTRESET);
> 
> Ditto.
> 
>> +       dwc3_writel(dwc->regs, DWC3_GCTL, reg);
>> +}
> 
>> +static void dwc3_complete(struct device *dev)
>> +{
> 
>> +       struct dwc3     *dwc = dev_get_drvdata(dev);
>> +       u32             reg;
> 
> Indentation style is different to the other functions in the same patch.
> Use simple space here.
> 
>> +       if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST &&
>> +                       dwc->dis_split_quirk) {
>> +               dev_dbg(dwc->dev, "set DWC3_GUCTL3_SPLITDISABLE\n");
>> +               reg = dwc3_readl(dwc->regs, DWC3_GUCTL3);
>> +               reg |= DWC3_GUCTL3_SPLITDISABLE;
>> +               dwc3_writel(dwc->regs, DWC3_GUCTL3, reg);
>> +       }
>> +}
> 
>> --- a/drivers/usb/dwc3/gadget.c
>> +++ b/drivers/usb/dwc3/gadget.c
>> @@ -269,7 +269,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
>>  {
>>         const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;
>>         struct dwc3             *dwc = dep->dwc;
> 
>> -       u32                     timeout = 1000;
>> +       u32                     timeout = 5000;
> 
> I don't see anything about this change in commit message. Moreoever,
> it looks like it must be a separate logical change with its own
> description.
> 
>>         u32                     saved_config = 0;
>>         u32                     reg;
> 
> 

I will separate these changes into different patches. Thanks!


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 00/10] Add support for usb on Hikey960
  2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
                   ` (9 preceding siblings ...)
  2019-02-18 11:23 ` [PATCH v2 10/10] dts: hi3660: Add support for usb on Hikey960 Yu Chen
@ 2019-02-18 17:30 ` Valentin Schneider
  2019-02-19  1:34   ` Chen Yu
  10 siblings, 1 reply; 31+ messages in thread
From: Valentin Schneider @ 2019-02-18 17:30 UTC (permalink / raw)
  To: Yu Chen, linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang

Hi,

On 18/02/2019 11:23, Yu Chen wrote:
> The patchset adds support for usb functionality of Hikey960, includes:
> - dwc3 driver for Hisilicon Kirin Soc hi3660
> - usb driver for HiKey960 board
> - some adjustment in dwc3, usb gadget and typec driver
> - dts for support usb of HiKey960
> 

I want to try this out on my HiKey960, but I can't get the USB A ports
working (tried USB stick and USB eth adapter).

On top of the arm64 defconfig, I've enabled (with menuconfig):

	CONFIG_PHY_HI3660_USB
	CONFIG_HISI_HIKEY_USB

Am I missing something? FYI up until now I've carried over Fan Ning's old
USB patch-set and that works fine, so I think it might just be a
configuration error from my end.

Thanks,
Valentin



^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code.
  2019-02-18 11:23 ` [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code Yu Chen
@ 2019-02-18 17:30   ` Valentin Schneider
  2019-02-19  1:40     ` Chen Yu
  2019-02-19  2:57   ` Jun Li
  1 sibling, 1 reply; 31+ messages in thread
From: Valentin Schneider @ 2019-02-18 17:30 UTC (permalink / raw)
  To: Yu Chen, linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Felipe Balbi,
	Greg Kroah-Hartman, Heikki Krogerus

Hi,

On 18/02/2019 11:23, Yu Chen wrote:
[...]
> @@ -522,6 +556,15 @@ int dwc3_drd_init(struct dwc3 *dwc)
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
>  	}
>  
> +	dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
> +	dwc3_role_switch.set = dwc3_usb_role_switch_set;
> +	dwc3_role_switch.get = dwc3_usb_role_switch_get;
> +	dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);

Building arm64 defconfig gives me this:

drivers/usb/dwc3/drd.o: In function `dwc3_drd_exit':
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604: undefined reference to `usb_role_switch_unregister'
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604:(.text+0x814): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_unregister'
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604: undefined reference to `usb_role_switch_unregister'
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604:(.text+0x844): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_unregister'
drivers/usb/dwc3/drd.o: In function `dwc3_drd_init':
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562: undefined reference to `usb_role_switch_register'
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562:(.text+0xa20): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_register'
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562: undefined reference to `usb_role_switch_register'
/home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562:(.text+0xb4c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_register'
Makefile:1024: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

This has CONFIG_USB_ROLE_SWITCH=m, setting it as a built-in makes the thing
linkable.

I suppose that's because defconfig gives us

  CONFIG_USB_DWC3_DUAL_ROLE=y

but then that should probably force a CONFIG_USB_ROLE_SWITCH=y. My
immediate reaction to this would be to add:

---
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index 2b1494460d0c..661b1d2efc8b 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -44,6 +44,7 @@ config USB_DWC3_DUAL_ROLE
 	bool "Dual Role mode"
 	depends on ((USB=y || USB=USB_DWC3) && (USB_GADGET=y || USB_GADGET=USB_DWC3))
 	depends on (EXTCON=y || EXTCON=USB_DWC3)
+	select USB_ROLE_SWITCH
 	help
 	  This is the default mode of working of DWC3 controller where
 	  both host and gadget features are enabled.
---
  
Not sure how acceptable that is though.


> +	if (ret) {
> +		dwc3_drd_exit(dwc);
> +		return PTR_ERR(dwc->role_sw);
> +	}
> +
>  	return 0;
>  }
>  
> @@ -557,4 +600,6 @@ void dwc3_drd_exit(struct dwc3 *dwc)
>  
>  	if (!dwc->edev)
>  		free_irq(dwc->otg_irq, dwc);
> +
> +	usb_role_switch_unregister(dwc->role_sw);
>  }
> 

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  2019-02-18 11:23 ` [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Yu Chen
@ 2019-02-18 20:18   ` Rob Herring
  2019-02-19  1:50     ` Chen Yu
  0 siblings, 1 reply; 31+ messages in thread
From: Rob Herring @ 2019-02-18 20:18 UTC (permalink / raw)
  To: Yu Chen
  Cc: linux-usb, devicetree, linux-kernel, john.stultz, suzhuangluan,
	kongfei, liuyu712, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Mark Rutland, Binghui Wang

On Mon, Feb 18, 2019 at 07:23:01PM +0800, Yu Chen wrote:
> This patch adds binding documentation for supporting the hi3660 usb
> phy on boards like the HiKey960.
> 
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> ---
> v1:
> * Fix some format error as suggested by Rob.
> v2:
> * Change hi3660 usb PHY to hi3660 USB PHY
> ---
> ---
>  .../devicetree/bindings/phy/phy-hi3660-usb3.txt     | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> 
> diff --git a/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> new file mode 100644
> index 000000000000..f9a3d56cfdd2
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> @@ -0,0 +1,21 @@
> +Hisilicon hi3660 USB PHY
> +-----------------------
> +
> +Required properties:
> +- compatible: should be "hisilicon,hi3660-usb-phy"
> +- #phy-cells: must be 0
> +- hisilicon,pericrg-syscon: phandle of syscon used to control phy.
> +- hisilicon,pctrl-syscon: phandle of syscon used to control phy.
> +- hisilicon,usb3-otg-bc-syscon: phandle of syscon used to control phy.
> +- hisilicon,eye-diagram-param: parameter set for phy
> +Refer to phy/phy-bindings.txt for the generic PHY binding properties
> +
> +Example:
> +	usb-phy {
> +		compatible = "hisilicon,hi3660-usb-phy";
> +		#phy-cells = <0>;
> +		hisilicon,pericrg-syscon = <&crg_ctrl>;
> +		hisilicon,pctrl-syscon = <&pctrl>;
> +		hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;

Are most of the registers within one of these blocks? If so, make this 
node a child of that node.

> +		hisilicon,eye-diagram-param = <0x22466e4>;
> +	};
> -- 
> 2.15.0-rc2
> 

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 00/10] Add support for usb on Hikey960
  2019-02-18 17:30 ` [PATCH v2 00/10] " Valentin Schneider
@ 2019-02-19  1:34   ` Chen Yu
  2019-02-19 11:31     ` Valentin Schneider
  0 siblings, 1 reply; 31+ messages in thread
From: Chen Yu @ 2019-02-19  1:34 UTC (permalink / raw)
  To: Valentin Schneider, linux-usb, devicetree, linux-kernel
  Cc: liuyu712, john.stultz, suzhuangluan, kongfei, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang

Hi,

On 2019/2/19 1:30, Valentin Schneider wrote:
> Hi,
> 
> On 18/02/2019 11:23, Yu Chen wrote:
>> The patchset adds support for usb functionality of Hikey960, includes:
>> - dwc3 driver for Hisilicon Kirin Soc hi3660
>> - usb driver for HiKey960 board
>> - some adjustment in dwc3, usb gadget and typec driver
>> - dts for support usb of HiKey960
>>
> 
> I want to try this out on my HiKey960, but I can't get the USB A ports
> working (tried USB stick and USB eth adapter).
> 
> On top of the arm64 defconfig, I've enabled (with menuconfig):
> 
> 	CONFIG_PHY_HI3660_USB
> 	CONFIG_HISI_HIKEY_USB
> 
> Am I missing something? FYI up until now I've carried over Fan Ning's old
> USB patch-set and that works fine, so I think it might just be a
> configuration error from my end.

This patch set based on Heikki Krogerus's patches.
Have you applied https://do-db2.lkml.org/lkml/2019/2/13/106 first?
And these configs should be set to y:
	CONFIG_TYPEC
	CONFIG_TYPEC_TCPM
	CONFIG_TYPEC_TCPCI
	CONFIG_TYPEC_RT1711H

> 
> Thanks,
> Valentin
> 
> 
> 
> .
> 

Thanks,
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code.
  2019-02-18 17:30   ` Valentin Schneider
@ 2019-02-19  1:40     ` Chen Yu
  0 siblings, 0 replies; 31+ messages in thread
From: Chen Yu @ 2019-02-19  1:40 UTC (permalink / raw)
  To: Valentin Schneider, linux-usb, devicetree, linux-kernel
  Cc: liuyu712, john.stultz, suzhuangluan, kongfei, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Felipe Balbi,
	Greg Kroah-Hartman, Heikki Krogerus

Hi,

On 2019/2/19 1:30, Valentin Schneider wrote:
> Hi,
> 
> On 18/02/2019 11:23, Yu Chen wrote:
> [...]
>> @@ -522,6 +556,15 @@ int dwc3_drd_init(struct dwc3 *dwc)
>>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
>>  	}
>>  
>> +	dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
>> +	dwc3_role_switch.set = dwc3_usb_role_switch_set;
>> +	dwc3_role_switch.get = dwc3_usb_role_switch_get;
>> +	dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);
> 
> Building arm64 defconfig gives me this:
> 
> drivers/usb/dwc3/drd.o: In function `dwc3_drd_exit':
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604: undefined reference to `usb_role_switch_unregister'
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604:(.text+0x814): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_unregister'
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604: undefined reference to `usb_role_switch_unregister'
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:604:(.text+0x844): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_unregister'
> drivers/usb/dwc3/drd.o: In function `dwc3_drd_init':
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562: undefined reference to `usb_role_switch_register'
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562:(.text+0xa20): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_register'
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562: undefined reference to `usb_role_switch_register'
> /home/valsch01/Work/kernel/drivers/usb/dwc3/drd.c:562:(.text+0xb4c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `usb_role_switch_register'
> Makefile:1024: recipe for target 'vmlinux' failed
> make: *** [vmlinux] Error 1
> 
> This has CONFIG_USB_ROLE_SWITCH=m, setting it as a built-in makes the thing
> linkable.
> 
> I suppose that's because defconfig gives us
> 
>   CONFIG_USB_DWC3_DUAL_ROLE=y
> 
> but then that should probably force a CONFIG_USB_ROLE_SWITCH=y. My
> immediate reaction to this would be to add:
> 
> ---
> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
> index 2b1494460d0c..661b1d2efc8b 100644
> --- a/drivers/usb/dwc3/Kconfig
> +++ b/drivers/usb/dwc3/Kconfig
> @@ -44,6 +44,7 @@ config USB_DWC3_DUAL_ROLE
>  	bool "Dual Role mode"
>  	depends on ((USB=y || USB=USB_DWC3) && (USB_GADGET=y || USB_GADGET=USB_DWC3))
>  	depends on (EXTCON=y || EXTCON=USB_DWC3)
> +	select USB_ROLE_SWITCH
>  	help
>  	  This is the default mode of working of DWC3 controller where
>  	  both host and gadget features are enabled.
> ---
>   
> Not sure how acceptable that is though.
> 
Thanks for your notice! I will add this in next version.

> 
>> +	if (ret) {
>> +		dwc3_drd_exit(dwc);
>> +		return PTR_ERR(dwc->role_sw);
>> +	}
>> +
>>  	return 0;
>>  }
>>  
>> @@ -557,4 +600,6 @@ void dwc3_drd_exit(struct dwc3 *dwc)
>>  
>>  	if (!dwc->edev)
>>  		free_irq(dwc->otg_irq, dwc);
>> +
>> +	usb_role_switch_unregister(dwc->role_sw);
>>  }
>>
> 
> .
> 

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  2019-02-18 20:18   ` Rob Herring
@ 2019-02-19  1:50     ` Chen Yu
  2019-02-19  3:03       ` Chunfeng Yun
  0 siblings, 1 reply; 31+ messages in thread
From: Chen Yu @ 2019-02-19  1:50 UTC (permalink / raw)
  To: Rob Herring
  Cc: liuyu712, linux-usb, devicetree, linux-kernel, john.stultz,
	suzhuangluan, kongfei, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Mark Rutland, Binghui Wang

Hi,

On 2019/2/19 4:18, Rob Herring wrote:
> On Mon, Feb 18, 2019 at 07:23:01PM +0800, Yu Chen wrote:
>> This patch adds binding documentation for supporting the hi3660 usb
>> phy on boards like the HiKey960.
>>
>> Cc: Rob Herring <robh+dt@kernel.org>
>> Cc: Mark Rutland <mark.rutland@arm.com>
>> Cc: John Stultz <john.stultz@linaro.org>
>> Cc: Binghui Wang <wangbinghui@hisilicon.com>
>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>> ---
>> v1:
>> * Fix some format error as suggested by Rob.
>> v2:
>> * Change hi3660 usb PHY to hi3660 USB PHY
>> ---
>> ---
>>  .../devicetree/bindings/phy/phy-hi3660-usb3.txt     | 21 +++++++++++++++++++++
>>  1 file changed, 21 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
>>
>> diff --git a/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
>> new file mode 100644
>> index 000000000000..f9a3d56cfdd2
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
>> @@ -0,0 +1,21 @@
>> +Hisilicon hi3660 USB PHY
>> +-----------------------
>> +
>> +Required properties:
>> +- compatible: should be "hisilicon,hi3660-usb-phy"
>> +- #phy-cells: must be 0
>> +- hisilicon,pericrg-syscon: phandle of syscon used to control phy.
>> +- hisilicon,pctrl-syscon: phandle of syscon used to control phy.
>> +- hisilicon,usb3-otg-bc-syscon: phandle of syscon used to control phy.
>> +- hisilicon,eye-diagram-param: parameter set for phy
>> +Refer to phy/phy-bindings.txt for the generic PHY binding properties
>> +
>> +Example:
>> +	usb-phy {
>> +		compatible = "hisilicon,hi3660-usb-phy";
>> +		#phy-cells = <0>;
>> +		hisilicon,pericrg-syscon = <&crg_ctrl>;
>> +		hisilicon,pctrl-syscon = <&pctrl>;
>> +		hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;
> 
> Are most of the registers within one of these blocks? If so, make this 
> node a child of that node.
I met a problem when I made this node a child of the syscon node,
the driver "phy-hi3660-usb3" was not probed.
Do you have any idea about how to make it probed when it is a child node?
> 
>> +		hisilicon,eye-diagram-param = <0x22466e4>;
>> +	};
>> -- 
>> 2.15.0-rc2
>>
> 
> .
> 

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960
  2019-02-18 11:23 ` [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960 Yu Chen
@ 2019-02-19  2:50   ` Chunfeng Yun
  2019-02-19  3:20     ` Chen Yu
  0 siblings, 1 reply; 31+ messages in thread
From: Chunfeng Yun @ 2019-02-19  2:50 UTC (permalink / raw)
  To: Yu Chen
  Cc: linux-usb, devicetree, linux-kernel, john.stultz, suzhuangluan,
	kongfei, liuyu712, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman,
	Binghui Wang, Heikki Krogerus

Hi,
On Mon, 2019-02-18 at 19:23 +0800, Yu Chen wrote:
> This driver handles usb hub power on and typeC port event of HiKey960 board:
> 1)DP&DM switching between usb hub and typeC port base on typeC port
> state
> 2)Control power of usb hub on Hikey960
> 3)Control vbus of typeC port
> 
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> 
> ---
> v1:
> * Using gpiod API with the gpios.
> * Removing registering usb role switch.
> * Registering usb role switch notifier.
> v2:
> * Fix license declaration.
> * Add configuration of  gpio direction.
> * Remove some log print.
> ---
> ---
>  drivers/misc/Kconfig          |   6 ++
>  drivers/misc/Makefile         |   1 +
>  drivers/misc/hisi_hikey_usb.c | 181 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 188 insertions(+)
>  create mode 100644 drivers/misc/hisi_hikey_usb.c
> 
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index f417b06e11c5..8d8b717759e2 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -521,6 +521,12 @@ config PVPANIC
>  	  a paravirtualized device provided by QEMU; it lets a virtual machine
>  	  (guest) communicate panic events to the host.
>  
> +config HISI_HIKEY_USB
> +	tristate "USB functionality of HiSilicon Hikey Platform"
> +	depends on OF && GPIOLIB
> +	help
> +	  If you say yes here you get support for usb functionality of HiSilicon Hikey Platform.
> +
>  source "drivers/misc/c2port/Kconfig"
>  source "drivers/misc/eeprom/Kconfig"
>  source "drivers/misc/cb710/Kconfig"
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index e39ccbbc1b3a..dc8892b13a1a 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
>  obj-$(CONFIG_OCXL)		+= ocxl/
>  obj-y				+= cardreader/
>  obj-$(CONFIG_PVPANIC)   	+= pvpanic.o
> +obj-$(CONFIG_HISI_HIKEY_USB)	+= hisi_hikey_usb.o
> diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c
> new file mode 100644
> index 000000000000..70013f8e76f0
> --- /dev/null
> +++ b/drivers/misc/hisi_hikey_usb.c
> @@ -0,0 +1,181 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Support for usb functionality of Hikey series boards
> + * based on Hisilicon Kirin Soc.
> + *
> + * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
> + *		http://www.huawei.com
> + *
> + * Authors: Yu Chen <chenyu56@huawei.com>
> + */
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/usb/role.h>
> +
> +#define DEVICE_DRIVER_NAME "hisi_hikey_usb"
> +
> +#define HUB_VBUS_POWER_ON 1
> +#define HUB_VBUS_POWER_OFF 0
> +#define USB_SWITCH_TO_HUB 1
> +#define USB_SWITCH_TO_TYPEC 0
> +
> +struct hisi_hikey_usb {
> +	struct gpio_desc *otg_switch;
> +	struct gpio_desc *typec_vbus;
> +	struct gpio_desc *hub_vbus;
> +	int typec_vbus_enable_val;
> +
> +	struct usb_role_switch *role_sw;
> +	struct notifier_block nb;
> +};
> +
> +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value);
> +}
> +
> +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int switch_to)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to);
> +}
> +
> +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value);
> +}
> +
> +static int hisi_hikey_role_switch(struct notifier_block *nb,
> +			unsigned long state, void *data)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +
> +	hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb);
> +
> +	switch (state) {
> +	case USB_ROLE_NONE:
> +		usb_typec_power_ctrl(hisi_hikey_usb,
> +				!hisi_hikey_usb->typec_vbus_enable_val);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB);
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_HOST:
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		usb_typec_power_ctrl(hisi_hikey_usb,
> +				hisi_hikey_usb->typec_vbus_enable_val);
> +		break;
> +	case USB_ROLE_DEVICE:
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
> +		usb_typec_power_ctrl(hisi_hikey_usb,
> +				!hisi_hikey_usb->typec_vbus_enable_val);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +static int hisi_hikey_usb_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *root = dev->of_node;
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +	int ret;
> +
> +	hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL);
> +	if (!hisi_hikey_usb)
> +		return -ENOMEM;
> +
> +	hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch;
> +
> +	ret = of_property_read_u32(root, "typec-vbus-enable-val",
> +				   &hisi_hikey_usb->typec_vbus_enable_val);
> +	if (ret)
> +		hisi_hikey_usb->typec_vbus_enable_val = 1;
> +
> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> +			hisi_hikey_usb->typec_vbus_enable_val ?
> +			GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
> +	if (!hisi_hikey_usb->typec_vbus)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
> +
> +	gpiod_direction_output(hisi_hikey_usb->typec_vbus,
> +			!hisi_hikey_usb->typec_vbus_enable_val);
maybe a simple way if use fixed regulator?

> +
> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN);
> +	if (!hisi_hikey_usb->otg_switch)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
> +
> +	gpiod_direction_output(hisi_hikey_usb->otg_switch, USB_SWITCH_TO_HUB);
> +
> +	/* hub-vdd33-en is optional */
> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
> +			GPIOD_OUT_LOW);
> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
> +
> +	gpiod_direction_output(hisi_hikey_usb->hub_vbus, HUB_VBUS_POWER_ON);
ditto
> +
> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
> +	if (!hisi_hikey_usb->role_sw)
> +		return -EPROBE_DEFER;
> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
> +		return PTR_ERR(hisi_hikey_usb->role_sw);
> +
> +	ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +	if (ret) {
> +		usb_role_switch_put(hisi_hikey_usb->role_sw);
> +		return ret;
> +	}
> +
> +	platform_set_drvdata(pdev, hisi_hikey_usb);
> +
> +	return 0;
> +}
> +
> +static int  hisi_hikey_usb_remove(struct platform_device *pdev)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev);
> +
> +	usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +
> +	usb_role_switch_put(hisi_hikey_usb->role_sw);
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id id_table_hisi_hikey_usb[] = {
> +	{.compatible = "hisilicon,gpio_hubv1"},
> +	{.compatible = "hisilicon,hikey960_usb"},
> +	{}
> +};
> +
> +static struct platform_driver hisi_hikey_usb_driver = {
> +	.probe = hisi_hikey_usb_probe,
> +	.remove = hisi_hikey_usb_remove,
> +	.driver = {
> +		.name = DEVICE_DRIVER_NAME,
> +		.of_match_table = id_table_hisi_hikey_usb,
> +	},
> +};
> +
> +module_platform_driver(hisi_hikey_usb_driver);
> +
> +MODULE_AUTHOR("Yu Chen <chenyu56@huawei.com>");
> +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey");
> +MODULE_LICENSE("GPL v2");



^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code.
  2019-02-18 11:23 ` [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code Yu Chen
  2019-02-18 17:30   ` Valentin Schneider
@ 2019-02-19  2:57   ` Jun Li
  2019-02-19  3:37     ` Chen Yu
  1 sibling, 1 reply; 31+ messages in thread
From: Jun Li @ 2019-02-19  2:57 UTC (permalink / raw)
  To: Yu Chen
  Cc: linux-usb, devicetree, linux-kernel, john.stultz, suzhuangluan,
	kongfei, liuyu712, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Felipe Balbi, Greg Kroah-Hartman, Heikki Krogerus,
	Li Jun

Hi
Yu Chen <chenyu56@huawei.com> 于2019年2月18日周一 下午7:34写道:
>
> The Type-C drivers use USB role switch API to inform the
> system about the negotiated data role, so registering a role
> switch in the DRD code in order to support platforms with
> USB Type-C connectors.
>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Felipe Balbi <balbi@kernel.org>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Suggested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> ---
> v2:
> * Assign fwnode in dwc3_role_switch.
> ---
> ---
>  drivers/usb/dwc3/core.h |  2 ++
>  drivers/usb/dwc3/drd.c  | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 47 insertions(+)
>
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 402b3c29eb26..7385544b9936 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -25,6 +25,7 @@
>  #include <linux/usb/ch9.h>
>  #include <linux/usb/gadget.h>
>  #include <linux/usb/otg.h>
> +#include <linux/usb/role.h>
>  #include <linux/ulpi/interface.h>
>
>  #include <linux/phy/phy.h>
> @@ -1083,6 +1084,7 @@ struct dwc3 {
>         struct extcon_dev       *edev;
>         struct notifier_block   edev_nb;
>         enum usb_phy_interface  hsphy_mode;
> +       struct usb_role_switch  *role_sw;
>
>         u32                     fladj;
>         u32                     irq_gadget;
> diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c
> index 869725d15c74..cf977bb0d62e 100644
> --- a/drivers/usb/dwc3/drd.c
> +++ b/drivers/usb/dwc3/drd.c
> @@ -474,8 +474,42 @@ static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc)
>         return edev;
>  }
>
> +static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role)
> +{
> +       u32 mode;
> +
> +       switch (role) {
> +       case USB_ROLE_HOST:
> +               mode = DWC3_GCTL_PRTCAP_HOST;
> +               break;
> +       case USB_ROLE_DEVICE:
> +               mode = DWC3_GCTL_PRTCAP_DEVICE;
> +               break;
> +       default:
> +               mode = DWC3_GCTL_PRTCAP_HOST;

I'd propose let dwc3 stay at device mode at default case.

> +               break;
> +       };
> +
> +       dwc3_set_mode(dev_get_drvdata(dev), mode);
> +       return 0;
> +}
> +
> +static enum usb_role dwc3_usb_role_switch_get(struct device *dev)
> +{
> +       struct dwc3 *dwc = dev_get_drvdata(dev);
> +       unsigned long flags;
> +       enum usb_role role;
> +
> +       spin_lock_irqsave(&dwc->lock, flags);
> +       role = dwc->current_otg_role;
> +       spin_unlock_irqrestore(&dwc->lock, flags);
> +
> +       return role;
> +}
> +
>  int dwc3_drd_init(struct dwc3 *dwc)
>  {
> +       struct usb_role_switch_desc dwc3_role_switch = {0};
>         int ret, irq;
>
>         dwc->edev = dwc3_get_extcon(dwc);
> @@ -522,6 +556,15 @@ int dwc3_drd_init(struct dwc3 *dwc)
>                 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
>         }
>
> +       dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
> +       dwc3_role_switch.set = dwc3_usb_role_switch_set;
> +       dwc3_role_switch.get = dwc3_usb_role_switch_get;
> +       dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);
> +       if (ret) {
> +               dwc3_drd_exit(dwc);
> +               return PTR_ERR(dwc->role_sw);
> +       }
> +

My understanding is, if you use usb role switch, you don't need either edev or
OTG block event, so this should be like:

if (device_property_read_bool(dwc->dev, "usb-role-switch")) {
           usb role switch register;
} else if (edev) {
...
} else {
...
}

Jun
>         return 0;
>  }
>
> @@ -557,4 +600,6 @@ void dwc3_drd_exit(struct dwc3 *dwc)
>
>         if (!dwc->edev)
>                 free_irq(dwc->otg_irq, dwc);
> +
> +       usb_role_switch_unregister(dwc->role_sw);
>  }
> --
> 2.15.0-rc2
>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  2019-02-19  1:50     ` Chen Yu
@ 2019-02-19  3:03       ` Chunfeng Yun
  2019-02-19  3:55         ` Chen Yu
  2019-02-19 14:22         ` Rob Herring
  0 siblings, 2 replies; 31+ messages in thread
From: Chunfeng Yun @ 2019-02-19  3:03 UTC (permalink / raw)
  To: Chen Yu
  Cc: Rob Herring, liuyu712, linux-usb, devicetree, linux-kernel,
	john.stultz, suzhuangluan, kongfei, wanghu17, butao, chenyao11,
	fangshengzhou, lipengcheng8, songxiaowei, xuyiping, xuyoujun4,
	yudongbin, zangleigang, Mark Rutland, Binghui Wang

Hi,
On Tue, 2019-02-19 at 09:50 +0800, Chen Yu wrote:
> Hi,
> 
> On 2019/2/19 4:18, Rob Herring wrote:
> > On Mon, Feb 18, 2019 at 07:23:01PM +0800, Yu Chen wrote:
> >> This patch adds binding documentation for supporting the hi3660 usb
> >> phy on boards like the HiKey960.
> >>
> >> Cc: Rob Herring <robh+dt@kernel.org>
> >> Cc: Mark Rutland <mark.rutland@arm.com>
> >> Cc: John Stultz <john.stultz@linaro.org>
> >> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> >> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> >> ---
> >> v1:
> >> * Fix some format error as suggested by Rob.
> >> v2:
> >> * Change hi3660 usb PHY to hi3660 USB PHY
> >> ---
> >> ---
> >>  .../devicetree/bindings/phy/phy-hi3660-usb3.txt     | 21 +++++++++++++++++++++
> >>  1 file changed, 21 insertions(+)
> >>  create mode 100644 Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> >>
> >> diff --git a/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> >> new file mode 100644
> >> index 000000000000..f9a3d56cfdd2
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> >> @@ -0,0 +1,21 @@
> >> +Hisilicon hi3660 USB PHY
> >> +-----------------------
> >> +
> >> +Required properties:
> >> +- compatible: should be "hisilicon,hi3660-usb-phy"
> >> +- #phy-cells: must be 0
> >> +- hisilicon,pericrg-syscon: phandle of syscon used to control phy.
> >> +- hisilicon,pctrl-syscon: phandle of syscon used to control phy.
> >> +- hisilicon,usb3-otg-bc-syscon: phandle of syscon used to control phy.
> >> +- hisilicon,eye-diagram-param: parameter set for phy
> >> +Refer to phy/phy-bindings.txt for the generic PHY binding properties
> >> +
> >> +Example:
> >> +	usb-phy {
> >> +		compatible = "hisilicon,hi3660-usb-phy";
> >> +		#phy-cells = <0>;
> >> +		hisilicon,pericrg-syscon = <&crg_ctrl>;
> >> +		hisilicon,pctrl-syscon = <&pctrl>;
> >> +		hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;
> > 
> > Are most of the registers within one of these blocks? If so, make this 
> > node a child of that node.
> I met a problem when I made this node a child of the syscon node,
> the driver "phy-hi3660-usb3" was not probed.
> Do you have any idea about how to make it probed when it is a child node?
call of_platform_populate() in parent node's driver,
but I don't know whether it's a standard way
> > 
> >> +		hisilicon,eye-diagram-param = <0x22466e4>;
> >> +	};
> >> -- 
> >> 2.15.0-rc2
> >>
> > 
> > .
> > 
> 
> Thanks
> Yu Chen
> 



^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960
  2019-02-19  2:50   ` Chunfeng Yun
@ 2019-02-19  3:20     ` Chen Yu
  2019-02-22  7:32       ` Chunfeng Yun
  0 siblings, 1 reply; 31+ messages in thread
From: Chen Yu @ 2019-02-19  3:20 UTC (permalink / raw)
  To: Chunfeng Yun
  Cc: liuyu712, linux-usb, devicetree, linux-kernel, john.stultz,
	suzhuangluan, kongfei, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman,
	Binghui Wang, Heikki Krogerus

Hi,

On 2019/2/19 10:50, Chunfeng Yun wrote:
>> +	if (ret)
>> +		hisi_hikey_usb->typec_vbus_enable_val = 1;
>> +
>> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
>> +			hisi_hikey_usb->typec_vbus_enable_val ?
>> +			GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
>> +	if (!hisi_hikey_usb->typec_vbus)
>> +		return -ENOENT;
>> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
>> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
>> +
>> +	gpiod_direction_output(hisi_hikey_usb->typec_vbus,
>> +			!hisi_hikey_usb->typec_vbus_enable_val);
> maybe a simple way if use fixed regulator?
> 
The hardware of the Hikey960 board has been fixed, and the type-c
port can act as UFP. So it is better to close the vbus when Hikey960
connect to host(e.g PC).
>> +
>> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN);
>> +	if (!hisi_hikey_usb->otg_switch)
>> +		return -ENOENT;
>> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
>> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
>> +
>> +	gpiod_direction_output(hisi_hikey_usb->otg_switch, USB_SWITCH_TO_HUB);
>> +
>> +	/* hub-vdd33-en is optional */
>> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
>> +			GPIOD_OUT_LOW);
>> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
>> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
>> +
>> +	gpiod_direction_output(hisi_hikey_usb->hub_vbus, HUB_VBUS_POWER_ON);
> ditto
>> +
>> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
>> +	if (!hisi_hikey_usb->role_sw)
>> +		return -EPROBE_DEFER;
>> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
>> +		return PTR_ERR(hisi_hikey_usb->role_sw);
>> +

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code.
  2019-02-19  2:57   ` Jun Li
@ 2019-02-19  3:37     ` Chen Yu
  0 siblings, 0 replies; 31+ messages in thread
From: Chen Yu @ 2019-02-19  3:37 UTC (permalink / raw)
  To: Jun Li
  Cc: liuyu712, linux-usb, devicetree, linux-kernel, john.stultz,
	suzhuangluan, kongfei, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Felipe Balbi, Greg Kroah-Hartman, Heikki Krogerus,
	Li Jun

Hi,

On 2019/2/19 10:57, Jun Li wrote:
>>
>> +static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role)
>> +{
>> +       u32 mode;
>> +
>> +       switch (role) {
>> +       case USB_ROLE_HOST:
>> +               mode = DWC3_GCTL_PRTCAP_HOST;
>> +               break;
>> +       case USB_ROLE_DEVICE:
>> +               mode = DWC3_GCTL_PRTCAP_DEVICE;
>> +               break;
>> +       default:
>> +               mode = DWC3_GCTL_PRTCAP_HOST;
> 
> I'd propose let dwc3 stay at device mode at default case.
> 
Setting mode to DWC3_GCTL_PRTCAP_HOST at default case due to the
requirement of Hikey960 board. When there is no cable connected to
type-C port, dwc3 should be set to HOST mode and the hub on the
Hikey960 will be power on.
Here is the details of the Hikey960:
	https://www.96boards.org/documentation/consumer/hikey/hikey960/hardware-docs/hardware-user-manual.md.html

But I will check the code to see if it is possible to make dwc3
set to device mode at default case.

>> +               break;
>> +       };
>> +
>> +       dwc3_set_mode(dev_get_drvdata(dev), mode);
>> +       return 0;
>> +}
>> +
>> +static enum usb_role dwc3_usb_role_switch_get(struct device *dev)
>> +{
>> +       struct dwc3 *dwc = dev_get_drvdata(dev);
>> +       unsigned long flags;
>> +       enum usb_role role;
>> +
>> +       spin_lock_irqsave(&dwc->lock, flags);
>> +       role = dwc->current_otg_role;
>> +       spin_unlock_irqrestore(&dwc->lock, flags);
>> +
>> +       return role;
>> +}
>> +
>>  int dwc3_drd_init(struct dwc3 *dwc)
>>  {
>> +       struct usb_role_switch_desc dwc3_role_switch = {0};
>>         int ret, irq;
>>
>>         dwc->edev = dwc3_get_extcon(dwc);
>> @@ -522,6 +556,15 @@ int dwc3_drd_init(struct dwc3 *dwc)
>>                 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
>>         }
>>
>> +       dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
>> +       dwc3_role_switch.set = dwc3_usb_role_switch_set;
>> +       dwc3_role_switch.get = dwc3_usb_role_switch_get;
>> +       dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch);
>> +       if (ret) {
>> +               dwc3_drd_exit(dwc);
>> +               return PTR_ERR(dwc->role_sw);
>> +       }
>> +
> 
> My understanding is, if you use usb role switch, you don't need either edev or
> OTG block event, so this should be like:
> 
> if (device_property_read_bool(dwc->dev, "usb-role-switch")) {
>            usb role switch register;
> } else if (edev) {
> ...
> } else {
> ...
> }
Yes. Thanks!

> 
> Jun
>>         return 0;
>>  }
>>
>> @@ -557,4 +600,6 @@ void dwc3_drd_exit(struct dwc3 *dwc)
>>
>>         if (!dwc->edev)
>>                 free_irq(dwc->otg_irq, dwc);
>> +
>> +       usb_role_switch_unregister(dwc->role_sw);
>>  }
>> --
>> 2.15.0-rc2
>>
> 
> .
> 

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  2019-02-19  3:03       ` Chunfeng Yun
@ 2019-02-19  3:55         ` Chen Yu
  2019-02-19 14:22         ` Rob Herring
  1 sibling, 0 replies; 31+ messages in thread
From: Chen Yu @ 2019-02-19  3:55 UTC (permalink / raw)
  To: Chunfeng Yun
  Cc: liuyu712, Rob Herring, linux-usb, devicetree, linux-kernel,
	john.stultz, suzhuangluan, kongfei, wanghu17, butao, chenyao11,
	fangshengzhou, lipengcheng8, songxiaowei, xuyiping, xuyoujun4,
	yudongbin, zangleigang, Mark Rutland, Binghui Wang

Hi,

On 2019/2/19 11:03, Chunfeng Yun wrote:
>>>> +
>>>> +Example:
>>>> +	usb-phy {
>>>> +		compatible = "hisilicon,hi3660-usb-phy";
>>>> +		#phy-cells = <0>;
>>>> +		hisilicon,pericrg-syscon = <&crg_ctrl>;
>>>> +		hisilicon,pctrl-syscon = <&pctrl>;
>>>> +		hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;
>>>
>>> Are most of the registers within one of these blocks? If so, make this 
>>> node a child of that node.
>> I met a problem when I made this node a child of the syscon node,
>> the driver "phy-hi3660-usb3" was not probed.
>> Do you have any idea about how to make it probed when it is a child node?
> call of_platform_populate() in parent node's driver,
> but I don't know whether it's a standard way
Yes, this function is used in dwc3 driver to probe the child node.
But I think it is not a good way to modify the syscon driver.
>>>
>>>> +		hisilicon,eye-diagram-param = <0x22466e4>;
>>>> +	};
>>>> -- 
>>>> 2.15.0-rc2
>>>>

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960
  2019-02-18 11:23 ` [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960 Yu Chen
@ 2019-02-19  8:25   ` Sergei Shtylyov
  2019-02-20  2:34     ` Chen Yu
  0 siblings, 1 reply; 31+ messages in thread
From: Sergei Shtylyov @ 2019-02-19  8:25 UTC (permalink / raw)
  To: Yu Chen, linux-usb, devicetree, linux-kernel
  Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Rob Herring, Mark Rutland,
	Binghui Wang

Hello!

On 18.02.2019 14:23, Yu Chen wrote:

> This patch adds binding documentation to support usb hub and usb
> data role switch of Hisilicon HiKey960 Board.
> 
> Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> ---
> v1:
> * Fix some format errors as suggested by Sergei.
> * Modify gpio description to use gpiod API.
> v2:
> * Remove information about Hikey.
> * Fix gpio description.
> * Remove device_type of endpoint.
> ---
> ---
>   .../bindings/misc/hisilicon-hikey-usb.txt          | 35 ++++++++++++++++++++++
>   1 file changed, 35 insertions(+)
>   create mode 100644 Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
> 
> diff --git a/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt b/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
> new file mode 100644
> index 000000000000..c2b789b515df
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
> @@ -0,0 +1,35 @@
> +Support usb hub and usb data role switch of Hisilicon HiKey960 Board.
> +
> +-----------------------------
> +
> +Required properties:
> +- compatible: "hisilicon,gpio-hubv1","hisilicon,hikey960-usb"

    Only one of those, looking at your example?
    Need a space after comma, BTW.

> +- typec-vbus-gpios: gpio to control the vbus of typeC port
> +- typec-vbus-enable-val: gpio value that enable the vbus of typeC port

    Hm, I thought that can be inferred from the GPIO specifier above...

> +- otg-switch-gpios: gpio to switch DP & DM between the hub and typeC port
> +- hub-vdd33-en-gpios: gpio to enable the power of hub
> +- pinctrl-0: pinctrl config

    You forgot about "pinctrl-names"...

> +
> +Example
> +-----
> +
> +	hisi_hikey_usb: hisi_hikey_usb {
> +		compatible = "hisilicon,hikey960-usb";
> +		typec-vbus-gpios = <&gpio25 2 0>;
> +		typec-vbus-enable-val = <1>;
> +		otg-switch-gpios = <&gpio25 6 0>;
> +		hub-vdd33-en-gpios = <&gpio5 6 0>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&usbhub5734_pmx_func>;
> +
> +		port {
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +
> +			hikey_usb_ep: endpoint@0 {
> +				reg = <0>;
> +				remote-endpoint = <&dwc3_role_switch_notify>;
> +			};
> +		};
> +
> +	};

MBR, Sergei

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 00/10] Add support for usb on Hikey960
  2019-02-19  1:34   ` Chen Yu
@ 2019-02-19 11:31     ` Valentin Schneider
  0 siblings, 0 replies; 31+ messages in thread
From: Valentin Schneider @ 2019-02-19 11:31 UTC (permalink / raw)
  To: Chen Yu, linux-usb, devicetree, linux-kernel
  Cc: liuyu712, john.stultz, suzhuangluan, kongfei, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang

On 19/02/2019 01:34, Chen Yu wrote:
[...]
> This patch set based on Heikki Krogerus's patches.
> Have you applied https://do-db2.lkml.org/lkml/2019/2/13/106 first?
> And these configs should be set to y:
> 	CONFIG_TYPEC
> 	CONFIG_TYPEC_TCPM
> 	CONFIG_TYPEC_TCPCI
> 	CONFIG_TYPEC_RT1711H
> 

I was based on the right stack but didn't have those configs. It seems to
be working fine now, thanks!

Tested-by: Valentin Schneider <valentin.schneider@arm.com>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY
  2019-02-19  3:03       ` Chunfeng Yun
  2019-02-19  3:55         ` Chen Yu
@ 2019-02-19 14:22         ` Rob Herring
  1 sibling, 0 replies; 31+ messages in thread
From: Rob Herring @ 2019-02-19 14:22 UTC (permalink / raw)
  To: Chunfeng Yun
  Cc: Chen Yu, liuyu712, Linux USB List, devicetree, linux-kernel,
	John Stultz, Suzhuangluan, kongfei, wanghu17, butao, chenyao11,
	fangshengzhou, Li Pengcheng, Song Xiaowei, Yiping Xu, xuyoujun4,
	yudongbin, zangleigang, Mark Rutland, Binghui Wang

On Mon, Feb 18, 2019 at 9:03 PM Chunfeng Yun <chunfeng.yun@mediatek.com> wrote:
>
> Hi,
> On Tue, 2019-02-19 at 09:50 +0800, Chen Yu wrote:
> > Hi,
> >
> > On 2019/2/19 4:18, Rob Herring wrote:
> > > On Mon, Feb 18, 2019 at 07:23:01PM +0800, Yu Chen wrote:
> > >> This patch adds binding documentation for supporting the hi3660 usb
> > >> phy on boards like the HiKey960.
> > >>
> > >> Cc: Rob Herring <robh+dt@kernel.org>
> > >> Cc: Mark Rutland <mark.rutland@arm.com>
> > >> Cc: John Stultz <john.stultz@linaro.org>
> > >> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> > >> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> > >> ---
> > >> v1:
> > >> * Fix some format error as suggested by Rob.
> > >> v2:
> > >> * Change hi3660 usb PHY to hi3660 USB PHY
> > >> ---
> > >> ---
> > >>  .../devicetree/bindings/phy/phy-hi3660-usb3.txt     | 21 +++++++++++++++++++++
> > >>  1 file changed, 21 insertions(+)
> > >>  create mode 100644 Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> > >>
> > >> diff --git a/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> > >> new file mode 100644
> > >> index 000000000000..f9a3d56cfdd2
> > >> --- /dev/null
> > >> +++ b/Documentation/devicetree/bindings/phy/phy-hi3660-usb3.txt
> > >> @@ -0,0 +1,21 @@
> > >> +Hisilicon hi3660 USB PHY
> > >> +-----------------------
> > >> +
> > >> +Required properties:
> > >> +- compatible: should be "hisilicon,hi3660-usb-phy"
> > >> +- #phy-cells: must be 0
> > >> +- hisilicon,pericrg-syscon: phandle of syscon used to control phy.
> > >> +- hisilicon,pctrl-syscon: phandle of syscon used to control phy.
> > >> +- hisilicon,usb3-otg-bc-syscon: phandle of syscon used to control phy.
> > >> +- hisilicon,eye-diagram-param: parameter set for phy
> > >> +Refer to phy/phy-bindings.txt for the generic PHY binding properties
> > >> +
> > >> +Example:
> > >> +  usb-phy {
> > >> +          compatible = "hisilicon,hi3660-usb-phy";
> > >> +          #phy-cells = <0>;
> > >> +          hisilicon,pericrg-syscon = <&crg_ctrl>;
> > >> +          hisilicon,pctrl-syscon = <&pctrl>;
> > >> +          hisilicon,usb3-otg-bc-syscon = <&usb3_otg_bc>;
> > >
> > > Are most of the registers within one of these blocks? If so, make this
> > > node a child of that node.
> > I met a problem when I made this node a child of the syscon node,
> > the driver "phy-hi3660-usb3" was not probed.
> > Do you have any idea about how to make it probed when it is a child node?
> call of_platform_populate() in parent node's driver,
> but I don't know whether it's a standard way

It is. The other way is adding 'simple-mfd' compatible if there is no
driver for the parent.

Rob

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960
  2019-02-19  8:25   ` Sergei Shtylyov
@ 2019-02-20  2:34     ` Chen Yu
  0 siblings, 0 replies; 31+ messages in thread
From: Chen Yu @ 2019-02-20  2:34 UTC (permalink / raw)
  To: Sergei Shtylyov, linux-usb, devicetree, linux-kernel
  Cc: liuyu712, john.stultz, suzhuangluan, kongfei, wanghu17, butao,
	chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
	xuyoujun4, yudongbin, zangleigang, Rob Herring, Mark Rutland,
	Binghui Wang

Hi,

On 2019/2/19 16:25, Sergei Shtylyov wrote:
> Hello!
> 
> On 18.02.2019 14:23, Yu Chen wrote:
> 
>> This patch adds binding documentation to support usb hub and usb
>> data role switch of Hisilicon HiKey960 Board.
>>
>> Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>> Cc: Rob Herring <robh+dt@kernel.org>
>> Cc: Mark Rutland <mark.rutland@arm.com>
>> Cc: John Stultz <john.stultz@linaro.org>
>> Cc: Binghui Wang <wangbinghui@hisilicon.com>
>> Signed-off-by: Yu Chen <chenyu56@huawei.com>
>> ---
>> v1:
>> * Fix some format errors as suggested by Sergei.
>> * Modify gpio description to use gpiod API.
>> v2:
>> * Remove information about Hikey.
>> * Fix gpio description.
>> * Remove device_type of endpoint.
>> ---
>> ---
>>   .../bindings/misc/hisilicon-hikey-usb.txt          | 35 ++++++++++++++++++++++
>>   1 file changed, 35 insertions(+)
>>   create mode 100644 Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
>>
>> diff --git a/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt b/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
>> new file mode 100644
>> index 000000000000..c2b789b515df
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/misc/hisilicon-hikey-usb.txt
>> @@ -0,0 +1,35 @@
>> +Support usb hub and usb data role switch of Hisilicon HiKey960 Board.
>> +
>> +-----------------------------
>> +
>> +Required properties:
>> +- compatible: "hisilicon,gpio-hubv1","hisilicon,hikey960-usb"
> 
>    Only one of those, looking at your example?
"hisilicon,gpio-hubv1" is similar as "hisilicon,hikey960-usb".

>    Need a space after comma, BTW.
OK. Thanks!

> 
>> +- typec-vbus-gpios: gpio to control the vbus of typeC port
>> +- typec-vbus-enable-val: gpio value that enable the vbus of typeC port
> 
>    Hm, I thought that can be inferred from the GPIO specifier above...
> 
OK. Thanks!

>> +- otg-switch-gpios: gpio to switch DP & DM between the hub and typeC port
>> +- hub-vdd33-en-gpios: gpio to enable the power of hub
>> +- pinctrl-0: pinctrl config
> 
>    You forgot about "pinctrl-names"...
OK. Thanks!

> 
>> +
>> +Example
>> +-----
>> +
>> +    hisi_hikey_usb: hisi_hikey_usb {
>> +        compatible = "hisilicon,hikey960-usb";
>> +        typec-vbus-gpios = <&gpio25 2 0>;
>> +        typec-vbus-enable-val = <1>;
>> +        otg-switch-gpios = <&gpio25 6 0>;
>> +        hub-vdd33-en-gpios = <&gpio5 6 0>;
>> +        pinctrl-names = "default";
>> +        pinctrl-0 = <&usbhub5734_pmx_func>;
>> +
>> +        port {
>> +            #address-cells = <1>;
>> +            #size-cells = <0>;
>> +
>> +            hikey_usb_ep: endpoint@0 {
>> +                reg = <0>;
>> +                remote-endpoint = <&dwc3_role_switch_notify>;
>> +            };
>> +        };
>> +
>> +    };
> 
> MBR, Sergei
> 
> .
> 

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960
  2019-02-19  3:20     ` Chen Yu
@ 2019-02-22  7:32       ` Chunfeng Yun
  2019-03-02  1:02         ` Chen Yu
  0 siblings, 1 reply; 31+ messages in thread
From: Chunfeng Yun @ 2019-02-22  7:32 UTC (permalink / raw)
  To: Chen Yu
  Cc: liuyu712, linux-usb, devicetree, linux-kernel, john.stultz,
	suzhuangluan, kongfei, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman,
	Binghui Wang, Heikki Krogerus

On Tue, 2019-02-19 at 11:20 +0800, Chen Yu wrote:
> Hi,
> 
> On 2019/2/19 10:50, Chunfeng Yun wrote:
> >> +	if (ret)
> >> +		hisi_hikey_usb->typec_vbus_enable_val = 1;
> >> +
> >> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> >> +			hisi_hikey_usb->typec_vbus_enable_val ?
> >> +			GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
> >> +	if (!hisi_hikey_usb->typec_vbus)
> >> +		return -ENOENT;
> >> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
> >> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
> >> +
> >> +	gpiod_direction_output(hisi_hikey_usb->typec_vbus,
> >> +			!hisi_hikey_usb->typec_vbus_enable_val);
> > maybe a simple way if use fixed regulator?
> > 
> The hardware of the Hikey960 board has been fixed, and the type-c
> port can act as UFP. So it is better to close the vbus when Hikey960
> connect to host(e.g PC).
I guess you misunderstand what I mean?
Please refer to bindings/regulator/fixed-regulator.txt
If you control vbus by gpio, you can use fixed-regulator, it will be
easy to make compatible with other cases, think about using a LDO to
control vbus
> >> +
> >> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN);
> >> +	if (!hisi_hikey_usb->otg_switch)
> >> +		return -ENOENT;
> >> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
> >> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
> >> +
> >> +	gpiod_direction_output(hisi_hikey_usb->otg_switch, USB_SWITCH_TO_HUB);
> >> +
> >> +	/* hub-vdd33-en is optional */
> >> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
> >> +			GPIOD_OUT_LOW);
> >> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
> >> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
> >> +
> >> +	gpiod_direction_output(hisi_hikey_usb->hub_vbus, HUB_VBUS_POWER_ON);
> > ditto
> >> +
> >> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
> >> +	if (!hisi_hikey_usb->role_sw)
> >> +		return -EPROBE_DEFER;
> >> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
> >> +		return PTR_ERR(hisi_hikey_usb->role_sw);
> >> +
> 
> Thanks
> Yu Chen
> 



^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960
  2019-02-22  7:32       ` Chunfeng Yun
@ 2019-03-02  1:02         ` Chen Yu
  0 siblings, 0 replies; 31+ messages in thread
From: Chen Yu @ 2019-03-02  1:02 UTC (permalink / raw)
  To: Chunfeng Yun
  Cc: liuyu712, linux-usb, devicetree, linux-kernel, john.stultz,
	suzhuangluan, kongfei, wanghu17, butao, chenyao11, fangshengzhou,
	lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
	zangleigang, Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman,
	Binghui Wang, Heikki Krogerus

Hi Chunfeng Yun,

On 2019/2/22 15:32, Chunfeng Yun wrote:
> On Tue, 2019-02-19 at 11:20 +0800, Chen Yu wrote:
>> Hi,
>>
>> On 2019/2/19 10:50, Chunfeng Yun wrote:
>>>> +	if (ret)
>>>> +		hisi_hikey_usb->typec_vbus_enable_val = 1;
>>>> +
>>>> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
>>>> +			hisi_hikey_usb->typec_vbus_enable_val ?
>>>> +			GPIOD_OUT_LOW : GPIOD_OUT_HIGH);
>>>> +	if (!hisi_hikey_usb->typec_vbus)
>>>> +		return -ENOENT;
>>>> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
>>>> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
>>>> +
>>>> +	gpiod_direction_output(hisi_hikey_usb->typec_vbus,
>>>> +			!hisi_hikey_usb->typec_vbus_enable_val);
>>> maybe a simple way if use fixed regulator?
>>>
>> The hardware of the Hikey960 board has been fixed, and the type-c
>> port can act as UFP. So it is better to close the vbus when Hikey960
>> connect to host(e.g PC).
> I guess you misunderstand what I mean?
> Please refer to bindings/regulator/fixed-regulator.txt
> If you control vbus by gpio, you can use fixed-regulator, it will be
> easy to make compatible with other cases, think about using a LDO to
> control vbus
Sorry for misunderstanding the fixed-regulator and thanks for your advice!
I have read bindings/regulator/fixed-regulator.txt and I think it is enough
to use gpiod API right now.
>>>> +
>>>> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", GPIOD_IN);
>>>> +	if (!hisi_hikey_usb->otg_switch)
>>>> +		return -ENOENT;
>>>> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
>>>> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
>>>> +
>>>> +	gpiod_direction_output(hisi_hikey_usb->otg_switch, USB_SWITCH_TO_HUB);
>>>> +
>>>> +	/* hub-vdd33-en is optional */
>>>> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
>>>> +			GPIOD_OUT_LOW);
>>>> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
>>>> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
>>>> +
>>>> +	gpiod_direction_output(hisi_hikey_usb->hub_vbus, HUB_VBUS_POWER_ON);
>>> ditto
>>>> +
>>>> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
>>>> +	if (!hisi_hikey_usb->role_sw)
>>>> +		return -EPROBE_DEFER;
>>>> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
>>>> +		return PTR_ERR(hisi_hikey_usb->role_sw);
>>>> +
>>
>> Thanks
>> Yu Chen
>>
> 

Thanks
Yu Chen


^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2019-03-02  1:03 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-18 11:23 [PATCH v2 00/10] Add support for usb on Hikey960 Yu Chen
2019-02-18 11:23 ` [PATCH v2 01/10] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Yu Chen
2019-02-18 20:18   ` Rob Herring
2019-02-19  1:50     ` Chen Yu
2019-02-19  3:03       ` Chunfeng Yun
2019-02-19  3:55         ` Chen Yu
2019-02-19 14:22         ` Rob Herring
2019-02-18 11:23 ` [PATCH v2 02/10] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960 Yu Chen
2019-02-19  8:25   ` Sergei Shtylyov
2019-02-20  2:34     ` Chen Yu
2019-02-18 11:23 ` [PATCH v2 03/10] usb: dwc3: dwc3-of-simple: Add support for dwc3 of Hisilicon Soc Platform Yu Chen
2019-02-18 11:23 ` [PATCH v2 04/10] usb: dwc3: Add two quirks for Hisilicon Kirin " Yu Chen
2019-02-18 12:21   ` Andy Shevchenko
2019-02-18 12:31     ` Chen Yu
2019-02-18 11:23 ` [PATCH v2 05/10] phy: Add usb phy support for hi3660 Soc of Hisilicon Yu Chen
2019-02-18 11:23 ` [PATCH v2 06/10] usb: roles: Add usb role switch notifier Yu Chen
2019-02-18 11:23 ` [PATCH v2 07/10] usb: dwc3: Registering a role switch in the DRD code Yu Chen
2019-02-18 17:30   ` Valentin Schneider
2019-02-19  1:40     ` Chen Yu
2019-02-19  2:57   ` Jun Li
2019-02-19  3:37     ` Chen Yu
2019-02-18 11:23 ` [PATCH v2 08/10] hikey960: Support usb functionality of Hikey960 Yu Chen
2019-02-19  2:50   ` Chunfeng Yun
2019-02-19  3:20     ` Chen Yu
2019-02-22  7:32       ` Chunfeng Yun
2019-03-02  1:02         ` Chen Yu
2019-02-18 11:23 ` [PATCH v2 09/10] usb: gadget: Add configfs attribuite for controling match_existing_only Yu Chen
2019-02-18 11:23 ` [PATCH v2 10/10] dts: hi3660: Add support for usb on Hikey960 Yu Chen
2019-02-18 17:30 ` [PATCH v2 00/10] " Valentin Schneider
2019-02-19  1:34   ` Chen Yu
2019-02-19 11:31     ` Valentin Schneider

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).