Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2420488imj; Mon, 18 Feb 2019 05:48:21 -0800 (PST) X-Google-Smtp-Source: AHgI3IZzVF2cY6VtCZon1vz8kQEveVIwmp/EEw3GMFA7FS+77wMkauy9gDW/MSJBDVUc/wSe79Ra X-Received: by 2002:a62:f51d:: with SMTP id n29mr17192043pfh.21.1550497701150; Mon, 18 Feb 2019 05:48:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550497701; cv=none; d=google.com; s=arc-20160816; b=TWx3R2eefybUyphFYsMraDt1eUejM670lyOjYVdPZo7dyJlswWO0Oz+SstaUAweAB+ mwq/FbqL42ovYbqwsEeE+3DVtBnx0ufQz2MYVMJjGMHDxLjI+SiAQt8/3uXjz3XBwjnk GjFQAITcy10M52oDyn/qeJc/WbzQYcxb7WHNAbqIeKknLiEbHACFzXPc8QKGOf9gYGKs xqd2xmfgMX65Rlj+yhZ0IPXimbbkMiOetj7UoXS9TWFmGFyh0hOuq/G0AcZMVNvsJe3j vjjXE/q9l6SAKk9E19FuAqDUmculUiXL6lrMKV54abqyfY0SQ/4gCKBGoOC0SWkYp26h TabA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=JwhBUipRgjvlivyAuw15qHtxLmatNKMV6LXKDQaJbYk=; b=bLt0CfftynN7x/rOnowExNq0p0Z3FZZ6quHht6yrKpMwar5X5CxooIHXyQZBg59ZYR YRFKILbbk/nObW47RourG0B7uUrE3iBoEFytLBg329coYb36aG1ptSUl/py9wsG0pKZP yahIf3ZAXbp7GPLRGX4VxFb5EB+iTqxl3giYyvpxpWae/9pvScYsTqztaxxtdQsgzPHi hPXLtDpI/nrqQtZUb5spHybnp3C75fAuAIj8Wy1YZB/JPkXZ2w90mYpzcsRR6oVl9sY0 p1RBKj2Gs/wVyzru3sctU1Sa9wbMfQ0G/8AlmUDs5vZhzYfPB6pRE+sHS8UnWwQgxt/E s67Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=t6n2KZXZ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w186si5232331pgd.460.2019.02.18.05.47.58; Mon, 18 Feb 2019 05:48:21 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=t6n2KZXZ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730944AbfBRNrH (ORCPT + 99 others); Mon, 18 Feb 2019 08:47:07 -0500 Received: from mail.kernel.org ([198.145.29.99]:53536 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730999AbfBRNrB (ORCPT ); Mon, 18 Feb 2019 08:47:01 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 569A3218FC; Mon, 18 Feb 2019 13:47:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1550497620; bh=a20BMaYnBzA722S3qoNqAccbMv+ymb/Nr+mq1EVPl3I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t6n2KZXZIb5ZnBNGLpd8hhQsTKefhHaGNhLWO9jUFOSiFQEQ97qi0NESyjxAGUCXs fcT6L8ZqPPukZhRO58lSVa01zp5Cs9eKkAlzY6P2yesf7W9KD922BKupvupgYIe5bf u+2afnM3vCeYsTa4sPeh3LkdSRk5rv/z8d7a9aXw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Anson Huang , Linus Walleij , =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= , Sasha Levin Subject: [PATCH 4.20 49/92] gpio: mxc: move gpio noirq suspend/resume to syscore phase Date: Mon, 18 Feb 2019 14:42:52 +0100 Message-Id: <20190218133459.291135962@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190218133454.668268457@linuxfoundation.org> References: <20190218133454.668268457@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.20-stable review patch. If anyone has any objections, please let me know. ------------------ 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+ Signed-off-by: Sasha Levin --- 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.19.1