It is better to place clk_enable() in phy_meson_g12a_usb2_init()
and clk_disable() in phy_meson_g12a_usb2_exit().

For more detailed information, please see comments in the review of
a similar driver in the Linux Kernel:

https://lore.kernel.org/all/CAFBinCCEhobbyKHuKDWzTYCQWgNT1-e8=7hmhq1mvt6cueo...@mail.gmail.com/

Signed-off-by: Alexey Romanov <avroma...@salutedevices.com>
Reviewed-by: Neil Armstrong <neil.armstr...@linaro.org>
---
 drivers/phy/meson-g12a-usb2.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/phy/meson-g12a-usb2.c b/drivers/phy/meson-g12a-usb2.c
index 2e366b16ae..7b028784a0 100644
--- a/drivers/phy/meson-g12a-usb2.c
+++ b/drivers/phy/meson-g12a-usb2.c
@@ -160,6 +160,14 @@ static int phy_meson_g12a_usb2_init(struct phy *phy)
        struct phy_meson_g12a_usb2_priv *priv = dev_get_priv(dev);
        int ret;
 
+#if CONFIG_IS_ENABLED(CLK)
+       ret = clk_enable(&priv->clk);
+       if (ret && ret != -ENOSYS && ret != -ENOTSUPP) {
+               pr_err("failed to enable PHY clock\n");
+               return ret;
+       }
+#endif
+
        ret = reset_assert(&priv->reset);
        udelay(1);
        ret |= reset_deassert(&priv->reset);
@@ -252,6 +260,10 @@ static int phy_meson_g12a_usb2_exit(struct phy *phy)
        struct phy_meson_g12a_usb2_priv *priv = dev_get_priv(dev);
        int ret;
 
+#if CONFIG_IS_ENABLED(CLK)
+       clk_disable(&priv->clk);
+#endif
+
        ret = reset_assert(&priv->reset);
        if (ret)
                return ret;
@@ -289,13 +301,6 @@ int meson_g12a_usb2_phy_probe(struct udevice *dev)
        ret = clk_get_by_index(dev, 0, &priv->clk);
        if (ret < 0)
                return ret;
-
-       ret = clk_enable(&priv->clk);
-       if (ret && ret != -ENOSYS && ret != -ENOTSUPP) {
-               pr_err("failed to enable PHY clock\n");
-               clk_free(&priv->clk);
-               return ret;
-       }
 #endif
 
        return 0;
-- 
2.25.1

Reply via email to