diff options
Diffstat (limited to 'drivers/mmc/host/s3cmci.c')
| -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) |
