Pull 5571 into release branch
authorLen Brown <len.brown@intel.com>
Thu, 1 Dec 2005 06:39:41 +0000 (01:39 -0500)
committerLen Brown <len.brown@intel.com>
Thu, 1 Dec 2005 06:39:41 +0000 (01:39 -0500)
arch/i386/kernel/acpi/boot.c
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/processor_idle.c
drivers/acpi/scan.c

index 76b1135..447fa9e 100644 (file)
@@ -638,6 +638,13 @@ static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
                        return 0;
 
                pmtmr_ioport = fadt->xpm_tmr_blk.address;
+               /*
+                * "X" fields are optional extensions to the original V1.0
+                * fields, so we must selectively expand V1.0 fields if the
+                * corresponding X field is zero.
+                */
+               if (!pmtmr_ioport)
+                       pmtmr_ioport = fadt->V1_pm_tmr_blk;
        } else {
                /* FADT rev. 1 */
                pmtmr_ioport = fadt->V1_pm_tmr_blk;
index fe1e812..fce21c2 100644 (file)
@@ -197,7 +197,6 @@ config ACPI_ASUS
 config ACPI_IBM
        tristate "IBM ThinkPad Laptop Extras"
        depends on X86
-       default y
        ---help---
          This is a Linux ACPI driver for the IBM ThinkPad laptops. It adds
          support for Fn-Fx key combinations, Bluetooth control, video
index a182434..5984b4f 100644 (file)
@@ -16,7 +16,7 @@ EXTRA_CFLAGS  += $(ACPI_CFLAGS)
 # ACPI Boot-Time Table Parsing
 #
 obj-y                          += tables.o
-obj-y                          += blacklist.o
+obj-$(CONFIG_X86)              += blacklist.o
 
 #
 # ACPI Core Subsystem (Interpreter)
index 70d8a6e..83fd1b6 100644 (file)
@@ -280,6 +280,16 @@ static void acpi_processor_idle(void)
 
        cx->usage++;
 
+#ifdef CONFIG_HOTPLUG_CPU
+       /*
+        * Check for P_LVL2_UP flag before entering C2 and above on
+        * an SMP system. We do it here instead of doing it at _CST/P_LVL
+        * detection phase, to work cleanly with logical CPU hotplug.
+        */
+       if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && 
+           !pr->flags.has_cst && acpi_fadt.plvl2_up)
+               cx->type = ACPI_STATE_C1;
+#endif
        /*
         * Sleep:
         * ------
@@ -534,6 +544,15 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
        pr->power.states[ACPI_STATE_C0].valid = 1;
        pr->power.states[ACPI_STATE_C1].valid = 1;
 
+#ifndef CONFIG_HOTPLUG_CPU
+       /*
+        * Check for P_LVL2_UP flag before entering C2 and above on
+        * an SMP system. 
+        */
+       if ((num_online_cpus() > 1) && acpi_fadt.plvl2_up)
+               return_VALUE(-ENODEV);
+#endif
+
        /* determine C2 and C3 address from pblk */
        pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4;
        pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5;
@@ -690,7 +709,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
 
        /* Validate number of power states discovered */
        if (pr->power.count < 2)
-               status = -ENODEV;
+               status = -EFAULT;
 
       end:
        acpi_os_free(buffer.pointer);
@@ -841,11 +860,11 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
         * this function */
 
        result = acpi_processor_get_power_info_cst(pr);
-       if ((result) || (acpi_processor_power_verify(pr) < 2)) {
+       if (result == -ENODEV)
                result = acpi_processor_get_power_info_fadt(pr);
-               if ((result) || (acpi_processor_power_verify(pr) < 2))
-                       result = acpi_processor_get_power_info_default_c1(pr);
-       }
+
+       if ((result) || (acpi_processor_power_verify(pr) < 2))
+               result = acpi_processor_get_power_info_default_c1(pr);
 
        /*
         * Set Default Policy
index 23e2c69..31218e1 100644 (file)
@@ -1110,7 +1110,7 @@ acpi_add_single_object(struct acpi_device **child,
         *
         * TBD: Assumes LDM provides driver hot-plug capability.
         */
-       result = acpi_bus_find_driver(device);
+       acpi_bus_find_driver(device);
 
       end:
        if (!result)