Make USB ports to work on HiKey960/970
v4 cover Make USB ports to work on HiKey960/970
Hi Rob,
It follows the patchset adding a DT schema needed to power on and to use the integrated USB hub found on HiKey 960 and Hikey 970 boards.
Besides each board use a different chip for the hub, on both they're controlled the same way. Such boards come with an integrated 4-port USB hub on it, set on what it seems to be a non-standard way: on both implementations, the USB type-C port is used to detect the USB role.
When in host mode, the 3.3V power supply (VDD33 pins) for the hub are disabled. That disables the USB I/O on type-A ports.
When USB type-C is on device mode, the OTG is switched via a GPIO pin to device mode, and the hub is powered on.
A Type-C power supply line is also controlled depending on the role.
-
The entire series which contains the remaining patches to support PCI and USB on HiKey970, and USB on HiKey960 is at:
https://github.com/mchehab/linux/commits/linux-master
The patches needed by the USB on HiKey970 were already merged upstream. So, the above branch applies on the top of Linux master branch.
Tested on HiKey 960:
$ lsusb Bus 002 Device 002: ID 0424:5734 Standard Microsystems Corp. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0424:2740 Standard Microsystems Corp. Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 001 Device 002: ID 0424:2734 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Tested on HiKey 970:
$ lsusb Bus 002 Device 002: ID 0451:8140 Texas Instruments, Inc. TUSB8041 4-Port Hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Bus 001 Device 002: ID 0451:8142 Texas Instruments, Inc. TUSB8041 4-Port Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
v4:
- Improved description at the DT schema;
- Use just one compatible, as there's no difference between HiKey 960 and 970 with regards to how the hub should be controlled;
- parse usb-role-switch property at the driver;
- make the properties that depends on usb-role-switch optional.
v3:
- The examples at the dt-bindings were updated to reflect
the actual DTS content and won't produce any warnings;
- Added John Stultz SoB to Hikey960 DTS patch;
- Added a patch for the mux hub driver for it to work with
the newer schema;John Stultz (1):
arm64: dts: hisilicon: Add usb mux hub for hikey960
Mauro Carvalho Chehab (2):
misc: hisi_hikey_usb: change the DT schema
arm64: dts: hisilicon: Add usb mux hub for hikey970
Yu Chen (1):
dt-bindings: misc: add schema for USB hub on Kirin devices
.../bindings/misc/hisilicon,hikey-usb.yaml | 87 +++++++++++++ .../boot/dts/hisilicon/hi3660-hikey960.dts | 35 +++++- .../boot/dts/hisilicon/hi3670-hikey970.dts | 23 ++++ drivers/misc/hisi_hikey_usb.c | 119 +++++++++--------- 4 files changed, 206 insertions(+), 58 deletions(-) create mode 100644 Documentation/devicetree/bindings/misc/hisilicon,hikey-usb.yaml
Signature · 1 line
2.31.1
PATCH v4 1/4 dt-bindings: misc: add schema for USB hub on Kirin devices
From: Yu Chen <[email protected]>
This patch adds binding documentation to support USB HUB and USB data role switch of HiSilicon HiKey960 and HiKey970 boards.
--- .../bindings/misc/hisilicon,hikey-usb.yaml | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Documentation/devicetree/bindings/misc/hisilicon,hikey-usb.yaml
Documentation/devicetree/bindings/misc/hisilicon,hikey-usb.yaml new file +87 -0
@@ -0,0 +1,87 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +# Copyright 2019 Linaro Ltd. +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/misc/hisilicon,hikey-usb.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: HiKey960/970 onboard USB GPIO Hub + +maintainers: + - John Stultz <[email protected]> + +description: | + Supports the onboard USB GPIO hubs found on HiKey960/970. + Such hubs require a power supply for the USB I/O. Depending on the + exact hub model, after USB I/O is powered up, a reset should be needed. + + It also acts as a role-switch intermediary to detect the state of + the USB-C port, to switch the hub into dual-role USB-C or host mode, + which enables and powers up the onboard USB-A host ports. + + Schematics about such hubs can be found here: + https://github.com/96boards/documentation/raw/master/consumer/hikey/hikey960/hardware-docs/HiKey960_Schematics.pdf + https://www.96boards.org/documentation/consumer/hikey/hikey970/hardware-docs/files/hikey970-schematics.pdf + +properties: + compatible: + enum: + - hisilicon,usbhub + + typec-vbus-gpios: + $ref: /schemas/types.yaml#/definitions/phandle-array + description: phandle to the typec-vbus gpio + + otg-switch-gpios: + $ref: /schemas/types.yaml#/definitions/phandle-array + description: phandle to the otg-switch gpio + + hub-reset-en-gpios: + $ref: /schemas/types.yaml#/definitions/phandle-array + description: phandle to the hub reset gpio + + usb-role-switch: + $ref: /schemas/types.yaml#/definitions/flag + description: Support role switch. + + hub-vdd-supply: + description: regulator for hub power + + port: + description: | + describe hadware connections between USB endpoints. + Two ports are supported: the first being the endpoint that will + be notified by this driver, and the second being the endpoint + that notifies this driver of a role switch. + +required: + - compatible + - hub-vdd-supply + - port + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + usb-hub { + compatible = "hisilicon,usbhub"; + typec-vbus-gpios = <&gpio25 2 GPIO_ACTIVE_HIGH>; + otg-switch-gpios = <&gpio25 6 GPIO_ACTIVE_HIGH>; + hub-reset-en-gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>; + hub-vdd-supply = <&usb_hub_vdd>; + usb-role-switch; + port { + #address-cells = <1>; + #size-cells = <0>; + usb_ep0: endpoint@0 { + reg = <0>; + remote-endpoint = <&dwc3_role_switch>; + }; + usb_ep1: endpoint@1 { + reg = <1>; + remote-endpoint = <&rt1711h_ep>; + }; + }; + };
Signature · 1 line
2.31.1
PATCH v4 2/4 misc: hisi_hikey_usb: change the DT schema
In reply to Mauro Carvalho ChehabAs there's no upstream DT bindings for this driver, let's update its DT schema, while it is not too late.
While here, add error messages, in order to help discovering problems during probing time.
--- drivers/misc/hisi_hikey_usb.c | 119 ++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 56 deletions(-)
drivers/misc/hisi_hikey_usb.c +63 -56
@@ -34,7 +34,6 @@ struct hisi_hikey_usb {struct device *dev;struct gpio_desc *otg_switch;struct gpio_desc *typec_vbus; -struct gpio_desc *hub_vbus;struct gpio_desc *reset;struct regulator *regulator;
@@ -54,9 +53,6 @@ static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value) {int ret, status; -if (hisi_hikey_usb->hub_vbus) -gpiod_set_value_cansleep (hisi_hikey_usb->hub_vbus, value); -if (!hisi_hikey_usb->regulator)return ;
@@ -147,75 +143,50 @@ static int hub_usb_role_switch_set(struct usb_role_switch *sw, enum usb_role rolreturn 0 ; } -static int hisi_hikey_usb_parse_kirin970 (struct platform_device *pdev, +static int hisi_hikey_usb_of_role_switch (struct platform_device *pdev,struct hisi_hikey_usb *hisi_hikey_usb) -{ -struct regulator *regulator; - - regulator =devm_regulator_get (&pdev->dev,"hub-vdd" ); -if (IS_ERR (regulator)) { -if (PTR_ERR (regulator) == -EPROBE_DEFER ) { -dev_info (&pdev->dev, -"waiting for hub-vdd-supply to be probed\n" ); -return PTR_ERR (regulator); - } -dev_err (&pdev->dev, -"get hub-vdd-supply failed with error %ld\n" , -PTR_ERR (regulator)); -return PTR_ERR (regulator); - } - hisi_hikey_usb->regulator = regulator; - - hisi_hikey_usb->reset =devm_gpiod_get (&pdev->dev,"hub_reset_en_gpio" , -GPIOD_OUT_HIGH ); -return PTR_ERR_OR_ZERO (hisi_hikey_usb->reset); -} - -static int hisi_hikey_usb_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev; -struct hisi_hikey_usb *hisi_hikey_usb;struct usb_role_switch_desc hub_role_switch = {NULL }; -int ret; - hisi_hikey_usb =devm_kzalloc (dev,sizeof (*hisi_hikey_usb),GFP_KERNEL ); -if (!hisi_hikey_usb) -return -ENOMEM ; - - hisi_hikey_usb->dev = &pdev->dev; +if (!device_property_read_bool (dev,"usb-role-switch" )) +return 0 ; hisi_hikey_usb->otg_switch =devm_gpiod_get (dev,"otg-switch" ,GPIOD_OUT_HIGH ); -if (IS_ERR (hisi_hikey_usb->otg_switch)) +if (IS_ERR (hisi_hikey_usb->otg_switch)) { +dev_err (dev,"get otg-switch failed with error %ld\n" , +PTR_ERR (hisi_hikey_usb->otg_switch));return PTR_ERR (hisi_hikey_usb->otg_switch); + } hisi_hikey_usb->typec_vbus =devm_gpiod_get (dev,"typec-vbus" ,GPIOD_OUT_LOW ); -if (IS_ERR (hisi_hikey_usb->typec_vbus)) +if (IS_ERR (hisi_hikey_usb->typec_vbus)) { +dev_err (dev,"get typec-vbus failed with error %ld\n" , +PTR_ERR (hisi_hikey_usb->typec_vbus));return PTR_ERR (hisi_hikey_usb->typec_vbus); + } -/* Parse Kirin 970-specific OF data */ -if (of_device_is_compatible (pdev->dev.of_node, -"hisilicon,kirin970_hikey_usbhub" )) { - ret =hisi_hikey_usb_parse_kirin970 (pdev, hisi_hikey_usb); -if (ret) -return ret; - }else { -/* hub-vdd33-en is optional */ - hisi_hikey_usb->hub_vbus =devm_gpiod_get_optional (dev,"hub-vdd33-en" , -GPIOD_OUT_HIGH ); -if (IS_ERR (hisi_hikey_usb->hub_vbus)) -return PTR_ERR (hisi_hikey_usb->hub_vbus); + hisi_hikey_usb->reset =devm_gpiod_get_optional (dev, +"hub-reset-en" , +GPIOD_OUT_HIGH ); +if (IS_ERR (hisi_hikey_usb->reset)) { +dev_err (dev,"get hub-reset-en failed with error %ld\n" , +PTR_ERR (hisi_hikey_usb->reset)); +return PTR_ERR (hisi_hikey_usb->reset); } hisi_hikey_usb->dev_role_sw =usb_role_switch_get (dev);if (!hisi_hikey_usb->dev_role_sw)return -EPROBE_DEFER ; -if (IS_ERR (hisi_hikey_usb->dev_role_sw)) +if (IS_ERR (hisi_hikey_usb->dev_role_sw)) { +dev_err (dev,"get device role switch failed with error %ld\n" , +PTR_ERR (hisi_hikey_usb->dev_role_sw));return PTR_ERR (hisi_hikey_usb->dev_role_sw); + }INIT_WORK (&hisi_hikey_usb->work, relay_set_role_switch); -mutex_init (&hisi_hikey_usb->lock); hub_role_switch.fwnode =dev_fwnode (dev); hub_role_switch.set = hub_usb_role_switch_set;
@@ -225,10 +196,44 @@ static int hisi_hikey_usb_probe(struct platform_device *pdev) &hub_role_switch);if (IS_ERR (hisi_hikey_usb->hub_role_sw)) { +dev_err (dev, +"failed to register hub role with error %ld\n" , +PTR_ERR (hisi_hikey_usb->hub_role_sw));usb_role_switch_put (hisi_hikey_usb->dev_role_sw);return PTR_ERR (hisi_hikey_usb->hub_role_sw); } +return 0 ; +} + +static int hisi_hikey_usb_probe (struct platform_device *pdev) +{ +struct device *dev = &pdev->dev; +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->dev = &pdev->dev; +mutex_init (&hisi_hikey_usb->lock); + + hisi_hikey_usb->regulator =devm_regulator_get (dev,"hub-vdd" ); +if (IS_ERR (hisi_hikey_usb->regulator)) { +if (PTR_ERR (hisi_hikey_usb->regulator) == -EPROBE_DEFER ) { +dev_info (dev,"waiting for hub-vdd-supply\n" ); +return PTR_ERR (hisi_hikey_usb->regulator); + } +dev_err (dev,"get hub-vdd-supply failed with error %ld\n" , +PTR_ERR (hisi_hikey_usb->regulator)); +return PTR_ERR (hisi_hikey_usb->regulator); + } + + ret =hisi_hikey_usb_of_role_switch (pdev, hisi_hikey_usb); +if (ret) +return ret; +platform_set_drvdata (pdev, hisi_hikey_usb);return 0 ;
@@ -238,18 +243,20 @@ static int hisi_hikey_usb_remove(struct platform_device *pdev) {struct hisi_hikey_usb *hisi_hikey_usb =platform_get_drvdata (pdev); -if (hisi_hikey_usb->hub_role_sw) +if (hisi_hikey_usb->hub_role_sw) {usb_role_switch_unregister (hisi_hikey_usb->hub_role_sw); -if (hisi_hikey_usb->dev_role_sw) -usb_role_switch_put (hisi_hikey_usb->dev_role_sw); +if (hisi_hikey_usb->dev_role_sw) +usb_role_switch_put (hisi_hikey_usb->dev_role_sw); + }else { +hub_power_ctrl (hisi_hikey_usb,HUB_VBUS_POWER_OFF ); + }return 0 ; }static const struct of_device_id id_table_hisi_hikey_usb[] = { - { .compatible ="hisilicon,gpio_hubv1" }, - { .compatible ="hisilicon,kirin970_hikey_usbhub" }, + { .compatible ="hisilicon,usbhub" }, {} };MODULE_DEVICE_TABLE (of, id_table_hisi_hikey_usb);
Signature · 1 line
2.31.1
PATCH v4 3/4 arm64: dts: hisilicon: Add usb mux hub for hikey970
In reply to Mauro Carvalho ChehabAdd dt bindings for Kirin 970 USB HUB. Such board comes with an integrated USB HUB provided via a TI TUSB8041 4-port USB 3.0 hub.
--- .../boot/dts/hisilicon/hi3670-hikey970.dts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+)
arch/arm64/boot/dts/hisilicon/hi3670-hikey970.dts +23 -0
@@ -53,6 +53,29 @@ wlan_en: wlan-en-1-8v { startup-delay-us = <70000>; enable-active-high; }; + + usb-hub { + compatible = "hisilicon,usbhub"; + typec-vbus-gpios = <&gpio26 1 0>; + otg-switch-gpios = <&gpio4 2 0>; + hub-reset-en-gpios = <&gpio0 3 0>; + hub-vdd-supply = <&ldo17>; + usb-role-switch; + + port { + #address-cells = <1>; + #size-cells = <0>; + + hikey_usb_ep0: endpoint@0 { + reg = <0>; + remote-endpoint = <&dwc3_role_switch>; + }; + hikey_usb_ep1: endpoint@1 { + reg = <1>; + remote-endpoint = <&rt1711h_ep>; + }; + }; + }; }; /*
Signature · 1 line
2.31.1
kernel test robot
build botRe: [PATCH v4 3/4] arm64: dts: hisilicon: Add usb mux hub for hikey970
I love your patch! Yet something to improve:
Hi Mauro,
I love your patch! Yet something to improve:
[auto build test ERROR on robh/for-next]
[also build test ERROR on char-misc/char-misc-testing v5.14 next-20210909] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Mauro-Carvalho-Chehab/Make-USB-ports-to-work-on-HiKey960-970/20210903-173102 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next config: arm64-buildonly-randconfig-r001-20210908 (attached as .config) compiler: aarch64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/b8b9096981afc8389783e87cd0342002d4aeed94
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Mauro-Carvalho-Chehab/Make-USB-ports-to-work-on-HiKey960-970/20210903-173102 git checkout b8b9096981afc8389783e87cd0342002d4aeed94
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>):
>> ERROR: Input tree has errors, aborting (use -f to force output)
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
PATCH v4 4/4 arm64: dts: hisilicon: Add usb mux hub for hikey960
In reply to Mauro Carvalho ChehabFrom: John Stultz <[email protected]>
Add dt bindings for Kirin 960 USB HUB. Such board comes with an integrated USB HUB provided via a Microchip USB5734 4-port high-speed hub controller.
--- .../boot/dts/hisilicon/hi3660-hikey960.dts | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts +33 -2
@@ -197,6 +197,37 @@ optee { method = "smc"; }; }; + + usb_hub_vdd: usb_hub_vdd { + compatible = "regulator-fixed"; + regulator-name = "hub-vdd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + gpio = <&gpio5 6 0>; + enable-active-high; + }; + + usb-hub { + compatible = "hisilicon,usbhub"; + typec-vbus-gpios = <&gpio25 2 GPIO_ACTIVE_HIGH>; + otg-switch-gpios = <&gpio25 6 GPIO_ACTIVE_HIGH>; + hub-vdd-supply = <&usb_hub_vdd>; + usb-role-switch; + + port { + #address-cells = <1>; + #size-cells = <0>; + + hikey_usb_ep0: endpoint@0 { + reg = <0>; + remote-endpoint = <&dwc3_role_switch>; + }; + hikey_usb_ep1: endpoint@1 { + reg = <1>; + remote-endpoint = <&rt1711h_ep>; + }; + }; + }; }; /*
@@ -564,7 +595,7 @@ port { rt1711h_ep: endpoint@0 { reg = <0>; - remote-endpoint = <&dwc3_role_switch>; + remote-endpoint = <&hikey_usb_ep1>; }; }; };
@@ -686,7 +717,7 @@ port { #size-cells = <0>; dwc3_role_switch: endpoint@0 { reg = <0>; - remote-endpoint = <&rt1711h_ep>; + remote-endpoint = <&hikey_usb_ep0>; }; dwc3_ss: endpoint@1 {
Signature · 1 line
2.31.1
Hi Rob,
Em Fri, 3 Sep 2021 11:28:31 +0200
Mauro Carvalho Chehab <[email protected]> escreveu:
Quoted 10 lines
Hi Rob,
It follows the patchset adding a DT schema needed to power on and to use the integrated USB hub found on HiKey 960 and Hikey 970 boards.
Besides each board use a different chip for the hub, on both they're controlled the same way. Such boards come with an integrated 4-port USB hub on it, set on what it seems to be a non-standard way: on both implementations, the USB type-C port is used to detect the USB role.
Quoted 7 lines
When in host mode, the 3.3V power supply (VDD33 pins) for the hub are disabled. That disables the USB I/O on type-A ports.
When USB type-C is on device mode, the OTG is switched via a GPIO pin to device mode, and the hub is powered on.
A Type-C power supply line is also controlled depending on the role.
Gentile ping.
Regards,
Mauro
Quoted 56 lines
-
The entire series which contains the remaining patches to support PCI and USB on HiKey970, and USB on HiKey960 is at:
https://github.com/mchehab/linux/commits/linux-master
The patches needed by the USB on HiKey970 were already merged upstream. So, the above branch applies on the top of Linux master branch.
Tested on HiKey 960:
$ lsusb Bus 002 Device 002: ID 0424:5734 Standard Microsystems Corp. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0424:2740 Standard Microsystems Corp. Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 001 Device 002: ID 0424:2734 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubTested on HiKey 970:
$ lsusb Bus 002 Device 002: ID 0451:8140 Texas Instruments, Inc. TUSB8041 4-Port Hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Bus 001 Device 002: ID 0451:8142 Texas Instruments, Inc. TUSB8041 4-Port Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubv4:
- Improved description at the DT schema;
- Use just one compatible, as there's no difference between HiKey 960 and 970 with regards to how the hub should be controlled;
- parse usb-role-switch property at the driver;
- make the properties that depends on usb-role-switch optional.v3:
- The examples at the dt-bindings were updated to reflectthe actual DTS content and won't produce any warnings; - Added John Stultz SoB to Hikey960 DTS patch; - Added a patch for the mux hub driver for it to work with the newer schema;John Stultz (1):
arm64: dts: hisilicon: Add usb mux hub for hikey960Mauro Carvalho Chehab (2):
misc:hisi_hikey_usb: change the DT schema
arm64: dts: hisilicon: Add usb mux hub for hikey970Yu Chen (1):
dt-bindings: misc: add schema for USB hub on Kirin devices
Quoted 7 lines
.../bindings/misc/hisilicon,hikey-usb.yaml | 87 +++++++++++++ .../boot/dts/hisilicon/hi3660-hikey960.dts | 35 +++++- .../boot/dts/hisilicon/hi3670-hikey970.dts | 23 ++++ drivers/misc/hisi_hikey_usb.c | 119 +++++++++--------- 4 files changed, 206 insertions(+), 58 deletions(-) create mode 100644 Documentation/devicetree/bindings/misc/hisilicon,hikey-usb.yaml
Thanks,
Mauro