From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1764982AbYFFP7T (ORCPT ); Fri, 6 Jun 2008 11:59:19 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1760982AbYFFPzf (ORCPT ); Fri, 6 Jun 2008 11:55:35 -0400 Received: from aeryn.fluff.org.uk ([87.194.8.8]:51804 "EHLO kira.home.fluff.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758633AbYFFPz2 (ORCPT ); Fri, 6 Jun 2008 11:55:28 -0400 Message-Id: <20080606155527.429024311@fluff.org.uk> References: <20080606155117.074799346@fluff.org.uk> User-Agent: quilt/0.46-1 Date: Fri, 06 Jun 2008 16:51:32 +0100 From: Ben Dooks To: linux-kernel@vger.kernel.org Cc: Pierre Ossman , Harald Welte , Thomas Kleffel , Roman Moravcik , Ben Dooks Subject: [patch 15/15] MMC: Add media presence detection to request handling. Content-Disposition: inline; filename=simtec/s3c24xx-sdmmc-add-mediacheck.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Index: linux-2.6.26-rc5-q/drivers/mmc/host/s3cmci.c =================================================================== --- linux-2.6.26-rc5-q.orig/drivers/mmc/host/s3cmci.c 2008-06-06 15:47:34.000000000 +0100 +++ linux-2.6.26-rc5-q/drivers/mmc/host/s3cmci.c 2008-06-06 15:47:35.000000000 +0100 @@ -991,6 +991,20 @@ static void s3cmci_send_request(struct m enable_irq(host->irq); } +static int s3cmci_card_present(struct s3cmci_host *host) +{ + struct s3c24xx_mci_pdata *pdata = host->pdata; + int ret; + + /* if we can't detect the presence, then always have card. */ + if (pdata->gpio_detect == 0) + return 1; + + 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); @@ -998,7 +1012,12 @@ static void s3cmci_request(struct mmc_ho host->cmd_is_stop = 0; host->mrq = mrq; - s3cmci_send_request(mmc); + if (!s3cmci_card_present(host)) { + 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: linux-2.6.26-rc5-q/include/asm-arm/arch-s3c2410/mci.h =================================================================== --- linux-2.6.26-rc5-q.orig/include/asm-arm/arch-s3c2410/mci.h 2008-06-06 15:46:30.000000000 +0100 +++ linux-2.6.26-rc5-q/include/asm-arm/arch-s3c2410/mci.h 2008-06-06 15:47:35.000000000 +0100 @@ -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; -- Ben (ben@fluff.org, http://www.fluff.org/) 'a smiley only costs 4 bytes'