]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
soc/tegra: pmc: Remove genpd when adding provider fails
authorJon Hunter <jonathanh@nvidia.com>
Sat, 22 Oct 2016 19:23:56 +0000 (20:23 +0100)
committerThierry Reding <treding@nvidia.com>
Tue, 15 Nov 2016 14:51:55 +0000 (15:51 +0100)
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>
drivers/soc/tegra/pmc.c

index bc4267c7fe150ecc7b49fe9f4a86eef0cce0b8d1..3400ec355adbfedfbd26c9fa1ce3a8306ba10f44 100644 (file)
@@ -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--)