From 2694127cc2c05a399d3be26d6b2df2224cd70ebc Mon Sep 17 00:00:00 2001 From: JC Kuo <jckuo@nvidia.com> Date: Fri, 16 Dec 2016 13:10:41 +0800 Subject: [PATCH] phy: tegra: xusb: add [set/clear]_vbus_override() This commit adds tegra_xusb_padctl_set_vbus_override() and tegra_xusb_padctl_clear_vbus_override() that can be used to change port role of a dual-role USB (otg-capable) USB2/USB3 port. Bug 1843963 Change-Id: I89c240d781779e35daa21dff343609ec3dd29300 Signed-off-by: JC Kuo <jckuo@nvidia.com> --- drivers/phy/tegra/xusb.c | 18 ++++++++++++++++++ drivers/phy/tegra/xusb.h | 1 + include/linux/phy/tegra/xusb.h | 2 ++ 3 files changed, 21 insertions(+) diff --git a/drivers/phy/tegra/xusb.c b/drivers/phy/tegra/xusb.c index 43f921bad4938c..fb30a31b962b78 100644 --- a/drivers/phy/tegra/xusb.c +++ b/drivers/phy/tegra/xusb.c @@ -1033,6 +1033,24 @@ int tegra_xusb_padctl_usb3_set_lfps_detect(struct tegra_xusb_padctl *padctl, } EXPORT_SYMBOL_GPL(tegra_xusb_padctl_usb3_set_lfps_detect); +int tegra_xusb_padctl_set_vbus_override(struct tegra_xusb_padctl *padctl) +{ + if (padctl->soc->ops->vbus_override) + return padctl->soc->ops->vbus_override(padctl, true); + + return -ENOSYS; +} +EXPORT_SYMBOL_GPL(tegra_xusb_padctl_set_vbus_override); + +int tegra_xusb_padctl_clear_vbus_override(struct tegra_xusb_padctl *padctl) +{ + if (padctl->soc->ops->vbus_override) + return padctl->soc->ops->vbus_override(padctl, false); + + return -ENOSYS; +} +EXPORT_SYMBOL_GPL(tegra_xusb_padctl_clear_vbus_override); + MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>"); MODULE_DESCRIPTION("Tegra XUSB Pad Controller driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/phy/tegra/xusb.h b/drivers/phy/tegra/xusb.h index a1d69b4885c138..5f93d9ab44822b 100644 --- a/drivers/phy/tegra/xusb.h +++ b/drivers/phy/tegra/xusb.h @@ -361,6 +361,7 @@ struct tegra_xusb_padctl_ops { unsigned int index, bool idle); int (*usb3_set_lfps_detect)(struct tegra_xusb_padctl *padctl, unsigned int index, bool enable); + int (*vbus_override)(struct tegra_xusb_padctl *padctl, bool set); }; struct tegra_xusb_padctl_soc { diff --git a/include/linux/phy/tegra/xusb.h b/include/linux/phy/tegra/xusb.h index 8e1a57a78d9fa7..bd00855fb5b9e6 100644 --- a/include/linux/phy/tegra/xusb.h +++ b/include/linux/phy/tegra/xusb.h @@ -26,5 +26,7 @@ int tegra_xusb_padctl_hsic_set_idle(struct tegra_xusb_padctl *padctl, unsigned int port, bool idle); int tegra_xusb_padctl_usb3_set_lfps_detect(struct tegra_xusb_padctl *padctl, unsigned int port, bool enable); +int tegra_xusb_padctl_set_vbus_override(struct tegra_xusb_padctl *padctl); +int tegra_xusb_padctl_clear_vbus_override(struct tegra_xusb_padctl *padctl); #endif /* PHY_TEGRA_XUSB_H */