[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