diff mbox series

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

Message ID 20180725222552.3450-2-lukma@denx.de
State Superseded
Delegated to: Tom Rini
Headers show
Series ARM: Odroid XU3: Enable DM_MMC support which is necessary for CONFIG_BLK | expand

Commit Message

Lukasz Majewski July 25, 2018, 10:25 p.m. UTC
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@denx.de>
---

 drivers/mmc/exynos_dw_mmc.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

Comments

Anand Moon July 27, 2018, 3:06 a.m. UTC | #1
Hi Lukasz

On 26 July 2018 at 03:55, Lukasz Majewski <lukma@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@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@gmail.com>

Best Regards
-Anand
diff mbox series

Patch

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);