Message ID | 20200617180209.5636-1-wcheng@codeaurora.org |
---|---|
Headers | show |
Series | Introduce PMIC based USB type C detection | expand |
Hi-- On 6/17/20 11:02 AM, Wesley Cheng wrote: > diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig > index 074a2ef55943..79d6b7596f0b 100644 > --- a/drivers/regulator/Kconfig > +++ b/drivers/regulator/Kconfig > @@ -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". 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. > + > config REGULATOR_RC5T583 > tristate "RICOH RC5T583 Power regulators" > depends on MFD_RC5T583 > diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile > index c0d6b96ebd78..cbab28aa7b56 100644 > --- a/drivers/regulator/Makefile > +++ b/drivers/regulator/Makefile > @@ -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.
Hey Wesley, On Wed, Jun 17, 2020 at 11:02:09AM -0700, Wesley Cheng wrote: > 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 <wcheng@codeaurora.org> > --- > arch/arm64/boot/dts/qcom/pm8150b.dtsi | 6 ++++++ > arch/arm64/boot/dts/qcom/sm8150-mtp.dts | 7 +++++++ > 2 files changed, 13 insertions(+) > > diff --git a/arch/arm64/boot/dts/qcom/pm8150b.dtsi b/arch/arm64/boot/dts/qcom/pm8150b.dtsi > index ec44a8bc2f84..b7274d9d7341 100644 > --- a/arch/arm64/boot/dts/qcom/pm8150b.dtsi > +++ b/arch/arm64/boot/dts/qcom/pm8150b.dtsi > @@ -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"; 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 > diff --git a/arch/arm64/boot/dts/qcom/sm8150-mtp.dts b/arch/arm64/boot/dts/qcom/sm8150-mtp.dts > index 6c6325c3af59..3845d19893eb 100644 > --- a/arch/arm64/boot/dts/qcom/sm8150-mtp.dts > +++ b/arch/arm64/boot/dts/qcom/sm8150-mtp.dts > @@ -426,6 +426,13 @@ &usb_1 { > status = "okay"; > }; > > +&spmi_bus { > + pmic@2 { > + qcom,dcdc@1100 { > + status = "okay"; > + }; > +}; > + > &usb_1_dwc3 { > dr_mode = "peripheral"; > }; > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >
On Wed 17 Jun 11:02 PDT 2020, Wesley Cheng wrote: > 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 <wcheng@codeaurora.org> > --- > 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 > > diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig > index 074a2ef55943..79d6b7596f0b 100644 > --- a/drivers/regulator/Kconfig > +++ b/drivers/regulator/Kconfig > @@ -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 > diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile > index c0d6b96ebd78..cbab28aa7b56 100644 > --- a/drivers/regulator/Makefile > +++ b/drivers/regulator/Makefile > @@ -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 > diff --git a/drivers/regulator/qcom_usb_vbus-regulator.c b/drivers/regulator/qcom_usb_vbus-regulator.c > new file mode 100644 > index 000000000000..fa7a3d891808 > --- /dev/null > +++ b/drivers/regulator/qcom_usb_vbus-regulator.c > @@ -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", > + .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. > + > +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. > + 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; > + 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. > + > + /* 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 = { > + .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 > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >
On Wed 17 Jun 11:02 PDT 2020, Wesley Cheng wrote: > 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 <wcheng@codeaurora.org> > --- > arch/arm64/boot/dts/qcom/pm8150b.dtsi | 6 ++++++ > arch/arm64/boot/dts/qcom/sm8150-mtp.dts | 7 +++++++ > 2 files changed, 13 insertions(+) > > diff --git a/arch/arm64/boot/dts/qcom/pm8150b.dtsi b/arch/arm64/boot/dts/qcom/pm8150b.dtsi > index ec44a8bc2f84..b7274d9d7341 100644 > --- a/arch/arm64/boot/dts/qcom/pm8150b.dtsi > +++ b/arch/arm64/boot/dts/qcom/pm8150b.dtsi > @@ -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 { > + compatible = "qcom,pm8150b-vbus-reg"; > + status = "disabled"; > + reg = <0x1100>; > + }; > + > qcom,typec@1500 { > compatible = "qcom,pm8150b-usb-typec"; > status = "disabled"; > diff --git a/arch/arm64/boot/dts/qcom/sm8150-mtp.dts b/arch/arm64/boot/dts/qcom/sm8150-mtp.dts > index 6c6325c3af59..3845d19893eb 100644 > --- a/arch/arm64/boot/dts/qcom/sm8150-mtp.dts > +++ b/arch/arm64/boot/dts/qcom/sm8150-mtp.dts > @@ -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 > + > &usb_1_dwc3 { > dr_mode = "peripheral"; > }; > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >
On Wed 17 Jun 11:02 PDT 2020, Wesley Cheng wrote: > 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 <wcheng@codeaurora.org> > --- > arch/arm64/boot/dts/qcom/pm8150b.dtsi | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/arch/arm64/boot/dts/qcom/pm8150b.dtsi b/arch/arm64/boot/dts/qcom/pm8150b.dtsi > index 322379d5c31f..ec44a8bc2f84 100644 > --- a/arch/arm64/boot/dts/qcom/pm8150b.dtsi > +++ b/arch/arm64/boot/dts/qcom/pm8150b.dtsi > @@ -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. > + 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 > + }; > + > adc@3100 { > compatible = "qcom,spmi-adc5"; > reg = <0x3100>; > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >