]> git.ipfire.org Git - thirdparty/kernel/linux.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)
committerMark Brown <broonie@kernel.org>
Sun, 15 Mar 2026 23:58:47 +0000 (23:58 +0000)
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>
drivers/spi/spi-amlogic-spisg.c

index 1509df2b17aed45cb4fab6b3f170ab1a3b6d12fa..9d568e385f052a6062e2969e6198ca441ba39b9a 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)
@@ -817,8 +815,6 @@ out_clk:
        if (spisg->core)
                clk_disable_unprepare(spisg->core);
        clk_disable_unprepare(spisg->pclk);
-out_controller:
-       spi_controller_put(ctlr);
 
        return ret;
 }