generic_phy_power_off(), needs to be called in dwc3_glue_remove() while
exiting as we powering on the phy in the dwc3_glue_probe(). Therefore,
instantiate struct phy in dwc3_glue_data to use in dwc3_glue_probe() as
well as dwc3_glue_remove().

In cases where "usb3-phy" is not present in the phy-names property,
generic_phy_get_by_name() returns -ENODATA. Therefore, add condition to not
return when the error code is -ENODATA too.

Also, generic_phy_init() and generic_phy_power_on() functions, have checks
to verify if the struct phy argument passed is valid. Therefore, remove
additional checks added for these in the dwc3_glue_probe().

Fixes: 142d50fbce7c ("usb: dwc3: Add support for usb3-phy PHY configuration")
Signed-off-by: Aswath Govindraju <a-govindr...@ti.com>
---
 drivers/usb/dwc3/dwc3-generic.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 6e1a1d066b40..f74d710a2447 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -30,6 +30,7 @@
 struct dwc3_glue_data {
        struct clk_bulk         clks;
        struct reset_ctl_bulk   resets;
+       struct phy phy;
        fdt_addr_t regs;
 };
 
@@ -458,21 +459,21 @@ static int dwc3_glue_probe(struct udevice *dev)
 {
        struct dwc3_glue_ops *ops = (struct dwc3_glue_ops 
*)dev_get_driver_data(dev);
        struct dwc3_glue_data *glue = dev_get_plat(dev);
+       struct phy *phy = &glue->phy;
        struct udevice *child = NULL;
        int index = 0;
        int ret;
-       struct phy phy;
 
-       ret = generic_phy_get_by_name(dev, "usb3-phy", &phy);
-       if (!ret) {
-               ret = generic_phy_init(&phy);
-               if (ret)
-                       return ret;
-       } else if (ret != -ENOENT) {
+       ret = generic_phy_get_by_name(dev, "usb3-phy", phy);
+       if (ret && ret != -ENOENT && ret != -ENODATA) {
                debug("could not get phy (err %d)\n", ret);
                return ret;
        }
 
+       ret = generic_phy_init(phy);
+       if (ret)
+               return ret;
+
        glue->regs = dev_read_addr(dev);
 
        ret = dwc3_glue_clk_init(dev, glue);
@@ -483,11 +484,9 @@ static int dwc3_glue_probe(struct udevice *dev)
        if (ret)
                return ret;
 
-       if (phy.dev) {
-               ret = generic_phy_power_on(&phy);
-               if (ret)
-                       return ret;
-       }
+       ret = generic_phy_power_on(phy);
+       if (ret)
+               return ret;
 
        ret = device_find_first_child(dev, &child);
        if (ret)
@@ -516,6 +515,8 @@ static int dwc3_glue_remove(struct udevice *dev)
 {
        struct dwc3_glue_data *glue = dev_get_plat(dev);
 
+       generic_phy_power_off(&glue->phy);
+
        reset_release_bulk(&glue->resets);
 
        clk_release_bulk(&glue->clks);
-- 
2.17.1

Reply via email to