On Thu, Feb 29, 2024 at 02:21:08PM +0000, Volodymyr Babchuk wrote:
> @@ -223,7 +229,7 @@ U_BOOT_DRIVER(qcom_clk) = {
>  int qcom_cc_bind(struct udevice *parent)
>  {
>       struct msm_clk_data *data = (struct msm_clk_data 
> *)dev_get_driver_data(parent);
> -     struct udevice *clkdev, *rstdev;
> +     struct udevice *clkdev, *rstdev, *pwrdev;
>       struct driver *drv;
>       int ret;
>  
> @@ -253,6 +259,20 @@ int qcom_cc_bind(struct udevice *parent)
>       if (ret)
>               device_unbind(clkdev);

Change this to:

        if (ret)
                goto unbind_clkdev;

>  
> +     if (!data->power_domains)
> +             return ret;


Then this becomes:

        if (!data->power_domains)
                return 0;

> +
> +     /* Get a handle to the common power domain handler */
> +     drv = lists_driver_lookup_name("qcom_power");
> +     if (!drv)
> +             return -ENOENT;

        if (!drv) {
                ret = -ENOENT;
                goto unbind_rstdev;
        }

> +
> +     /* Register the power domain controller */
> +     ret = device_bind_with_driver_data(parent, drv, "qcom_power", 
> (ulong)data,
> +                                        dev_ofnode(parent), &pwrdev);
> +     if (ret)
> +             device_unbind(pwrdev);

pwrdev wasn't bound.  Free the last *successful* allocation which was
still rstdev.

        if (ret)
                goto unbind_rstdev;

        return 0;

unbind_rstdev:
        device_unbind(rstdev);
unbind_clkdev:
        device_unbind(clkdev);

        return ret;

> +
>       return ret;
>  }
>  

regards,
dan carpenter

Reply via email to