diff options
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/s3cmci.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index 6f1b474e33b9..62d73d3497f0 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c | |||
@@ -984,6 +984,18 @@ static void s3cmci_send_request(struct mmc_host *mmc) | |||
984 | enable_irq(host->irq); | 984 | enable_irq(host->irq); |
985 | } | 985 | } |
986 | 986 | ||
987 | static int s3cmci_card_present(struct s3cmci_host *host) | ||
988 | { | ||
989 | struct s3c24xx_mci_pdata *pdata = host->pdata; | ||
990 | int ret; | ||
991 | |||
992 | if (pdata->gpio_detect == 0) | ||
993 | return -ENOSYS; | ||
994 | |||
995 | ret = s3c2410_gpio_getpin(pdata->gpio_detect) ? 0 : 1; | ||
996 | return ret ^ pdata->detect_invert; | ||
997 | } | ||
998 | |||
987 | static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq) | 999 | static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq) |
988 | { | 1000 | { |
989 | struct s3cmci_host *host = mmc_priv(mmc); | 1001 | struct s3cmci_host *host = mmc_priv(mmc); |
@@ -992,7 +1004,12 @@ static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
992 | host->cmd_is_stop = 0; | 1004 | host->cmd_is_stop = 0; |
993 | host->mrq = mrq; | 1005 | host->mrq = mrq; |
994 | 1006 | ||
995 | s3cmci_send_request(mmc); | 1007 | if (s3cmci_card_present(host) == 0) { |
1008 | dbg(host, dbg_err, "%s: no medium present\n", __func__); | ||
1009 | host->mrq->cmd->error = -ENOMEDIUM; | ||
1010 | mmc_request_done(mmc, mrq); | ||
1011 | } else | ||
1012 | s3cmci_send_request(mmc); | ||
996 | } | 1013 | } |
997 | 1014 | ||
998 | static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | 1015 | static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) |