]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/acpi/processor_core.c
Merge branch 'omap-pool'
[linux-2.6-omap-h63xx.git] / drivers / acpi / processor_core.c
index fa2f7422d23de1e2bec5ee3702fa15e2a5ca284c..45ad3288c5fffb35868a801d34a9adc31676a134 100644 (file)
@@ -82,7 +82,7 @@ static int acpi_processor_add(struct acpi_device *device);
 static int acpi_processor_start(struct acpi_device *device);
 static int acpi_processor_remove(struct acpi_device *device, int type);
 static int acpi_processor_info_open_fs(struct inode *inode, struct file *file);
-static void acpi_processor_notify(acpi_handle handle, u32 event, void *data);
+static void acpi_processor_notify(struct acpi_device *device, u32 event);
 static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu);
 static int acpi_processor_handle_eject(struct acpi_processor *pr);
 
@@ -104,6 +104,7 @@ static struct acpi_driver acpi_processor_driver = {
                .start = acpi_processor_start,
                .suspend = acpi_processor_suspend,
                .resume = acpi_processor_resume,
+               .notify = acpi_processor_notify,
                },
 };
 
@@ -426,6 +427,29 @@ static int map_lapic_id(struct acpi_subtable_header *entry,
        return 0;
 }
 
+static int map_x2apic_id(struct acpi_subtable_header *entry,
+                        int device_declaration, u32 acpi_id, int *apic_id)
+{
+       struct acpi_madt_local_x2apic *apic =
+               (struct acpi_madt_local_x2apic *)entry;
+       u32 tmp = apic->local_apic_id;
+
+       /* Only check enabled APICs*/
+       if (!(apic->lapic_flags & ACPI_MADT_ENABLED))
+               return 0;
+
+       /* Device statement declaration type */
+       if (device_declaration) {
+               if (apic->uid == acpi_id)
+                       goto found;
+       }
+
+       return 0;
+found:
+       *apic_id = tmp;
+       return 1;
+}
+
 static int map_lsapic_id(struct acpi_subtable_header *entry,
                int device_declaration, u32 acpi_id, int *apic_id)
 {
@@ -475,6 +499,9 @@ static int map_madt_entry(int type, u32 acpi_id)
                if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) {
                        if (map_lapic_id(header, acpi_id, &apic_id))
                                break;
+               } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) {
+                       if (map_x2apic_id(header, type, acpi_id, &apic_id))
+                               break;
                } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
                        if (map_lsapic_id(header, type, acpi_id, &apic_id))
                                break;
@@ -665,7 +692,6 @@ static DEFINE_PER_CPU(void *, processor_device_array);
 static int __cpuinit acpi_processor_start(struct acpi_device *device)
 {
        int result = 0;
-       acpi_status status = AE_OK;
        struct acpi_processor *pr;
        struct sys_device *sysdev;
 
@@ -702,9 +728,6 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
        if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev"))
                return -EFAULT;
 
-       status = acpi_install_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY,
-                                            acpi_processor_notify, pr);
-
        /* _PDC call should be done before doing anything else (if reqd.). */
        arch_acpi_processor_init_pdc(pr);
        acpi_processor_set_pdc(pr);
@@ -750,18 +773,14 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
        return result;
 }
 
-static void acpi_processor_notify(acpi_handle handle, u32 event, void *data)
+static void acpi_processor_notify(struct acpi_device *device, u32 event)
 {
-       struct acpi_processor *pr = data;
-       struct acpi_device *device = NULL;
+       struct acpi_processor *pr = acpi_driver_data(device);
        int saved;
 
        if (!pr)
                return;
 
-       if (acpi_bus_get_device(pr->handle, &device))
-               return;
-
        switch (event) {
        case ACPI_PROCESSOR_NOTIFY_PERFORMANCE:
                saved = pr->performance_platform_limit;
@@ -840,7 +859,6 @@ static int acpi_processor_add(struct acpi_device *device)
 
 static int acpi_processor_remove(struct acpi_device *device, int type)
 {
-       acpi_status status = AE_OK;
        struct acpi_processor *pr = NULL;
 
 
@@ -859,9 +877,6 @@ static int acpi_processor_remove(struct acpi_device *device, int type)
 
        acpi_processor_power_exit(pr, device);
 
-       status = acpi_remove_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY,
-                                           acpi_processor_notify);
-
        sysfs_remove_link(&device->dev.kobj, "sysdev");
 
        acpi_processor_remove_fs(device);