From patchwork Wed Aug 27 07:26:29 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aisheng Dong X-Patchwork-Id: 4786621 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8AA03C0338 for ; Wed, 27 Aug 2014 07:49:17 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BBB4D2015E for ; Wed, 27 Aug 2014 07:49:16 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A22D22012D for ; Wed, 27 Aug 2014 07:49:15 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XMXwC-0005do-Sc; Wed, 27 Aug 2014 07:46:36 +0000 Received: from mail-bn1lp0140.outbound.protection.outlook.com ([207.46.163.140] helo=na01-bn1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XMXvn-0004pc-Tu for linux-arm-kernel@lists.infradead.org; Wed, 27 Aug 2014 07:46:12 +0000 Received: from BN3PR0301CA0074.namprd03.prod.outlook.com (25.160.152.170) by BLUPR03MB328.namprd03.prod.outlook.com (10.141.48.27) with Microsoft SMTP Server (TLS) id 15.0.1015.9; Wed, 27 Aug 2014 07:45:49 +0000 Received: from BN1AFFO11FD031.protection.gbl (2a01:111:f400:7c10::119) by BN3PR0301CA0074.outlook.office365.com (2a01:111:e400:401e::42) with Microsoft SMTP Server (TLS) id 15.0.1015.19 via Frontend Transport; Wed, 27 Aug 2014 07:45:49 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1AFFO11FD031.mail.protection.outlook.com (10.58.52.185) with Microsoft SMTP Server (TLS) id 15.0.1010.11 via Frontend Transport; Wed, 27 Aug 2014 07:45:49 +0000 Received: from shlinux1.ap.freescale.net (shlinux1.ap.freescale.net [10.192.225.216]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id s7R7jZGv024520; Wed, 27 Aug 2014 00:45:46 -0700 From: Dong Aisheng To: Subject: [PATCH V3 3/6] mmc: sdhci: add platform set_timeout hook Date: Wed, 27 Aug 2014 15:26:29 +0800 Message-ID: <1409124392-28899-4-git-send-email-b29396@freescale.com> X-Mailer: git-send-email 1.7.8 In-Reply-To: <1409124392-28899-1-git-send-email-b29396@freescale.com> References: <1409124392-28899-1-git-send-email-b29396@freescale.com> X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:CAL; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(6009001)(189002)(199003)(36756003)(81542001)(88136002)(93916002)(110136001)(77156001)(79102001)(81342001)(87286001)(105606002)(97736001)(90102001)(46102001)(87936001)(106466001)(64706001)(84676001)(47776003)(20776003)(89996001)(77982001)(85852003)(83072002)(68736004)(92566001)(92726001)(83322001)(6806004)(44976005)(76482001)(19580405001)(19580395003)(80022001)(85306004)(50986999)(76176999)(104166001)(48376002)(95666004)(2351001)(107046002)(31966008)(74502001)(74662001)(229853001)(33646002)(62966002)(21056001)(104016003)(50466002)(26826002)(50226001)(99396002)(102836001)(4396001)(42262002); DIR:OUT; SFP:; SCL:1; SRVR:BLUPR03MB328; H:tx30smr01.am.freescale.net; FPR:; MLV:ovrnspm; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:;UriScan:; X-Forefront-PRVS: 0316567485 Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=Aisheng.Dong@freescale.com; X-OriginatorOrg: freescale.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140827_004612_124556_CBD6F2C0 X-CRM114-Status: GOOD ( 10.38 ) X-Spam-Score: -0.0 (/) Cc: ulf.hansson@linaro.org, shawn.guo@linaro.org, b29396@freescale.com, chris@printf.net, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently the common code assume 0xE is the maximum timeout counter value and use it to write into the timeout counter register. However, it's fairly possible that some other SoCs may have different max timeout register value. That means 0xE may be incorrect and becomes meaningless. It's also possible that other platforms has different timeout calculation algorithm. To be flexible, this patch provides a .set_timeout hook for those platforms to set the timeout on their way if they need. Reviewed-by: Shawn Guo Signed-off-by: Dong Aisheng --- drivers/mmc/host/sdhci.c | 19 ++++++++++++++----- drivers/mmc/host/sdhci.h | 2 ++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index d633f288..881a7a0 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -707,19 +707,28 @@ static void sdhci_set_transfer_irqs(struct sdhci_host *host) sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); } -static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) +static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd) { u8 count; + + if (host->ops->set_timeout) { + host->ops->set_timeout(host, cmd); + } else { + count = sdhci_calc_timeout(host, cmd); + sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); + } +} + +static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) +{ u8 ctrl; struct mmc_data *data = cmd->data; int ret; WARN_ON(host->data); - if (data || (cmd->flags & MMC_RSP_BUSY)) { - count = sdhci_calc_timeout(host, cmd); - sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); - } + if (data || (cmd->flags & MMC_RSP_BUSY)) + sdhci_set_timeout(host, cmd); if (!data) return; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index b130509..9828ff8 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -282,6 +282,8 @@ struct sdhci_ops { unsigned int (*get_min_clock)(struct sdhci_host *host); unsigned int (*get_timeout_clock)(struct sdhci_host *host); unsigned int (*get_max_timeout_count)(struct sdhci_host *host); + void (*set_timeout)(struct sdhci_host *host, + struct mmc_command *cmd); void (*set_bus_width)(struct sdhci_host *host, int width); void (*platform_send_init_74_clocks)(struct sdhci_host *host, u8 power_mode);