Commit 73a395c4 authored by Pavel Machek (CIP)'s avatar Pavel Machek (CIP) Committed by Thierry Reding

drm/tegra: sor: Do not leak runtime PM reference

It's theoretically possible for the runtime PM reference to leak if the
code fails anywhere between the pm_runtime_resume_and_get() and
pm_runtime_put() calls, so make sure to release the runtime PM reference
in that case.

Practically this will never happen because none of the functions will
fail on Tegra, but it's better for the code to be pedantic in case these
assumptions will ever become wrong.
Signed-off-by: default avatarPavel Machek (CIP) <pavel@denx.de>
[treding@nvidia.com: add commit message]
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 6efb943b
...@@ -3125,21 +3125,21 @@ static int tegra_sor_init(struct host1x_client *client) ...@@ -3125,21 +3125,21 @@ static int tegra_sor_init(struct host1x_client *client)
if (err < 0) { if (err < 0) {
dev_err(sor->dev, "failed to acquire SOR reset: %d\n", dev_err(sor->dev, "failed to acquire SOR reset: %d\n",
err); err);
return err; goto rpm_put;
} }
err = reset_control_assert(sor->rst); err = reset_control_assert(sor->rst);
if (err < 0) { if (err < 0) {
dev_err(sor->dev, "failed to assert SOR reset: %d\n", dev_err(sor->dev, "failed to assert SOR reset: %d\n",
err); err);
return err; goto rpm_put;
} }
} }
err = clk_prepare_enable(sor->clk); err = clk_prepare_enable(sor->clk);
if (err < 0) { if (err < 0) {
dev_err(sor->dev, "failed to enable clock: %d\n", err); dev_err(sor->dev, "failed to enable clock: %d\n", err);
return err; goto rpm_put;
} }
usleep_range(1000, 3000); usleep_range(1000, 3000);
...@@ -3150,7 +3150,7 @@ static int tegra_sor_init(struct host1x_client *client) ...@@ -3150,7 +3150,7 @@ static int tegra_sor_init(struct host1x_client *client)
dev_err(sor->dev, "failed to deassert SOR reset: %d\n", dev_err(sor->dev, "failed to deassert SOR reset: %d\n",
err); err);
clk_disable_unprepare(sor->clk); clk_disable_unprepare(sor->clk);
return err; goto rpm_put;
} }
reset_control_release(sor->rst); reset_control_release(sor->rst);
...@@ -3171,6 +3171,12 @@ static int tegra_sor_init(struct host1x_client *client) ...@@ -3171,6 +3171,12 @@ static int tegra_sor_init(struct host1x_client *client)
} }
return 0; return 0;
rpm_put:
if (sor->rst)
pm_runtime_put(sor->dev);
return err;
} }
static int tegra_sor_exit(struct host1x_client *client) static int tegra_sor_exit(struct host1x_client *client)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment