From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753343AbbE0KHD (ORCPT ); Wed, 27 May 2015 06:07:03 -0400 Received: from mail-bl2on0147.outbound.protection.outlook.com ([65.55.169.147]:54250 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752735AbbE0KGv (ORCPT ); Wed, 27 May 2015 06:06:51 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; vger.kernel.org; dkim=none (message not signed) header.d=none; Date: Wed, 27 May 2015 18:05:26 +0800 From: Dong Aisheng To: Stefan Agner CC: , , , , , , , , , Subject: Re: [PATCH v3 1/2] mmc: sdhci: fix abort due to missing runtime PM Message-ID: <20150527100524.GA1294@shlinux1.ap.freescale.net> References: <1432192504-3601-1-git-send-email-stefan@agner.ch> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1432192504-3601-1-git-send-email-stefan@agner.ch> User-Agent: Mutt/1.5.20 (2009-06-14) X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD020;1:3qSziNnBLfuqlig2Zs/X+08oyt6LTwAATOMdFtFZkY/km2kdkfxY8tB0LWUswpv74iAFti9Jd/6RdjyL+JI3nAlB8lKBdbcqDtL/fTngkoJ6S/Gv5XlnaUG660oD4F7mv9gvx0OQ7RJqYlSlP/hXxtAZRuuaBuiozut8F/egvzmZ0TDffBSQjLCLyGxLfk/+N23M0w2fK0qY4g1/98t7NuyjjotShB/jIsKvOZUxmWCbU03eWqy9u3uAh3OLFWyaTX5PikAVa5MMU3iFw2Mv7fenUvBGglQxrzPpLaqvOp4Wny7kw1IWWkorZMHIgLH1 X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(339900001)(189002)(23433003)(24454002)(43544003)(199003)(51704005)(2950100001)(97756001)(64706001)(54356999)(110136002)(5001960100002)(76176999)(50986999)(5001830100001)(5001860100001)(68736005)(77096005)(46406003)(189998001)(47776003)(97736004)(106466001)(4001540100001)(33656002)(83506001)(4001350100001)(81156007)(77156002)(87936001)(85426001)(23726002)(62966003)(105606002)(50466002)(6806004)(19580395003)(104016003)(46102003)(92566002)(19580405001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB1276;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1276;2:4/cdoSTNyl1Soe0i8b9u2dWYlCD6GA94q4C/W/efmxqhHUi4iE2WD1erlLNPBg4a;2:TVWuMBuZRwuQwtFZhJBmGcuhmD6EX2Q5mvbeDwiPy1pqbG2gYqmJ675T8XS/QXbGqVXgSA77rDccHQw9elpRaD2PFYuY51SsI4uMLCt7BpcJEuyysZxsj5XnANfTta88wkD19mPye/NCYEvR4vn0GVC95dNdHUCdCo5EjfICf9H54vYQGf6Znzny0/1dkDsInbnPNUl39gfH12LGfJdY6hgmTsTkwNEytvpEEvU3aSI=;6:SlhDFUgzcR4cgxN33ooV4LujtMsFj+9In85B4fqHr9GB8kr6f31lF2fr3ym+isfZ4W9PEecxXZieaUN/CCuki2+TVtmkdI2UYAiO7+DNTps2QgQ8904R2HiIRB45aThk4fmUGZ9eMpkpReDA6Zi0QQULv2LC1/w04mwJ1JwW6dUEEa5YtMih3wLIgoo2rtWn/VWgr5h4c4u+G1Eoy0ROViCctN5MIPrZ+XRBTLA55DhNhjBn4gBNi+OhLSaCASyDbilK6p8ZFbzVd4B7EYjdF3CqaJAZswjUrvLyROe7dDXUsx04y+NM9BAyi7Nu5WJdpzFH/bEd8LHgp4Z7oX6hPQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1276; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(520003)(5005006)(3002001);SRVR:CY1PR0301MB1276;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1276; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1276;3:Xs/3eMRIU71gzK78OUSH6Oq8TH/S5r6HpRFk3gjTZIgzZ5iOKT3i1YUkDCvOD+eO1Php1wKrKyTj5tFK6mpyI7vN+1TLxAO/kStRVplqIygIuYvCg+cbr21V5gSRf+tgNJS2Uh1cKhyuXBYz2oFRYK5kzeRqLswtHpejIl2LL+5FWJqxD+XFaz1OihYiNugrtfafgHA15TWD++aEAHZ7HkaKthW2WBOZnKErJVpbtqHERmGZ0XEvV7NGtxidJ8zQIL3/EtAkZoq2YzMoUv9INzOXLW4LKDa4n9u3DItp+7jK6bT7QKhleTvf7xeYcR+u X-Forefront-PRVS: 05891FB07F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1276;9:7d4x+UAMfsNf1UB617363oh1UGATvVt/JAJZg9q8?= =?us-ascii?Q?qouULnFyiUCnjH693LJpPzM9tiYoREVRy6WfNBfXKHnlezkal5KRk7SKcqOd?= =?us-ascii?Q?xIOTi5syObFDrMuPAYYrvDUIq9ykvZOvNIf1nLAH/XyoYMERWsBtWP5kdh5H?= =?us-ascii?Q?FY79qLfWBWqyuxBOCYnk9+Ird8i8TrY7Hkjucd8oLNxT3ztvzKteBLoUKp0h?= =?us-ascii?Q?PBGJOcp5Y17V2eGjszNSZruH6qI6d+5kcwLK6O4pVlUUjvzabIwYqKFVSNWm?= =?us-ascii?Q?FrQeRAt7xilFzY9ttOE11ZSV3+1c+lkNUIywvjlXZOxSQHwY2W1xR8l0kqqG?= =?us-ascii?Q?X3cOHUFfLklI4vxXSn5IQJRWVp/aITnjtaBFHajAyrGGI8dpgJr5vOErevIz?= =?us-ascii?Q?jGmrgcjrUQNdNCTy9CNxLSLILZkKjU5GdZtdELK0lj5ORq9hMKcAmWDEfTSC?= =?us-ascii?Q?tWJ/WAOBIXI3b3xi+h3CZh3tls2ZS0Xpw/n4xgbIgcDY4EBHLjhPeHxF8XR5?= =?us-ascii?Q?7Dzmesx2LR1U8wS6L3SwcIomykj3WaVIu/ga/AiZZ6r/pBDZy/Pxo5aBCW73?= =?us-ascii?Q?nSTIiksndCpyxk0XHiGUukj0tvp9iR99SX+fbWt4mpUusS4L1GknPJsfPA0E?= =?us-ascii?Q?Xq2mntYk38OYAZ1tkCvCWg96QNzwOlq9sxAWg/vgcGKVEc/d616a5ZfzS/mU?= =?us-ascii?Q?0qzlXO7/IRIPHGWRqp7e5tktQZKsXzO1UNHy5ogSeNnvuuD+GjewO80cIkHS?= =?us-ascii?Q?nr9cy6MMYlbLQVZ2Z54sRUM/v661xqk1gCsYZX4UIE2HAuFRI1oLTyYG24eD?= =?us-ascii?Q?yEwQKuVZjAm1lRQ12qIkcuuH5CImrtdsh8fsIyasXxdZbtF3YRMXAhnGtb2d?= =?us-ascii?Q?7pNGTSl6h9trh+Ai0/T7pjBXlIj5FMB8CfuE8FlC6EZAK3lLB0Pi0PZg9Med?= =?us-ascii?Q?+PAn43FY6hdCWXssyP3z8x/CLTI2nRRcKlnGT64+9B28PiCoiXcWs2PixjHM?= =?us-ascii?Q?datoDDKYKbb4+xBT5fEhbTe0z1Vztud76r2sUWSQOXnF9uxwxFHkBXUT0lAd?= =?us-ascii?Q?ZNVuvdS7uxdRq9TseoP6OeoJVO1HjPhJ4y+SlVa+WGOjWNA7F96j92rO0/dB?= =?us-ascii?Q?SuF97RuCkM5ZID9S/q10dm7n/IqBODNzLlWEJu17uBfmYFbLe8VXPg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1276;3:2RQ8neFnAxlKWr9cgcwuh+S1Wr9/2GXtziPsXSuajmGnqAangBZ3rAPoB9oJEfdbzy+x6BDTAL25CB/7L76dcKyDAyIIfua5aMrt2x/I7GFhENP2oiCnFwyTXy6woKMXiSetmZDQMlaimEMS0dzwHw==;10:q+bUm03cpfFAM6ET38ZxTIWpGP3fJlbZyNKbwAW7C9HbHO586qwxPAnjvlawJZA1EKw4C9+h3KDpppOMwhigGyW5lFEWehhB79Se/58SUpg=;6:xG0k1lT/nB63umdNYKE6Lcu6vgAbYiNYDIvIZ5fcxM6NNEqmwVNX3DEmXhabNNHD X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2015 10:06:48.8018 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1276 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, May 21, 2015 at 09:15:03AM +0200, Stefan Agner wrote: > When using i.MX ESDHC driver, while entering suspend while the device > is in runtime PM, the sdhci_(suspend|resume)_host function are called > with disabled clocks. Since this functions access the SDHC host > registers, this leads to an external abort on Vybrid SoC: > > [ 37.772967] Unhandled fault: imprecise external abort (0x1c06) at 0x76f5f000 > [ 37.780304] Internal error: : 1c06 [#1] ARM > [ 37.784670] Modules linked in: > [ 37.787908] CPU: 0 PID: 428 Comm: sh Not tainted 3.18.0-rc5-00119-geefd097-dirty #1540 > [ 37.796142] task: 8e246c00 ti: 8ca6c000 task.ti: 8ca6c000 > [ 37.801785] PC is at esdhc_writel_le+0x40/0xec > [ 37.806431] LR is at sdhci_set_card_detection+0xe0/0xe4 > [ 37.811877] pc : [<803f0584>] lr : [<803eaaa0>] psr: 400f0013 > [ 37.811877] sp : 8ca6dd28 ip : 00000001 fp : 8ca6dd3c > [ 37.823766] r10: 807a233c r9 : 00000000 r8 : 8e8b7210 > [ 37.829194] r7 : 802d8a08 r6 : 8082e928 r5 : 00000000 r4 : 00000002 > [ 37.835974] r3 : 8ea34e90 r2 : 00000038 r1 : 00000000 r0 : 8ea32ac0 > ... > > Clocks need to be enabled to access the registers. Fix the issue by > add runtime PM enabled pltfm implementation of suspend/resume which > take care of clocks by using the runtime PM API properly. > > Signed-off-by: Stefan Agner > --- > Changes since v2: > - Implement a generic pltfm suspend/resume function instead of a local > function in sdhci-esdhc-imx.c > - Convert sdhci-pxav3 to use the runtime PM enabled pltfm suspend/resume > function too > > drivers/mmc/host/sdhci-esdhc-imx.c | 2 +- > drivers/mmc/host/sdhci-pltfm.c | 36 ++++++++++++++++++++++++++++++++++++ > drivers/mmc/host/sdhci-pltfm.h | 2 ++ > 3 files changed, 39 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c > index 82f512d..7b7b3a3 100644 > --- a/drivers/mmc/host/sdhci-esdhc-imx.c > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c > @@ -1132,7 +1132,7 @@ static int sdhci_esdhc_runtime_resume(struct device *dev) > #endif > > static const struct dev_pm_ops sdhci_esdhc_pmops = { > - SET_SYSTEM_SLEEP_PM_OPS(sdhci_pltfm_suspend, sdhci_pltfm_resume) > + SET_SYSTEM_SLEEP_PM_OPS(sdhci_pltfm_rpm_suspend, sdhci_pltfm_rpm_resume) > SET_RUNTIME_PM_OPS(sdhci_esdhc_runtime_suspend, > sdhci_esdhc_runtime_resume, NULL) > }; > diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c > index a207f5a..38c03cd 100644 > --- a/drivers/mmc/host/sdhci-pltfm.c > +++ b/drivers/mmc/host/sdhci-pltfm.c > @@ -31,6 +31,7 @@ > #include > #include > #include > +#include > #ifdef CONFIG_PPC > #include > #endif > @@ -256,6 +257,41 @@ const struct dev_pm_ops sdhci_pltfm_pmops = { > .resume = sdhci_pltfm_resume, > }; > EXPORT_SYMBOL_GPL(sdhci_pltfm_pmops); > + > +int sdhci_pltfm_rpm_suspend(struct device *dev) Why invent a new API? Can't put into sdhci_pltfm_suspend? Regards Dong Aisheng > +{ > + int ret; > + struct sdhci_host *host = dev_get_drvdata(dev); > + > + pm_runtime_get_sync(dev); > + ret = sdhci_suspend_host(host); > + pm_runtime_mark_last_busy(dev); > + pm_runtime_put_autosuspend(dev); > + if (ret) > + return ret; > + > + return pm_runtime_force_suspend(dev); > +} > +EXPORT_SYMBOL_GPL(sdhci_pltfm_rpm_suspend); > + > +int sdhci_pltfm_rpm_resume(struct device *dev) > +{ > + int ret; > + struct sdhci_host *host = dev_get_drvdata(dev); > + > + ret = pm_runtime_force_resume(dev); > + > + if (ret) > + return ret; > + > + pm_runtime_get_sync(dev); > + ret = sdhci_resume_host(host); > + pm_runtime_mark_last_busy(dev); > + pm_runtime_put_autosuspend(dev); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(sdhci_pltfm_rpm_resume); > #endif /* CONFIG_PM */ > > static int __init sdhci_pltfm_drv_init(void) > diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h > index 04bc248..ac5f6ea 100644 > --- a/drivers/mmc/host/sdhci-pltfm.h > +++ b/drivers/mmc/host/sdhci-pltfm.h > @@ -114,6 +114,8 @@ static inline void *sdhci_pltfm_priv(struct sdhci_pltfm_host *host) > extern int sdhci_pltfm_suspend(struct device *dev); > extern int sdhci_pltfm_resume(struct device *dev); > extern const struct dev_pm_ops sdhci_pltfm_pmops; > +extern int sdhci_pltfm_rpm_suspend(struct device *dev); > +extern int sdhci_pltfm_rpm_resume(struct device *dev); > #define SDHCI_PLTFM_PMOPS (&sdhci_pltfm_pmops) > #else > #define SDHCI_PLTFM_PMOPS NULL > -- > 2.4.1 >