From patchwork Fri Dec 9 12:29:17 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sangwook X-Patchwork-Id: 5557 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id DF87723E0D for ; Fri, 9 Dec 2011 12:31:27 +0000 (UTC) Received: from mail-bw0-f52.google.com (mail-bw0-f52.google.com [209.85.214.52]) by fiordland.canonical.com (Postfix) with ESMTP id B6226A18F8A for ; Fri, 9 Dec 2011 12:31:27 +0000 (UTC) Received: by bke17 with SMTP id 17so3910352bke.11 for ; Fri, 09 Dec 2011 04:31:27 -0800 (PST) Received: by 10.204.156.141 with SMTP id x13mr3586030bkw.54.1323433887361; Fri, 09 Dec 2011 04:31:27 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.205.129.2 with SMTP id hg2cs113020bkc; Fri, 9 Dec 2011 04:31:27 -0800 (PST) Received: by 10.204.9.209 with SMTP id m17mr3553115bkm.101.1323433885286; Fri, 09 Dec 2011 04:31:25 -0800 (PST) Received: from mail-bw0-f50.google.com (mail-bw0-f50.google.com [209.85.214.50]) by mx.google.com with ESMTPS id q6si3608743bkd.65.2011.12.09.04.31.23 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 09 Dec 2011 04:31:25 -0800 (PST) Received-SPF: neutral (google.com: 209.85.214.50 is neither permitted nor denied by best guess record for domain of sangwook.lee@linaro.org) client-ip=209.85.214.50; Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.214.50 is neither permitted nor denied by best guess record for domain of sangwook.lee@linaro.org) smtp.mail=sangwook.lee@linaro.org Received: by bkcik5 with SMTP id ik5so3503952bkc.37 for ; Fri, 09 Dec 2011 04:31:23 -0800 (PST) Received: by 10.205.127.9 with SMTP id gy9mr3431194bkc.67.1323433883285; Fri, 09 Dec 2011 04:31:23 -0800 (PST) Received: from localhost.localdomain (host86-166-239-104.range86-166.btcentralplus.com. [86.166.239.104]) by mx.google.com with ESMTPS id w3sm9450587bkq.3.2011.12.09.04.31.20 (version=SSLv3 cipher=OTHER); Fri, 09 Dec 2011 04:31:22 -0800 (PST) From: Sangwook Lee To: cjb@laptop.org, linux-mmc@vger.kernel.org Cc: nicolas.pitre@linaro.org, per.forlin@linaro.org, linux-kernel@vger.kernel.org, patches@linaro.org, Sangwook Lee Subject: [PATCH] mmc: sdio: optimization for process_sdio_pending_irq Date: Fri, 9 Dec 2011 12:29:17 +0000 Message-Id: <1323433757-3811-1-git-send-email-sangwook.lee@linaro.org> X-Mailer: git-send-email 1.7.4.1 Skip fillng in mmc_command struct for CCCR_INTx everytime sdio_irq_thread (process_sdio_pending_irqs) calls mmc_io_rw_direct. Signed-off-by: Sangwook Lee --- drivers/mmc/core/sdio_irq.c | 2 +- drivers/mmc/core/sdio_ops.c | 40 ++++++++++++++++++++++++++++++++++++++++ drivers/mmc/core/sdio_ops.h | 1 + 3 files changed, 42 insertions(+), 1 deletions(-) diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index 68f81b9..67f782a 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c @@ -44,7 +44,7 @@ static int process_sdio_pending_irqs(struct mmc_card *card) return 1; } - ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_INTx, 0, &pending); + ret = mmc_io_rw_direct_irq(card, &pending); if (ret) { pr_debug("%s: error %d reading SDIO_CCCR_INTx\n", mmc_card_id(card), ret); diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c index b0517cc..c80fc32 100644 --- a/drivers/mmc/core/sdio_ops.c +++ b/drivers/mmc/core/sdio_ops.c @@ -111,6 +111,46 @@ static int mmc_io_rw_direct_host(struct mmc_host *host, int write, unsigned fn, return 0; } +static struct mmc_command sdio_intx_cmd = { + .opcode = SD_IO_RW_DIRECT, + .arg = SDIO_CCCR_INTx << 9, + .flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_AC, +}; + +int mmc_io_rw_direct_irq(struct mmc_card *card, u8 *out) +{ + int err; + struct mmc_host *host ; + + BUG_ON(!card); + host = card->host; + BUG_ON(!host); + + err = mmc_wait_for_cmd(host, &sdio_intx_cmd, 0); + if (err) + return err; + + if (mmc_host_is_spi(host)) { + /* host driver already reported errors */ + } else { + if (sdio_intx_cmd.resp[0] & R5_ERROR) + return -EIO; + if (sdio_intx_cmd.resp[0] & R5_FUNCTION_NUMBER) + return -EINVAL; + if (sdio_intx_cmd.resp[0] & R5_OUT_OF_RANGE) + return -ERANGE; + } + + if (out) { + if (mmc_host_is_spi(host)) + *out = (sdio_intx_cmd.resp[0] >> 8) & 0xFF; + else + *out = sdio_intx_cmd.resp[0] & 0xFF; + } + + return 0; +} + int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, unsigned addr, u8 in, u8 *out) { diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h index 12a4d3a..5fe8ad6 100644 --- a/drivers/mmc/core/sdio_ops.h +++ b/drivers/mmc/core/sdio_ops.h @@ -15,6 +15,7 @@ int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr); int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, unsigned addr, u8 in, u8* out); +int mmc_io_rw_direct_irq(struct mmc_card *card, u8 *out); int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn, unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz); int sdio_reset(struct mmc_host *host);