| From 36e252ae9ff73a215e233068e1ad5de52ad287db Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 6 May 2020 22:09:07 +0200 |
| Subject: memory: tegra: Fix an error handling path in tegra186_emc_probe() |
| |
| 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 |
| |