lkml.org 
[lkml]   [2012]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [alsa-devel] [PATCH 1/15] sound/soc/mxs/mxs-saif.c: add missing iounmap
    From: Julia Lawall <Julia.Lawall@lip6.fr>

    The various devm_ functions allocate memory that is released when a driver
    detaches. This patch uses these functions for data that is allocated in
    the probe function of a platform device and is only freed in the remove
    function.

    By removing the need for kfree and iounmap, this also eliminates missing
    resource-release problems.

    Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>

    ---
    This is a patch against the version in
    git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git

    sound/soc/mxs/mxs-saif.c | 47 ++++++++++++-----------------------------------
    1 file changed, 12 insertions(+), 35 deletions(-)

    diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
    --- a/sound/soc/mxs/mxs-saif.c
    +++ b/sound/soc/mxs/mxs-saif.c
    @@ -632,7 +632,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
    return ret;
    }

    - saif = kzalloc(sizeof(*saif), GFP_KERNEL);
    + saif = devm_kzalloc(&pdev->dev, sizeof(*saif), GFP_KERNEL);
    if (!saif)
    return -ENOMEM;

    @@ -652,7 +652,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
    ret = PTR_ERR(saif->clk);
    dev_err(&pdev->dev, "Cannot get the clock: %d\n",
    ret);
    - goto failed_clk;
    + return ret;
    }

    iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    @@ -663,18 +663,11 @@ static int mxs_saif_probe(struct platform_device *pdev)
    goto failed_get_resource;
    }

    - if (!request_mem_region(iores->start, resource_size(iores),
    - "mxs-saif")) {
    - dev_err(&pdev->dev, "request_mem_region failed\n");
    - ret = -EBUSY;
    - goto failed_get_resource;
    - }
    -
    - saif->base = ioremap(iores->start, resource_size(iores));
    + saif->base = devm_request_and_ioremap(&pdev->dev, iores);
    if (!saif->base) {
    - dev_err(&pdev->dev, "ioremap failed\n");
    + dev_err(&pdev->dev, "devm_request_and_ioremap failed\n");
    ret = -ENODEV;
    - goto failed_ioremap;
    + goto failed_get_resource;
    }

    dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
    @@ -682,7 +675,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
    ret = -ENODEV;
    dev_err(&pdev->dev, "failed to get dma resource: %d\n",
    ret);
    - goto failed_ioremap;
    + goto failed_get_resource;
    }
    saif->dma_param.chan_num = dmares->start;

    @@ -691,14 +684,15 @@ static int mxs_saif_probe(struct platform_device *pdev)
    ret = saif->irq;
    dev_err(&pdev->dev, "failed to get irq resource: %d\n",
    ret);
    - goto failed_get_irq1;
    + goto failed_get_resource;
    }

    saif->dev = &pdev->dev;
    - ret = request_irq(saif->irq, mxs_saif_irq, 0, "mxs-saif", saif);
    + ret = devm_request_irq(&pdev->dev, saif->irq, mxs_saif_irq, 0,
    + "mxs-saif", saif);
    if (ret) {
    dev_err(&pdev->dev, "failed to request irq\n");
    - goto failed_get_irq1;
    + goto failed_get_resource;
    }

    saif->dma_param.chan_irq = platform_get_irq(pdev, 1);
    @@ -706,7 +700,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
    ret = saif->dma_param.chan_irq;
    dev_err(&pdev->dev, "failed to get dma irq resource: %d\n",
    ret);
    - goto failed_get_irq2;
    + goto failed_get_resource;
    }

    platform_set_drvdata(pdev, saif);
    @@ -714,7 +708,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
    ret = snd_soc_register_dai(&pdev->dev, &mxs_saif_dai);
    if (ret) {
    dev_err(&pdev->dev, "register DAI failed\n");
    - goto failed_register;
    + goto failed_get_resource;
    }

    saif->soc_platform_pdev = platform_device_alloc(
    @@ -737,36 +731,19 @@ failed_pdev_add:
    platform_device_put(saif->soc_platform_pdev);
    failed_pdev_alloc:
    snd_soc_unregister_dai(&pdev->dev);
    -failed_register:
    -failed_get_irq2:
    - free_irq(saif->irq, saif);
    -failed_get_irq1:
    - iounmap(saif->base);
    -failed_ioremap:
    - release_mem_region(iores->start, resource_size(iores));
    failed_get_resource:
    clk_put(saif->clk);
    -failed_clk:
    - kfree(saif);

    return ret;
    }

    static int __devexit mxs_saif_remove(struct platform_device *pdev)
    {
    - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    struct mxs_saif *saif = platform_get_drvdata(pdev);

    platform_device_unregister(saif->soc_platform_pdev);
    -
    snd_soc_unregister_dai(&pdev->dev);
    -
    - iounmap(saif->base);
    - release_mem_region(res->start, resource_size(res));
    - free_irq(saif->irq, saif);
    -
    clk_put(saif->clk);
    - kfree(saif);

    return 0;
    }


    \
     
     \ /
      Last update: 2012-01-26 14:43    [W:5.071 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site