From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Rafael J. Wysocki" Subject: [PATCH] ACPI / scan: Allow ACPI drivers to bind to PNP device objects Date: Thu, 21 Aug 2014 06:04:51 +0200 Message-ID: <5487060.QsgluucUH4@vostro.rjw.lan> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7Bit Return-path: Received: from v094114.home.net.pl ([79.96.170.134]:52873 "HELO v094114.home.net.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1750809AbaHUDpw (ORCPT ); Wed, 20 Aug 2014 23:45:52 -0400 Sender: linux-acpi-owner@vger.kernel.org List-Id: linux-acpi@vger.kernel.org To: ACPI Devel Maling List Cc: Linux Kernel Mailing List , Zhang Rui , Gabriele Mazzotta , Dirk Griesbach , Matthew Garrett From: Rafael J. Wysocki We generally don't allow ACPI drivers to bind to ACPI device objects that companion "physical" device objects are created for to avoid situations in which two different drivers may attempt to handle one device at the same time. Recent ACPI device enumeration rework extended that approach to ACPI PNP devices by starting to use a scan handler for enumerating them. However, we previously allowed ACPI drivers to bind to ACPI device objects with existing PNP device companions and changing that led to functional regressions on some systems. For this reason, add a special check for PNP devices in acpi_device_probe() so that ACPI drivers can bind to ACPI device objects having existing PNP device companions as before. Fixes: eec15edbb0e1 (ACPI / PNP: use device ID list for PNPACPI device enumeration) Link: https://bugzilla.kernel.org/show_bug.cgi?id=81511 Link: https://bugzilla.kernel.org/show_bug.cgi?id=81971 Reported-and-tested-by: Gabriele Mazzotta Reported-and-tested-by: Dirk Griesbach Signed-off-by: Rafael J. Wysocki --- drivers/acpi/acpi_pnp.c | 5 +++++ drivers/acpi/internal.h | 1 + drivers/acpi/scan.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) Index: linux-pm/drivers/acpi/acpi_pnp.c =================================================================== --- linux-pm.orig/drivers/acpi/acpi_pnp.c +++ linux-pm/drivers/acpi/acpi_pnp.c @@ -396,3 +396,8 @@ void __init acpi_pnp_init(void) { acpi_scan_add_handler(&acpi_pnp_handler); } + +bool is_acpi_pnp_device(struct acpi_device *adev) +{ + return adev->handler == &acpi_pnp_handler; +} Index: linux-pm/drivers/acpi/internal.h =================================================================== --- linux-pm.orig/drivers/acpi/internal.h +++ linux-pm/drivers/acpi/internal.h @@ -86,6 +86,7 @@ void acpi_device_add_finalize(struct acp void acpi_free_pnp_ids(struct acpi_device_pnp *pnp); bool acpi_device_is_present(struct acpi_device *adev); bool acpi_device_is_battery(struct acpi_device *adev); +bool is_acpi_pnp_device(struct acpi_device *adev); /* -------------------------------------------------------------------------- Power Resource Index: linux-pm/drivers/acpi/scan.c =================================================================== --- linux-pm.orig/drivers/acpi/scan.c +++ linux-pm/drivers/acpi/scan.c @@ -975,7 +975,7 @@ static int acpi_device_probe(struct devi struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver); int ret; - if (acpi_dev->handler) + if (acpi_dev->handler && !is_acpi_pnp_device(acpi_dev)) return -EINVAL; if (!acpi_drv->ops.add)