usb: phy: tegra: Clean up ulpi_phy_power_off
authorDmitry Osipenko <digetx@gmail.com>
Mon, 6 Jan 2020 01:33:59 +0000 (04:33 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2020 10:15:31 +0000 (11:15 +0100)
Firstly, the PHY's clock needs to unprepared to keep prepare count
balanced. Secondly, downstream code suggests that reset is synchronous
and thus it should be asserted before disabling clock.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20200106013416.9604-4-digetx@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/phy/phy-tegra-usb.c

index ea7ef1d..99acfde 100644 (file)
@@ -757,8 +757,19 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)
 
 static int ulpi_phy_power_off(struct tegra_usb_phy *phy)
 {
-       clk_disable(phy->clk);
-       return gpio_direction_output(phy->reset_gpio, 0);
+       int err;
+
+       err = gpio_direction_output(phy->reset_gpio, 0);
+       if (err) {
+               dev_err(phy->u_phy.dev, "reset GPIO not asserted: %d\n", err);
+               return err;
+       }
+
+       usleep_range(5000, 6000);
+
+       clk_disable_unprepare(phy->clk);
+
+       return 0;
 }
 
 static void tegra_usb_phy_close(struct tegra_usb_phy *phy)