On Thu, 22 Jun 2006 14:20:38 +0900
KAMEZAWA Hiroyuki <[EMAIL PROTECTED]> wrote:
> I'll try to write a patch.
> 

This is a patch. (against 2.6.17-mm1 but maybe okay to other kernels.)
Could you try this ?
But I'm not sure this is sane way or not..

Regards,
-Kame
=====
Index: linux-2.6.17-mm1/drivers/acpi/scan.c
===================================================================
--- linux-2.6.17-mm1.orig/drivers/acpi/scan.c
+++ linux-2.6.17-mm1/drivers/acpi/scan.c
@@ -231,6 +231,14 @@ static int acpi_bus_get_power_flags(stru
        return_VALUE(0);
 }
 
+static int acpi_match_hid(struct acpi_device *device, char *id)
+{
+       if (device->flags.hardware_id)
+               if (strstr(id, device->pnp.hardware_id))
+                       return 0;
+       return -ENOENT;
+}
+
 int acpi_match_ids(struct acpi_device *device, char *ids)
 {
        if (device->flags.hardware_id)
@@ -476,6 +484,14 @@ acpi_bus_match(struct acpi_device *devic
        return acpi_match_ids(device, driver->ids);
 }
 
+static int
+acpi_bus_hid_match(struct acpi_device *device, struct acpi_driver *driver)
+{
+       if (driver && driver->ops.match)
+               return driver->ops.match(device, driver);
+       return acpi_match_hid(device, driver->ids);
+}
+
 /**
  * acpi_bus_driver_init - add a device to a driver
  * @device: the device to add and initialize
@@ -647,8 +663,24 @@ static int acpi_bus_find_driver(struct a
        struct list_head *node, *next;
 
        ACPI_FUNCTION_TRACE("acpi_bus_find_driver");
-
        spin_lock(&acpi_device_lock);
+
+       /* At first, find driver for HID */
+       list_for_each_safe(node, next, &acpi_bus_drivers) {
+               struct acpi_driver *driver =
+                   container_of(node, struct acpi_driver, node);
+
+               atomic_inc(&driver->references);
+               spin_unlock(&acpi_device_lock);
+               if (!acpi_bus_hid_match(device, driver)) {
+                       result = acpi_bus_driver_init(device, driver);
+                       if (!result)
+                               goto Done;
+               }
+               atomic_dec(&driver->references);
+               spin_lock(&acpi_device_lock);
+       }
+       /* find driver for all IDs */
        list_for_each_safe(node, next, &acpi_bus_drivers) {
                struct acpi_driver *driver =
                    container_of(node, struct acpi_driver, node);

-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to