diff options
| author | David S. Miller <davem@davemloft.net> | 2009-03-19 02:53:57 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-03-19 02:53:57 -0400 |
| commit | 0702b30dd821ac8a4103ddbe545518713fdca9be (patch) | |
| tree | 8ce0c9f5e58c5ccb99870505eecd139986caa05e /drivers/acpi | |
| parent | 192d7a4667c6d11d1a174ec4cad9a3c5d5f9043c (diff) | |
| parent | a1e4ee22863d41a6fbb24310d7951836cb6dafe7 (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'drivers/acpi')
| -rw-r--r-- | drivers/acpi/Kconfig | 7 | ||||
| -rw-r--r-- | drivers/acpi/Makefile | 2 | ||||
| -rw-r--r-- | drivers/acpi/battery.c | 25 | ||||
| -rw-r--r-- | drivers/acpi/bus.c | 9 | ||||
| -rw-r--r-- | drivers/acpi/ec.c | 9 | ||||
| -rw-r--r-- | drivers/acpi/numa.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/osl.c | 50 | ||||
| -rw-r--r-- | drivers/acpi/sleep.c | 16 |
8 files changed, 52 insertions, 68 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index a7799a99f2d9..8a851d0f4384 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
| @@ -254,13 +254,6 @@ config ACPI_PCI_SLOT | |||
| 254 | help you correlate PCI bus addresses with the physical geography | 254 | help you correlate PCI bus addresses with the physical geography |
| 255 | of your slots. If you are unsure, say N. | 255 | of your slots. If you are unsure, say N. |
| 256 | 256 | ||
| 257 | config ACPI_SYSTEM | ||
| 258 | bool | ||
| 259 | default y | ||
| 260 | help | ||
| 261 | This driver will enable your system to shut down using ACPI, and | ||
| 262 | dump your ACPI DSDT table using /proc/acpi/dsdt. | ||
| 263 | |||
| 264 | config X86_PM_TIMER | 257 | config X86_PM_TIMER |
| 265 | bool "Power Management Timer Support" if EMBEDDED | 258 | bool "Power Management Timer Support" if EMBEDDED |
| 266 | depends on X86 | 259 | depends on X86 |
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index 65d90c720b5a..b130ea0d0759 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
| @@ -52,7 +52,7 @@ obj-$(CONFIG_ACPI_PROCESSOR) += processor.o | |||
| 52 | obj-$(CONFIG_ACPI_CONTAINER) += container.o | 52 | obj-$(CONFIG_ACPI_CONTAINER) += container.o |
| 53 | obj-$(CONFIG_ACPI_THERMAL) += thermal.o | 53 | obj-$(CONFIG_ACPI_THERMAL) += thermal.o |
| 54 | obj-y += power.o | 54 | obj-y += power.o |
| 55 | obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o | 55 | obj-y += system.o event.o |
| 56 | obj-$(CONFIG_ACPI_DEBUG) += debug.o | 56 | obj-$(CONFIG_ACPI_DEBUG) += debug.o |
| 57 | obj-$(CONFIG_ACPI_NUMA) += numa.o | 57 | obj-$(CONFIG_ACPI_NUMA) += numa.o |
| 58 | obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o | 58 | obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 65132f920459..69cbc57c2d1c 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
| @@ -138,6 +138,29 @@ static int acpi_battery_technology(struct acpi_battery *battery) | |||
| 138 | 138 | ||
| 139 | static int acpi_battery_get_state(struct acpi_battery *battery); | 139 | static int acpi_battery_get_state(struct acpi_battery *battery); |
| 140 | 140 | ||
| 141 | static int acpi_battery_is_charged(struct acpi_battery *battery) | ||
| 142 | { | ||
| 143 | /* either charging or discharging */ | ||
| 144 | if (battery->state != 0) | ||
| 145 | return 0; | ||
| 146 | |||
| 147 | /* battery not reporting charge */ | ||
| 148 | if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN || | ||
| 149 | battery->capacity_now == 0) | ||
| 150 | return 0; | ||
| 151 | |||
| 152 | /* good batteries update full_charge as the batteries degrade */ | ||
| 153 | if (battery->full_charge_capacity == battery->capacity_now) | ||
| 154 | return 1; | ||
| 155 | |||
| 156 | /* fallback to using design values for broken batteries */ | ||
| 157 | if (battery->design_capacity == battery->capacity_now) | ||
| 158 | return 1; | ||
| 159 | |||
| 160 | /* we don't do any sort of metric based on percentages */ | ||
| 161 | return 0; | ||
| 162 | } | ||
| 163 | |||
| 141 | static int acpi_battery_get_property(struct power_supply *psy, | 164 | static int acpi_battery_get_property(struct power_supply *psy, |
| 142 | enum power_supply_property psp, | 165 | enum power_supply_property psp, |
| 143 | union power_supply_propval *val) | 166 | union power_supply_propval *val) |
| @@ -155,7 +178,7 @@ static int acpi_battery_get_property(struct power_supply *psy, | |||
| 155 | val->intval = POWER_SUPPLY_STATUS_DISCHARGING; | 178 | val->intval = POWER_SUPPLY_STATUS_DISCHARGING; |
| 156 | else if (battery->state & 0x02) | 179 | else if (battery->state & 0x02) |
| 157 | val->intval = POWER_SUPPLY_STATUS_CHARGING; | 180 | val->intval = POWER_SUPPLY_STATUS_CHARGING; |
| 158 | else if (battery->state == 0) | 181 | else if (acpi_battery_is_charged(battery)) |
| 159 | val->intval = POWER_SUPPLY_STATUS_FULL; | 182 | val->intval = POWER_SUPPLY_STATUS_FULL; |
| 160 | else | 183 | else |
| 161 | val->intval = POWER_SUPPLY_STATUS_UNKNOWN; | 184 | val->intval = POWER_SUPPLY_STATUS_UNKNOWN; |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 765fd1c56cd6..bee64b73c919 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
| @@ -758,8 +758,7 @@ static int __init acpi_bus_init(void) | |||
| 758 | acpi_status status = AE_OK; | 758 | acpi_status status = AE_OK; |
| 759 | extern acpi_status acpi_os_initialize1(void); | 759 | extern acpi_status acpi_os_initialize1(void); |
| 760 | 760 | ||
| 761 | 761 | acpi_os_initialize1(); | |
| 762 | status = acpi_os_initialize1(); | ||
| 763 | 762 | ||
| 764 | status = | 763 | status = |
| 765 | acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); | 764 | acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); |
| @@ -769,12 +768,6 @@ static int __init acpi_bus_init(void) | |||
| 769 | goto error1; | 768 | goto error1; |
| 770 | } | 769 | } |
| 771 | 770 | ||
| 772 | if (ACPI_FAILURE(status)) { | ||
| 773 | printk(KERN_ERR PREFIX | ||
| 774 | "Unable to initialize ACPI OS objects\n"); | ||
| 775 | goto error1; | ||
| 776 | } | ||
| 777 | |||
| 778 | /* | 771 | /* |
| 779 | * ACPI 2.0 requires the EC driver to be loaded and work before | 772 | * ACPI 2.0 requires the EC driver to be loaded and work before |
| 780 | * the EC device is found in the namespace (i.e. before acpi_initialize_objects() | 773 | * the EC device is found in the namespace (i.e. before acpi_initialize_objects() |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 5c2f5d343be6..2fe15060dcdc 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -120,6 +120,8 @@ static struct acpi_ec { | |||
| 120 | spinlock_t curr_lock; | 120 | spinlock_t curr_lock; |
| 121 | } *boot_ec, *first_ec; | 121 | } *boot_ec, *first_ec; |
| 122 | 122 | ||
| 123 | static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */ | ||
| 124 | |||
| 123 | /* -------------------------------------------------------------------------- | 125 | /* -------------------------------------------------------------------------- |
| 124 | Transaction Management | 126 | Transaction Management |
| 125 | -------------------------------------------------------------------------- */ | 127 | -------------------------------------------------------------------------- */ |
| @@ -259,6 +261,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
| 259 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); | 261 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); |
| 260 | acpi_disable_gpe(NULL, ec->gpe); | 262 | acpi_disable_gpe(NULL, ec->gpe); |
| 261 | } | 263 | } |
| 264 | if (EC_FLAGS_MSI) | ||
| 265 | udelay(ACPI_EC_DELAY); | ||
| 262 | /* start transaction */ | 266 | /* start transaction */ |
| 263 | spin_lock_irqsave(&ec->curr_lock, tmp); | 267 | spin_lock_irqsave(&ec->curr_lock, tmp); |
| 264 | /* following two actions should be kept atomic */ | 268 | /* following two actions should be kept atomic */ |
| @@ -967,6 +971,11 @@ int __init acpi_ec_ecdt_probe(void) | |||
| 967 | /* | 971 | /* |
| 968 | * Generate a boot ec context | 972 | * Generate a boot ec context |
| 969 | */ | 973 | */ |
| 974 | if (dmi_name_in_vendors("Micro-Star") || | ||
| 975 | dmi_name_in_vendors("Notebook")) { | ||
| 976 | pr_info(PREFIX "Enabling special treatment for EC from MSI.\n"); | ||
| 977 | EC_FLAGS_MSI = 1; | ||
| 978 | } | ||
| 970 | status = acpi_get_table(ACPI_SIG_ECDT, 1, | 979 | status = acpi_get_table(ACPI_SIG_ECDT, 1, |
| 971 | (struct acpi_table_header **)&ecdt_ptr); | 980 | (struct acpi_table_header **)&ecdt_ptr); |
| 972 | if (ACPI_SUCCESS(status)) { | 981 | if (ACPI_SUCCESS(status)) { |
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index c5e292aab0e3..3a0d8ef25c75 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
| @@ -277,7 +277,7 @@ int acpi_get_node(acpi_handle *handle) | |||
| 277 | int pxm, node = -1; | 277 | int pxm, node = -1; |
| 278 | 278 | ||
| 279 | pxm = acpi_get_pxm(handle); | 279 | pxm = acpi_get_pxm(handle); |
| 280 | if (pxm >= 0) | 280 | if (pxm >= 0 && pxm < MAX_PXM_DOMAINS) |
| 281 | node = acpi_map_pxm_to_node(pxm); | 281 | node = acpi_map_pxm_to_node(pxm); |
| 282 | 282 | ||
| 283 | return node; | 283 | return node; |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index b3193ec0a2ef..1e35f342957c 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -1317,54 +1317,6 @@ acpi_os_validate_interface (char *interface) | |||
| 1317 | return AE_SUPPORT; | 1317 | return AE_SUPPORT; |
| 1318 | } | 1318 | } |
| 1319 | 1319 | ||
| 1320 | #ifdef CONFIG_X86 | ||
| 1321 | |||
| 1322 | struct aml_port_desc { | ||
| 1323 | uint start; | ||
| 1324 | uint end; | ||
| 1325 | char* name; | ||
| 1326 | char warned; | ||
| 1327 | }; | ||
| 1328 | |||
| 1329 | static struct aml_port_desc aml_invalid_port_list[] = { | ||
| 1330 | {0x20, 0x21, "PIC0", 0}, | ||
| 1331 | {0xA0, 0xA1, "PIC1", 0}, | ||
| 1332 | {0x4D0, 0x4D1, "ELCR", 0} | ||
| 1333 | }; | ||
| 1334 | |||
| 1335 | /* | ||
| 1336 | * valid_aml_io_address() | ||
| 1337 | * | ||
| 1338 | * if valid, return true | ||
| 1339 | * else invalid, warn once, return false | ||
| 1340 | */ | ||
| 1341 | static bool valid_aml_io_address(uint address, uint length) | ||
| 1342 | { | ||
| 1343 | int i; | ||
| 1344 | int entries = sizeof(aml_invalid_port_list) / sizeof(struct aml_port_desc); | ||
| 1345 | |||
| 1346 | for (i = 0; i < entries; ++i) { | ||
| 1347 | if ((address >= aml_invalid_port_list[i].start && | ||
| 1348 | address <= aml_invalid_port_list[i].end) || | ||
| 1349 | (address + length >= aml_invalid_port_list[i].start && | ||
| 1350 | address + length <= aml_invalid_port_list[i].end)) | ||
| 1351 | { | ||
| 1352 | if (!aml_invalid_port_list[i].warned) | ||
| 1353 | { | ||
| 1354 | printk(KERN_ERR "ACPI: Denied BIOS AML access" | ||
| 1355 | " to invalid port 0x%x+0x%x (%s)\n", | ||
| 1356 | address, length, | ||
| 1357 | aml_invalid_port_list[i].name); | ||
| 1358 | aml_invalid_port_list[i].warned = 1; | ||
| 1359 | } | ||
| 1360 | return false; /* invalid */ | ||
| 1361 | } | ||
| 1362 | } | ||
| 1363 | return true; /* valid */ | ||
| 1364 | } | ||
| 1365 | #else | ||
| 1366 | static inline bool valid_aml_io_address(uint address, uint length) { return true; } | ||
| 1367 | #endif | ||
| 1368 | /****************************************************************************** | 1320 | /****************************************************************************** |
| 1369 | * | 1321 | * |
| 1370 | * FUNCTION: acpi_os_validate_address | 1322 | * FUNCTION: acpi_os_validate_address |
| @@ -1394,8 +1346,6 @@ acpi_os_validate_address ( | |||
| 1394 | 1346 | ||
| 1395 | switch (space_id) { | 1347 | switch (space_id) { |
| 1396 | case ACPI_ADR_SPACE_SYSTEM_IO: | 1348 | case ACPI_ADR_SPACE_SYSTEM_IO: |
| 1397 | if (!valid_aml_io_address(address, length)) | ||
| 1398 | return AE_AML_ILLEGAL_ADDRESS; | ||
| 1399 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | 1349 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: |
| 1400 | /* Only interference checks against SystemIO and SytemMemory | 1350 | /* Only interference checks against SystemIO and SytemMemory |
| 1401 | are needed */ | 1351 | are needed */ |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 519266654f06..00456fccfa38 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -378,6 +378,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 378 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), | 378 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), |
| 379 | }, | 379 | }, |
| 380 | }, | 380 | }, |
| 381 | { | ||
| 382 | .callback = init_old_suspend_ordering, | ||
| 383 | .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)", | ||
| 384 | .matches = { | ||
| 385 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."), | ||
| 386 | DMI_MATCH(DMI_BOARD_NAME, "M2N8L"), | ||
| 387 | }, | ||
| 388 | }, | ||
| 389 | { | ||
| 390 | .callback = init_set_sci_en_on_resume, | ||
| 391 | .ident = "Toshiba Satellite L300", | ||
| 392 | .matches = { | ||
| 393 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
| 394 | DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"), | ||
| 395 | }, | ||
| 396 | }, | ||
| 381 | {}, | 397 | {}, |
| 382 | }; | 398 | }; |
| 383 | #endif /* CONFIG_SUSPEND */ | 399 | #endif /* CONFIG_SUSPEND */ |
