[PATCH] usb: dwc3: core: fix clk_get_rate returning negative value

Marek Vasut marex at denx.de
Thu Jun 15 22:59:11 CEST 2023


On 6/15/23 16:59, Eugen Hristev wrote:
> Unlike it's Linux counterpart, clk_get_rate can return a negative value, -ve.
> The driver does not take that into account, stores the rate into
> an unsigned long, and if clk_get_rate fails, it will take into consideration
> the actual value and wrongly program the hardware.
> E.g. on error -2 (no such entry), the rate will be 18446744073709551614
> and this will be subsequently used by the driver to program the DWC3
> To fix this, exit the function if the value is negative.
> 
> Fixes: 6bae0eb5b8bd ("usb: dwc3: Calculate REFCLKPER based on reference clock")
> Signed-off-by: Eugen Hristev <eugen.hristev at collabora.com>
> ---
>   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 49f6a1900b01..5a8c29424578 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -138,7 +138,7 @@ static void dwc3_ref_clk_period(struct dwc3 *dwc)
>   
>   	if (dwc->ref_clk) {
>   		rate = clk_get_rate(dwc->ref_clk);

This ^ assigns to unsigned long .

Please just change the data type of the $rate to 'long' (drop the unsigned).

> -		if (!rate)
> +		if (!rate || (long)rate < 0)

if (rate <= 0) will work too ^


More information about the U-Boot mailing list