diff options
-rw-r--r-- | kernel.spec | 9 | ||||
-rw-r--r-- | pnpacpi-cope-with-invalid-device-ids.patch | 85 |
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; |