mirror of https://gitee.com/openkylin/linux.git
mmc: mmci: Convert to devm functions
Converting to devm functions to simplify error handling in ->probe() and to cleanup ->remove(). Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
d276209015
commit
ef289982f2
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/io.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -1456,15 +1457,9 @@ static int mmci_probe(struct amba_device *dev,
|
||||||
if (np)
|
if (np)
|
||||||
mmci_dt_populate_generic_pdata(np, plat);
|
mmci_dt_populate_generic_pdata(np, plat);
|
||||||
|
|
||||||
ret = amba_request_regions(dev, DRIVER_NAME);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
mmc = mmc_alloc_host(sizeof(struct mmci_host), &dev->dev);
|
mmc = mmc_alloc_host(sizeof(struct mmci_host), &dev->dev);
|
||||||
if (!mmc) {
|
if (!mmc)
|
||||||
ret = -ENOMEM;
|
return -ENOMEM;
|
||||||
goto rel_regions;
|
|
||||||
}
|
|
||||||
|
|
||||||
host = mmc_priv(mmc);
|
host = mmc_priv(mmc);
|
||||||
host->mmc = mmc;
|
host->mmc = mmc;
|
||||||
|
@ -1500,10 +1495,11 @@ static int mmci_probe(struct amba_device *dev,
|
||||||
dev_dbg(mmc_dev(mmc), "eventual mclk rate: %u Hz\n",
|
dev_dbg(mmc_dev(mmc), "eventual mclk rate: %u Hz\n",
|
||||||
host->mclk);
|
host->mclk);
|
||||||
}
|
}
|
||||||
|
|
||||||
host->phybase = dev->res.start;
|
host->phybase = dev->res.start;
|
||||||
host->base = ioremap(dev->res.start, resource_size(&dev->res));
|
host->base = devm_ioremap_resource(&dev->dev, &dev->res);
|
||||||
if (!host->base) {
|
if (IS_ERR(host->base)) {
|
||||||
ret = -ENOMEM;
|
ret = PTR_ERR(host->base);
|
||||||
goto clk_disable;
|
goto clk_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1592,34 +1588,35 @@ static int mmci_probe(struct amba_device *dev,
|
||||||
|
|
||||||
if (plat->gpio_cd == -EPROBE_DEFER) {
|
if (plat->gpio_cd == -EPROBE_DEFER) {
|
||||||
ret = -EPROBE_DEFER;
|
ret = -EPROBE_DEFER;
|
||||||
goto err_gpio_cd;
|
goto clk_disable;
|
||||||
}
|
}
|
||||||
if (gpio_is_valid(plat->gpio_cd)) {
|
if (gpio_is_valid(plat->gpio_cd)) {
|
||||||
ret = mmc_gpio_request_cd(mmc, plat->gpio_cd, 0);
|
ret = mmc_gpio_request_cd(mmc, plat->gpio_cd, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_gpio_cd;
|
goto clk_disable;
|
||||||
}
|
}
|
||||||
if (plat->gpio_wp == -EPROBE_DEFER) {
|
if (plat->gpio_wp == -EPROBE_DEFER) {
|
||||||
ret = -EPROBE_DEFER;
|
ret = -EPROBE_DEFER;
|
||||||
goto err_gpio_cd;
|
goto clk_disable;
|
||||||
}
|
}
|
||||||
if (gpio_is_valid(plat->gpio_wp)) {
|
if (gpio_is_valid(plat->gpio_wp)) {
|
||||||
ret = mmc_gpio_request_ro(mmc, plat->gpio_wp);
|
ret = mmc_gpio_request_ro(mmc, plat->gpio_wp);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_gpio_cd;
|
goto clk_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = request_irq(dev->irq[0], mmci_irq, IRQF_SHARED, DRIVER_NAME " (cmd)", host);
|
ret = devm_request_irq(&dev->dev, dev->irq[0], mmci_irq, IRQF_SHARED,
|
||||||
|
DRIVER_NAME " (cmd)", host);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_gpio_cd;
|
goto clk_disable;
|
||||||
|
|
||||||
if (!dev->irq[1])
|
if (!dev->irq[1])
|
||||||
host->singleirq = true;
|
host->singleirq = true;
|
||||||
else {
|
else {
|
||||||
ret = request_irq(dev->irq[1], mmci_pio_irq, IRQF_SHARED,
|
ret = devm_request_irq(&dev->dev, dev->irq[1], mmci_pio_irq,
|
||||||
DRIVER_NAME " (pio)", host);
|
IRQF_SHARED, DRIVER_NAME " (pio)", host);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto irq0_free;
|
goto clk_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
writel(MCI_IRQENABLE, host->base + MMCIMASK0);
|
writel(MCI_IRQENABLE, host->base + MMCIMASK0);
|
||||||
|
@ -1641,17 +1638,10 @@ static int mmci_probe(struct amba_device *dev,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
irq0_free:
|
|
||||||
free_irq(dev->irq[0], host);
|
|
||||||
err_gpio_cd:
|
|
||||||
iounmap(host->base);
|
|
||||||
clk_disable:
|
clk_disable:
|
||||||
clk_disable_unprepare(host->clk);
|
clk_disable_unprepare(host->clk);
|
||||||
host_free:
|
host_free:
|
||||||
mmc_free_host(mmc);
|
mmc_free_host(mmc);
|
||||||
rel_regions:
|
|
||||||
amba_release_regions(dev);
|
|
||||||
out:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1677,16 +1667,8 @@ static int mmci_remove(struct amba_device *dev)
|
||||||
writel(0, host->base + MMCIDATACTRL);
|
writel(0, host->base + MMCIDATACTRL);
|
||||||
|
|
||||||
mmci_dma_release(host);
|
mmci_dma_release(host);
|
||||||
free_irq(dev->irq[0], host);
|
|
||||||
if (!host->singleirq)
|
|
||||||
free_irq(dev->irq[1], host);
|
|
||||||
|
|
||||||
iounmap(host->base);
|
|
||||||
clk_disable_unprepare(host->clk);
|
clk_disable_unprepare(host->clk);
|
||||||
|
|
||||||
mmc_free_host(mmc);
|
mmc_free_host(mmc);
|
||||||
|
|
||||||
amba_release_regions(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue