]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
spi: amlogic-spisg: Fix memory leak in aml_spisg_probe()
authorFelix Gu <ustc.gu@gmail.com>
Sun, 8 Mar 2026 06:49:21 +0000 (14:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Mar 2026 10:13:31 +0000 (11:13 +0100)
[ Upstream commit b8db9552997924b750e727a625a30eaa4603bbb9 ]

In aml_spisg_probe(), ctlr is allocated by
spi_alloc_target()/spi_alloc_host(), but fails to call
spi_controller_put() in several error paths. This leads
to a memory leak whenever the driver fails to probe after
the initial allocation.

Convert to use devm_spi_alloc_host()/devm_spi_alloc_target()
to fix the memory leak.

Fixes: cef9991e04ae ("spi: Add Amlogic SPISG driver")
Signed-off-by: Felix Gu <ustc.gu@gmail.com>
Link: https://patch.msgid.link/20260308-spisg-v1-1-2cace5cafc24@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/spi/spi-amlogic-spisg.c

index bcd7ec291ad07c60a1c4dbf574631a6bc31fc3d3..6045c89c37c8304dbf030e01b2eb8297b671d31d 100644 (file)
@@ -729,9 +729,9 @@ static int aml_spisg_probe(struct platform_device *pdev)
        };
 
        if (of_property_read_bool(dev->of_node, "spi-slave"))
-               ctlr = spi_alloc_target(dev, sizeof(*spisg));
+               ctlr = devm_spi_alloc_target(dev, sizeof(*spisg));
        else
-               ctlr = spi_alloc_host(dev, sizeof(*spisg));
+               ctlr = devm_spi_alloc_host(dev, sizeof(*spisg));
        if (!ctlr)
                return -ENOMEM;
 
@@ -750,10 +750,8 @@ static int aml_spisg_probe(struct platform_device *pdev)
                return dev_err_probe(dev, PTR_ERR(spisg->map), "regmap init failed\n");
 
        irq = platform_get_irq(pdev, 0);
-       if (irq < 0) {
-               ret = irq;
-               goto out_controller;
-       }
+       if (irq < 0)
+               return irq;
 
        ret = device_reset_optional(dev);
        if (ret)
@@ -818,8 +816,6 @@ out_clk:
        if (spisg->core)
                clk_disable_unprepare(spisg->core);
        clk_disable_unprepare(spisg->pclk);
-out_controller:
-       spi_controller_put(ctlr);
 
        return ret;
 }