Introduce PMIC based USB type C detection
Subsystems (7)
v3 cover Introduce PMIC based USB type C detection
Changes in v3:
- Fix driver reference to match driver name in Kconfig for qcom_usb_vbus-regulator.c
- Utilize regulator bitmap helpers for enable, disable and is enabled calls in qcom_usb_vbus-regulator.c
- Use of_get_regulator_init_data() to initialize regulator init data, and to set constraints in qcom_usb_vbus-regulator.c
- Remove the need for a local device structure in the vbus regulator driver
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 | 14 + arch/arm64/boot/dts/qcom/sm8150-mtp.dts | 7 + drivers/regulator/Kconfig | 10 + drivers/regulator/Makefile | 1 + drivers/regulator/qcom_usb_vbus-regulator.c | 100 +++++++ drivers/usb/typec/Kconfig | 12 + drivers/usb/typec/Makefile | 1 + drivers/usb/typec/qcom-pmic-typec.c | 275 ++++++++++++++++++ 10 files changed, 578 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 v3 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 v3 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
Re: [PATCH v3 2/6] dt-bindings: usb: Add Qualcomm PMIC type C controller dt-binding
Quoted 39 lines · Wesley Cheng
Introduce 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.
Signed-off-by Wesley Cheng <[email protected]>--- .../bindings/usb/qcom,pmic-typec.yaml | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/qcom,pmic-typec.yamlDocumentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +20
-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:
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml line 30
Quoted 10 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +10
-0+ 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
You are duplicating everything in usb-connector.yaml. You should have a $ref to it.
Quoted 15 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +15
-0+ + properties: + compatible: + enum: + - usb-c-connector + + power-role: + enum: + - dual + - source + - sink + + data-role: + enum: + - dual
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml line 55
Quoted 10 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +10
-0+ - host + - device + + port: + description: Remote endpoint connections + type: object + + properties: + endpoint@0: + description: Connection to USB type C mux node
This is wrong. The connector binding says port 0 is the connection the USB HS controller.
What's a type C mux node? Is there a binding for that? There's an ongoing discussion with the CrOS folks on how to describe Alt mode mux/switches.
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml line 64
Quoted 9 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +9
-0+ type: object + + properties: + remote-endpoint: + maxItems: 1 + description: Node reference to the type C mux + + endpoint@1: + description: Connection to role switch node
Again, what's this?
Quoted 57 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +53
-1+ 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>; + }; + }; + }; + }; + }; +... --The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH v3 2/6] dt-bindings: usb: Add Qualcomm PMIC type C controller dt-binding
Quoted 5 lines · Rob Herring
On Wed, Jun 17, 2020 at 12:02 PM Wesley Cheng <[email protected]> wrote:
You are duplicating everything in
usb-connector.yaml. You should have a $ref to it.
Hi Rob,
Sure, I will add a reference to that doc.
Quoted 7 lines
This is wrong. The connector binding says port 0 is the connection the USB HS controller.
What's a type C mux node? Is there a binding for that? There's an ongoing discussion with the CrOS folks on how to describe Alt mode mux/switches.
I reviewed the connector binding previously, and couldn't seem to come up with a model which fit a design where the type C controller (ie the entity which does the CC orientation and role detection) does not have the SS lane mux included. The SS lane mux is the HW which handles the selection of the SS lanes to utilize based on cable orientation.
I looked at the FUSB302 TCPM driver, which doesn't have an integrated SS lane mux, and relies on an external FUSB340 switch to handle the polarity, but seems that in the fusb302.c driver it doesn't implement the polarity handler. They might possibly have a HW output signal which controls the mux directly, but I'm not sure on that.
Anyway, if someone wanted to take a SW approach and program an external mux, this model doesn't seem to allow that. This is somewhat unrelated to the DP AUX mode switching, as that probably will only come into the picture after the policy engine has detected there is a DP adapter connected, whereas this is applicable to non DP/alt mode situations.
Thanks!
Quoted 12 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml line 64
Quoted 9 lines
Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml new file +9
-0+ type: object + + properties: + remote-endpoint: + maxItems: 1 + description: Node reference to the type C mux + + endpoint@1: + description: Connection to role switch nodeAgain, what's this?
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH v3 2/6] dt-bindings: usb: Add Qualcomm PMIC type C controller dt-binding
Quoted 21 lines · Wesley Cheng
Quoted 5 lines · Rob Herring
On Wed, Jun 17, 2020 at 12:02 PM Wesley Cheng <[email protected]> wrote:
You are duplicating everything in
usb-connector.yaml. You should have a $ref to it.Hi Rob,
Sure, I will add a reference to that doc.
Quoted 7 lines
This is wrong. The connector binding says port 0 is the connection the USB HS controller.
What's a type C mux node? Is there a binding for that? There's an ongoing discussion with the CrOS folks on how to describe Alt mode mux/switches.
Quoted 5 lines
I reviewed the connector binding previously, and couldn't seem to come up with a model which fit a design where the type C controller (ie the entity which does the CC orientation and role detection) does not have the SS lane mux included. The SS lane mux is the HW which handles the selection of the SS lanes to utilize based on cable orientation.
The intent was the controller would be the parent node of the connector.
How the SS lane mux is represented is what needs to be figured out. I don't know what that looks like, but it needs to be something that works for multiple designs. Ideally, that's an extension of the existing 'usb-c-connector' binding, but if there's good reasons to redesign it that can happen.
Rob
Re: [PATCH v3 2/6] dt-bindings: usb: Add Qualcomm PMIC type C controller dt-binding
Quoted 22 lines · Rob Herring
Quoted 21 lines · Wesley Cheng
Quoted 5 lines · Rob Herring
On Wed, Jun 17, 2020 at 12:02 PM Wesley Cheng <[email protected]> wrote:
You are duplicating everything in
usb-connector.yaml. You should have a $ref to it.Hi Rob,
Sure, I will add a reference to that doc.
Quoted 7 lines
This is wrong. The connector binding says port 0 is the connection the USB HS controller.
What's a type C mux node? Is there a binding for that? There's an ongoing discussion with the CrOS folks on how to describe Alt mode mux/switches.
Quoted 8 lines
Quoted 5 lines
I reviewed the connector binding previously, and couldn't seem to come up with a model which fit a design where the type C controller (ie the entity which does the CC orientation and role detection) does not have the SS lane mux included. The SS lane mux is the HW which handles the selection of the SS lanes to utilize based on cable orientation.
The intent was the controller would be the parent node of the connector.
Hi Rob,
Correct, I agree with that point, and in the changes uploaded, the QCOM PMIC type C controller will be the parent node for the connector.
Quoted 8 lines
How the SS lane mux is represented is what needs to be figured out. I don't know what that looks like, but it needs to be something that works for multiple designs. Ideally, that's an extension of the existing 'usb-c-connector' binding, but if there's good reasons to redesign it that can happen.
Rob
We probably wouldn't need to redesign it, but maybe if we can remove the connector port assignments requirement, it would allow for some flexibility. From my knowledge, I don't think any driver is actually utilizing or checking the port number assignments, so there isn't a limitation on what could be defined in there.
Here's a simplified diagram of the FUSB302 reference design from the data sheet. The I2C bus is just for CSR access to the FUSB302.
_______ _______
______|FUSB302| |SOC |
| |Type C | | |
| |Cntrl |__I2C_______ | |
| |_______| | |
___ | | |
| |______ CC1/2 _________| | |
| |______ HS DP/DM __________________________________ | |
| | | |
________ | |
| |______ SS RX/TX1 ____________|FUSB304 |__SS RX/TX_ | |
| |______ SS RX/TX2 ____________|USB Mux | |_______|
| | |________|
| |
|___|Otherwise, we can just simply add another port definition for external SS lane muxes if possible.
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v3 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
Re: [PATCH v3 3/6] arm64: boot: dts: qcom: pm8150b: Add node for USB type C block
Quoted 14 lines · Wesley Cheng
The 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.
Signed-off-by Wesley Cheng <[email protected]>--- arch/arm64/boot/dts/qcom/pm8150b.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)arch/arm64/boot/dts/qcom/pm8150b.dtsi +0
-0
arch/arm64/boot/dts/qcom/pm8150b.dtsi power-on@800 { · line 25
Quoted 4 lines
arch/arm64/boot/dts/qcom/pm8150b.dtsi +1
-0@@ -22,6 +22,14 @@ power-on@800 { status = "disabled"; }; + qcom,typec@1500 {
Please no "qcom," in the node names and please give it a label to make it easy to change the status of the node.
arch/arm64/boot/dts/qcom/pm8150b.dtsi power-on@800 { · line 30
Quoted 5 lines
arch/arm64/boot/dts/qcom/pm8150b.dtsi +5
-0+ compatible = "qcom,pm8150b-usb-typec"; + status = "disabled"; + reg = <0x1500>; + interrupts = + <0x2 0x15 0x5 IRQ_TYPE_EDGE_RISING>;
This is nicer on a single line, so please omit the line break.
Regards,
Bjorn
Quoted 9 lines
arch/arm64/boot/dts/qcom/pm8150b.dtsi +2
-0+ }; + 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 v3 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 | 100 ++++++++++++++++++++ 3 files changed, 111 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_vbus-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 +100 -0
100 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 v3 4/6] regulator: Add support for QCOM PMIC VBUS booster
Hi--
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_vbus-regulator".
Since '-' in a module name is converted to '_' when the module is loaded, it probably makes more sense to tell the user that the module name will be qcom_usb_vbus_regulator.
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 v3 4/6] regulator: Add support for QCOM PMIC VBUS booster
In reply to Wesley ChengQuoted 80 lines · Wesley Cheng
Some 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.
Signed-off-by Wesley Cheng <[email protected]>--- drivers/regulator/Kconfig | 10 ++ drivers/regulator/Makefile | 1 + drivers/regulator/qcom_usb_vbus-regulator.c | 100 ++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 drivers/regulator/qcom_usb_vbus-regulator.cdrivers/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_vbus-regulator". + config REGULATOR_RC5T583 tristate "RICOH RC5T583 Power regulators" depends on MFD_RC5T583drivers/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.odrivers/regulator/qcom_usb_vbus-regulator.c new file +29
-0@@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-2.0-only +// +// Qualcomm PMIC VBUS output regulator driver +// +// Copyright (c) 2020, The Linux Foundation. All rights reserved. + +#include <linux/module.h> +#include <linux/err.h> +#include <linux/kernel.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/of_regulator.h> +#include <linux/regmap.h> + +#define CMD_OTG 0x40 +#define OTG_EN BIT(0) +#define OTG_CFG 0x53 +#define OTG_EN_SRC_CFG BIT(1) + +static const struct regulator_ops qcom_usb_vbus_reg_ops = { + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, +}; + +static struct regulator_desc qcom_usb_vbus_rdesc = { + .name ="usb_vbus" ,
drivers/regulator/qcom_usb_vbus-regulator.c line 39
Quoted 10 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +10
-0+ .ops = &qcom_usb_vbus_reg_ops, + .owner = THIS_MODULE, + .type = REGULATOR_VOLTAGE, +}; + +static const struct of_device_id qcom_usb_vbus_regulator_match[] = { + { .compatible ="qcom,pm8150b-vbus-reg" }, + { } +}; +MODULE_DEVICE_TABLE (of, qcom_usb_vbus_regulator_match);
Please move the of_device_id below the probe.
drivers/regulator/qcom_usb_vbus-regulator.c line 45
Quoted 6 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +6
-0+ +static int qcom_usb_vbus_regulator_probe (struct platform_device *pdev) +{ +struct device *dev = &pdev->dev; +struct regulator_dev *rdev; +struct regmap *regmap;
Please drop the tab in the middle here.
Quoted 26 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +26
-0+struct regulator_config config = { }; +struct regulator_init_data *init_data; +int ret; +u32 base; + + ret =of_property_read_u32 (dev->of_node,"reg" , &base); +if (ret <0 ) { +dev_err (dev,"no base address found\n" ); +return ret; + } + + regmap =dev_get_regmap (dev->parent,NULL ); +if (regmap) { +dev_err (dev,"Failed to get regmap\n" ); +return -ENOENT ; + } + + init_data =of_get_regulator_init_data (dev, dev->of_node, + &qcom_usb_vbus_rdesc); +if (!init_data) +return -ENOMEM ; + + qcom_usb_vbus_rdesc.enable_reg = base +CMD_OTG ; + qcom_usb_vbus_rdesc.enable_mask =OTG_EN ; + config.dev = dev; + config.init_data = init_data;
drivers/regulator/qcom_usb_vbus-regulator.c line 81
Quoted 10 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +10
-0+ config.regmap = regmap; + + rdev =devm_regulator_register (dev, &qcom_usb_vbus_rdesc, &config); +if (IS_ERR (rdev)) { + ret =PTR_ERR (rdev); +dev_err (dev,"not able to register vbus reg %d\n" , ret); +return ret; + } + +platform_set_drvdata (pdev, rdev);
I don't see a matching platform_get_drvdata(), so please omit this.
Quoted 9 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +9
-0+ +/* Disable HW logic for VBUS enable */ +regmap_update_bits (regmap, base +OTG_CFG ,OTG_EN_SRC_CFG ,0 ); + +return 0 ; +} + +static struct platform_driver qcom_usb_vbus_regulator_driver = { + .driver = {
drivers/regulator/qcom_usb_vbus-regulator.c line 100
Quoted 10 lines
drivers/regulator/qcom_usb_vbus-regulator.c new file +10
-0+ .name = "qcom-usb-vbus-regulator", + .of_match_table = qcom_usb_vbus_regulator_match, + }, + .probe = qcom_usb_vbus_regulator_probe, +}; +module_platform_driver (qcom_usb_vbus_regulator_driver); + +MODULE_DESCRIPTION ("Qualcomm USB vbus regulator driver" ); +MODULE_LICENSE ("GPL v2" ); +MODULE_ALIAS ("platform:qcom-usb-vbus-regulator" );
There's no code that will attempt to load the driver by this alias, so please drop it.
Regards,
Bjorn
Quoted 4 lines
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v3 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 v3 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
Re: [PATCH v3 6/6] arm64: boot: dts: qcom: pm8150b: Add DTS node for PMIC VBUS booster
Hey Wesley,
Quoted 17 lines · Wesley Cheng
Add the required DTS node for the USB VBUS output regulator, which is available on PM8150B. This will provide the VBUS source to connected peripherals.
Signed-off-by Wesley Cheng <[email protected]>--- 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 +0
-0@@ -22,6 +22,12 @@ power-on@800 { status = "disabled"; };
arch/arm64/boot/dts/qcom/pm8150b.dtsi power-on@800 { · line 33
Quoted 10 lines
arch/arm64/boot/dts/qcom/pm8150b.dtsi +6
-0+ qcom,dcdc@1100 { + compatible = "qcom,pm8150b-vbus-reg"; + status = "disabled"; + reg = <0x1100>; + }; + qcom,typec@1500 { compatible = "qcom,pm8150b-usb-typec"; status = "disabled";
Don't you also need a "usb_vbus-supply" property here under the Type-C node pointing to the phandle of the vbus reg?
Jack
Quoted 22 lines
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
Re: [PATCH v3 6/6] arm64: boot: dts: qcom: pm8150b: Add DTS node for PMIC VBUS booster
In reply to Wesley ChengQuoted 15 lines · Wesley Cheng
Add the required DTS node for the USB VBUS output regulator, which is available on PM8150B. This will provide the VBUS source to connected peripherals.
Signed-off-by Wesley Cheng <[email protected]>--- 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 +0
-0
arch/arm64/boot/dts/qcom/pm8150b.dtsi power-on@800 { · line 25
Quoted 4 lines
arch/arm64/boot/dts/qcom/pm8150b.dtsi +1
-0@@ -22,6 +22,12 @@ power-on@800 { status = "disabled"; }; + qcom,dcdc@1100 {
You shouldn't use "qcom," in node names and whenever possible you should try to use generic node names. It would also be good to have a label on this, to allow the regulator to be referenced by a client.
So please make this something like:
pm8150b_vbus: regulator@1100 {Quoted 13 lines
arch/arm64/boot/dts/qcom/pm8150b.dtsi +5
-0+ 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 +0
-0
arch/arm64/boot/dts/qcom/sm8150-mtp.dts &usb_1 { · line 434
Quoted 9 lines
arch/arm64/boot/dts/qcom/sm8150-mtp.dts +6
-0@@ -426,6 +426,13 @@ &usb_1 { status = "okay"; }; +&spmi_bus { + pmic@2 { + qcom,dcdc@1100 { + status = "okay"; + }; +};
And then you can enable &pm8150b_vbus here instead.
Regards,
Bjorn
Quoted 8 lines
arch/arm64/boot/dts/qcom/sm8150-mtp.dts +1
-0+ &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