aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/host/s3cmci.c19
-rw-r--r--include/asm-arm/plat-s3c24xx/mci.h1
2 files changed, 19 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
987static 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
987static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq) 999static 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
998static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) 1015static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
diff --git a/include/asm-arm/plat-s3c24xx/mci.h b/include/asm-arm/plat-s3c24xx/mci.h
index 4f4ccd18f0cb..2d0852ac3b27 100644
--- a/include/asm-arm/plat-s3c24xx/mci.h
+++ b/include/asm-arm/plat-s3c24xx/mci.h
@@ -3,6 +3,7 @@
3 3
4struct s3c24xx_mci_pdata { 4struct s3c24xx_mci_pdata {
5 unsigned int wprotect_invert : 1; 5 unsigned int wprotect_invert : 1;
6 unsigned int detect_invert : 1; /* set => detect active high. */
6 7
7 unsigned int gpio_detect; 8 unsigned int gpio_detect;
8 unsigned int gpio_wprotect; 9 unsigned int gpio_wprotect;