acpiphp: Execute ACPI _REG method for hotadded devices
Shaohua Li [Thu, 25 Feb 2010 02:59:34 +0000 (10:59 +0800)]
Per ACPI spec, _ERG method should be executed before device driver
gets control for hotpluged device. Firmware might do some configuration
there. See http://bugzilla.kernel.org/show_bug.cgi?id=10805. In this
machine, _REG method of docked device will configure cardbus bridge.

Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Tested-by: Paul Martin <pm@debian.org>
Signed-off-by: Len Brown <len.brown@intel.com>

drivers/pci/hotplug/acpiphp_glue.c

index cb2fd01..b5dad9f 100644 (file)
@@ -749,6 +749,24 @@ static int acpiphp_bus_trim(acpi_handle handle)
        return retval;
 }
 
+static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
+{
+       struct acpiphp_func *func;
+       union acpi_object params[2];
+       struct acpi_object_list arg_list;
+
+       list_for_each_entry(func, &slot->funcs, sibling) {
+               arg_list.count = 2;
+               arg_list.pointer = params;
+               params[0].type = ACPI_TYPE_INTEGER;
+               params[0].integer.value = ACPI_ADR_SPACE_PCI_CONFIG;
+               params[1].type = ACPI_TYPE_INTEGER;
+               params[1].integer.value = 1;
+               /* _REG is optional, we don't care about if there is failure */
+               acpi_evaluate_object(func->handle, "_REG", &arg_list, NULL);
+       }
+}
+
 /**
  * enable_device - enable, configure a slot
  * @slot: slot to be enabled
@@ -805,6 +823,7 @@ static int __ref enable_device(struct acpiphp_slot *slot)
        pci_bus_assign_resources(bus);
        acpiphp_sanitize_bus(bus);
        acpiphp_set_hpp_values(bus);
+       acpiphp_set_acpi_region(slot);
        pci_enable_bridges(bus);
        pci_bus_add_devices(bus);