clk_get_rate() in U-Boot is documented to return clock rate on success,
0 for invalid clock and -ve error code for other errors. This differ
slightly from Linux where only >= 0 is returned from clk_get_rate().

Some clock drivers take advantage of this difference and may return -ve
error code for clocks not fully supported in U-Boot.

Use IS_ERR_VALUE() to check for an error code in addition to current
invalid clock check to fix broken and unpredicted behavior when clock
driver returns a -ve error code for the ref_clk.

Signed-off-by: Jonas Karlman <[email protected]>
---
 drivers/usb/dwc3/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 6f22b9232bad..5bfca580824a 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -149,7 +149,7 @@ static void dwc3_ref_clk_period(struct dwc3 *dwc)
 
        if (dwc->ref_clk) {
                rate = clk_get_rate(dwc->ref_clk);
-               if (!rate)
+               if (IS_ERR_VALUE(rate) || !rate)
                        return;
                period = NSEC_PER_SEC / rate;
        } else {
-- 
2.52.0

Reply via email to