diff options
author | Ben Dooks <ben-linux@fluff.org> | 2008-06-30 17:40:36 -0400 |
---|---|---|
committer | Pierre Ossman <drzeus@drzeus.cx> | 2008-07-15 08:14:48 -0400 |
commit | 50a845700b3b55f825b0eb901b03d6091f66d9f4 (patch) | |
tree | 394d3d5d58d2c9316b455f8922ed01e8cec8f65e /drivers/mmc/host | |
parent | 2de5f79d4dfcb1be16f0b873bc77d6ec74b0426d (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')
-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) |