]> err.no Git - linux-2.6/commitdiff
MMC: S3C24XX: Add media presence test to request handling.
authorBen Dooks <ben-linux@fluff.org>
Mon, 30 Jun 2008 21:40:36 +0000 (22:40 +0100)
committerPierre Ossman <drzeus@drzeus.cx>
Tue, 15 Jul 2008 12:14:48 +0000 (14:14 +0200)
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>
drivers/mmc/host/s3cmci.c
include/asm-arm/plat-s3c24xx/mci.h

index 6f1b474e33b9dfdb0f5ea7fa2f292b4b8ff06a39..62d73d3497f0e77f8a684d31f293964aae8101d1 100644 (file)
@@ -984,6 +984,18 @@ static void s3cmci_send_request(struct mmc_host *mmc)
        enable_irq(host->irq);
 }
 
+static int s3cmci_card_present(struct s3cmci_host *host)
+{
+       struct s3c24xx_mci_pdata *pdata = host->pdata;
+       int ret;
+
+       if (pdata->gpio_detect == 0)
+               return -ENOSYS;
+
+       ret = s3c2410_gpio_getpin(pdata->gpio_detect) ? 0 : 1;
+       return ret ^ pdata->detect_invert;
+}
+
 static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
 {
        struct s3cmci_host *host = mmc_priv(mmc);
@@ -992,7 +1004,12 @@ static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
        host->cmd_is_stop = 0;
        host->mrq = mrq;
 
-       s3cmci_send_request(mmc);
+       if (s3cmci_card_present(host) == 0) {
+               dbg(host, dbg_err, "%s: no medium present\n", __func__);
+               host->mrq->cmd->error = -ENOMEDIUM;
+               mmc_request_done(mmc, mrq);
+       } else
+               s3cmci_send_request(mmc);
 }
 
 static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
index 4f4ccd18f0cb97a294d8753c3a1209f319dc5e87..2d0852ac3b272d57a66271ce4edee234ccb53e96 100644 (file)
@@ -3,6 +3,7 @@
 
 struct s3c24xx_mci_pdata {
        unsigned int    wprotect_invert : 1;
+       unsigned int    detect_invert : 1;   /* set => detect active high. */
 
        unsigned int    gpio_detect;
        unsigned int    gpio_wprotect;