[PATCH 1/2] usb typec: tcpci: mt6360: Add vsafe0v support and external vbus supply control

From: cy_huang
Date: Fri Jan 15 2021 - 09:14:19 EST


From: ChiYuan Huang <cy_huang@xxxxxxxxxxx>

MT6360 not support for TCPC command to control source and sink.
Uses external 5V vbus regulator as the vbus source control.

Also adds the capability to report vsafe0v.

Signed-off-by: ChiYuan Huang <cy_huang@xxxxxxxxxxx>
---
drivers/usb/typec/tcpm/tcpci_mt6360.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)

diff --git a/drivers/usb/typec/tcpm/tcpci_mt6360.c b/drivers/usb/typec/tcpm/tcpci_mt6360.c
index f1bd9e0..0edf4b6 100644
--- a/drivers/usb/typec/tcpm/tcpci_mt6360.c
+++ b/drivers/usb/typec/tcpm/tcpci_mt6360.c
@@ -11,6 +11,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
#include <linux/usb/tcpm.h>

#include "tcpci.h"
@@ -36,6 +37,7 @@ struct mt6360_tcpc_info {
struct tcpci_data tdata;
struct tcpci *tcpci;
struct device *dev;
+ struct regulator *vbus;
int irq;
};

@@ -51,6 +53,27 @@ static inline int mt6360_tcpc_write16(struct regmap *regmap,
return regmap_raw_write(regmap, reg, &val, sizeof(u16));
}

+static int mt6360_tcpc_set_vbus(struct tcpci *tcpci, struct tcpci_data *data, bool src, bool snk)
+{
+ struct mt6360_tcpc_info *mti = container_of(data, struct mt6360_tcpc_info, tdata);
+ int ret;
+
+ /* To correctly handle the already enabled vbus and disable its supply first */
+ if (regulator_is_enabled(mti->vbus)) {
+ ret = regulator_disable(mti->vbus);
+ if (ret)
+ return ret;
+ }
+
+ if (src) {
+ ret = regulator_enable(mti->vbus);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static int mt6360_tcpc_init(struct tcpci *tcpci, struct tcpci_data *tdata)
{
struct regmap *regmap = tdata->regmap;
@@ -138,7 +161,13 @@ static int mt6360_tcpc_probe(struct platform_device *pdev)
if (mti->irq < 0)
return mti->irq;

+ mti->vbus = devm_regulator_get(&pdev->dev, "vbus");
+ if (IS_ERR(mti->vbus))
+ return PTR_ERR(mti->vbus);
+
mti->tdata.init = mt6360_tcpc_init;
+ mti->tdata.set_vbus = mt6360_tcpc_set_vbus;
+ mti->tdata.vbus_vsafe0v = 1;
mti->tcpci = tcpci_register_port(&pdev->dev, &mti->tdata);
if (IS_ERR(mti->tcpci)) {
dev_err(&pdev->dev, "Failed to register tcpci port\n");
--
2.7.4