From patchwork Sat Aug 29 22:41:14 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael Wysocki X-Patchwork-Id: 44712 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n7TMcJ2g018861 for ; Sat, 29 Aug 2009 22:40:20 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751830AbZH2WkQ (ORCPT ); Sat, 29 Aug 2009 18:40:16 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752046AbZH2WkQ (ORCPT ); Sat, 29 Aug 2009 18:40:16 -0400 Received: from ogre.sisk.pl ([217.79.144.158]:47540 "EHLO ogre.sisk.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751830AbZH2WkP (ORCPT ); Sat, 29 Aug 2009 18:40:15 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by ogre.sisk.pl (Postfix) with ESMTP id 443CF1529D7; Sat, 29 Aug 2009 21:40:33 +0200 (CEST) Received: from ogre.sisk.pl ([127.0.0.1]) by localhost (ogre.sisk.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 10295-02; Sat, 29 Aug 2009 21:40:16 +0200 (CEST) Received: from tosh.localnet (220-bem-13.acn.waw.pl [82.210.184.220]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ogre.sisk.pl (Postfix) with ESMTP id 29D4D1523BB; Sat, 29 Aug 2009 21:40:16 +0200 (CEST) From: "Rafael J. Wysocki" To: Len Brown Subject: [PATCH] ACPI / PM: Allow PCI root bridges to wake up the system Date: Sun, 30 Aug 2009 00:41:14 +0200 User-Agent: KMail/1.12.0 (Linux/2.6.31-rc8-rjw; KDE/4.3.0; x86_64; ; ) Cc: ACPI Devel Maling List , Linux PCI , Jesse Barnes , Matthew Garrett , Henrique de Moraes Holschuh , pm list MIME-Version: 1.0 Message-Id: <200908300041.14541.rjw@sisk.pl> X-Virus-Scanned: amavisd-new at ogre.sisk.pl using MkS_Vir for Linux Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org From: Rafael J. Wysocki If PCI root bridge is declared in the ACPI tables as a wake-up device, allow it to wake up the system by default. This allows add-on PCI devices to work as wake-up devices on some systems, where PME# asserted by an add-on device causes the root bridge GPE to generate a wake-up event, without using /proc/acpi/wakeup to change the root bridge wake-up setting. Signed-off-by: Rafael J. Wysocki --- drivers/acpi/glue.c | 3 +++ drivers/acpi/pci_root.c | 25 +++++++++++++------------ include/acpi/acpi_bus.h | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux-2.6/drivers/acpi/glue.c =================================================================== --- linux-2.6.orig/drivers/acpi/glue.c +++ linux-2.6/drivers/acpi/glue.c @@ -168,6 +168,9 @@ static int acpi_bind_one(struct device * "physical_node"); if (acpi_dev->wakeup.flags.valid) { device_set_wakeup_capable(dev, true); + /* Allow PCI root bridges to wake up the system. */ + if (acpi_dev_is_root_bridge(acpi_dev)) + acpi_dev->wakeup.state.enabled = true; device_set_wakeup_enable(dev, acpi_dev->wakeup.state.enabled); } Index: linux-2.6/drivers/acpi/pci_root.c =================================================================== --- linux-2.6.orig/drivers/acpi/pci_root.c +++ linux-2.6/drivers/acpi/pci_root.c @@ -138,26 +138,27 @@ acpi_handle acpi_get_pci_rootbridge_hand EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle); /** + * acpi_dev_is_root_bridge - determine if an ACPI device is a PCI root bridge + * @device: ACPI device to check. + */ +bool acpi_dev_is_root_bridge(struct acpi_device *device) +{ + return !acpi_match_device_ids(device, root_device_ids); +} + +/** * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge - * @handle - the ACPI CA node in question. - * - * Note: we could make this API take a struct acpi_device * instead, but - * for now, it's more convenient to operate on an acpi_handle. + * @handle: the ACPI CA node in question. */ int acpi_is_root_bridge(acpi_handle handle) { int ret; struct acpi_device *device; - ret = acpi_bus_get_device(handle, &device); + ret = !acpi_bus_get_device(handle, &device); if (ret) - return 0; - - ret = acpi_match_device_ids(device, root_device_ids); - if (ret) - return 0; - else - return 1; + ret = acpi_dev_is_root_bridge(device); + return ret; } EXPORT_SYMBOL_GPL(acpi_is_root_bridge); Index: linux-2.6/include/acpi/acpi_bus.h =================================================================== --- linux-2.6.orig/include/acpi/acpi_bus.h +++ linux-2.6/include/acpi/acpi_bus.h @@ -371,6 +371,7 @@ struct device *acpi_get_physical_device( /* helper */ acpi_handle acpi_get_child(acpi_handle, acpi_integer); +bool acpi_dev_is_root_bridge(struct acpi_device *); int acpi_is_root_bridge(acpi_handle); acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int); #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))