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 658/717] spi: synquacer: Disable clock in probe error path
    Date
    From: Lukas Wunner <lukas@wunner.de>

    commit 8853b2503014aca5c793d2c7f0aabc990b32bdad upstream.

    If the calls to platform_get_irq() or devm_request_irq() fail on probe
    of the SynQuacer SPI driver, the clock "sspi->clk" is erroneously not
    unprepared and disabled.

    If the clock rate "master->max_speed_hz" cannot be determined, the same
    happens and in addition the spi_master struct is not freed.

    Fix it.

    Fixes: b0823ee35cf9 ("spi: Add spi driver for Socionext SynQuacer platform")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Cc: <stable@vger.kernel.org> # v5.3+
    Cc: Masahisa Kojima <masahisa.kojima@linaro.org>
    Link: https://lore.kernel.org/r/232281df1ab91d8f0f553a62d5f97fc264ace4da.1604874488.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/spi/spi-synquacer.c | 15 ++++++++-------
    1 file changed, 8 insertions(+), 7 deletions(-)

    --- a/drivers/spi/spi-synquacer.c
    +++ b/drivers/spi/spi-synquacer.c
    @@ -657,7 +657,8 @@ static int synquacer_spi_probe(struct pl

    if (!master->max_speed_hz) {
    dev_err(&pdev->dev, "missing clock source\n");
    - return -EINVAL;
    + ret = -EINVAL;
    + goto disable_clk;
    }
    master->min_speed_hz = master->max_speed_hz / 254;

    @@ -670,7 +671,7 @@ static int synquacer_spi_probe(struct pl
    rx_irq = platform_get_irq(pdev, 0);
    if (rx_irq <= 0) {
    ret = rx_irq;
    - goto put_spi;
    + goto disable_clk;
    }
    snprintf(sspi->rx_irq_name, SYNQUACER_HSSPI_IRQ_NAME_MAX, "%s-rx",
    dev_name(&pdev->dev));
    @@ -678,13 +679,13 @@ static int synquacer_spi_probe(struct pl
    0, sspi->rx_irq_name, sspi);
    if (ret) {
    dev_err(&pdev->dev, "request rx_irq failed (%d)\n", ret);
    - goto put_spi;
    + goto disable_clk;
    }

    tx_irq = platform_get_irq(pdev, 1);
    if (tx_irq <= 0) {
    ret = tx_irq;
    - goto put_spi;
    + goto disable_clk;
    }
    snprintf(sspi->tx_irq_name, SYNQUACER_HSSPI_IRQ_NAME_MAX, "%s-tx",
    dev_name(&pdev->dev));
    @@ -692,7 +693,7 @@ static int synquacer_spi_probe(struct pl
    0, sspi->tx_irq_name, sspi);
    if (ret) {
    dev_err(&pdev->dev, "request tx_irq failed (%d)\n", ret);
    - goto put_spi;
    + goto disable_clk;
    }

    master->dev.of_node = np;
    @@ -710,7 +711,7 @@ static int synquacer_spi_probe(struct pl

    ret = synquacer_spi_enable(master);
    if (ret)
    - goto fail_enable;
    + goto disable_clk;

    pm_runtime_set_active(sspi->dev);
    pm_runtime_enable(sspi->dev);
    @@ -723,7 +724,7 @@ static int synquacer_spi_probe(struct pl

    disable_pm:
    pm_runtime_disable(sspi->dev);
    -fail_enable:
    +disable_clk:
    clk_disable_unprepare(sspi->clk);
    put_spi:
    spi_master_put(master);

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