diff options
Diffstat (limited to 'drivers/mmc/host/sdhci-dove.c')
| -rw-r--r-- | drivers/mmc/host/sdhci-dove.c | 38 | 
1 files changed, 20 insertions, 18 deletions
diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c index 90140eb03e3..8fd50a21103 100644 --- a/drivers/mmc/host/sdhci-dove.c +++ b/drivers/mmc/host/sdhci-dove.c @@ -19,6 +19,7 @@   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   */ +#include <linux/err.h>  #include <linux/io.h>  #include <linux/clk.h>  #include <linux/err.h> @@ -84,30 +85,32 @@ static int __devinit sdhci_dove_probe(struct platform_device *pdev)  	struct sdhci_dove_priv *priv;  	int ret; -	ret = sdhci_pltfm_register(pdev, &sdhci_dove_pdata); -	if (ret) -		goto sdhci_dove_register_fail; -  	priv = devm_kzalloc(&pdev->dev, sizeof(struct sdhci_dove_priv),  			    GFP_KERNEL);  	if (!priv) {  		dev_err(&pdev->dev, "unable to allocate private data"); -		ret = -ENOMEM; -		goto sdhci_dove_allocate_fail; +		return -ENOMEM;  	} +	priv->clk = clk_get(&pdev->dev, NULL); +	if (!IS_ERR(priv->clk)) +		clk_prepare_enable(priv->clk); + +	ret = sdhci_pltfm_register(pdev, &sdhci_dove_pdata); +	if (ret) +		goto sdhci_dove_register_fail; +  	host = platform_get_drvdata(pdev);  	pltfm_host = sdhci_priv(host);  	pltfm_host->priv = priv; -	priv->clk = clk_get(&pdev->dev, NULL); -	if (!IS_ERR(priv->clk)) -		clk_prepare_enable(priv->clk);  	return 0; -sdhci_dove_allocate_fail: -	sdhci_pltfm_unregister(pdev);  sdhci_dove_register_fail: +	if (!IS_ERR(priv->clk)) { +		clk_disable_unprepare(priv->clk); +		clk_put(priv->clk); +	}  	return ret;  } @@ -117,14 +120,13 @@ static int __devexit sdhci_dove_remove(struct platform_device *pdev)  	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);  	struct sdhci_dove_priv *priv = pltfm_host->priv; -	if (priv->clk) { -		if (!IS_ERR(priv->clk)) { -			clk_disable_unprepare(priv->clk); -			clk_put(priv->clk); -		} -		devm_kfree(&pdev->dev, priv->clk); +	sdhci_pltfm_unregister(pdev); + +	if (!IS_ERR(priv->clk)) { +		clk_disable_unprepare(priv->clk); +		clk_put(priv->clk);  	} -	return sdhci_pltfm_unregister(pdev); +	return 0;  }  static const struct of_device_id sdhci_dove_of_match_table[] __devinitdata = {  |