From patchwork Tue Jul 9 23:19:19 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 2825477 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 5FA179F9FB for ; Tue, 9 Jul 2013 23:20:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7D6F120121 for ; Tue, 9 Jul 2013 23:20:51 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B976120113 for ; Tue, 9 Jul 2013 23:20:49 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UwhCc-0001k4-8q; Tue, 09 Jul 2013 23:20:10 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UwhCU-0004TB-Gy; Tue, 09 Jul 2013 23:20:02 +0000 Received: from mail-yh0-f74.google.com ([209.85.213.74]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UwhCI-0004Q1-1Z for linux-arm-kernel@lists.infradead.org; Tue, 09 Jul 2013 23:19:51 +0000 Received: by mail-yh0-f74.google.com with SMTP id z20so554216yhz.3 for ; Tue, 09 Jul 2013 16:19:29 -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=8h13AkeRjSVHVhi8aAAbrYV3x0q/Ir8BXoRk9WxWFWY=; b=jgDPNZd4louP6Qmm/nLdr4qKuQ4LOyk2uqb345snSt6Yxbht28DgY5U8aNcacifCow hguLVGcM5Qw4YYyrZDfZA5K/PcBQ2UU+QAVd8Ekob3bCvJH4GYm1hd0Gv3yno73Gx90U Ijq2oDCrAKZUB4uc+r2X+BR/zHZg9Nr1R3AtZMO4Dehs6m1qJxhi9kTtYObY87nEcZLg 4n7azj3aD/AqEG5mk2RWOVU9O/6JGh/IYl2Z956nxlxeXT4GZVbY9cIO1UJt/dEmelgL h2FtriALQO/S4GgdzycfLEi3tBUtJZK2p7V8Ze8A5/IyDPu9l6LgQf0UxAZDjOzFlUKe S4ug== X-Received: by 10.236.124.78 with SMTP id w54mr15113668yhh.44.1373411969048; Tue, 09 Jul 2013 16:19:29 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id p73si14508285yhh.5.2013.07.09.16.19.29 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Tue, 09 Jul 2013 16:19:29 -0700 (PDT) Received: from tictac.mtv.corp.google.com (tictac.mtv.corp.google.com [172.22.162.34]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id D933A31C1B2; Tue, 9 Jul 2013 16:19:28 -0700 (PDT) Received: by tictac.mtv.corp.google.com (Postfix, from userid 121310) id 7CEBA80AEC; Tue, 9 Jul 2013 16:19:28 -0700 (PDT) From: Doug Anderson To: Chris Ball Subject: [PATCH v2 3/5] mmc: dw_mmc: Add exynos resume_noirq callback to clear WAKEUP_INT Date: Tue, 9 Jul 2013 16:19:19 -0700 Message-Id: <1373411961-23812-4-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 1.8.3 In-Reply-To: <1373411961-23812-1-git-send-email-dianders@chromium.org> References: <1373391071-6312-1-git-send-email-dianders@chromium.org> <1373411961-23812-1-git-send-email-dianders@chromium.org> X-Gm-Message-State: ALoCoQn7M2vKX6i2eNfi3oToH8bHpAvmJB9ZbyogKaJ3vIM5I3ti3/zH4JwLh5cLz69/EaE9a+k7AjUdxY7LExaPnGXY1q5V8I5fcKwYK3SNcz4k8F2zora3b6QEhZM1gHb4NflMvTBXIzEUQ54IyI9Gfah7e1qaEcNUWQyhBJrdM+6GbdXB1HGcLOQC+0BiVbX7O7DLO47XVRAkDk2zE/fME+dI4vIvOw== X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130709_191950_172172_C9F42FAB X-CRM114-Status: GOOD ( 12.42 ) X-Spam-Score: -2.9 (--) Cc: Doug Anderson , linux-samsung-soc@vger.kernel.org, James Hogan , Grant Grundler , linux-kernel@vger.kernel.org, linux-mmc@vger.kernel.org, Tomasz Figa , Abhilash Kesavan , Jaehoon Chung , Seungwon Jeon , Kukjin Kim , Alim Akhtar , Olof Johansson , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, 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 If the WAKEUP_INT is asserted at wakeup and not cleared, we'll end up looping around forever. This has been seen to happen on exynos5420 silicon despite the fact that we haven't enabled any wakeup events. Signed-off-by: Doug Anderson --- Changes in v2: - Use suspend_noirq as per James Hogan. drivers/mmc/host/dw_mmc-exynos.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c index f013e7e..36b9620 100644 --- a/drivers/mmc/host/dw_mmc-exynos.c +++ b/drivers/mmc/host/dw_mmc-exynos.c @@ -30,6 +30,7 @@ #define SDMMC_CLKSEL_TIMING(x, y, z) (SDMMC_CLKSEL_CCLK_SAMPLE(x) | \ SDMMC_CLKSEL_CCLK_DRIVE(y) | \ SDMMC_CLKSEL_CCLK_DIVIDER(z)) +#define SDMMC_CLKSEL_WAKEUP_INT BIT(11) #define SDMMC_CMD_USE_HOLD_REG BIT(29) @@ -102,6 +103,27 @@ static int dw_mci_exynos_setup_clock(struct dw_mci *host) return 0; } +/** + * dw_mci_exynos_resume_noirq - Exynos-specific resume code + * + * We have seen cases (at least on the exynos5420) where turning off the INT + * power rail during suspend will leave the WAKEUP_INT bit in the CLKSEL + * register asserted. This bit is 1 to indicate that it fired and we can + * clear it by writing a 1 back. Clear it to prevent interrupts from going off + * constantly. + */ + +static int dw_mci_exynos_resume_noirq(struct dw_mci *host) +{ + u32 clksel; + + clksel = mci_readl(host, CLKSEL); + if (clksel & SDMMC_CLKSEL_WAKEUP_INT) + mci_writel(host, CLKSEL, clksel); + + return 0; +} + static void dw_mci_exynos_prepare_command(struct dw_mci *host, u32 *cmdr) { /* @@ -165,6 +187,7 @@ static const struct dw_mci_drv_data exynos_drv_data = { .caps = exynos_dwmmc_caps, .init = dw_mci_exynos_priv_init, .setup_clock = dw_mci_exynos_setup_clock, + .resume_noirq = dw_mci_exynos_resume_noirq, .prepare_command = dw_mci_exynos_prepare_command, .set_ios = dw_mci_exynos_set_ios, .parse_dt = dw_mci_exynos_parse_dt,