From patchwork Thu Nov 6 08:36:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 5240041 Return-Path: X-Original-To: patchwork-dmaengine@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 62EA1C11AC for ; Thu, 6 Nov 2014 08:37:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EAFAD20120 for ; Thu, 6 Nov 2014 08:37:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 06CDA2010F for ; Thu, 6 Nov 2014 08:37:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751779AbaKFIhH (ORCPT ); Thu, 6 Nov 2014 03:37:07 -0500 Received: from mailout3.w1.samsung.com ([210.118.77.13]:64723 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751946AbaKFIhC (ORCPT ); Thu, 6 Nov 2014 03:37:02 -0500 Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout3.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NEM005ZP02GGZ90@mailout3.w1.samsung.com>; Thu, 06 Nov 2014 08:39:52 +0000 (GMT) X-AuditID: cbfec7f5-b7f956d000005ed7-84-545b332bad50 Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id 33.8B.24279.B233B545; Thu, 06 Nov 2014 08:36:59 +0000 (GMT) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0NEL00IEEZXIOS10@eusync2.samsung.com>; Thu, 06 Nov 2014 08:36:59 +0000 (GMT) From: Krzysztof Kozlowski To: "Rafael J. Wysocki" , Len Brown , Pavel Machek , Russell King , Dan Williams , Vinod Koul , Ulf Hansson , Alan Stern , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, Lars-Peter Clausen , Michal Simek Cc: Kevin Hilman , Laurent Pinchart , Kyungmin Park , Marek Szyprowski , Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski Subject: [PATCH v10 1/5] PM / Runtime: Allow accessing irq_safe if no PM_RUNTIME Date: Thu, 06 Nov 2014 09:36:46 +0100 Message-id: <1415263010-7992-2-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1415263010-7992-1-git-send-email-k.kozlowski@samsung.com> References: <1415263010-7992-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrILMWRmVeSWpSXmKPExsVy+t/xK7raxtEhBpMuWlhsnLGe1WL61AuM Fqun/mW1eP3C0OLp5sdMFmeb3rBbLJk8n9Wic+ISdotZU/YyWVzeNYfN4nPvEUaL25d5LdYe uctu8e5lhMXdU0fZLM6cvsRqMeH3BTaL42vDLV727WdxEPZoae5h85jdMZPVY/Gel0wem1Z1 snncubaHzWPJm0OsHluutrN4zL77g9Gjb8sqRo8Vq7+ze3zeJOex9/NvlgCeKC6blNSczLLU In27BK6M3oU7mQuuCFf0/n3B0sC4RKCLkZNDQsBEYtPyTYwQtpjEhXvr2boYuTiEBJYyShz9 v5gVwuljkjhx/SJYFZuAscTm5UvAqkQErjNLdD/uZwFJMAssYpJomqoIYgsLBEgcmH6dGcRm EVCVOPvjL3sXIwcHr4CbxLsn8hDb5CROHpvMCmJzCrhL/FrygQnEFgIqaf86m30CI+8CRoZV jKKppckFxUnpuUZ6xYm5xaV56XrJ+bmbGCHR8HUH49JjVocYBTgYlXh4I9ijQ4RYE8uKK3MP MUpwMCuJ8EboAYV4UxIrq1KL8uOLSnNSiw8xMnFwSjUwsl3bsKl+6wmN8ooTWmdWFZw/dWND dojk/op9W27fnrpd5NGCf2lHAvzlo7Vsb50Vijt7Qa+wMNvryNF87b8H7/66xP30TW5Nsvqc gwHTHH7G9i4/ETX9Urody44PcnZ7Vqc96nxqwbY3fuoTeR/XAz2R0QITL57bLijoc3SXylTj KKenHPYV+kosxRmJhlrMRcWJAMEmOxdkAgAA Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Some drivers (e.g. bus drivers) may want to check if power.irq_safe was called by child driver, regardless of CONFIG_PM_RUNTIME. An example scenario is amba/bus.c and dma/pl330.c drivers. The runtime suspend/resume callbacks in amba bus driver act differently if irq_safe was set by child driver (in irq_safe mode bus clock is only disabled). The pl330 driver sets irq_safe and assumes that amba bus driver will only disable the clock in runtime PM. So in system sleep suspend callback the pl330 driver unprepares the clock after calling pm_runtime_force_suspend(). However inconsistency would appear if CONFIG_PM_RUNTIME is not set and child drivers do not want the irq_safe runtime PM. In such case amba bus driver still has to know whether child driver wanted irq_safe - by looking at dev->power.irq_safe field. Signed-off-by: Krzysztof Kozlowski --- include/linux/pm.h | 2 +- include/linux/pm_runtime.h | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/linux/pm.h b/include/linux/pm.h index 383fd68aaee1..b05fa954f50d 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -566,6 +566,7 @@ struct dev_pm_info { bool ignore_children:1; bool early_init:1; /* Owned by the PM core */ bool direct_complete:1; /* Owned by the PM core */ + unsigned int irq_safe:1; /* PM runtime */ spinlock_t lock; #ifdef CONFIG_PM_SLEEP struct list_head entry; @@ -590,7 +591,6 @@ struct dev_pm_info { unsigned int run_wake:1; unsigned int runtime_auto:1; unsigned int no_callbacks:1; - unsigned int irq_safe:1; unsigned int use_autosuspend:1; unsigned int timer_autosuspends:1; unsigned int memalloc_noio:1; diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 367f49b9a1c9..d94a65662a60 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -166,7 +166,10 @@ static inline bool pm_runtime_suspended_if_enabled(struct device *dev) { return static inline bool pm_runtime_enabled(struct device *dev) { return false; } static inline void pm_runtime_no_callbacks(struct device *dev) {} -static inline void pm_runtime_irq_safe(struct device *dev) {} +static inline void pm_runtime_irq_safe(struct device *dev) +{ + dev->power.irq_safe = 1; +} static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; } static inline void pm_runtime_mark_last_busy(struct device *dev) {}