From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751566AbdJBJ5R (ORCPT ); Mon, 2 Oct 2017 05:57:17 -0400 Received: from mail-he1eur01on0058.outbound.protection.outlook.com ([104.47.0.58]:19808 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751016AbdJBJ4Q (ORCPT ); Mon, 2 Oct 2017 05:56:16 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ed.blake@sondrel.com; From: Ed Blake To: tglx@linutronix.de, jason@lakedaemon.net, marc.zyngier@arm.com Cc: linux-kernel@vger.kernel.org, Ed Blake Subject: [PATCH 2/4] irqchip: imgpdc: Avoid immediate wake event during set_wake Date: Mon, 2 Oct 2017 10:55:57 +0100 Message-Id: <1506938159-466-3-git-send-email-ed.blake@sondrel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1506938159-466-1-git-send-email-ed.blake@sondrel.com> References: <1506938159-466-1-git-send-email-ed.blake@sondrel.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.88.9.101] X-ClientProxiedBy: DB6PR07CA0121.eurprd07.prod.outlook.com (2603:10a6:6:16::14) To AM4P191MB0001.EURP191.PROD.OUTLOOK.COM (2603:10a6:200:64::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e745bd73-2e43-4123-c938-08d5097bd1cd X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:AM4P191MB0001; X-Microsoft-Exchange-Diagnostics: 1;AM4P191MB0001;3:xxr9b+XejSLl5g+G4FG4rXtQ4N7o7K6CdB7BVFBc7D5FbUzyniFnRYGSNQYhQoq0fBWRVh9ZFkejScqfgQ07lMJLwS0hh+7i8e5+dkqttM77ASqyc55AIQBhgnzakLNlQ8KfDdCkzpamHm5x8rGCvpV0AzzSKWM1vCtCFQVZ8nfOjH1eGzw/XKEWBR1CpjnioNWPp7j5klBUmTy4aZbhrLk17EOfm9cJgK/5sqDV4g1fEKvwcPVeU5NVW4Ta+f6/;25:uork8dgVLKm0NGQYb27pn5UgN+xDoVOZutsdBxW+rHvayJPtCa3XKf76nr/3rVwmq3rUYLBmg2CHzEkLZHNOI+CzuVf6TN/tgTOZ/nOrdMbkEnoN5GizzwWaYbycw5E2TzQyW1LBE3um6qkgTVMtnjXAh6pF+RWjBztBUtvWHSqVsgwJS0uHWMorkczXBWudTWsOOYr4vHkTmAF0Mt6CNEWMYLFT3MOGIrErN5KlWIJmMQ1ZEuxDF/Z7nNr/q8p6gng2BAN0Na9I+RwKTPJeTs9xXyZKNIeFGW7dlRbaIGWhx/yJTr8+l5TIzraz+ypQum7cDXREE73c0NtC3bd3Zw==;31:KvhA2+H/hULKUBPYMpeakmpctLdRUxyQfF68CCZMR1dUrkpCjdTZlqQkgW8coHsi60fNuhfXhEbgXMhND74nE6SRiaXDrHcdiHrWDmIUIDDp+3W0hMgMLURIic3erX18efzeblfcDIs9LDGdiMAH4oGTm+XKTk3Q3hTH6ZlB+0Jbqo38ZSN1TTbnTp5HwTyr3mOCxW6b/x3Dz7JWLgSc2Zufmoq5ycxAmGXEcyj40sA= X-MS-TrafficTypeDiagnostic: AM4P191MB0001: X-Microsoft-Exchange-Diagnostics: 1;AM4P191MB0001;20:pW+/5+0qjLvGxUkKn4gIJYXPOFSUVyIEtrVecrIAGlStARHS/OZAZkq1Vsk/cnyDHXlmFsrz0dNx/2ROZ2jAErNuPUyqJo7ZfTHyHdYrMVLxrpHS0+HWyfcIfJXxN4qnHaIPZezsW62fXDGYWarGN9M4KZqH2MNd3QZJ94rLFb8K43b7fOtMqeWv5mO3H/LBzv1y5WmBrVkht/KBcLsT6MvakCjU8kgIXZOZaVXYDbvXoXV4kb4zE5RpIe6889+s;4:M0cwQ8qJfNpTxTgMomotnulRfA/Z3a2gERyW0z0BFQp3YIQ28FuOWpV0HgXEIxy1CodennF1LlyE2cX0b2v5fPQAWts3x9Q6WAZhaJ6JbtNasnaV7vq0J4Qw8UjuUH3QVTCFakxpsOaMU4/SL1BSBnL++HyDH8eBsg2DlQInIrbxMgCeyjO1Bcjf/q1R/78mY3F71lAfETz7c+cTIEjsiYCEo8UXiywH5R+w5lXFAUcIh91xJE/8RZx5eSZ+FX3o X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(3002001)(93006095)(93001095)(10201501046)(6041248)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123560025)(20161123555025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:AM4P191MB0001;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:AM4P191MB0001; X-Forefront-PRVS: 0448A97BF2 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(39830400002)(346002)(199003)(189002)(66066001)(47776003)(6666003)(6116002)(3846002)(97736004)(69596002)(76176999)(50986999)(4326008)(5660300001)(101416001)(6486002)(107886003)(8936002)(8676002)(81166006)(81156014)(50226002)(5003940100001)(189998001)(68736007)(53936002)(305945005)(7736002)(50466002)(48376002)(25786009)(36756003)(2906002)(2950100002)(106356001)(105586002)(33646002)(53416004)(478600001)(16526017)(316002)(16586007)(86362001)(14773001);DIR:OUT;SFP:1101;SCL:1;SRVR:AM4P191MB0001;H:iw-build-2.sondrel.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM4P191MB0001;23:zBJoP8uSPIVcxSGY+Wy8VsDhx94ipi40Eitp96sGQ?= =?us-ascii?Q?GzO/11z16ymuThSp8nFWJK/sjiCKoicPaHI5Ev+uy3LXgX9C35MuWWxGNdgA?= =?us-ascii?Q?MfOu5RpDBNzf5JcJNT9xYfTWkpBKMLehgcRLjDkHWJFwLf/BczXq2O6PhyOW?= =?us-ascii?Q?Z/zq8azU8zbxxEdLTPq4RP/twufoYLDjjzdMC/5Uq7nHJvWIoorV1sE8EFoH?= =?us-ascii?Q?sIOE7h6UJOTSXyxtwQSD9QWmYalQfEzlqjSUFu5neKlFgRr6bNMIkBkOeR76?= =?us-ascii?Q?DAA4TbuXViciXVzH10xY95D+TvV4mDnjOSOHgqjqT9hHdgXRUR+DpKsHdkVM?= =?us-ascii?Q?yJ/Ph30vQUvai/7ujssMzMq3TZceDvjprqurWneY6X7Y+TYbJIYT0OWAIbN9?= =?us-ascii?Q?SaEvVoUbAuw3U8unxt15HsRL+av+K5HTqV6Mc0PC987e1PW7jiiPyhKCiMLl?= =?us-ascii?Q?k2TL2uGYwTdayz7KCiKTT+AQmLu+bLq13K966jzzQK6HkUYFUfHKM1looYdh?= =?us-ascii?Q?Iy/jKfTkHaE2NM38HSM/Ta0UvE406dRVURRa341WtYtQACAsy+4+kHqwWXCH?= =?us-ascii?Q?/jE8UJKQQhUnMpzBzSpgXvPH6k+ehI3wcgY8nDwnx03oBm+SvKZKxOrHZDt4?= =?us-ascii?Q?oIfpuxHMvYCY/5ZRCKa5K+OX7J1PinjB/ai4ZIV1lqVzP2eOuMiamE9U/bfx?= =?us-ascii?Q?1VjBqc7knggKFlI/rA0d7p6XmeqzV9DdqlWcGgvOo76YLjp0hoqXM4etsfd5?= =?us-ascii?Q?22MbeUIegpotNjv0hEaY0ON6v0xhdHNf41wJcQjRS2K0lqw8YaPcrmgrJZyG?= =?us-ascii?Q?LaoOXlRB5LzzkiD2pReSOrd1Jrndm0VdNzr6He5K8w8yx++X8TKWMjNP8E03?= =?us-ascii?Q?Qi88HlxYT4Fvju4lJBzZPnto2BX58cdSZkPW25E1ACVmRFeZuq+8IEw0ALBk?= =?us-ascii?Q?wQ3ygtOy/7gBVo+UZp11OeLQo+Lyqm2JEeawTI29RCkTKfxmZ3B645sq6HHH?= =?us-ascii?Q?l3fKjRE660UOWAaJfL7ggr+PGc/vCvIt5Wve0tbAC45iTPca8KJm+nCQUOaC?= =?us-ascii?Q?HYxQHZZF62c03Uf20805XL9lRWqKOZfviORTOyc59U9yW/VdTtzgCzKkoh8m?= =?us-ascii?Q?Ys7017CBQU=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM4P191MB0001;6:B5yDlaHLeL89vzJdScKvhwrH0fCuVMNVhjZhY6u0ADvoyij1k/Kbn0o+36GWFv5tMSu6TKE/ve4p12aBF3LBO7zd8dxIfjl8yw6rMRksDHcbD9zzqG6QZc7ZhOGWoNgQDbWICvu8eWMlSxh0gtHXdb42HRA91yF2EO2Qj95LTqdQADqzU7/Sc/3zYD+2hdRe4FLBDseMiSm7Fc9QVFi4P21PmRqa73vaprhc3Zxs1NwcSw4WvKDE1Wqtk8rHnTamaHZsvw1ZWecjG2eMnCObkNHr8HHhP2X6Mz12nH66sI0Pn+WrdkbI3gp5yPfn9a7Ufr+0pkzAhaV3A/FAUCrXfQ==;5:XnGtisGonpyKmbd68ILvI8KN8mH8/aO1U5cd3MmhVSkJyRHWyuXapmK9ShThJmqYz9a17zCQ1umpLvJ2Fo7e3xsOio0yMfSjuT9eWneukjr4VpnollWSuP+PVi3uGQpVXCrE0+JWigBJIMR/O6bp3g==;24:ooI+NWTIMU6PKElrsG4uS62ikUcV+Ymy4NvXk0rDYs+g7Ve54lDG18dvpN0FekWF+44KXcrqQjbiIzFJ/CmrLZ2KKVFS6q+PlHuYMPQrZXI=;7:WlBOiRIhuxDG7kRswCvRwmHHrADSzU5rV/18JUvhu/Un60igEGRq78CcMn/fjEA4lO9v0bg+WBQMRPdeuMbhGk/pGn4ADZEOf5u28zb33jRR+LFd0anIq1M5VQ8gGLL7LRlpc6RvrxcNfa09Aze6gjRRomE5gWzpdgIybYV23d0bNNf/kxlQUvxuyo7Gvi1Hy+tSCwpGqEabFGFOO4u80ntTRTmfKUFpQQsk5JkAeB4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: sondrel.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Oct 2017 09:56:14.5532 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4faa3872-698e-4896-80ec-148b916cb1ba X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4P191MB0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When enabling sys wakes, an immediate power transition may occur if the wake input has been active in the past. Work around this by doing the following: 1) Set SYS_WAKE_CONFIG to the current value of SOC_POWER so that an immediate power transition has no effect 2) Enable and disable the sys wake to flush the stale wake event 3) Set SYS_WAKE_CONFIG back to the original value Signed-off-by: Ed Blake --- drivers/irqchip/irq-imgpdc.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/irqchip/irq-imgpdc.c b/drivers/irqchip/irq-imgpdc.c index 2ac3210..22d8f8a 100644 --- a/drivers/irqchip/irq-imgpdc.c +++ b/drivers/irqchip/irq-imgpdc.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -18,6 +19,7 @@ /* PDC interrupt register numbers */ +#define PDC_SOC_POWER 0x300 #define PDC_IRQ_STATUS 0x310 #define PDC_IRQ_ENABLE 0x314 #define PDC_IRQ_CLEAR 0x318 @@ -204,6 +206,8 @@ static int pdc_irq_set_wake(struct irq_data *data, unsigned int on) unsigned int mask = (1 << 16) << hw; unsigned int dst_irq; unsigned int *dst_irq_wake_depth; + unsigned int syswake, soc_sys_wake_cfg_regoff; + u32 soc_sys_wake_cfg, soc_power; int ret; /* control the destination IRQ wakeup too for standby mode */ @@ -216,6 +220,27 @@ static int pdc_irq_set_wake(struct irq_data *data, unsigned int on) } raw_spin_lock(&priv->lock); + /* + * When enabling sys wakes, an immediate power transition may occur if + * the wake input has been active in the past. Work around this: + * 1) Set SYS_WAKE_CONFIG to the current value of SOC_POWER so that an + * immediate power transition has no effect + * 2) Enable and disable the sys wake to flush the stale wake event + * 3) Set SYS_WAKE_CONFIG back to the original value + */ + if (hwirq_is_syswake(hw) && on) { + syswake = hwirq_to_syswake(hw); + soc_sys_wake_cfg_regoff = PDC_SYS_WAKE_CONFIG_BASE + + syswake * PDC_SYS_WAKE_CONFIG_STRIDE; + soc_sys_wake_cfg = pdc_read(priv, soc_sys_wake_cfg_regoff); + soc_power = pdc_read(priv, PDC_SOC_POWER); + pdc_write(priv, soc_sys_wake_cfg_regoff, soc_power); + pdc_write(priv, PDC_IRQ_ROUTE, priv->irq_route | mask); + udelay(31); + pdc_write(priv, PDC_IRQ_ROUTE, priv->irq_route); + pdc_write(priv, soc_sys_wake_cfg_regoff, soc_sys_wake_cfg); + } + if (on) priv->irq_route |= mask; else -- 1.9.1