From patchwork Fri Aug 9 16:33:18 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 2842016 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 D23F1BF546 for ; Fri, 9 Aug 2013 16:34:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id DD576203FB for ; Fri, 9 Aug 2013 16:34:30 +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 BB29A203F3 for ; Fri, 9 Aug 2013 16:34:29 +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 1V7pdl-0002KZ-Of; Fri, 09 Aug 2013 16:34:14 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1V7pdd-0002iO-JT; Fri, 09 Aug 2013 16:34:05 +0000 Received: from mail-vb0-f74.google.com ([209.85.212.74]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1V7pdS-0002fi-0e for linux-arm-kernel@lists.infradead.org; Fri, 09 Aug 2013 16:33:55 +0000 Received: by mail-vb0-f74.google.com with SMTP id w16so466914vbf.1 for ; Fri, 09 Aug 2013 09:33:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=XH25wUzKjNO5cXy+7rcmkevuxvN9OLkkIIy2McA1k2c=; b=hppSYSYTn8bm5rFCuUeXZJsuc3NqGnjhtv+LsT/a0M+d76W3MoLIcGD7vYibi5xlhV 2+Cy6hMIWytDK5nO4gAP/K2XSSHnw1Pn/8bkPTEFaakXdGhjYuNiLd7bF08kqKdaOBbt 1v2LTjBPYaYQ2yvxYPBTXYrHMIsj0dgqwsV0kIWGKjJp/fDmttdFileEbvAB8re9Cqqj k1lC5mzguntWBdzNDt9KXBBRr83ccEf82Lsmtr3i3i/tDyZeo5sz0WSUbwAeHoCqqdjL 7y2F8iYDswE5FzhoEyuUWfrOC/2z7vvsd03rr3YvwwVXzlMKHRc8eBG4j+4H6+NJDbH4 RdQQ== X-Gm-Message-State: ALoCoQmcxQBr/xofLlgVjkvQ8zT8N1kU513c2w2Hq2P4K3DU3I95c6ozw94/rtR0S4fsAN3LSmY415KE2k/W8NwggfMWuOU4KDBKebx89BO46qlTeWRMEVmu6adJQu54OzzBtAYQHIZaO7tnRDgXxJRPtmnrE2EHeDVrmAXMLEkK/GILCd1JSvgKrldMaYPj2fAvgLien08MLqMrcgMtTwSZxksNX4Igsg== X-Received: by 10.236.207.169 with SMTP id n29mr5637881yho.50.1376066009636; Fri, 09 Aug 2013 09:33:29 -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 h38si1177294yhm.6.2013.08.09.09.33.29 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Fri, 09 Aug 2013 09:33:29 -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 5371F5A425C; Fri, 9 Aug 2013 09:33:29 -0700 (PDT) Received: by tictac.mtv.corp.google.com (Postfix, from userid 121310) id 0349480AC0; Fri, 9 Aug 2013 09:33:28 -0700 (PDT) From: Doug Anderson To: Chris Ball Subject: [PATCH v5 2/4] mmc: dw_mmc: Add exynos resume_noirq callback to clear WAKEUP_INT Date: Fri, 9 Aug 2013 09:33:18 -0700 Message-Id: <1376066000-5495-3-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 1.8.3 In-Reply-To: <1376066000-5495-1-git-send-email-dianders@chromium.org> References: <1375825071-20922-1-git-send-email-dianders@chromium.org> <1376066000-5495-1-git-send-email-dianders@chromium.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130809_123354_187763_3981F96E X-CRM114-Status: GOOD ( 17.84 ) X-Spam-Score: -0.8 (/) Cc: linux-samsung-soc@vger.kernel.org, James Hogan , Seungwon Jeon , linux-kernel@vger.kernel.org, Olof Johansson , linux-mmc@vger.kernel.org, Tomasz Figa , Doug Anderson , Jaehoon Chung , Grant Grundler , Kukjin Kim , Alim Akhtar , Abhilash Kesavan , 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=-2.4 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, 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 due to a silicon errata. It is safe to do on all exynos variants. Signed-off-by: Doug Anderson --- Changes in v5: - Cleaned up dw_mci_exynos_resume_noirq() comment as per Seungwon. - Don't memcpy dev_pm_ops structure, define a new one. Changes in v4: - Take Seungwon's suggestion and don't add any dw_mmc-pltfm code. Changes in v3: - Add freeze/thaw and poweroff/restore noirq entries. Changes in v2: - Use suspend_noirq as per James Hogan. drivers/mmc/host/dw_mmc-exynos.c | 56 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c index 866edef..7d88583 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 EXYNOS4210_FIXED_CIU_CLK_DIV 2 #define EXYNOS4412_FIXED_CIU_CLK_DIV 4 @@ -100,6 +101,52 @@ static int dw_mci_exynos_setup_clock(struct dw_mci *host) return 0; } +#ifdef CONFIG_PM_SLEEP +/* + * TODO: we should probably disable the clock to the card in the suspend path. + */ +static int dw_mci_exynos_suspend(struct device *dev) +{ + struct dw_mci *host = dev_get_drvdata(dev); + + return dw_mci_suspend(host); +} + +static int dw_mci_exynos_resume(struct device *dev) +{ + struct dw_mci *host = dev_get_drvdata(dev); + + return dw_mci_resume(host); +} + +/** + * dw_mci_exynos_resume_noirq - Exynos-specific resume code + * + * On exynos5420 there is a silicon errata that will sometimes 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. + * + * We run this code on all exynos variants because it doesn't hurt. + */ + +static int dw_mci_exynos_resume_noirq(struct device *dev) +{ + struct dw_mci *host = dev_get_drvdata(dev); + u32 clksel; + + clksel = mci_readl(host, CLKSEL); + if (clksel & SDMMC_CLKSEL_WAKEUP_INT) + mci_writel(host, CLKSEL, clksel); + + return 0; +} +#else +#define dw_mci_exynos_suspend NULL +#define dw_mci_exynos_resume NULL +#define dw_mci_exynos_resume_noirq NULL +#endif /* CONFIG_PM_SLEEP */ + static void dw_mci_exynos_prepare_command(struct dw_mci *host, u32 *cmdr) { /* @@ -187,13 +234,20 @@ static int dw_mci_exynos_probe(struct platform_device *pdev) return dw_mci_pltfm_register(pdev, drv_data); } +const struct dev_pm_ops dw_mci_exynos_pmops = { + SET_SYSTEM_SLEEP_PM_OPS(dw_mci_exynos_suspend, dw_mci_exynos_resume) + .resume_noirq = dw_mci_exynos_resume_noirq, + .thaw_noirq = dw_mci_exynos_resume_noirq, + .restore_noirq = dw_mci_exynos_resume_noirq, +}; + static struct platform_driver dw_mci_exynos_pltfm_driver = { .probe = dw_mci_exynos_probe, .remove = __exit_p(dw_mci_pltfm_remove), .driver = { .name = "dwmmc_exynos", .of_match_table = dw_mci_exynos_match, - .pm = &dw_mci_pltfm_pmops, + .pm = &dw_mci_exynos_pmops, }, };