ARM: mmp: Fix failure to remove sram device
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 26 Jul 2021 20:01:58 +0000 (22:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:24:02 +0000 (14:24 +0200)
[ Upstream commit 4036b29a146b2749af3bb213b003eb69f3e5ecc4 ]

Make sure in .probe() to set driver data before the function is left to
make it possible in .remove() to undo the actions done.

This fixes a potential memory leak and stops returning an error code in
.remove() that is ignored by the driver core anyhow.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/arm/mach-mmp/sram.c

index 6794e2d..ecc46c3 100644 (file)
@@ -72,6 +72,8 @@ static int sram_probe(struct platform_device *pdev)
        if (!info)
                return -ENOMEM;
 
+       platform_set_drvdata(pdev, info);
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res == NULL) {
                dev_err(&pdev->dev, "no memory resource defined\n");
@@ -107,8 +109,6 @@ static int sram_probe(struct platform_device *pdev)
        list_add(&info->node, &sram_bank_list);
        mutex_unlock(&sram_lock);
 
-       platform_set_drvdata(pdev, info);
-
        dev_info(&pdev->dev, "initialized\n");
        return 0;
 
@@ -127,17 +127,19 @@ static int sram_remove(struct platform_device *pdev)
        struct sram_bank_info *info;
 
        info = platform_get_drvdata(pdev);
-       if (info == NULL)
-               return -ENODEV;
 
-       mutex_lock(&sram_lock);
-       list_del(&info->node);
-       mutex_unlock(&sram_lock);
+       if (info->sram_size) {
+               mutex_lock(&sram_lock);
+               list_del(&info->node);
+               mutex_unlock(&sram_lock);
+
+               gen_pool_destroy(info->gpool);
+               iounmap(info->sram_virt);
+               kfree(info->pool_name);
+       }
 
-       gen_pool_destroy(info->gpool);
-       iounmap(info->sram_virt);
-       kfree(info->pool_name);
        kfree(info);
+
        return 0;
 }