Commit 6ebaf8f2 authored by Viresh Kumar's avatar Viresh Kumar Committed by Chris Ball

mmc: sdhci-spear: Use devm_* derivatives

This patch replaces normal calls to resource allocation routines
with devm_*() derivative of those routines. This removes the need
to free those resources inside the driver.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@st.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 3524b5d1
...@@ -82,18 +82,18 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -82,18 +82,18 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
goto err; goto err;
} }
if (!request_mem_region(iomem->start, resource_size(iomem), if (!devm_request_mem_region(&pdev->dev, iomem->start,
"spear-sdhci")) { resource_size(iomem), "spear-sdhci")) {
ret = -EBUSY; ret = -EBUSY;
dev_dbg(&pdev->dev, "cannot request region\n"); dev_dbg(&pdev->dev, "cannot request region\n");
goto err; goto err;
} }
sdhci = kzalloc(sizeof(*sdhci), GFP_KERNEL); sdhci = devm_kzalloc(&pdev->dev, sizeof(*sdhci), GFP_KERNEL);
if (!sdhci) { if (!sdhci) {
ret = -ENOMEM; ret = -ENOMEM;
dev_dbg(&pdev->dev, "cannot allocate memory for sdhci\n"); dev_dbg(&pdev->dev, "cannot allocate memory for sdhci\n");
goto err_kzalloc; goto err;
} }
/* clk enable */ /* clk enable */
...@@ -101,13 +101,13 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -101,13 +101,13 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
if (IS_ERR(sdhci->clk)) { if (IS_ERR(sdhci->clk)) {
ret = PTR_ERR(sdhci->clk); ret = PTR_ERR(sdhci->clk);
dev_dbg(&pdev->dev, "Error getting clock\n"); dev_dbg(&pdev->dev, "Error getting clock\n");
goto err_clk_get; goto err;
} }
ret = clk_enable(sdhci->clk); ret = clk_enable(sdhci->clk);
if (ret) { if (ret) {
dev_dbg(&pdev->dev, "Error enabling clock\n"); dev_dbg(&pdev->dev, "Error enabling clock\n");
goto err_clk_enb; goto put_clk;
} }
/* overwrite platform_data */ /* overwrite platform_data */
...@@ -122,7 +122,7 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -122,7 +122,7 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
if (IS_ERR(host)) { if (IS_ERR(host)) {
ret = PTR_ERR(host); ret = PTR_ERR(host);
dev_dbg(&pdev->dev, "error allocating host\n"); dev_dbg(&pdev->dev, "error allocating host\n");
goto err_alloc_host; goto disable_clk;
} }
host->hw_name = "sdhci"; host->hw_name = "sdhci";
...@@ -130,17 +130,18 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -130,17 +130,18 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
host->irq = platform_get_irq(pdev, 0); host->irq = platform_get_irq(pdev, 0);
host->quirks = SDHCI_QUIRK_BROKEN_ADMA; host->quirks = SDHCI_QUIRK_BROKEN_ADMA;
host->ioaddr = ioremap(iomem->start, resource_size(iomem)); host->ioaddr = devm_ioremap(&pdev->dev, iomem->start,
resource_size(iomem));
if (!host->ioaddr) { if (!host->ioaddr) {
ret = -ENOMEM; ret = -ENOMEM;
dev_dbg(&pdev->dev, "failed to remap registers\n"); dev_dbg(&pdev->dev, "failed to remap registers\n");
goto err_ioremap; goto free_host;
} }
ret = sdhci_add_host(host); ret = sdhci_add_host(host);
if (ret) { if (ret) {
dev_dbg(&pdev->dev, "error adding host\n"); dev_dbg(&pdev->dev, "error adding host\n");
goto err_add_host; goto free_host;
} }
platform_set_drvdata(pdev, host); platform_set_drvdata(pdev, host);
...@@ -159,11 +160,12 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -159,11 +160,12 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
if (sdhci->data->card_power_gpio >= 0) { if (sdhci->data->card_power_gpio >= 0) {
int val = 0; int val = 0;
ret = gpio_request(sdhci->data->card_power_gpio, "sdhci"); ret = devm_gpio_request(&pdev->dev,
sdhci->data->card_power_gpio, "sdhci");
if (ret < 0) { if (ret < 0) {
dev_dbg(&pdev->dev, "gpio request fail: %d\n", dev_dbg(&pdev->dev, "gpio request fail: %d\n",
sdhci->data->card_power_gpio); sdhci->data->card_power_gpio);
goto err_pgpio_request; goto set_drvdata;
} }
if (sdhci->data->power_always_enb) if (sdhci->data->power_always_enb)
...@@ -175,60 +177,48 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -175,60 +177,48 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
if (ret) { if (ret) {
dev_dbg(&pdev->dev, "gpio set direction fail: %d\n", dev_dbg(&pdev->dev, "gpio set direction fail: %d\n",
sdhci->data->card_power_gpio); sdhci->data->card_power_gpio);
goto err_pgpio_direction; goto set_drvdata;
} }
} }
if (sdhci->data->card_int_gpio >= 0) { if (sdhci->data->card_int_gpio >= 0) {
ret = gpio_request(sdhci->data->card_int_gpio, "sdhci"); ret = devm_gpio_request(&pdev->dev, sdhci->data->card_int_gpio,
"sdhci");
if (ret < 0) { if (ret < 0) {
dev_dbg(&pdev->dev, "gpio request fail: %d\n", dev_dbg(&pdev->dev, "gpio request fail: %d\n",
sdhci->data->card_int_gpio); sdhci->data->card_int_gpio);
goto err_igpio_request; goto set_drvdata;
} }
ret = gpio_direction_input(sdhci->data->card_int_gpio); ret = gpio_direction_input(sdhci->data->card_int_gpio);
if (ret) { if (ret) {
dev_dbg(&pdev->dev, "gpio set direction fail: %d\n", dev_dbg(&pdev->dev, "gpio set direction fail: %d\n",
sdhci->data->card_int_gpio); sdhci->data->card_int_gpio);
goto err_igpio_direction; goto set_drvdata;
} }
ret = request_irq(gpio_to_irq(sdhci->data->card_int_gpio), ret = devm_request_irq(&pdev->dev,
gpio_to_irq(sdhci->data->card_int_gpio),
sdhci_gpio_irq, IRQF_TRIGGER_LOW, sdhci_gpio_irq, IRQF_TRIGGER_LOW,
mmc_hostname(host->mmc), pdev); mmc_hostname(host->mmc), pdev);
if (ret) { if (ret) {
dev_dbg(&pdev->dev, "gpio request irq fail: %d\n", dev_dbg(&pdev->dev, "gpio request irq fail: %d\n",
sdhci->data->card_int_gpio); sdhci->data->card_int_gpio);
goto err_igpio_request_irq; goto set_drvdata;
} }
} }
return 0; return 0;
err_igpio_request_irq: set_drvdata:
err_igpio_direction:
if (sdhci->data->card_int_gpio >= 0)
gpio_free(sdhci->data->card_int_gpio);
err_igpio_request:
err_pgpio_direction:
if (sdhci->data->card_power_gpio >= 0)
gpio_free(sdhci->data->card_power_gpio);
err_pgpio_request:
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
sdhci_remove_host(host, 1); sdhci_remove_host(host, 1);
err_add_host: free_host:
iounmap(host->ioaddr);
err_ioremap:
sdhci_free_host(host); sdhci_free_host(host);
err_alloc_host: disable_clk:
clk_disable(sdhci->clk); clk_disable(sdhci->clk);
err_clk_enb: put_clk:
clk_put(sdhci->clk); clk_put(sdhci->clk);
err_clk_get:
kfree(sdhci);
err_kzalloc:
release_mem_region(iomem->start, resource_size(iomem));
err: err:
dev_err(&pdev->dev, "spear-sdhci probe failed: %d\n", ret); dev_err(&pdev->dev, "spear-sdhci probe failed: %d\n", ret);
return ret; return ret;
...@@ -237,35 +227,19 @@ static int __devinit sdhci_probe(struct platform_device *pdev) ...@@ -237,35 +227,19 @@ static int __devinit sdhci_probe(struct platform_device *pdev)
static int __devexit sdhci_remove(struct platform_device *pdev) static int __devexit sdhci_remove(struct platform_device *pdev)
{ {
struct sdhci_host *host = platform_get_drvdata(pdev); struct sdhci_host *host = platform_get_drvdata(pdev);
struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
struct spear_sdhci *sdhci = dev_get_platdata(&pdev->dev); struct spear_sdhci *sdhci = dev_get_platdata(&pdev->dev);
int dead; int dead = 0;
u32 scratch; u32 scratch;
if (sdhci->data) {
if (sdhci->data->card_int_gpio >= 0) {
free_irq(gpio_to_irq(sdhci->data->card_int_gpio), pdev);
gpio_free(sdhci->data->card_int_gpio);
}
if (sdhci->data->card_power_gpio >= 0)
gpio_free(sdhci->data->card_power_gpio);
}
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
dead = 0;
scratch = readl(host->ioaddr + SDHCI_INT_STATUS); scratch = readl(host->ioaddr + SDHCI_INT_STATUS);
if (scratch == (u32)-1) if (scratch == (u32)-1)
dead = 1; dead = 1;
sdhci_remove_host(host, dead); sdhci_remove_host(host, dead);
iounmap(host->ioaddr);
sdhci_free_host(host); sdhci_free_host(host);
clk_disable(sdhci->clk); clk_disable(sdhci->clk);
clk_put(sdhci->clk); clk_put(sdhci->clk);
kfree(sdhci);
if (iomem)
release_mem_region(iomem->start, resource_size(iomem));
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment