lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 645/717] spi: ar934x: Dont leak SPI master in probe error path
    Date
    From: Lukas Wunner <lukas@wunner.de>

    commit 236924ee531d6251c8d10e9177b7742a60534ed5 upstream.

    If the call to devm_spi_register_controller() fails on probe of the
    Qualcomm Atheros AR934x/QCA95xx SPI driver, the spi_controller struct is
    erroneously not freed. Fix by switching over to the new
    devm_spi_alloc_master() helper.

    Moreover, the controller's clock is enabled on probe but not disabled if
    any of the subsequent probe steps fail.

    Finally, there's an ordering issue in ar934x_spi_remove() wherein the
    clock is disabled even though the controller is not yet unregistered.
    It is unregistered after ar934x_spi_remove() by the devres framework.
    As long as it is not unregistered, SPI transfers may still be ongoing
    and disabling the clock may break them. It is not possible to use
    devm_spi_register_controller() in this case, so move to the non-devm
    variant.

    All of these bugs have existed since the driver was first introduced,
    so it seems fair to fix them together in a single commit.

    Fixes: 047980c582af ("spi: add driver for ar934x spi controller")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Cc: <stable@vger.kernel.org> # v5.7+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation
    Cc: <stable@vger.kernel.org> # v5.7+
    Cc: Chuanhong Guo <gch981213@gmail.com>
    Link: https://lore.kernel.org/r/1d58367d74d55741e0c2730a51a2b65012c8ab33.1607286887.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/spi/spi-ar934x.c | 14 +++++++++++---
    1 file changed, 11 insertions(+), 3 deletions(-)

    --- a/drivers/spi/spi-ar934x.c
    +++ b/drivers/spi/spi-ar934x.c
    @@ -176,10 +176,11 @@ static int ar934x_spi_probe(struct platf
    if (ret)
    return ret;

    - ctlr = spi_alloc_master(&pdev->dev, sizeof(*sp));
    + ctlr = devm_spi_alloc_master(&pdev->dev, sizeof(*sp));
    if (!ctlr) {
    dev_info(&pdev->dev, "failed to allocate spi controller\n");
    - return -ENOMEM;
    + ret = -ENOMEM;
    + goto err_clk_disable;
    }

    /* disable flash mapping and expose spi controller registers */
    @@ -202,7 +203,13 @@ static int ar934x_spi_probe(struct platf
    sp->clk_freq = clk_get_rate(clk);
    sp->ctlr = ctlr;

    - return devm_spi_register_controller(&pdev->dev, ctlr);
    + ret = spi_register_controller(ctlr);
    + if (!ret)
    + return 0;
    +
    +err_clk_disable:
    + clk_disable_unprepare(clk);
    + return ret;
    }

    static int ar934x_spi_remove(struct platform_device *pdev)
    @@ -213,6 +220,7 @@ static int ar934x_spi_remove(struct plat
    ctlr = dev_get_drvdata(&pdev->dev);
    sp = spi_controller_get_devdata(ctlr);

    + spi_unregister_controller(ctlr);
    clk_disable_unprepare(sp->clk);

    return 0;

    \
     
     \ /
      Last update: 2020-12-28 15:33    [W:3.560 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site