[U-Boot] [PATCH v1 1/9] ARM: dw_mmc: Exclude dwmci Exynos priv_data allocation from exynos_dwmci_get_config()

Anand Moon linux.amoon at gmail.com
Fri Jul 27 03:06:08 UTC 2018


Hi Lukasz

On 26 July 2018 at 03:55, Lukasz Majewski <lukma at denx.de> wrote:
> This commit prevents memory leak when this function is used with DM_MMC
> as the struct dwmci_exynos_priv_data is already allocated by DM.
>
> It is necessary for NON DM aware devices to allocate this struct first.
>
> Signed-off-by: Lukasz Majewski <lukma at denx.de>
> ---
>
>  drivers/mmc/exynos_dw_mmc.c | 30 +++++++++++++++---------------
>  1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c
> index 865fdf4dbba0..49c4f7634830 100644
> --- a/drivers/mmc/exynos_dw_mmc.c
> +++ b/drivers/mmc/exynos_dw_mmc.c
> @@ -146,17 +146,11 @@ static int do_dwmci_init(struct dwmci_host *host)
>  }
>
>  static int exynos_dwmci_get_config(const void *blob, int node,
> -                                       struct dwmci_host *host)
> +                                  struct dwmci_host *host,
> +                                  struct dwmci_exynos_priv_data *priv)
>  {
>         int err = 0;
>         u32 base, timing[3];
> -       struct dwmci_exynos_priv_data *priv;
> -
> -       priv = malloc(sizeof(struct dwmci_exynos_priv_data));
> -       if (!priv) {
> -               pr_err("dwmci_exynos_priv_data malloc fail!\n");
> -               return -ENOMEM;
> -       }
>
>         /* Extract device id for each mmc channel */
>         host->dev_id = pinmux_decode_periph_id(blob, node);
> @@ -167,7 +161,6 @@ static int exynos_dwmci_get_config(const void *blob, int node,
>
>         if (host->dev_index > 4) {
>                 printf("DWMMC%d: Can't get the dev index\n", host->dev_index);
> -               free(priv);
>                 return -EINVAL;
>         }
>
> @@ -178,7 +171,6 @@ static int exynos_dwmci_get_config(const void *blob, int node,
>         base = fdtdec_get_addr(blob, node, "reg");
>         if (!base) {
>                 printf("DWMMC%d: Can't get base address\n", host->dev_index);
> -               free(priv);
>                 return -EINVAL;
>         }
>         host->ioaddr = (void *)base;
> @@ -188,7 +180,6 @@ static int exynos_dwmci_get_config(const void *blob, int node,
>         if (err) {
>                 printf("DWMMC%d: Can't get sdr-timings for devider\n",
>                                 host->dev_index);
> -               free(priv);
>                 return -EINVAL;
>         }
>
> @@ -208,14 +199,13 @@ static int exynos_dwmci_get_config(const void *blob, int node,
>         host->bus_hz = fdtdec_get_int(blob, node, "bus_hz", 0);
>         host->div = fdtdec_get_int(blob, node, "div", 0);
>
> -       host->priv = priv;
> -
>         return 0;
>  }
>
>  static int exynos_dwmci_process_node(const void *blob,
>                                         int node_list[], int count)
>  {
> +       struct dwmci_exynos_priv_data *priv;
>         struct dwmci_host *host;
>         int i, node, err;
>
> @@ -224,11 +214,20 @@ static int exynos_dwmci_process_node(const void *blob,
>                 if (node <= 0)
>                         continue;
>                 host = &dwmci_host[i];
> -               err = exynos_dwmci_get_config(blob, node, host);
> +
> +               priv = malloc(sizeof(struct dwmci_exynos_priv_data));
> +               if (!priv) {
> +                       pr_err("dwmci_exynos_priv_data malloc fail!\n");
> +                       return -ENOMEM;
> +               }
> +
> +               err = exynos_dwmci_get_config(blob, node, host, priv);
>                 if (err) {
>                         printf("%s: failed to decode dev %d\n", __func__, i);
> +                       free(priv);
>                         return err;
>                 }
> +               host->priv = priv;
>
>                 do_dwmci_init(host);
>         }
> @@ -266,7 +265,8 @@ static int exynos_dwmmc_probe(struct udevice *dev)
>         struct dwmci_host *host = &priv->host;
>         int err;
>
> -       err = exynos_dwmci_get_config(gd->fdt_blob, dev_of_offset(dev), host);
> +       err = exynos_dwmci_get_config(gd->fdt_blob, dev_of_offset(dev), host,
> +                                     priv);
>         if (err)
>                 return err;
>         err = do_dwmci_init(host);
> --
> 2.11.0
>

Please add my.
Tested-by: Anand Moon <linux.amoon at gmail.com>

Best Regards
-Anand


More information about the U-Boot mailing list