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 660/717] spi: mt7621: Dont leak SPI master in probe error path
    Date
    From: Lukas Wunner <lukas@wunner.de>

    commit 46b5c4fb87ce8211e0f9b0383dbde72c3652d2ba upstream.

    If the calls to device_reset() or devm_spi_register_controller() fail on
    probe of the MediaTek MT7621 SPI driver, the spi_controller struct is
    erroneously not freed. Fix by switching over to the new
    devm_spi_alloc_master() helper.

    Additionally, there's an ordering issue in mt7621_spi_remove() wherein
    the spi_controller is unregistered after disabling the SYS clock.
    The correct order is to call spi_unregister_controller() *before* this
    teardown step because bus accesses may still be ongoing until that
    function returns.

    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: 1ab7f2a43558 ("staging: mt7621-spi: add mt7621 support")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Reviewed-by: Stefan Roese <sr@denx.de>
    Cc: <stable@vger.kernel.org> # v4.17+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation
    Cc: <stable@vger.kernel.org> # v4.17+
    Link: https://lore.kernel.org/r/72b680796149f5fcda0b3f530ffb7ee73b04f224.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-mt7621.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    --- a/drivers/spi/spi-mt7621.c
    +++ b/drivers/spi/spi-mt7621.c
    @@ -350,7 +350,7 @@ static int mt7621_spi_probe(struct platf
    if (status)
    return status;

    - master = spi_alloc_master(&pdev->dev, sizeof(*rs));
    + master = devm_spi_alloc_master(&pdev->dev, sizeof(*rs));
    if (!master) {
    dev_info(&pdev->dev, "master allocation failed\n");
    clk_disable_unprepare(clk);
    @@ -382,7 +382,7 @@ static int mt7621_spi_probe(struct platf
    return ret;
    }

    - ret = devm_spi_register_controller(&pdev->dev, master);
    + ret = spi_register_controller(master);
    if (ret)
    clk_disable_unprepare(clk);

    @@ -397,6 +397,7 @@ static int mt7621_spi_remove(struct plat
    master = dev_get_drvdata(&pdev->dev);
    rs = spi_controller_get_devdata(master);

    + spi_unregister_controller(master);
    clk_disable_unprepare(rs->clk);

    return 0;

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