You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.1 KiB
Diff
102 lines
3.1 KiB
Diff
The MMC core subsystem provides in drivers/mmc/core/slot-gpio.c a nice
|
|
set of helper functions to simplify the management of the card detect
|
|
GPIO in MMC host drivers. This patch migrates the mvsdio driver to
|
|
using those helpers, which will make the ->probe() code simpler, and
|
|
therefore ease the process of adding a Device Tree binding for this
|
|
driver.
|
|
|
|
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
---
|
|
drivers/mmc/host/mvsdio.c | 44 +++++++++-----------------------------------
|
|
1 file changed, 9 insertions(+), 35 deletions(-)
|
|
|
|
--- a/drivers/mmc/host/mvsdio.c
|
|
+++ b/drivers/mmc/host/mvsdio.c
|
|
@@ -54,7 +54,6 @@ struct mvsd_host {
|
|
struct resource *res;
|
|
int irq;
|
|
struct clk *clk;
|
|
- int gpio_card_detect;
|
|
};
|
|
|
|
#define mvsd_write(offs, val) writel(val, iobase + (offs))
|
|
@@ -540,13 +539,6 @@ static void mvsd_timeout_timer(unsigned
|
|
mmc_request_done(host->mmc, mrq);
|
|
}
|
|
|
|
-static irqreturn_t mvsd_card_detect_irq(int irq, void *dev)
|
|
-{
|
|
- struct mvsd_host *host = dev;
|
|
- mmc_detect_change(host->mmc, msecs_to_jiffies(100));
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
static void mvsd_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
|
{
|
|
struct mvsd_host *host = mmc_priv(mmc);
|
|
@@ -765,23 +757,11 @@ static int __init mvsd_probe(struct plat
|
|
clk_prepare_enable(host->clk);
|
|
}
|
|
|
|
- if (mvsd_data->gpio_card_detect) {
|
|
- ret = gpio_request(mvsd_data->gpio_card_detect,
|
|
- DRIVER_NAME " cd");
|
|
- if (ret == 0) {
|
|
- gpio_direction_input(mvsd_data->gpio_card_detect);
|
|
- irq = gpio_to_irq(mvsd_data->gpio_card_detect);
|
|
- ret = request_irq(irq, mvsd_card_detect_irq,
|
|
- IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING,
|
|
- DRIVER_NAME " cd", host);
|
|
- if (ret == 0)
|
|
- host->gpio_card_detect =
|
|
- mvsd_data->gpio_card_detect;
|
|
- else
|
|
- gpio_free(mvsd_data->gpio_card_detect);
|
|
- }
|
|
- }
|
|
- if (!host->gpio_card_detect)
|
|
+ if (gpio_is_valid(mvsd_data->gpio_card_detect)) {
|
|
+ ret = mmc_gpio_request_cd(mmc, mvsd_data->gpio_card_detect);
|
|
+ if (ret)
|
|
+ goto out;
|
|
+ } else
|
|
mmc->caps |= MMC_CAP_NEEDS_POLL;
|
|
|
|
mmc_gpio_request_ro(mmc, mvsd_data->gpio_write_protect);
|
|
@@ -794,9 +774,9 @@ static int __init mvsd_probe(struct plat
|
|
|
|
pr_notice("%s: %s driver initialized, ",
|
|
mmc_hostname(mmc), DRIVER_NAME);
|
|
- if (host->gpio_card_detect)
|
|
+ if (!(mmc->caps & MMC_CAP_NEEDS_POLL))
|
|
printk("using GPIO %d for card detection\n",
|
|
- host->gpio_card_detect);
|
|
+ mvsd_data->gpio_card_detect);
|
|
else
|
|
printk("lacking card detect (fall back to polling)\n");
|
|
return 0;
|
|
@@ -805,10 +785,7 @@ out:
|
|
if (host) {
|
|
if (host->irq)
|
|
free_irq(host->irq, host);
|
|
- if (host->gpio_card_detect) {
|
|
- free_irq(gpio_to_irq(host->gpio_card_detect), host);
|
|
- gpio_free(host->gpio_card_detect);
|
|
- }
|
|
+ mmc_gpio_free_cd(mmc);
|
|
mmc_gpio_free_ro(mmc);
|
|
if (host->base)
|
|
iounmap(host->base);
|
|
@@ -832,10 +809,7 @@ static int __exit mvsd_remove(struct pla
|
|
if (mmc) {
|
|
struct mvsd_host *host = mmc_priv(mmc);
|
|
|
|
- if (host->gpio_card_detect) {
|
|
- free_irq(gpio_to_irq(host->gpio_card_detect), host);
|
|
- gpio_free(host->gpio_card_detect);
|
|
- }
|
|
+ mmc_gpio_free_cd(mmc);
|
|
mmc_remove_host(mmc);
|
|
free_irq(host->irq, host);
|
|
mmc_gpio_free_ro(mmc);
|