From patchwork Thu May 14 13:37:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomeu Vizoso X-Patchwork-Id: 6405721 X-Patchwork-Delegate: rjw@sisk.pl Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4C6139F32E for ; Thu, 14 May 2015 13:38:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8AD97203DA for ; Thu, 14 May 2015 13:38:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 451E9203E9 for ; Thu, 14 May 2015 13:38:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933047AbbENNiV (ORCPT ); Thu, 14 May 2015 09:38:21 -0400 Received: from mail-wg0-f43.google.com ([74.125.82.43]:34842 "EHLO mail-wg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932912AbbENNiU (ORCPT ); Thu, 14 May 2015 09:38:20 -0400 Received: by wgnd10 with SMTP id d10so73435288wgn.2; Thu, 14 May 2015 06:38:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=HpdRzVoSof8BIpjy53U6xLINVGN5sRZx3YfhC1Zy23A=; b=UqSgDIzQ2wWK+Ib2mo6kZLTx1+v4Z1fZ6KqqRF7V7l49xkDeu98dQ0bTG+k+8yJBWX 8h+mVlRcDkBOFCSv9/8D+OxtIXn3flKgjqYYeuis08NhZLbiVmJ7bZrc459KoXilKbmR q96gQsrRorPjouy8+eq8xnO0BRiK5Q+mpeNHOV2sOteY08o+vMvqljw208hKw4z6Q/Yr Tawt05+DeSC6mj0XAdSoiKWxh5wr+bjZHDEtIUWGlPCEVhMezgZIM6mkwEATGbwfozZE kzP9SArFdT2sS4kEFIupM9/TECclc+J1CGfgqdOfQfK2SrJDEBdcdWpIzrBu1pT3EPzi EeEQ== X-Received: by 10.194.57.109 with SMTP id h13mr7954669wjq.67.1431610698721; Thu, 14 May 2015 06:38:18 -0700 (PDT) Received: from cizrna.lan ([109.72.12.86]) by mx.google.com with ESMTPSA id l3sm13374280wiv.18.2015.05.14.06.38.16 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 May 2015 06:38:17 -0700 (PDT) From: Tomeu Vizoso To: linux-pm@vger.kernel.org Cc: Alan Stern , Laurent Pinchart , Dmitry Torokhov , Kevin Hilman , Tomeu Vizoso , "Rafael J. Wysocki" , Len Brown , Pavel Machek , Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: [PATCH v2] PM / sleep: Let devices force direct_complete Date: Thu, 14 May 2015 15:37:52 +0200 Message-Id: <1431610673-16801-1-git-send-email-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.4.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_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 Introduce a new per-device flag power.force_direct_complete that will instruct the PM core to let that device remain in runtime suspend when the system goes into a sleep power state, regardless of the PM state of any of its descendants. This is needed because otherwise it would be needed to get dozens of drivers to implement the prepare() callback and be runtime PM active even if they don't have a 1-to-1 relationship with a piece of HW. This only applies to devices that aren't wakeup-capable, as those would need to setup their IRQs as wakeup-capable in their prepare() callbacks. Signed-off-by: Tomeu Vizoso Acked-by: Alan Stern --- v2: * Fix wording as suggested by Kevin Hilman --- Documentation/power/runtime_pm.txt | 10 ++++++++++ drivers/base/power/main.c | 14 ++++++++++---- include/linux/pm.h | 1 + 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 44fe1d2..e131aab 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt @@ -665,6 +665,16 @@ as appropriate. This only applies to system suspend transitions that are not related to hibernation (see Documentation/power/devices.txt for more information). +For devices that know they can remain runtime suspended when the system +transitions to a sleep state regardless of the PM state of their descendants, +the flag power.force_direct_complete can be set on their device structures. +This can be useful when a real device has several virtual devices as +descendants and it would be very cumbersome to make sure that they return a +positive value in their .prepare() callback and have runtime PM enabled. Usage +of power.force_direct_complete is only allowed to devices that aren't +wakeup-capable, as they would need to set their IRQs as wakeups in their +.prepare() callbacks before the system transitions to a sleep state. + The PM core does its best to reduce the probability of race conditions between the runtime PM and system suspend/resume (and hibernation) callbacks by carrying out the following operations: diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 3d874ec..7b962f5 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -1438,7 +1438,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) if (parent) { spin_lock_irq(&parent->power.lock); - dev->parent->power.direct_complete = false; + if (!dev->parent->power.force_direct_complete) + dev->parent->power.direct_complete = false; + if (dev->power.wakeup_path && !dev->parent->power.ignore_children) dev->parent->power.wakeup_path = true; @@ -1605,9 +1607,13 @@ static int device_prepare(struct device *dev, pm_message_t state) * will do the same thing with all of its descendants". This only * applies to suspend transitions, however. */ - spin_lock_irq(&dev->power.lock); - dev->power.direct_complete = ret > 0 && state.event == PM_EVENT_SUSPEND; - spin_unlock_irq(&dev->power.lock); + if (state.event == PM_EVENT_SUSPEND) { + spin_lock_irq(&dev->power.lock); + dev->power.direct_complete = ret > 0 || + (dev->power.force_direct_complete && + !device_can_wakeup(dev)); + spin_unlock_irq(&dev->power.lock); + } return 0; } diff --git a/include/linux/pm.h b/include/linux/pm.h index 2d29c64..2e41cfd 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -553,6 +553,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 */ + bool force_direct_complete:1; spinlock_t lock; #ifdef CONFIG_PM_SLEEP struct list_head entry;