[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1610720001-15300-1-git-send-email-u0084500@gmail.com>
Date: Fri, 15 Jan 2021 22:13:20 +0800
From: cy_huang <u0084500@...il.com>
To: linux@...ck-us.net, heikki.krogerus@...ux.intel.com,
matthias.bgg@...il.com, robh+dt@...nel.org
Cc: gregkh@...uxfoundation.org, linux-usb@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org,
linux-mediatek@...ts.infradead.org, linux-kernel@...r.kernel.org,
cy_huang@...htek.com, gene_chen@...htek.com,
devicetree@...r.kernel.org
Subject: [PATCH 1/2] usb typec: tcpci: mt6360: Add vsafe0v support and external vbus supply control
From: ChiYuan Huang <cy_huang@...htek.com>
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@...htek.com>
---
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
Powered by blists - more mailing lists