diff options
author | Jon Hunter <jonathanh@nvidia.com> | 2016-10-22 21:23:56 +0200 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2016-11-15 15:51:55 +0100 |
commit | 0b137340d04b9dfa911cc882bc26ed611671f5f5 (patch) | |
tree | 00b9f59ee314dcbdbbd23238e25cc63b5f46884a /drivers/soc | |
parent | soc/tegra: pmc: Check return code for pm_genpd_init() (diff) | |
download | linux-0b137340d04b9dfa911cc882bc26ed611671f5f5.tar.xz linux-0b137340d04b9dfa911cc882bc26ed611671f5f5.zip |
soc/tegra: pmc: Remove genpd when adding provider fails
Commit 3fe577107ccf ("PM / Domains: Add support for removing PM
domains") add support for removing PM domains. Update the Tegra PMC
driver to remove PM domains if we fail to add a provider for the PM
domain.
Please note that the code under 'power_on_cleanup' label does not
really belong in the clean-up error path for tegra_powergate_add().
To keep the error path simple, remove this label and move the
associated code to where it needs to be invoked.
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/soc')
-rw-r--r-- | drivers/soc/tegra/pmc.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index bc4267c7fe15..3400ec355adb 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -840,8 +840,12 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np) goto remove_clks; } - if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) - goto power_on_cleanup; + if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) { + if (off) + WARN_ON(tegra_powergate_power_up(pg, true)); + + goto remove_resets; + } /* * FIXME: If XHCI is enabled for Tegra, then power-up the XUSB @@ -852,8 +856,12 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np) * to be unused. */ if (IS_ENABLED(CONFIG_USB_XHCI_TEGRA) && - (id == TEGRA_POWERGATE_XUSBA || id == TEGRA_POWERGATE_XUSBC)) - goto power_on_cleanup; + (id == TEGRA_POWERGATE_XUSBA || id == TEGRA_POWERGATE_XUSBC)) { + if (off) + WARN_ON(tegra_powergate_power_up(pg, true)); + + goto remove_resets; + } err = pm_genpd_init(&pg->genpd, NULL, off); if (err < 0) { @@ -866,16 +874,15 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np) if (err < 0) { pr_err("failed to add genpd provider for %s: %d\n", np->name, err); - goto remove_resets; + goto remove_genpd; } pr_debug("added power domain %s\n", pg->genpd.name); return; -power_on_cleanup: - if (off) - WARN_ON(tegra_powergate_power_up(pg, true)); +remove_genpd: + pm_genpd_remove(&pg->genpd); remove_resets: while (pg->num_resets--) |