From patchwork Tue Aug 6 21:37:49 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 2839640 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 C5AFABF535 for ; Tue, 6 Aug 2013 21:38:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CC7EC201E0 for ; Tue, 6 Aug 2013 21:38:54 +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 8F5D5201BA for ; Tue, 6 Aug 2013 21:38:53 +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 1V6oxj-0001oF-EY; Tue, 06 Aug 2013 21:38:39 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1V6oxe-0002k2-FX; Tue, 06 Aug 2013 21:38:34 +0000 Received: from mail-ve0-f202.google.com ([209.85.128.202]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1V6oxS-0002hp-Nw for linux-arm-kernel@lists.infradead.org; Tue, 06 Aug 2013 21:38:24 +0000 Received: by mail-ve0-f202.google.com with SMTP id ox1so109564veb.3 for ; Tue, 06 Aug 2013 14:38:01 -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=xSgyUjFBZIBX29JG7sG8XGaofuQfzNBbDFHq0mmde1I=; b=jQMeP2Z45hwVNg6e8zc97qYeI7DF7flXN9ThqdQ2EIsWKgjcez5GLdxK0g37gfm/UW WWTNUrhjKIMlPtPBti/rhg5twfrgsQWXQPDmzbjwWXN4ybROJrareiKTrzgWPdhDHy1s 93cNuJIgelEb6GlEABUzSS6d8lqt6xA0+Mo7z4WOMuU+cvbCRDelvW0yyKN63kF5F5/S O//whD2eLFngMArx8zl+LcwEDh8e0fK6DNj2AFHUWUfsFvUhsJm9DSd2YK70I099XGvP qNn0G37DInWqpO9XVwfl5HhlOG/nPMjzJ4RWxpseOB1wp+HxvCAFBJKL7KVqmJkefYsy Cyrg== X-Gm-Message-State: ALoCoQnE8ix0Bjny25t5LDypbeo3AlAt33xrTBjP9BgNzrGovsDEeAiBh3btla9OVVWsMDu4fSFhGQo+FomRdyJb/0i3dQGv+CFo0QYzU+aQg6zyLOxJ1g9ODwYvbq1/PMRjq3Ed+gF5w7BEVMBWOQBekRE8xx1qE3pmgysSnmzowQ5dInEFC/tKYontdTdFeJf6ozD5wD7fN+RNfdD2ILlN803nrCrw4Q== X-Received: by 10.236.194.33 with SMTP id l21mr46585yhn.42.1375825081519; Tue, 06 Aug 2013 14:38:01 -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 e64si284471yhj.1.2013.08.06.14.38.01 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Tue, 06 Aug 2013 14:38:01 -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 2BE5E5A41A3; Tue, 6 Aug 2013 14:38:01 -0700 (PDT) Received: by tictac.mtv.corp.google.com (Postfix, from userid 121310) id D26B180E05; Tue, 6 Aug 2013 14:38:00 -0700 (PDT) From: Doug Anderson To: Chris Ball Subject: [PATCH v4 2/4] mmc: dw_mmc: Add exynos resume_noirq callback to clear WAKEUP_INT Date: Tue, 6 Aug 2013 14:37:49 -0700 Message-Id: <1375825071-20922-3-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 1.8.3 In-Reply-To: <1375825071-20922-1-git-send-email-dianders@chromium.org> References: <1373470926-19314-1-git-send-email-dianders@chromium.org> <1375825071-20922-1-git-send-email-dianders@chromium.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130806_173823_385952_09C43307 X-CRM114-Status: GOOD ( 17.30 ) X-Spam-Score: -0.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=-2.5 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 Reviewed-by: Tomasz Figa --- 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 | 51 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c index 866edef..0c1f192 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,30 @@ static int dw_mci_exynos_setup_clock(struct dw_mci *host) return 0; } +/** + * 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 and the bug + * may be more widespread than just exynos5420. + */ + +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; +} + static void dw_mci_exynos_prepare_command(struct dw_mci *host, u32 *cmdr) { /* @@ -187,17 +212,39 @@ static int dw_mci_exynos_probe(struct platform_device *pdev) return dw_mci_pltfm_register(pdev, drv_data); } +static struct dev_pm_ops dw_mci_exynos_pmops; + 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, }, }; -module_platform_driver(dw_mci_exynos_pltfm_driver); +static int __init dw_mci_exynos_init(void) +{ + /* Add a "noirq" resume to platform pmops */ + memcpy(&dw_mci_exynos_pmops, &dw_mci_pltfm_pmops, + sizeof(dw_mci_exynos_pmops)); + WARN_ON(dw_mci_exynos_pmops.resume_noirq || + dw_mci_exynos_pmops.thaw_noirq || + dw_mci_exynos_pmops.restore_noirq); + dw_mci_exynos_pmops.resume_noirq = dw_mci_exynos_resume_noirq; + dw_mci_exynos_pmops.thaw_noirq = dw_mci_exynos_resume_noirq; + dw_mci_exynos_pmops.restore_noirq = dw_mci_exynos_resume_noirq; + + return platform_driver_register(&dw_mci_exynos_pltfm_driver); +} +module_init(dw_mci_exynos_init); + +static void __exit dw_mci_exynos_exit(void) +{ + platform_driver_unregister(&dw_mci_exynos_pltfm_driver); +} +module_exit(dw_mci_exynos_exit); MODULE_DESCRIPTION("Samsung Specific DW-MSHC Driver Extension"); MODULE_AUTHOR("Thomas Abraham