Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933511AbbDQP0K (ORCPT ); Fri, 17 Apr 2015 11:26:10 -0400 Received: from mail-wi0-f180.google.com ([209.85.212.180]:38506 "EHLO mail-wi0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754220AbbDQPZu (ORCPT ); Fri, 17 Apr 2015 11:25:50 -0400 From: Tomeu Vizoso To: linux-pm@vger.kernel.org Cc: Laurent Pinchart , Dmitry Torokhov , Alan Stern , Tomeu Vizoso , "Rafael J. Wysocki" , Pavel Machek , Len Brown , Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: [PATCH v3 1/2] PM / sleep: Let devices force direct_complete Date: Fri, 17 Apr 2015 17:24:49 +0200 Message-Id: <1429284290-25153-2-git-send-email-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.3.5 In-Reply-To: <1429284290-25153-1-git-send-email-tomeu.vizoso@collabora.com> References: <1429284290-25153-1-git-send-email-tomeu.vizoso@collabora.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2491 Lines: 66 Introduce a new per-device flag power.force_direct_complete that will instruct the PM core to ignore the runtime PM status of its descendants when deciding whether to let this device remain in runtime suspend when the system goes into a sleep power state. 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. Signed-off-by: Tomeu Vizoso --- drivers/base/power/main.c | 13 +++++++++---- include/linux/pm.h | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 3d874ec..728c2dc 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,12 @@ 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; + 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; -- 2.3.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/