From patchwork Mon Feb 20 20:33:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geert Uytterhoeven X-Patchwork-Id: 9583631 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5772B600C1 for ; Mon, 20 Feb 2017 20:34:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 46EC12886C for ; Mon, 20 Feb 2017 20:34:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 394412888F; Mon, 20 Feb 2017 20:34:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AC3A12886C for ; Mon, 20 Feb 2017 20:34:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751894AbdBTUeF (ORCPT ); Mon, 20 Feb 2017 15:34:05 -0500 Received: from albert.telenet-ops.be ([195.130.137.90]:42240 "EHLO albert.telenet-ops.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751934AbdBTUeC (ORCPT ); Mon, 20 Feb 2017 15:34:02 -0500 Received: from ayla.of.borg ([84.193.137.253]) by albert.telenet-ops.be with bizsmtp id n8Zs1u00J5UCtCs068Zsmh; Mon, 20 Feb 2017 21:34:00 +0100 Received: from ramsan.of.borg ([192.168.97.29] helo=ramsan) by ayla.of.borg with esmtp (Exim 4.82) (envelope-from ) id 1cfuee-0003mr-3x; Mon, 20 Feb 2017 21:33:52 +0100 Received: from geert by ramsan with local (Exim 4.86_2) (envelope-from ) id 1cfuee-0006YQ-2c; Mon, 20 Feb 2017 21:33:52 +0100 From: Geert Uytterhoeven To: Lorenzo Pieralisi , Mark Rutland , Sudeep Holla , Lina Iyer , John Stultz , Thomas Gleixner , "Rafael J . Wysocki" , Len Brown , Pavel Machek , Rob Herring Cc: Magnus Damm , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-renesas-soc@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven Subject: [PATCH/RFC 4/6] drivers: firmware: psci: Fix non-PMIC wake-up if SYSTEM_SUSPEND cuts power Date: Mon, 20 Feb 2017 21:33:27 +0100 Message-Id: <1487622809-25127-5-git-send-email-geert+renesas@glider.be> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1487622809-25127-1-git-send-email-geert+renesas@glider.be> References: <1487622809-25127-1-git-send-email-geert+renesas@glider.be> Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Nothing in the PSCI specification requires the SoC to remain powered and to support wake-up sources when suspended using SYSTEM_SUSPEND. If the firmware implements the PSCI SYSTEM_SUSPEND operation by cutting power to the SoC, the only possibly wake-up sources are thus the ones connected to the PMIC. Document and add support for an "arm,psci-system-suspend-is-power-down" DT property, so Linux uses a different suspend method when other wake-up sources (e.g. wake on LAN, UART or GPIO) are enabled. Signed-off-by: Geert Uytterhoeven --- Documentation/devicetree/bindings/arm/psci.txt | 11 +++++++++++ drivers/firmware/psci.c | 13 ++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/arm/psci.txt b/Documentation/devicetree/bindings/arm/psci.txt index a2c4f1d524929bb7..16e390ecb7531028 100644 --- a/Documentation/devicetree/bindings/arm/psci.txt +++ b/Documentation/devicetree/bindings/arm/psci.txt @@ -68,6 +68,17 @@ state nodes, as per bindings in [1]) must specify the following properties: Definition: power_state parameter to pass to the PSCI suspend call. + - arm,psci-system-suspend-is-power-down + Nothing in the PSCI specification requires the SoC to remain + powered and to support wake-up sources when suspended using + SYSTEM_SUSPEND. + If your firmware implements the PSCI SYSTEM_SUSPEND operation + by cutting power to the SoC, the only possibly wake-up sources + are thus the ones connected to the PMIC. In such case you + should specify this property, so the operating system is aware + it should use a different suspend method when other wake-up + sources (e.g. wake on LAN, UART or GPIO) are enabled. + Example: Case 1: PSCI v0.1 only. diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c index 13b4d50bb3577384..0a74c23fd5fe043e 100644 --- a/drivers/firmware/psci.c +++ b/drivers/firmware/psci.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -86,6 +87,7 @@ static u32 psci_function_id[PSCI_FN_MAX]; static u32 psci_cpu_suspend_feature; static bool psci_suspend_mem_supported; +static bool psci_system_suspend_is_power_down; static inline bool psci_has_ext_power_state(void) { @@ -440,12 +442,14 @@ static int psci_system_suspend_valid(suspend_state_t state) static int psci_system_suspend_enter(suspend_state_t state) { switch (state) { + case PM_SUSPEND_MEM: + if (!psci_system_suspend_is_power_down || + !wakeup_source_available()) + return cpu_suspend(0, psci_system_suspend); + /* fall through */ case PM_SUSPEND_STANDBY: cpu_do_idle(); break; - - case PM_SUSPEND_MEM: - return cpu_suspend(0, psci_system_suspend); } return 0; @@ -596,6 +600,9 @@ static int __init psci_0_2_init(struct device_node *np) */ err = psci_probe(); + psci_system_suspend_is_power_down = of_property_read_bool(np, + "arm,psci-system-suspend-is-power-down"); + out_put_node: of_node_put(np); return err;