From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95CD4C43381 for ; Sun, 17 Feb 2019 22:14:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3708E21773 for ; Sun, 17 Feb 2019 22:14:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=geanix.com header.i=@geanix.com header.b="rUwprWX+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726304AbfBQWO6 (ORCPT ); Sun, 17 Feb 2019 17:14:58 -0500 Received: from mail.hundeboll.net ([88.198.92.70]:58638 "EHLO mail.hundeboll.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726124AbfBQWO6 (ORCPT ); Sun, 17 Feb 2019 17:14:58 -0500 X-Greylist: delayed 554 seconds by postgrey-1.27 at vger.kernel.org; Sun, 17 Feb 2019 17:14:57 EST Received: from zen.localdomain (unknown [85.184.147.232]) by mail.hundeboll.net (Postfix) with ESMTPSA id 89EE51C32F2; Sun, 17 Feb 2019 23:05:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=geanix.com; s=hundeboll; t=1550441141; bh=AW+b6+QV68HHwxF8pe8FbD8oLwqqQuZGuNLKMDSfh98=; h=From:To:Cc:Subject:Date; b=rUwprWX+eAWD3jFFLUpaMkhCgThN66NeUI/+LoWWN4MWFYWuLz/HobXLrelJCPpLB M3HH2LQMJHgCzcmlU/Fx9NQZ7suIrJiDmQEmtHzAop7GOsqF9MlZzqBjIE6vjo64C6 iZpotidDZvtQXq7v6pmUUMW5dMS7+GYcB2GVogZOI7aesXhmgULaWdSGEsIfEBCPqE UFNazFQmNDCk3C1ycpajVgfDBH7PELnRQOkbtEqoRjnUV4CFd6+JDs3ui1EZRuZVad vLrJyJsY+j0onqgycbUe5ovNkOi4hVii75wTLEPw2NssiPHUenzoHAJPgNO/i/idwY d5KtWGakm7d1Q== From: =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= To: stable@vger.kernel.org Cc: Anson Huang , Anson Huang , Linus Walleij , =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= Subject: [PATCH] gpio: mxc: move gpio noirq suspend/resume to syscore phase Date: Sun, 17 Feb 2019 23:05:33 +0100 Message-Id: <20190217220533.113017-1-martin@geanix.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Anson Huang commit 1a5287a3dbc34cd0c02c8f64c9131bd23cdfe2bb upstream. During noirq suspend/resume phase, GPIO irq could arrive and its registers like IMR will be changed by irq handle process, to make the GPIO registers exactly when it is powered ON after resume, move the GPIO noirq suspend/resume callback to syscore suspend/resume phase, local irq is disabled at this phase so GPIO registers are atomic. Fixes: c19fdaeea0aa ("gpio: mxc: add power management support") Signed-off-by: Anson Huang Signed-off-by: Linus Walleij Signed-off-by: Martin Hundebøll Cc: # 4.19.x+ --- This patch fixes gpio wakeup from suspend on (at least) imx6ul and imx6ull. The backport handles the conflict from commit 7f3f2b478cab ("gpio: gpio-mxc: simplify getting .driver_data"). drivers/gpio/gpio-mxc.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c index 995cf0b9e0b1..2d1dfa1e0745 100644 --- a/drivers/gpio/gpio-mxc.c +++ b/drivers/gpio/gpio-mxc.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -550,33 +551,38 @@ static void mxc_gpio_restore_regs(struct mxc_gpio_port *port) writel(port->gpio_saved_reg.dr, port->base + GPIO_DR); } -static int __maybe_unused mxc_gpio_noirq_suspend(struct device *dev) +static int mxc_gpio_syscore_suspend(void) { - struct platform_device *pdev = to_platform_device(dev); - struct mxc_gpio_port *port = platform_get_drvdata(pdev); + struct mxc_gpio_port *port; - mxc_gpio_save_regs(port); - clk_disable_unprepare(port->clk); + /* walk through all ports */ + list_for_each_entry(port, &mxc_gpio_ports, node) { + mxc_gpio_save_regs(port); + clk_disable_unprepare(port->clk); + } return 0; } -static int __maybe_unused mxc_gpio_noirq_resume(struct device *dev) +static void mxc_gpio_syscore_resume(void) { - struct platform_device *pdev = to_platform_device(dev); - struct mxc_gpio_port *port = platform_get_drvdata(pdev); + struct mxc_gpio_port *port; int ret; - ret = clk_prepare_enable(port->clk); - if (ret) - return ret; - mxc_gpio_restore_regs(port); - - return 0; + /* walk through all ports */ + list_for_each_entry(port, &mxc_gpio_ports, node) { + ret = clk_prepare_enable(port->clk); + if (ret) { + pr_err("mxc: failed to enable gpio clock %d\n", ret); + return; + } + mxc_gpio_restore_regs(port); + } } -static const struct dev_pm_ops mxc_gpio_dev_pm_ops = { - SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mxc_gpio_noirq_suspend, mxc_gpio_noirq_resume) +static struct syscore_ops mxc_gpio_syscore_ops = { + .suspend = mxc_gpio_syscore_suspend, + .resume = mxc_gpio_syscore_resume, }; static struct platform_driver mxc_gpio_driver = { @@ -584,7 +590,6 @@ static struct platform_driver mxc_gpio_driver = { .name = "gpio-mxc", .of_match_table = mxc_gpio_dt_ids, .suppress_bind_attrs = true, - .pm = &mxc_gpio_dev_pm_ops, }, .probe = mxc_gpio_probe, .id_table = mxc_gpio_devtype, @@ -592,6 +597,8 @@ static struct platform_driver mxc_gpio_driver = { static int __init gpio_mxc_init(void) { + register_syscore_ops(&mxc_gpio_syscore_ops); + return platform_driver_register(&mxc_gpio_driver); } subsys_initcall(gpio_mxc_init); -- 2.20.1