From patchwork Tue Jul 9 17:31:07 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 2825398 Return-Path: X-Original-To: patchwork-linux-mmc@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 C5C38C0AB2 for ; Tue, 9 Jul 2013 17:31:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D1502201F5 for ; Tue, 9 Jul 2013 17:31:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A7427201EE for ; Tue, 9 Jul 2013 17:31:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752688Ab3GIRbp (ORCPT ); Tue, 9 Jul 2013 13:31:45 -0400 Received: from mail-ve0-f202.google.com ([209.85.128.202]:33907 "EHLO mail-ve0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751957Ab3GIRbo (ORCPT ); Tue, 9 Jul 2013 13:31:44 -0400 Received: by mail-ve0-f202.google.com with SMTP id m1so517440ves.3 for ; Tue, 09 Jul 2013 10:31:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=nHmyMuZB44AQba3Qj/IAqyd+k0XW06bz1M3Ot+S4LaA=; b=SJqTjyQe9FBtG+4EM5+TcosvDmaYiH0eRbCEMDidZOOGF+bSwfdldT3sgClj5PkV46 aauHmBk8wncljtb6lv7vRTKGZXJymWspBwbE+74zEVAULmD0VzUUkdjW8Vf5mVHgn5W0 oK4pwG75O4aR4fJIb+ZtTG2LgIh9oTdF0gP/qyh0nO+yObK6uFfzWKQhyk/FX20mnTXq dneBV8iY7HtMLZv7OzKU4+QilFSKyYo6YE0AEhR0Poy7E+157Pxq4Yl6oqeEBydClJ5U 41Z6FkmCNx3AFFobvu3NJSZLcsL7Ahr0h+BX31MS9maFsHcnNA3lIBKUEjkfMYaLf3NE o66w== X-Received: by 10.236.226.6 with SMTP id a6mr15301785yhq.35.1373391103931; Tue, 09 Jul 2013 10:31:43 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id v70si13955289yhv.3.2013.07.09.10.31.43 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Tue, 09 Jul 2013 10:31:43 -0700 (PDT) Received: from tictac.mtv.corp.google.com (tictac.mtv.corp.google.com [172.22.162.34]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id BEDAA5A419C; Tue, 9 Jul 2013 10:31:43 -0700 (PDT) Received: by tictac.mtv.corp.google.com (Postfix, from userid 121310) id 73F8E8024A; Tue, 9 Jul 2013 10:31:43 -0700 (PDT) From: Doug Anderson To: Chris Ball Cc: Olof Johansson , Jaehoon Chung , Seungwon Jeon , James Hogan , Grant Grundler , Alim Akhtar , Abhilash Kesavan , Tomasz Figa , Doug Anderson , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/5] mmc: dw_mmc: Invalidate cache of current_speed after suspend/resume Date: Tue, 9 Jul 2013 10:31:07 -0700 Message-Id: <1373391071-6312-2-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 1.8.3 In-Reply-To: <1373391071-6312-1-git-send-email-dianders@chromium.org> References: <1373391071-6312-1-git-send-email-dianders@chromium.org> X-Gm-Message-State: ALoCoQnWIUka9lqqfzpe9wAGrImxXYhwd1Rxz1g35j10pgghnArzbNqQuSMA61WADMXzcu/CkWTfZdiY8idouZv6DvAcBbfxHRPz1ebhYnAmp5jmuBf3csft+0jnSMv4eSxia6JLTltM3zrPHvxDfhujXQ9L+ZalzT859oB8VjYPSfbClO1PB0F1iipBHs0mLYoPIQ590ebcnuroo06twV7sslJ5D10Jdw== Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham 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 The dw_mmc driver keeps a cache of the current slot->clock in order to avoid doing a whole lot of work every time set_ios() is called. However, after suspend/resume the register values are bogus so we need to ensure that the cached value is invalidated. In many cases we got by without this since the core mmc code fiddles with the clock a lot. If we've got a card present we're probably running it at something like 50MHz and the core will temporarily switch us to 400kHz after resume. One case that didn't work (for me) is the case of having no card in the slot. The slot is initted to 400kHz at boot time. After suspend/resume the slot thinks it's still at 400kHz (due to the cache) so doesn't adjust timing. When it tries to send the command at probe time it just times out and gets left in a bad state. Invalidating the current_speed also means that we don't need to call: dw_mci_setup_bus(slot, true); ...to force an update of the clock in the case when the slot was left powered. Signed-off-by: Doug Anderson --- drivers/mmc/host/dw_mmc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index bc3a1bc..f20273e 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -2488,13 +2488,18 @@ int dw_mci_resume(struct dw_mci *host) DW_MCI_ERROR_FLAGS | SDMMC_INT_CD); mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); + /* + * Invalidate the 'current_speed' value since CLKDIV has some up in + * default state and our cache is incorrect. + */ + host->current_speed = 0xFFFFFFFF; + for (i = 0; i < host->num_slots; i++) { struct dw_mci_slot *slot = host->slot[i]; if (!slot) continue; if (slot->mmc->pm_flags & MMC_PM_KEEP_POWER) { dw_mci_set_ios(slot->mmc, &slot->mmc->ios); - dw_mci_setup_bus(slot, true); } ret = mmc_resume_host(host->slot[i]->mmc);