summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel.spec9
-rw-r--r--pnpacpi-cope-with-invalid-device-ids.patch85
2 files changed, 94 insertions, 0 deletions
diff --git a/kernel.spec b/kernel.spec
index b4294397d..c9dc2d173 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -724,6 +724,8 @@ Patch12224: pci-v2-4-4-PCI-allocate-bus-resources-from-the-top-down.patch
Patch12300: btusb-macbookpro-7-1.patch
Patch12301: btusb-macbookpro-6-2.patch
+Patch12302: pnpacpi-cope-with-invalid-device-ids.patch
+
%endif
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
@@ -1333,6 +1335,9 @@ ApplyPatch pci-v2-4-4-PCI-allocate-bus-resources-from-the-top-down.patch
ApplyPatch btusb-macbookpro-7-1.patch
ApplyPatch btusb-macbookpro-6-2.patch
+# rhbz#641468
+ApplyPatch pnpacpi-cope-with-invalid-device-ids.patch
+
# END OF PATCH APPLICATIONS
%endif
@@ -1940,6 +1945,10 @@ fi
# || ||
%changelog
+* Fri Oct 15 2010 Kyle McMartin <kyle@redhat.com>
+- backport pnpacpi-cope-with-invalid-device-ids from linux-next.
+ (rhbz#641468)
+
* Fri Oct 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.36-0.39.rc8.git0
- Linux 2.6.36-rc8.
diff --git a/pnpacpi-cope-with-invalid-device-ids.patch b/pnpacpi-cope-with-invalid-device-ids.patch
new file mode 100644
index 000000000..70b2ab968
--- /dev/null
+++ b/pnpacpi-cope-with-invalid-device-ids.patch
@@ -0,0 +1,85 @@
+commit 420a0f66378c84b00b0e603e4d38210102dbe367
+Author: Dmitry Torokhov <dmitry.torokhov@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@jhz.name>
+ Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+ Signed-off-by: Len Brown <len.brown@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;