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>
Wed, 20 Apr 2022 07:08:23 +0000 (09:08 +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 bf5e64906e65604375a0781e51c95bbea7242924..a41162dc4af40043d6085eccbbc80cc7eea87a8d 100644 (file)
@@ -75,6 +75,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");
@@ -110,8 +112,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;
 
@@ -130,17 +130,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;
 }