]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: sn-f-ospi: Fix resource leak in f_ospi_probe()
authorFelix Gu <ustc.gu@gmail.com>
Wed, 18 Mar 2026 16:12:34 +0000 (00:12 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 23 Mar 2026 14:51:59 +0000 (14:51 +0000)
In f_ospi_probe(), when num_cs validation fails, it returns without
calling spi_controller_put() on the SPI controller, which causes a
resource leak.

Use devm_spi_alloc_host() instead of spi_alloc_host() to ensure the
SPI controller is properly freed when probe fails.

Fixes: 1b74dd64c861 ("spi: Add Socionext F_OSPI SPI flash controller driver")
Signed-off-by: Felix Gu <ustc.gu@gmail.com>
Link: https://patch.msgid.link/20260319-sn-f-v1-1-33a6738d2da8@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-sn-f-ospi.c

index bfcc140df810b51774c973eea3e125a6325a96f7..1f554aa7ca276b7c54e53412f0583bbaf3cdc7ea 100644 (file)
@@ -612,7 +612,7 @@ static int f_ospi_probe(struct platform_device *pdev)
        u32 num_cs = OSPI_NUM_CS;
        int ret;
 
-       ctlr = spi_alloc_host(dev, sizeof(*ospi));
+       ctlr = devm_spi_alloc_host(dev, sizeof(*ospi));
        if (!ctlr)
                return -ENOMEM;
 
@@ -635,16 +635,12 @@ static int f_ospi_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, ospi);
 
        ospi->base = devm_platform_ioremap_resource(pdev, 0);
-       if (IS_ERR(ospi->base)) {
-               ret = PTR_ERR(ospi->base);
-               goto err_put_ctlr;
-       }
+       if (IS_ERR(ospi->base))
+               return PTR_ERR(ospi->base);
 
        ospi->clk = devm_clk_get_enabled(dev, NULL);
-       if (IS_ERR(ospi->clk)) {
-               ret = PTR_ERR(ospi->clk);
-               goto err_put_ctlr;
-       }
+       if (IS_ERR(ospi->clk))
+               return PTR_ERR(ospi->clk);
 
        mutex_init(&ospi->mlock);
 
@@ -661,9 +657,6 @@ static int f_ospi_probe(struct platform_device *pdev)
 err_destroy_mutex:
        mutex_destroy(&ospi->mlock);
 
-err_put_ctlr:
-       spi_controller_put(ctlr);
-
        return ret;
 }