Message ID | 5487060.QsgluucUH4@vostro.rjw.lan (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On Thu, 2014-08-21 at 06:04 +0200, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > 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 <gabriele.mzt@gmail.com> > Reported-and-tested-by: Dirk Griesbach <spamthis@freenet.de> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > 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; > +} can we reuse acpi_is_pnp_device()? The only difference is that acpi_is_pnp_device() returns true for RTC_CMOS devices, which is not a problem IMO because RTC CMOS devices have PNP driver only. thanks, rui > 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) -- 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-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)