mmc: sdhci: Add sdhci_cleanup_host
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 20 Mar 2017 17:50:45 +0000 (19:50 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 24 Apr 2017 19:41:34 +0000 (21:41 +0200)
Add sdhci_cleanup_host() to cleanup __sdhci_add_host().

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h

index 7cb25dc1984f7c21eed40e73e495c1ea4cb4bd67..48631b8126881a8fcc0a94a92ae820e6cf888326 100644 (file)
@@ -3568,6 +3568,22 @@ undma:
 }
 EXPORT_SYMBOL_GPL(sdhci_setup_host);
 
+void sdhci_cleanup_host(struct sdhci_host *host)
+{
+       struct mmc_host *mmc = host->mmc;
+
+       if (!IS_ERR(mmc->supply.vqmmc))
+               regulator_disable(mmc->supply.vqmmc);
+
+       if (host->align_buffer)
+               dma_free_coherent(mmc_dev(mmc), host->align_buffer_sz +
+                                 host->adma_table_sz, host->align_buffer,
+                                 host->align_addr);
+       host->adma_table = NULL;
+       host->align_buffer = NULL;
+}
+EXPORT_SYMBOL_GPL(sdhci_cleanup_host);
+
 int __sdhci_add_host(struct sdhci_host *host)
 {
        struct mmc_host *mmc = host->mmc;
@@ -3632,16 +3648,6 @@ unirq:
 untasklet:
        tasklet_kill(&host->finish_tasklet);
 
-       if (!IS_ERR(mmc->supply.vqmmc))
-               regulator_disable(mmc->supply.vqmmc);
-
-       if (host->align_buffer)
-               dma_free_coherent(mmc_dev(mmc), host->align_buffer_sz +
-                                 host->adma_table_sz, host->align_buffer,
-                                 host->align_addr);
-       host->adma_table = NULL;
-       host->align_buffer = NULL;
-
        return ret;
 }
 EXPORT_SYMBOL_GPL(__sdhci_add_host);
@@ -3654,7 +3660,16 @@ int sdhci_add_host(struct sdhci_host *host)
        if (ret)
                return ret;
 
-       return __sdhci_add_host(host);
+       ret = __sdhci_add_host(host);
+       if (ret)
+               goto cleanup;
+
+       return 0;
+
+cleanup:
+       sdhci_cleanup_host(host);
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(sdhci_add_host);
 
index 6fe6005b284e1a2544fa5f843baa005dea14766b..477b3f5bedfd709ec7d08edbd9dffe52870b2608 100644 (file)
@@ -660,6 +660,7 @@ void sdhci_card_detect(struct sdhci_host *host);
 void __sdhci_read_caps(struct sdhci_host *host, u16 *ver, u32 *caps,
                       u32 *caps1);
 int sdhci_setup_host(struct sdhci_host *host);
+void sdhci_cleanup_host(struct sdhci_host *host);
 int __sdhci_add_host(struct sdhci_host *host);
 int sdhci_add_host(struct sdhci_host *host);
 void sdhci_remove_host(struct sdhci_host *host, int dead);