summaryrefslogtreecommitdiffstats
path: root/drivers/phy/tegra/xusb-tegra210.c
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2020-03-18 23:25:54 +0100
committerThierry Reding <treding@nvidia.com>2020-03-19 14:00:04 +0100
commit2f8da84def73e1dd89385146e1dbb2ae2c8e0a6a (patch)
tree49393740be1a16f05e58d9aa54787616a0ea6784 /drivers/phy/tegra/xusb-tegra210.c
parent562835644667459c701b08c036fbe72443a3fb71 (diff)
downloadlinux-stable-2f8da84def73e1dd89385146e1dbb2ae2c8e0a6a.tar.gz
linux-stable-2f8da84def73e1dd89385146e1dbb2ae2c8e0a6a.tar.bz2
linux-stable-2f8da84def73e1dd89385146e1dbb2ae2c8e0a6a.zip
phy: tegra: Fix regulator leak
Devices are created for each port of the XUSB pad controller. Each USB 2 and USB 3 port can potentially have an associated VBUS power supply that needs to be removed when the device is removed. Since port devices never bind to a driver, the driver core will not get to perform the cleanup of device-managed resources that usually happens on driver unbind. Now, the driver core will also perform device-managed resource cleanup for driver-less devices when they are released. However, when a device link is created between the regulator and the port device, as part of regulator_get(), the regulator takes a reference to the port device and prevents it from being released unless regulator_put() is called, which will never happen. Avoid this by using the non-device-managed API and manually releasing the regulator reference when the port is unregistered. Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/phy/tegra/xusb-tegra210.c')
-rw-r--r--drivers/phy/tegra/xusb-tegra210.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/phy/tegra/xusb-tegra210.c b/drivers/phy/tegra/xusb-tegra210.c
index 54d6826854a9..0e11a8cf2591 100644
--- a/drivers/phy/tegra/xusb-tegra210.c
+++ b/drivers/phy/tegra/xusb-tegra210.c
@@ -1953,6 +1953,7 @@ tegra210_usb2_port_map(struct tegra_xusb_port *port)
}
static const struct tegra_xusb_port_ops tegra210_usb2_port_ops = {
+ .remove = tegra_xusb_usb2_port_remove,
.enable = tegra210_usb2_port_enable,
.disable = tegra210_usb2_port_disable,
.map = tegra210_usb2_port_map,
@@ -2119,6 +2120,7 @@ tegra210_usb3_port_map(struct tegra_xusb_port *port)
}
static const struct tegra_xusb_port_ops tegra210_usb3_port_ops = {
+ .remove = tegra_xusb_usb3_port_remove,
.enable = tegra210_usb3_port_enable,
.disable = tegra210_usb3_port_disable,
.map = tegra210_usb3_port_map,