aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/s3cmci.c
diff options
context:
space:
mode:
authorBen Dooks <ben-linux@fluff.org>2008-06-30 17:40:36 -0400
committerPierre Ossman <drzeus@drzeus.cx>2008-07-15 08:14:48 -0400
commit50a845700b3b55f825b0eb901b03d6091f66d9f4 (patch)
tree394d3d5d58d2c9316b455f8922ed01e8cec8f65e /drivers/mmc/host/s3cmci.c
parent2de5f79d4dfcb1be16f0b873bc77d6ec74b0426d (diff)
MMC: S3C24XX: Add media presence test to request handling.
Ensure that we have physical media present before attempting to send a request to a card. This ensures that we do not get flooded by errors from commands that can never be completed timing out. Signed-off-by: Ben Dooks <ben-linux@fluff.org> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc/host/s3cmci.c')
-rw-r--r--drivers/mmc/host/s3cmci.c19
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
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)