lkml.org 
[lkml]   [2020]   [Aug]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.8 16/72] memory: tegra: Fix an error handling path in tegra186_emc_probe()
    Date
    From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

    [ Upstream commit c3d4eb3bf6ad32466555b31094f33a299444f795 ]

    The call to tegra_bpmp_get() must be balanced by a call to
    tegra_bpmp_put() in case of error, as already done in the remove
    function.

    Add an error handling path and corresponding goto.

    Fixes: 52d15dd23f0b ("memory: tegra: Support DVFS on Tegra186 and later")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/memory/tegra/tegra186-emc.c | 16 +++++++++++-----
    1 file changed, 11 insertions(+), 5 deletions(-)

    diff --git a/drivers/memory/tegra/tegra186-emc.c b/drivers/memory/tegra/tegra186-emc.c
    index 97f26bc77ad41..c900948881d5b 100644
    --- a/drivers/memory/tegra/tegra186-emc.c
    +++ b/drivers/memory/tegra/tegra186-emc.c
    @@ -185,7 +185,7 @@ static int tegra186_emc_probe(struct platform_device *pdev)
    if (IS_ERR(emc->clk)) {
    err = PTR_ERR(emc->clk);
    dev_err(&pdev->dev, "failed to get EMC clock: %d\n", err);
    - return err;
    + goto put_bpmp;
    }

    platform_set_drvdata(pdev, emc);
    @@ -201,7 +201,7 @@ static int tegra186_emc_probe(struct platform_device *pdev)
    err = tegra_bpmp_transfer(emc->bpmp, &msg);
    if (err < 0) {
    dev_err(&pdev->dev, "failed to EMC DVFS pairs: %d\n", err);
    - return err;
    + goto put_bpmp;
    }

    emc->debugfs.min_rate = ULONG_MAX;
    @@ -211,8 +211,10 @@ static int tegra186_emc_probe(struct platform_device *pdev)

    emc->dvfs = devm_kmalloc_array(&pdev->dev, emc->num_dvfs,
    sizeof(*emc->dvfs), GFP_KERNEL);
    - if (!emc->dvfs)
    - return -ENOMEM;
    + if (!emc->dvfs) {
    + err = -ENOMEM;
    + goto put_bpmp;
    + }

    dev_dbg(&pdev->dev, "%u DVFS pairs:\n", emc->num_dvfs);

    @@ -237,7 +239,7 @@ static int tegra186_emc_probe(struct platform_device *pdev)
    "failed to set rate range [%lu-%lu] for %pC\n",
    emc->debugfs.min_rate, emc->debugfs.max_rate,
    emc->clk);
    - return err;
    + goto put_bpmp;
    }

    emc->debugfs.root = debugfs_create_dir("emc", NULL);
    @@ -254,6 +256,10 @@ static int tegra186_emc_probe(struct platform_device *pdev)
    emc, &tegra186_emc_debug_max_rate_fops);

    return 0;
    +
    +put_bpmp:
    + tegra_bpmp_put(emc->bpmp);
    + return err;
    }

    static int tegra186_emc_remove(struct platform_device *pdev)
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-08-09 01:51    [W:4.131 / U:1.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site