Introduce PMIC based USB type C detection
Subsystems (7)
v2 cover Introduce PMIC based USB type C detection
Changes in v2:
- Use devm_kzalloc() in qcom_pmic_typec_probe()
- Add checks to make sure return value of typec_find_port_power_role() is valid
- Added a VBUS output regulator driver, which will be used by the PMIC USB type c driver to enable/disable the source
- Added logic to control vbus source from the PMIC type c driver when UFP/DFP is detected
- Added dt-binding for this new regulator driver
- Fixed Kconfig typec notation to match others
- Leave type C block disabled until enabled by a platform DTS
Add the required drivers for implementing type C orientation and role detection using the Qualcomm PMIC. Currently, PMICs such as the PM8150B have an integrated type C block, which can be utilized for this. This series adds the dt-binding, PMIC type C driver, and DTS nodes.
The PMIC type C driver will register itself as a type C port w/ a registered type C switch for orientation, and will fetch a USB role switch handle for the role notifications. It will also have the ability to enable the VBUS output to any connected devices based on if the device is behaving as a UFP or DFP.
Wesley Cheng (6):
usb: typec: Add QCOM PMIC typec detection driver
dt-bindings: usb: Add Qualcomm PMIC type C controller dt-binding
arm64: boot: dts: qcom: pm8150b: Add node for USB type C block
regulator: Add support for QCOM PMIC VBUS booster
dt-bindings: regulator: Add dt-binding for QCOM PMIC VBUS output
regulator
arm64: boot: dts: qcom: pm8150b: Add DTS node for PMIC VBUS booster
.../regulator/qcom,usb-vbus-regulator.yaml | 41 +++ .../bindings/usb/qcom,pmic-typec.yaml | 117 ++++++++ arch/arm64/boot/dts/qcom/pm8150b.dtsi | 13 + arch/arm64/boot/dts/qcom/sm8150-mtp.dts | 7 + drivers/regulator/Kconfig | 10 + drivers/regulator/Makefile | 1 + drivers/regulator/qcom_usb_vbus-regulator.c | 147 ++++++++++ drivers/usb/typec/Kconfig | 12 + drivers/usb/typec/Makefile | 1 + drivers/usb/typec/qcom-pmic-typec.c | 275 ++++++++++++++++++ 10 files changed, 624 insertions(+) create mode 100644 Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml create mode 100644 Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml create mode 100644 drivers/regulator/qcom_usb_vbus-regulator.c create mode 100644 drivers/usb/typec/qcom-pmic-typec.c
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 1/6 usb: typec: Add QCOM PMIC typec detection driver
The QCOM SPMI typec driver handles the role and orientation detection, and
notifies client drivers using the USB role switch framework. It registers
as a typec port, so orientation can be communicated using the typec switch APIs. The driver also attains a handle to the VBUS output regulator, so it can enable/disable the VBUS source when acting as a host/device.
--- drivers/usb/typec/Kconfig | 12 ++ drivers/usb/typec/Makefile | 1 + drivers/usb/typec/qcom-pmic-typec.c | 275 ++++++++++++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 drivers/usb/typec/qcom-pmic-typec.c
drivers/usb/typec/Kconfig +12 -0
@@ -72,6 +72,18 @@ config TYPEC_TPS6598X If you choose to build this driver as a dynamically linked module, the module will be called tps6598x.ko. +config TYPEC_QCOM_PMIC + tristate "Qualcomm PMIC USB Type-C driver" + depends on ARCH_QCOM + help + Driver for supporting role switch over the Qualcomm PMIC. This will + handle the USB Type-C role and orientation detection reported by the + QCOM PMIC if the PMIC has the capability to handle USB Type-C + detection. + + It will also enable the VBUS output to connected devices when a + DFP connection is made. + source "drivers/usb/typec/mux/Kconfig" source "drivers/usb/typec/altmodes/Kconfig"
drivers/usb/typec/Makefile +1 -0
@@ -6,4 +6,5 @@ obj-$(CONFIG_TYPEC_TCPM) += tcpm/ obj-$(CONFIG_TYPEC_UCSI) += ucsi/ obj-$(CONFIG_TYPEC_HD3SS3220) += hd3ss3220.o obj-$(CONFIG_TYPEC_TPS6598X) += tps6598x.o +obj-$(CONFIG_TYPEC_QCOM_PMIC) += qcom-pmic-typec.o obj-$(CONFIG_TYPEC) += mux/
drivers/usb/typec/qcom-pmic-typec.c new file +275 -0
275 lines not on this page · raw message
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 2/6 dt-bindings: usb: Add Qualcomm PMIC type C controller dt-binding
In reply to Wesley ChengIntroduce the dt-binding for enabling USB type C orientation and role detection using the PM8150B. The driver will be responsible for receiving the interrupt at a state change on the CC lines, reading the orientation/role, and communicating this information to the remote clients, which can include a role switch node and a type C switch.
--- .../bindings/usb/qcom,pmic-typec.yaml | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +117 -0
@@ -0,0 +1,117 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: "http://devicetree.org/schemas/usb/qcom,pmic-typec.yaml#" +$schema: "http://devicetree.org/meta-schemas/core.yaml#" + +title: Qualcomm PMIC based USB type C Detection Driver + +maintainers: + - Wesley Cheng <[email protected]> + +description: | + Qualcomm PMIC Type C Detect + +properties: + compatible: + enum: + - qcom,pm8150b-usb-typec + + reg: + maxItems: 1 + description: Type C base address + + interrupts: + maxItems: 1 + description: CC change interrupt from PMIC + + connector: + description: Connector type for remote endpoints + type: object + + properties: + compatible: + enum: + - usb-c-connector + + power-role: + enum: + - dual + - source + - sink + + data-role: + enum: + - dual + - host + - device + + port: + description: Remote endpoint connections + type: object + + properties: + endpoint@0: + description: Connection to USB type C mux node + type: object + + properties: + remote-endpoint: + maxItems: 1 + description: Node reference to the type C mux + + endpoint@1: + description: Connection to role switch node + type: object + + properties: + remote-endpoint: + maxItems: 1 + description: Node reference to the role switch node + + required: + - compatible + +required: + - compatible + - interrupts + - connector + +additionalProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/irq.h> + pm8150b { + #address-cells = <1>; + #size-cells = <0>; + qcom,typec@1500 { + compatible = "qcom,pm8150b-usb-typec"; + reg = <0x1500>; + interrupts = + <0x2 0x15 0x5 IRQ_TYPE_EDGE_RISING>; + + connector { + compatible = "usb-c-connector"; + power-role = "dual"; + data-role = "dual"; + port { + #address-cells = <1>; + #size-cells = <0>; + usb3_data_ss: endpoint@0 { + reg = <0>; + remote-endpoint = + <&qmp_ss_mux>; + }; + + usb3_role: endpoint@1 { + + reg = <1>; + remote-endpoint = + <&dwc3_drd_switch>; + }; + }; + }; + }; + }; +...
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 3/6 arm64: boot: dts: qcom: pm8150b: Add node for USB type C block
In reply to Wesley ChengThe PM8150B has a dedicated USB type C block, which can be used for type C orientation and role detection. Create the reference node to this type C block for further use.
--- arch/arm64/boot/dts/qcom/pm8150b.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm64/boot/dts/qcom/pm8150b.dtsi +8 -0
@@ -22,6 +22,14 @@ power-on@800 { status = "disabled"; }; + qcom,typec@1500 { + compatible = "qcom,pm8150b-usb-typec"; + status = "disabled"; + reg = <0x1500>; + interrupts = + <0x2 0x15 0x5 IRQ_TYPE_EDGE_RISING>; + }; + adc@3100 { compatible = "qcom,spmi-adc5"; reg = <0x3100>;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 4/6 regulator: Add support for QCOM PMIC VBUS booster
In reply to Wesley ChengSome Qualcomm PMICs have the capability to source the VBUS output to connected peripherals. This driver will register a regulator to the regulator list to enable or disable this source by an external driver.
--- drivers/regulator/Kconfig | 10 ++ drivers/regulator/Makefile | 1 + drivers/regulator/qcom_usb_vbus-regulator.c | 147 ++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 drivers/regulator/qcom_usb_vbus-regulator.c
drivers/regulator/Kconfig +10 -0
@@ -797,6 +797,16 @@ config REGULATOR_QCOM_SPMI Qualcomm SPMI PMICs as a module. The module will be named "qcom_spmi-regulator". +config REGULATOR_QCOM_USB_VBUS + tristate "Qualcomm USB Vbus regulator driver" + depends on SPMI || COMPILE_TEST + help + If you say yes to this option, support will be included for the + regulator used to enable the VBUS output. + + Say M here if you want to include support for enabling the VBUS output + as a module. The module will be named "qcom_usb-regulator". + config REGULATOR_RC5T583 tristate "RICOH RC5T583 Power regulators" depends on MFD_RC5T583
drivers/regulator/Makefile +1 -0
@@ -89,6 +89,7 @@ obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPMH) += qcom-rpmh-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SPMI) += qcom_spmi-regulator.o +obj-$(CONFIG_REGULATOR_QCOM_USB_VBUS) += qcom_usb_vbus-regulator.o obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o obj-$(CONFIG_REGULATOR_PV88060) += pv88060-regulator.o
drivers/regulator/qcom_usb_vbus-regulator.c new file +147 -0
147 lines not on this page · raw message
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH v2 4/6] regulator: Add support for QCOM PMIC VBUS booster
Quoted 7 lines · Wesley Cheng
drivers/regulator/Kconfig +0
-0@@ -797,6 +797,16 @@ config REGULATOR_QCOM_SPMI Qualcomm SPMI PMICs as a module. The module will be named "qcom_spmi-regulator".
drivers/regulator/Kconfig config REGULATOR_QCOM_SPMI · line 808
Quoted 10 lines
drivers/regulator/Kconfig +9
-0+config REGULATOR_QCOM_USB_VBUS + tristate "Qualcomm USB Vbus regulator driver" + depends on SPMI || COMPILE_TEST + help + If you say yes to this option, support will be included for the + regulator used to enable the VBUS output. + + Say M here if you want to include support for enabling the VBUS output + as a module. The module will be named "qcom_usb-regulator".
Hi,
Shouldn't that module name match what is in the Makefile?
Quoted 9 lines
drivers/regulator/Kconfig +1
-0+ config REGULATOR_RC5T583 tristate "RICOH RC5T583 Power regulators" depends on MFD_RC5T583drivers/regulator/Makefile +0
-0
drivers/regulator/Makefile obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o · line 95
Quoted 7 lines
drivers/regulator/Makefile +1
-0@@ -89,6 +89,7 @@ obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPMH) += qcom-rpmh-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SPMI) += qcom_spmi-regulator.o +obj-$(CONFIG_REGULATOR_QCOM_USB_VBUS) += qcom_usb_vbus-regulator.o obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o obj-$(CONFIG_REGULATOR_PV88060) += pv88060-regulator.o
thanks.
Signature · 1 line
~Randy
Re: [PATCH v2 4/6] regulator: Add support for QCOM PMIC VBUS booster
Quoted 9 lines · Randy Dunlap
Quoted 8 lines · Wesley Cheng
drivers/regulator/Kconfig +0
-0@@ -797,6 +797,16 @@ config REGULATOR_QCOM_SPMI Qualcomm SPMI PMICs as a module. The module will be named "qcom_spmi-regulator".
Quoted 14 lines
drivers/regulator/Kconfig config REGULATOR_QCOM_SPMI · line 808
Quoted 9 lines
drivers/regulator/Kconfig +9
-0+config REGULATOR_QCOM_USB_VBUS + tristate "Qualcomm USB Vbus regulator driver" + depends on SPMI || COMPILE_TEST + help + If you say yes to this option, support will be included for the + regulator used to enable the VBUS output. + + Say M here if you want to include support for enabling the VBUS output + as a module. The module will be named "qcom_usb-regulator".Hi,
Shouldn't that module name match what is in theMakefile?
Thanks, Randy. Missed this as I was going back and forth on the file name. Thanks for the catch.
Quoted 20 lines
Quoted 9 lines
drivers/regulator/Kconfig +1
-0+ config REGULATOR_RC5T583 tristate "RICOH RC5T583 Power regulators" depends on MFD_RC5T583drivers/regulator/Makefile +0
-0drivers/regulator/Makefile obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o · line 95
Quoted 7 lines
drivers/regulator/Makefile +1
-0@@ -89,6 +89,7 @@ obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPMH) += qcom-rpmh-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SPMI) += qcom_spmi-regulator.o +obj-$(CONFIG_REGULATOR_QCOM_USB_VBUS) += qcom_usb_vbus-regulator.o obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o obj-$(CONFIG_REGULATOR_PV88060) += pv88060-regulator.othanks.
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Mark Brown
maintainerRe: [PATCH v2 4/6] regulator: Add support for QCOM PMIC VBUS booster
In reply to Wesley Chengdrivers/regulator/qcom_usb_vbus-regulator.c line 4
Quoted 6 lines · Wesley Cheng
+++
b/drivers/regulator/qcom_usb_vbus-regulator.cdrivers/regulator/qcom_usb_vbus-regulator.c new file +4
-0@@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +* Copyright (c) 2020, The Linux Foundation. All rights reserved. +*/
Please make the entire comment a C++ one so things look more intentional.
drivers/regulator/qcom_usb_vbus-regulator.c line 57
Quoted 8 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +6
-0+static int qcom_usb_vbus_enable (struct regulator_dev *rdev) +{ +static int qcom_usb_vbus_disable (struct regulator_dev *rdev) +{ +static int qcom_usb_vbus_is_enabled (struct regulator_dev *rdev) +{
These operations can all be replaced by regulator_is_enabled_regmap() and friends.
drivers/regulator/qcom_usb_vbus-regulator.c line 115
Quoted 1 line
drivers/regulator/qcom_usb_vbus-regulator.c new file +1
-0+ init_data.constraints.valid_ops_mask |=REGULATOR_CHANGE_STATUS ;
No, this is broken - regulators should not override the constraints the machine sets.
Re: [PATCH v2 4/6] regulator: Add support for QCOM PMIC VBUS booster
Quoted 12 lines · Mark Brown
drivers/regulator/qcom_usb_vbus-regulator.c line 4
Quoted 6 lines · Wesley Cheng
+++
b/drivers/regulator/qcom_usb_vbus-regulator.cdrivers/regulator/qcom_usb_vbus-regulator.c new file +4
-0@@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +* Copyright (c) 2020, The Linux Foundation. All rights reserved. +*/ Please make the entire comment a C++ one so things look more intentional.
Hi Mark,
Sure, will do.
Quoted 12 lines
drivers/regulator/qcom_usb_vbus-regulator.c line 57
Quoted 8 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +6
-0+static int qcom_usb_vbus_enable (struct regulator_dev *rdev) +{ +static int qcom_usb_vbus_disable (struct regulator_dev *rdev) +{ +static int qcom_usb_vbus_is_enabled (struct regulator_dev *rdev) +{These operations can all be replaced by
regulator_is_enabled_regmap()and friends.
Got it. This simplifies the driver a lot. Thanks for the tip.
Quoted 5 lines
drivers/regulator/qcom_usb_vbus-regulator.c line 115
Quoted 1 line
drivers/regulator/qcom_usb_vbus-regulator.c new file +1
-0+ init_data.constraints.valid_ops_mask |=REGULATOR_CHANGE_STATUS ;No, this is broken - regulators should not override the constraints the machine sets.
Understood. I decided to go with of_get_regulator_init_data() to initialize the init_data parameter. This should take care of the constraint settings.
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 5/6 dt-bindings: regulator: Add dt-binding for QCOM PMIC VBUS output regulator
In reply to Wesley ChengThis describes how to enable the Qualcomm PMIC VBUS booster used for providing power to connected USB peripherals when the USB role is host mode. The driver itself will register the vbus_usb regulator, so that external drivers can utilize the enable/disable regulator APIs.
--- .../regulator/qcom,usb-vbus-regulator.yaml | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml
Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml new file +41 -0
@@ -0,0 +1,41 @@ +# SPDX-License-Identifier: GPL-2.0 +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/regulator/qcom,usb-vbus-regulator.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: The Qualcomm PMIC VBUS output regulator driver + +maintainers: + - Wesley Cheng <[email protected]> + +description: | + This regulator driver controls the VBUS output by the Qualcomm PMIC. This + regulator will be enabled in situations where the device is required to + provide power to the connected peripheral. + +properties: + compatible: + enum: + - qcom,pm8150b-vbus-reg + + reg: + maxItems: 1 + description: VBUS output base address + +required: + - compatible + +additionalProperties: false + +examples: + - | + pm8150b { + #address-cells = <1>; + #size-cells = <0>; + qcom,dcdc@1100 { + compatible = "qcom,pm8150b-vbus-reg"; + reg = <0x1100>; + }; + }; +...
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 6/6 arm64: boot: dts: qcom: pm8150b: Add DTS node for PMIC VBUS booster
In reply to Wesley ChengAdd the required DTS node for the USB VBUS output regulator, which is available on PM8150B. This will provide the VBUS source to connected peripherals.
--- arch/arm64/boot/dts/qcom/pm8150b.dtsi | 6 ++++++ arch/arm64/boot/dts/qcom/sm8150-mtp.dts | 7 +++++++ 2 files changed, 13 insertions(+)
arch/arm64/boot/dts/qcom/pm8150b.dtsi +6 -0
@@ -22,6 +22,12 @@ power-on@800 { status = "disabled"; }; + qcom,dcdc@1100 { + compatible = "qcom,pm8150b-vbus-reg"; + status = "disabled"; + reg = <0x1100>; + }; + qcom,typec@1500 { compatible = "qcom,pm8150b-usb-typec"; status = "disabled";
arch/arm64/boot/dts/qcom/sm8150-mtp.dts +7 -0
@@ -426,6 +426,13 @@ &usb_1 { status = "okay"; }; +&spmi_bus { + pmic@2 { + qcom,dcdc@1100 { + status = "okay"; + }; +}; + &usb_1_dwc3 { dr_mode = "peripheral"; };
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project