mmc: fix sdhci-dove probe/removal

1. Never ever publish a device in the system before it has been setup
to a usable state.
2. Unregister the device _BEFORE_ taking away any resources it may be
using.
3. Don't check clks against NULL.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: Chris Ball <cjb@laptop.org>

authored by

Russell King - ARM Linux and committed by
Chris Ball
ee3298a2 a0d28ba0

+20 -18
+20 -18
drivers/mmc/host/sdhci-dove.c
··· 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22 #include <linux/io.h> 23 #include <linux/clk.h> 24 #include <linux/err.h> ··· 85 struct sdhci_dove_priv *priv; 86 int ret; 87 88 - ret = sdhci_pltfm_register(pdev, &sdhci_dove_pdata); 89 - if (ret) 90 - goto sdhci_dove_register_fail; 91 - 92 priv = devm_kzalloc(&pdev->dev, sizeof(struct sdhci_dove_priv), 93 GFP_KERNEL); 94 if (!priv) { 95 dev_err(&pdev->dev, "unable to allocate private data"); 96 - ret = -ENOMEM; 97 - goto sdhci_dove_allocate_fail; 98 } 99 100 host = platform_get_drvdata(pdev); 101 pltfm_host = sdhci_priv(host); 102 pltfm_host->priv = priv; 103 104 - priv->clk = clk_get(&pdev->dev, NULL); 105 - if (!IS_ERR(priv->clk)) 106 - clk_prepare_enable(priv->clk); 107 return 0; 108 109 - sdhci_dove_allocate_fail: 110 - sdhci_pltfm_unregister(pdev); 111 sdhci_dove_register_fail: 112 return ret; 113 } 114 ··· 120 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); 121 struct sdhci_dove_priv *priv = pltfm_host->priv; 122 123 - if (priv->clk) { 124 - if (!IS_ERR(priv->clk)) { 125 - clk_disable_unprepare(priv->clk); 126 - clk_put(priv->clk); 127 - } 128 - devm_kfree(&pdev->dev, priv->clk); 129 } 130 - return sdhci_pltfm_unregister(pdev); 131 } 132 133 static const struct of_device_id sdhci_dove_of_match_table[] __devinitdata = {
··· 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22 + #include <linux/err.h> 23 #include <linux/io.h> 24 #include <linux/clk.h> 25 #include <linux/err.h> ··· 84 struct sdhci_dove_priv *priv; 85 int ret; 86 87 priv = devm_kzalloc(&pdev->dev, sizeof(struct sdhci_dove_priv), 88 GFP_KERNEL); 89 if (!priv) { 90 dev_err(&pdev->dev, "unable to allocate private data"); 91 + return -ENOMEM; 92 } 93 + 94 + priv->clk = clk_get(&pdev->dev, NULL); 95 + if (!IS_ERR(priv->clk)) 96 + clk_prepare_enable(priv->clk); 97 + 98 + ret = sdhci_pltfm_register(pdev, &sdhci_dove_pdata); 99 + if (ret) 100 + goto sdhci_dove_register_fail; 101 102 host = platform_get_drvdata(pdev); 103 pltfm_host = sdhci_priv(host); 104 pltfm_host->priv = priv; 105 106 return 0; 107 108 sdhci_dove_register_fail: 109 + if (!IS_ERR(priv->clk)) { 110 + clk_disable_unprepare(priv->clk); 111 + clk_put(priv->clk); 112 + } 113 return ret; 114 } 115 ··· 117 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); 118 struct sdhci_dove_priv *priv = pltfm_host->priv; 119 120 + sdhci_pltfm_unregister(pdev); 121 + 122 + if (!IS_ERR(priv->clk)) { 123 + clk_disable_unprepare(priv->clk); 124 + clk_put(priv->clk); 125 } 126 + return 0; 127 } 128 129 static const struct of_device_id sdhci_dove_of_match_table[] __devinitdata = {