[kernel/f14/master] pnpacpi: cope with invalid device IDs. (rhbz#641468)

Kyle McMartin kyle at fedoraproject.org
Fri Oct 15 19:04:58 UTC 2010


commit 9ee136bcf74de7bd6aab8db8b8de545a786ebbe4
Author: Kyle McMartin <kyle at dreadnought.i.jkkm.org>
Date:   Fri Oct 15 15:04:48 2010 -0400

    pnpacpi: cope with invalid device IDs. (rhbz#641468)

 kernel.spec                                |    7 ++
 pnpacpi-cope-with-invalid-device-ids.patch |   85 ++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 0 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 66fb761..fdbfa26 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -751,6 +751,8 @@ Patch12595: sched-35-increment-cache_nice_tries-only-on-periodic-lb.patch
 Patch13600: btusb-macbookpro-6-2.patch
 Patch13601: btusb-macbookpro-7-1.patch
 
+Patch13603: pnpacpi-cope-with-invalid-device-ids.patch
+
 Patch13610: libata-it821x-dump-stack-on-cache-flush.patch
 Patch13620: xen-fix-typo-in-xen-irq-fix.patch
 
@@ -1402,6 +1404,8 @@ ApplyPatch libata-it821x-dump-stack-on-cache-flush.patch
 # temporary fix for typo in Xen -stable patch
 ApplyPatch xen-fix-typo-in-xen-irq-fix.patch
 
+# rhbz#641468
+ApplyPatch pnpacpi-cope-with-invalid-device-ids.patch
 
 # rhbz#641476
 ApplyPatch dm-allow-setting-of-uuid-via-rename-if-not-already-set.patch
@@ -1992,6 +1996,9 @@ fi
 # and build.
 
 %changelog
+* Fri Oct 15 2010 Kyle McMartin <kyle at redhat.com>
+- pnpacpi: cope with invalid device IDs. (rhbz#641468)
+
 * Fri Oct 15 2010 Peter Jones <pjones at redhat.com> 2.6.35.6-44
 - Add a missing dm_put in previous device mapper patch.
 
diff --git a/pnpacpi-cope-with-invalid-device-ids.patch b/pnpacpi-cope-with-invalid-device-ids.patch
new file mode 100644
index 0000000..70b2ab9
--- /dev/null
+++ b/pnpacpi-cope-with-invalid-device-ids.patch
@@ -0,0 +1,85 @@
+commit 420a0f66378c84b00b0e603e4d38210102dbe367
+Author: Dmitry Torokhov <dmitry.torokhov at gmail.com>
+Date:   Sat Sep 18 10:11:09 2010 -0700
+
+    PNPACPI: cope with invalid device IDs
+    
+    If primary ID (HID) is invalid try locating first valid ID on compatible
+    ID list before giving up.
+    
+    This helps, for example, to recognize i8042 AUX port on Sony Vaio VPCZ1
+    which uses SNYSYN0003 as HID. Without the patch users are forced to
+    boot with i8042.nopnp to make use of their touchpads.
+    
+    Tested-by: Jan-Hendrik Zab <jan at jhz.name>
+    Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+    Signed-off-by: Len Brown <len.brown at intel.com>
+
+diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
+index dc4e32e..0d943ee 100644
+--- a/drivers/pnp/pnpacpi/core.c
++++ b/drivers/pnp/pnpacpi/core.c
+@@ -28,7 +28,7 @@
+ #include "../base.h"
+ #include "pnpacpi.h"
+ 
+-static int num = 0;
++static int num;
+ 
+ /* We need only to blacklist devices that have already an acpi driver that
+  * can't use pnp layer. We don't need to blacklist device that are directly
+@@ -180,11 +180,24 @@ struct pnp_protocol pnpacpi_protocol = {
+ };
+ EXPORT_SYMBOL(pnpacpi_protocol);
+ 
++static char *pnpacpi_get_id(struct acpi_device *device)
++{
++	struct acpi_hardware_id *id;
++
++	list_for_each_entry(id, &device->pnp.ids, list) {
++		if (ispnpidacpi(id->id))
++			return id->id;
++	}
++
++	return NULL;
++}
++
+ static int __init pnpacpi_add_device(struct acpi_device *device)
+ {
+ 	acpi_handle temp = NULL;
+ 	acpi_status status;
+ 	struct pnp_dev *dev;
++	char *pnpid;
+ 	struct acpi_hardware_id *id;
+ 
+ 	/*
+@@ -192,11 +205,17 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
+ 	 * driver should not be loaded.
+ 	 */
+ 	status = acpi_get_handle(device->handle, "_CRS", &temp);
+-	if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
+-	    is_exclusive_device(device) || (!device->status.present))
++	if (ACPI_FAILURE(status))
++		return 0;
++
++	pnpid = pnpacpi_get_id(device);
++	if (!pnpid)
++		return 0;
++
++	if (is_exclusive_device(device) || !device->status.present)
+ 		return 0;
+ 
+-	dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device));
++	dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid);
+ 	if (!dev)
+ 		return -ENOMEM;
+ 
+@@ -227,7 +246,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
+ 		pnpacpi_parse_resource_option_data(dev);
+ 
+ 	list_for_each_entry(id, &device->pnp.ids, list) {
+-		if (!strcmp(id->id, acpi_device_hid(device)))
++		if (!strcmp(id->id, pnpid))
+ 			continue;
+ 		if (!ispnpidacpi(id->id))
+ 			continue;


More information about the scm-commits mailing list