If the clock handle is given in the DT, it means the clock is required
for proper operation of the PHY. In that case a failure to obtain the
clock must be propagated to stop the driver from probing. This fixes
working with clocks, which request probe deferral.

Signed-off-by: Lucas Stach <l.st...@pengutronix.de>
---
 drivers/usb/phy/phy-generic.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
index 89d6e7a5fdb7..1cc02eb3fc65 100644
--- a/drivers/usb/phy/phy-generic.c
+++ b/drivers/usb/phy/phy-generic.c
@@ -224,7 +224,7 @@ int usb_phy_gen_create_phy(struct device *dev, struct 
usb_phy_generic *nop,
        int err = 0;
 
        u32 clk_rate = 0;
-       bool needs_vcc = false;
+       bool needs_vcc = false, needs_clk = false;
 
        if (dev->of_node) {
                struct device_node *node = dev->of_node;
@@ -233,6 +233,7 @@ int usb_phy_gen_create_phy(struct device *dev, struct 
usb_phy_generic *nop,
                        clk_rate = 0;
 
                needs_vcc = of_property_read_bool(node, "vcc-supply");
+               needs_clk = of_property_read_bool(node, "clocks");
                nop->gpiod_reset = devm_gpiod_get_optional(dev, "reset",
                                                           GPIOD_ASIS);
                err = PTR_ERR_OR_ZERO(nop->gpiod_reset);
@@ -275,6 +276,8 @@ int usb_phy_gen_create_phy(struct device *dev, struct 
usb_phy_generic *nop,
        if (IS_ERR(nop->clk)) {
                dev_dbg(dev, "Can't get phy clock: %ld\n",
                                        PTR_ERR(nop->clk));
+               if (needs_clk)
+                       return PTR_ERR(nop->clk);
        }
 
        if (!IS_ERR(nop->clk) && clk_rate) {
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to