Skip to content

Commit 66ba63d

Browse files
committed
Merge tag 'pmdomain-v6.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm
Pull pmdomain fix from Ulf Hansson: - tegra: Ensure pmc power-domains are in a known state * tag 'pmdomain-v6.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm: soc/tegra: pmc: Ensure power-domains are in a known state
2 parents 55ddcff + b6bcbce commit 66ba63d

File tree

1 file changed

+29
-22
lines changed

1 file changed

+29
-22
lines changed

drivers/soc/tegra/pmc.c

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,7 +1232,7 @@ static int tegra_powergate_of_get_clks(struct tegra_powergate *pg,
12321232
}
12331233

12341234
static int tegra_powergate_of_get_resets(struct tegra_powergate *pg,
1235-
struct device_node *np, bool off)
1235+
struct device_node *np)
12361236
{
12371237
struct device *dev = pg->pmc->dev;
12381238
int err;
@@ -1247,22 +1247,6 @@ static int tegra_powergate_of_get_resets(struct tegra_powergate *pg,
12471247
err = reset_control_acquire(pg->reset);
12481248
if (err < 0) {
12491249
pr_err("failed to acquire resets: %d\n", err);
1250-
goto out;
1251-
}
1252-
1253-
if (off) {
1254-
err = reset_control_assert(pg->reset);
1255-
} else {
1256-
err = reset_control_deassert(pg->reset);
1257-
if (err < 0)
1258-
goto out;
1259-
1260-
reset_control_release(pg->reset);
1261-
}
1262-
1263-
out:
1264-
if (err) {
1265-
reset_control_release(pg->reset);
12661250
reset_control_put(pg->reset);
12671251
}
12681252

@@ -1308,20 +1292,43 @@ static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
13081292
goto set_available;
13091293
}
13101294

1311-
err = tegra_powergate_of_get_resets(pg, np, off);
1295+
err = tegra_powergate_of_get_resets(pg, np);
13121296
if (err < 0) {
13131297
dev_err(dev, "failed to get resets for %pOFn: %d\n", np, err);
13141298
goto remove_clks;
13151299
}
13161300

1317-
if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
1318-
if (off)
1319-
WARN_ON(tegra_powergate_power_up(pg, true));
1301+
/*
1302+
* If the power-domain is off, then ensure the resets are asserted.
1303+
* If the power-domain is on, then power down to ensure that when is
1304+
* it turned on the power-domain, clocks and resets are all in the
1305+
* expected state.
1306+
*/
1307+
if (off) {
1308+
err = reset_control_assert(pg->reset);
1309+
if (err) {
1310+
pr_err("failed to assert resets: %d\n", err);
1311+
goto remove_resets;
1312+
}
1313+
} else {
1314+
err = tegra_powergate_power_down(pg);
1315+
if (err) {
1316+
dev_err(dev, "failed to turn off PM domain %s: %d\n",
1317+
pg->genpd.name, err);
1318+
goto remove_resets;
1319+
}
1320+
}
13201321

1322+
/*
1323+
* If PM_GENERIC_DOMAINS is not enabled, power-on
1324+
* the domain and skip the genpd registration.
1325+
*/
1326+
if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
1327+
WARN_ON(tegra_powergate_power_up(pg, true));
13211328
goto remove_resets;
13221329
}
13231330

1324-
err = pm_genpd_init(&pg->genpd, NULL, off);
1331+
err = pm_genpd_init(&pg->genpd, NULL, true);
13251332
if (err < 0) {
13261333
dev_err(dev, "failed to initialise PM domain %pOFn: %d\n", np,
13271334
err);

0 commit comments

Comments
 (0)