diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-03 03:17:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-03 03:17:02 -0400 |
commit | c299eba3c5a801657f275d33be588b34831cd30e (patch) | |
tree | 022a2a72604443fa8ce8d3fd040fbda49b04f681 /drivers/acpi | |
parent | 1850536b93888e6cc3ee42e63e20e61f35f8b3e2 (diff) | |
parent | 4a8f5058bde15d737abe39b5bed3f21dcb6599d2 (diff) |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (28 commits)
ACPI: delete stale reference in kernel-parameters.txt
ACPI: add missing _OSI strings
ACPI: remove NID_INVAL
thermal: make THERMAL_HWMON implementation fully internal
thermal: split hwmon lookup to a separate function
thermal: hide CONFIG_THERMAL_HWMON
ACPI print OSI(Linux) warning only once
ACPI: DMI workaround for Asus A8N-SLI Premium and Asus A8N-SLI DELUX
ACPI / Battery: propagate sysfs error in acpi_battery_add()
ACPI / Battery: avoid acpi_battery_add() use-after-free
ACPI: introduce "acpi_rsdp=" parameter for kdump
ACPI: constify ops structs
ACPI: fix CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS
ACPI: fix 80 char overflow
ACPI / Battery: Resolve the race condition in the sysfs_remove_battery()
ACPI / Battery: Add the check before refresh sysfs in the battery_notify()
ACPI / Battery: Add the hibernation process in the battery_notify()
ACPI / Battery: Rename acpi_battery_quirks2 with acpi_battery_quirks
ACPI / Battery: Change 16-bit signed negative battery current into correct value
ACPI / Battery: Add the power unit macro
...
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/acpica/acglobal.h | 6 | ||||
-rw-r--r-- | drivers/acpi/acpica/aclocal.h | 1 | ||||
-rw-r--r-- | drivers/acpi/acpica/acpredef.h | 1 | ||||
-rw-r--r-- | drivers/acpi/acpica/nspredef.c | 19 | ||||
-rw-r--r-- | drivers/acpi/acpica/nsrepair2.c | 15 | ||||
-rw-r--r-- | drivers/acpi/acpica/tbinstal.c | 27 | ||||
-rw-r--r-- | drivers/acpi/battery.c | 82 | ||||
-rw-r--r-- | drivers/acpi/dock.c | 4 | ||||
-rw-r--r-- | drivers/acpi/ec_sys.c | 2 | ||||
-rw-r--r-- | drivers/acpi/fan.c | 2 | ||||
-rw-r--r-- | drivers/acpi/osl.c | 25 | ||||
-rw-r--r-- | drivers/acpi/pci_irq.c | 58 | ||||
-rw-r--r-- | drivers/acpi/pci_root.c | 3 | ||||
-rw-r--r-- | drivers/acpi/processor_thermal.c | 2 | ||||
-rw-r--r-- | drivers/acpi/sbs.c | 13 | ||||
-rw-r--r-- | drivers/acpi/sleep.c | 16 | ||||
-rw-r--r-- | drivers/acpi/sysfs.c | 4 | ||||
-rw-r--r-- | drivers/acpi/thermal.c | 2 | ||||
-rw-r--r-- | drivers/acpi/video.c | 2 |
19 files changed, 227 insertions, 57 deletions
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index 73863d86f022..76dc02f15574 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
@@ -126,6 +126,12 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); | |||
126 | */ | 126 | */ |
127 | u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE); | 127 | u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE); |
128 | 128 | ||
129 | /* | ||
130 | * Disable runtime checking and repair of values returned by control methods. | ||
131 | * Use only if the repair is causing a problem on a particular machine. | ||
132 | */ | ||
133 | u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_auto_repair, FALSE); | ||
134 | |||
129 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ | 135 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ |
130 | 136 | ||
131 | struct acpi_table_fadt acpi_gbl_FADT; | 137 | struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index c7f743ca395b..5552125d8340 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
@@ -357,6 +357,7 @@ struct acpi_predefined_data { | |||
357 | char *pathname; | 357 | char *pathname; |
358 | const union acpi_predefined_info *predefined; | 358 | const union acpi_predefined_info *predefined; |
359 | union acpi_operand_object *parent_package; | 359 | union acpi_operand_object *parent_package; |
360 | struct acpi_namespace_node *node; | ||
360 | u32 flags; | 361 | u32 flags; |
361 | u8 node_flags; | 362 | u8 node_flags; |
362 | }; | 363 | }; |
diff --git a/drivers/acpi/acpica/acpredef.h b/drivers/acpi/acpica/acpredef.h index 94e73c97cf85..c445cca490ea 100644 --- a/drivers/acpi/acpica/acpredef.h +++ b/drivers/acpi/acpica/acpredef.h | |||
@@ -468,6 +468,7 @@ static const union acpi_predefined_info predefined_names[] = | |||
468 | {{"_SWS", 0, ACPI_RTYPE_INTEGER}}, | 468 | {{"_SWS", 0, ACPI_RTYPE_INTEGER}}, |
469 | {{"_TC1", 0, ACPI_RTYPE_INTEGER}}, | 469 | {{"_TC1", 0, ACPI_RTYPE_INTEGER}}, |
470 | {{"_TC2", 0, ACPI_RTYPE_INTEGER}}, | 470 | {{"_TC2", 0, ACPI_RTYPE_INTEGER}}, |
471 | {{"_TDL", 0, ACPI_RTYPE_INTEGER}}, | ||
471 | {{"_TIP", 1, ACPI_RTYPE_INTEGER}}, | 472 | {{"_TIP", 1, ACPI_RTYPE_INTEGER}}, |
472 | {{"_TIV", 1, ACPI_RTYPE_INTEGER}}, | 473 | {{"_TIV", 1, ACPI_RTYPE_INTEGER}}, |
473 | {{"_TMP", 0, ACPI_RTYPE_INTEGER}}, | 474 | {{"_TMP", 0, ACPI_RTYPE_INTEGER}}, |
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index 9fb03fa8ffde..c845c8089f39 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c | |||
@@ -193,14 +193,20 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
193 | } | 193 | } |
194 | 194 | ||
195 | /* | 195 | /* |
196 | * 1) We have a return value, but if one wasn't expected, just exit, this is | 196 | * Return value validation and possible repair. |
197 | * not a problem. For example, if the "Implicit Return" feature is | ||
198 | * enabled, methods will always return a value. | ||
199 | * | 197 | * |
200 | * 2) If the return value can be of any type, then we cannot perform any | 198 | * 1) Don't perform return value validation/repair if this feature |
201 | * validation, exit. | 199 | * has been disabled via a global option. |
200 | * | ||
201 | * 2) We have a return value, but if one wasn't expected, just exit, | ||
202 | * this is not a problem. For example, if the "Implicit Return" | ||
203 | * feature is enabled, methods will always return a value. | ||
204 | * | ||
205 | * 3) If the return value can be of any type, then we cannot perform | ||
206 | * any validation, just exit. | ||
202 | */ | 207 | */ |
203 | if ((!predefined->info.expected_btypes) || | 208 | if (acpi_gbl_disable_auto_repair || |
209 | (!predefined->info.expected_btypes) || | ||
204 | (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { | 210 | (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { |
205 | goto cleanup; | 211 | goto cleanup; |
206 | } | 212 | } |
@@ -212,6 +218,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
212 | goto cleanup; | 218 | goto cleanup; |
213 | } | 219 | } |
214 | data->predefined = predefined; | 220 | data->predefined = predefined; |
221 | data->node = node; | ||
215 | data->node_flags = node->flags; | 222 | data->node_flags = node->flags; |
216 | data->pathname = pathname; | 223 | data->pathname = pathname; |
217 | 224 | ||
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c index 973883babee1..024c4f263f87 100644 --- a/drivers/acpi/acpica/nsrepair2.c +++ b/drivers/acpi/acpica/nsrepair2.c | |||
@@ -503,6 +503,21 @@ acpi_ns_repair_TSS(struct acpi_predefined_data *data, | |||
503 | { | 503 | { |
504 | union acpi_operand_object *return_object = *return_object_ptr; | 504 | union acpi_operand_object *return_object = *return_object_ptr; |
505 | acpi_status status; | 505 | acpi_status status; |
506 | struct acpi_namespace_node *node; | ||
507 | |||
508 | /* | ||
509 | * We can only sort the _TSS return package if there is no _PSS in the | ||
510 | * same scope. This is because if _PSS is present, the ACPI specification | ||
511 | * dictates that the _TSS Power Dissipation field is to be ignored, and | ||
512 | * therefore some BIOSs leave garbage values in the _TSS Power field(s). | ||
513 | * In this case, it is best to just return the _TSS package as-is. | ||
514 | * (May, 2011) | ||
515 | */ | ||
516 | status = | ||
517 | acpi_ns_get_node(data->node, "^_PSS", ACPI_NS_NO_UPSEARCH, &node); | ||
518 | if (ACPI_SUCCESS(status)) { | ||
519 | return (AE_OK); | ||
520 | } | ||
506 | 521 | ||
507 | status = acpi_ns_check_sorted_list(data, return_object, 5, 1, | 522 | status = acpi_ns_check_sorted_list(data, return_object, 5, 1, |
508 | ACPI_SORT_DESCENDING, | 523 | ACPI_SORT_DESCENDING, |
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c index 48db0944ce4a..62365f6075dd 100644 --- a/drivers/acpi/acpica/tbinstal.c +++ b/drivers/acpi/acpica/tbinstal.c | |||
@@ -126,12 +126,29 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index) | |||
126 | } | 126 | } |
127 | 127 | ||
128 | /* | 128 | /* |
129 | * Originally, we checked the table signature for "SSDT" or "PSDT" here. | 129 | * Validate the incoming table signature. |
130 | * Next, we added support for OEMx tables, signature "OEM". | 130 | * |
131 | * Valid tables were encountered with a null signature, so we've just | 131 | * 1) Originally, we checked the table signature for "SSDT" or "PSDT". |
132 | * given up on validating the signature, since it seems to be a waste | 132 | * 2) We added support for OEMx tables, signature "OEM". |
133 | * of code. The original code was removed (05/2008). | 133 | * 3) Valid tables were encountered with a null signature, so we just |
134 | * gave up on validating the signature, (05/2008). | ||
135 | * 4) We encountered non-AML tables such as the MADT, which caused | ||
136 | * interpreter errors and kernel faults. So now, we once again allow | ||
137 | * only "SSDT", "OEMx", and now, also a null signature. (05/2011). | ||
134 | */ | 138 | */ |
139 | if ((table_desc->pointer->signature[0] != 0x00) && | ||
140 | (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)) | ||
141 | && (ACPI_STRNCMP(table_desc->pointer->signature, "OEM", 3))) { | ||
142 | ACPI_ERROR((AE_INFO, | ||
143 | "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx", | ||
144 | acpi_ut_valid_acpi_name(*(u32 *)table_desc-> | ||
145 | pointer-> | ||
146 | signature) ? table_desc-> | ||
147 | pointer->signature : "????", | ||
148 | *(u32 *)table_desc->pointer->signature)); | ||
149 | |||
150 | return_ACPI_STATUS(AE_BAD_SIGNATURE); | ||
151 | } | ||
135 | 152 | ||
136 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 153 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
137 | 154 | ||
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 2c661353e8f2..87c0a8daa99a 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -55,6 +55,9 @@ | |||
55 | #define ACPI_BATTERY_NOTIFY_INFO 0x81 | 55 | #define ACPI_BATTERY_NOTIFY_INFO 0x81 |
56 | #define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 | 56 | #define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 |
57 | 57 | ||
58 | /* Battery power unit: 0 means mW, 1 means mA */ | ||
59 | #define ACPI_BATTERY_POWER_UNIT_MA 1 | ||
60 | |||
58 | #define _COMPONENT ACPI_BATTERY_COMPONENT | 61 | #define _COMPONENT ACPI_BATTERY_COMPONENT |
59 | 62 | ||
60 | ACPI_MODULE_NAME("battery"); | 63 | ACPI_MODULE_NAME("battery"); |
@@ -91,11 +94,6 @@ MODULE_DEVICE_TABLE(acpi, battery_device_ids); | |||
91 | enum { | 94 | enum { |
92 | ACPI_BATTERY_ALARM_PRESENT, | 95 | ACPI_BATTERY_ALARM_PRESENT, |
93 | ACPI_BATTERY_XINFO_PRESENT, | 96 | ACPI_BATTERY_XINFO_PRESENT, |
94 | /* For buggy DSDTs that report negative 16-bit values for either | ||
95 | * charging or discharging current and/or report 0 as 65536 | ||
96 | * due to bad math. | ||
97 | */ | ||
98 | ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, | ||
99 | ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, | 97 | ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, |
100 | }; | 98 | }; |
101 | 99 | ||
@@ -301,7 +299,8 @@ static enum power_supply_property energy_battery_props[] = { | |||
301 | #ifdef CONFIG_ACPI_PROCFS_POWER | 299 | #ifdef CONFIG_ACPI_PROCFS_POWER |
302 | inline char *acpi_battery_units(struct acpi_battery *battery) | 300 | inline char *acpi_battery_units(struct acpi_battery *battery) |
303 | { | 301 | { |
304 | return (battery->power_unit)?"mA":"mW"; | 302 | return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ? |
303 | "mA" : "mW"; | ||
305 | } | 304 | } |
306 | #endif | 305 | #endif |
307 | 306 | ||
@@ -461,9 +460,17 @@ static int acpi_battery_get_state(struct acpi_battery *battery) | |||
461 | battery->update_time = jiffies; | 460 | battery->update_time = jiffies; |
462 | kfree(buffer.pointer); | 461 | kfree(buffer.pointer); |
463 | 462 | ||
464 | if (test_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags) && | 463 | /* For buggy DSDTs that report negative 16-bit values for either |
465 | battery->rate_now != -1) | 464 | * charging or discharging current and/or report 0 as 65536 |
465 | * due to bad math. | ||
466 | */ | ||
467 | if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA && | ||
468 | battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && | ||
469 | (s16)(battery->rate_now) < 0) { | ||
466 | battery->rate_now = abs((s16)battery->rate_now); | 470 | battery->rate_now = abs((s16)battery->rate_now); |
471 | printk_once(KERN_WARNING FW_BUG "battery: (dis)charge rate" | ||
472 | " invalid.\n"); | ||
473 | } | ||
467 | 474 | ||
468 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) | 475 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) |
469 | && battery->capacity_now >= 0 && battery->capacity_now <= 100) | 476 | && battery->capacity_now >= 0 && battery->capacity_now <= 100) |
@@ -544,7 +551,7 @@ static int sysfs_add_battery(struct acpi_battery *battery) | |||
544 | { | 551 | { |
545 | int result; | 552 | int result; |
546 | 553 | ||
547 | if (battery->power_unit) { | 554 | if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { |
548 | battery->bat.properties = charge_battery_props; | 555 | battery->bat.properties = charge_battery_props; |
549 | battery->bat.num_properties = | 556 | battery->bat.num_properties = |
550 | ARRAY_SIZE(charge_battery_props); | 557 | ARRAY_SIZE(charge_battery_props); |
@@ -566,18 +573,16 @@ static int sysfs_add_battery(struct acpi_battery *battery) | |||
566 | 573 | ||
567 | static void sysfs_remove_battery(struct acpi_battery *battery) | 574 | static void sysfs_remove_battery(struct acpi_battery *battery) |
568 | { | 575 | { |
569 | if (!battery->bat.dev) | 576 | mutex_lock(&battery->lock); |
577 | if (!battery->bat.dev) { | ||
578 | mutex_unlock(&battery->lock); | ||
570 | return; | 579 | return; |
580 | } | ||
581 | |||
571 | device_remove_file(battery->bat.dev, &alarm_attr); | 582 | device_remove_file(battery->bat.dev, &alarm_attr); |
572 | power_supply_unregister(&battery->bat); | 583 | power_supply_unregister(&battery->bat); |
573 | battery->bat.dev = NULL; | 584 | battery->bat.dev = NULL; |
574 | } | 585 | mutex_unlock(&battery->lock); |
575 | |||
576 | static void acpi_battery_quirks(struct acpi_battery *battery) | ||
577 | { | ||
578 | if (dmi_name_in_vendors("Acer") && battery->power_unit) { | ||
579 | set_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags); | ||
580 | } | ||
581 | } | 586 | } |
582 | 587 | ||
583 | /* | 588 | /* |
@@ -592,7 +597,7 @@ static void acpi_battery_quirks(struct acpi_battery *battery) | |||
592 | * | 597 | * |
593 | * Handle this correctly so that they won't break userspace. | 598 | * Handle this correctly so that they won't break userspace. |
594 | */ | 599 | */ |
595 | static void acpi_battery_quirks2(struct acpi_battery *battery) | 600 | static void acpi_battery_quirks(struct acpi_battery *battery) |
596 | { | 601 | { |
597 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) | 602 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) |
598 | return ; | 603 | return ; |
@@ -623,13 +628,15 @@ static int acpi_battery_update(struct acpi_battery *battery) | |||
623 | result = acpi_battery_get_info(battery); | 628 | result = acpi_battery_get_info(battery); |
624 | if (result) | 629 | if (result) |
625 | return result; | 630 | return result; |
626 | acpi_battery_quirks(battery); | ||
627 | acpi_battery_init_alarm(battery); | 631 | acpi_battery_init_alarm(battery); |
628 | } | 632 | } |
629 | if (!battery->bat.dev) | 633 | if (!battery->bat.dev) { |
630 | sysfs_add_battery(battery); | 634 | result = sysfs_add_battery(battery); |
635 | if (result) | ||
636 | return result; | ||
637 | } | ||
631 | result = acpi_battery_get_state(battery); | 638 | result = acpi_battery_get_state(battery); |
632 | acpi_battery_quirks2(battery); | 639 | acpi_battery_quirks(battery); |
633 | return result; | 640 | return result; |
634 | } | 641 | } |
635 | 642 | ||
@@ -863,7 +870,7 @@ DECLARE_FILE_FUNCTIONS(alarm); | |||
863 | }, \ | 870 | }, \ |
864 | } | 871 | } |
865 | 872 | ||
866 | static struct battery_file { | 873 | static const struct battery_file { |
867 | struct file_operations ops; | 874 | struct file_operations ops; |
868 | mode_t mode; | 875 | mode_t mode; |
869 | const char *name; | 876 | const char *name; |
@@ -948,9 +955,12 @@ static int battery_notify(struct notifier_block *nb, | |||
948 | struct acpi_battery *battery = container_of(nb, struct acpi_battery, | 955 | struct acpi_battery *battery = container_of(nb, struct acpi_battery, |
949 | pm_nb); | 956 | pm_nb); |
950 | switch (mode) { | 957 | switch (mode) { |
958 | case PM_POST_HIBERNATION: | ||
951 | case PM_POST_SUSPEND: | 959 | case PM_POST_SUSPEND: |
952 | sysfs_remove_battery(battery); | 960 | if (battery->bat.dev) { |
953 | sysfs_add_battery(battery); | 961 | sysfs_remove_battery(battery); |
962 | sysfs_add_battery(battery); | ||
963 | } | ||
954 | break; | 964 | break; |
955 | } | 965 | } |
956 | 966 | ||
@@ -975,25 +985,33 @@ static int acpi_battery_add(struct acpi_device *device) | |||
975 | if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, | 985 | if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, |
976 | "_BIX", &handle))) | 986 | "_BIX", &handle))) |
977 | set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); | 987 | set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); |
978 | acpi_battery_update(battery); | 988 | result = acpi_battery_update(battery); |
989 | if (result) | ||
990 | goto fail; | ||
979 | #ifdef CONFIG_ACPI_PROCFS_POWER | 991 | #ifdef CONFIG_ACPI_PROCFS_POWER |
980 | result = acpi_battery_add_fs(device); | 992 | result = acpi_battery_add_fs(device); |
981 | #endif | 993 | #endif |
982 | if (!result) { | 994 | if (result) { |
983 | printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", | ||
984 | ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), | ||
985 | device->status.battery_present ? "present" : "absent"); | ||
986 | } else { | ||
987 | #ifdef CONFIG_ACPI_PROCFS_POWER | 995 | #ifdef CONFIG_ACPI_PROCFS_POWER |
988 | acpi_battery_remove_fs(device); | 996 | acpi_battery_remove_fs(device); |
989 | #endif | 997 | #endif |
990 | kfree(battery); | 998 | goto fail; |
991 | } | 999 | } |
992 | 1000 | ||
1001 | printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", | ||
1002 | ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), | ||
1003 | device->status.battery_present ? "present" : "absent"); | ||
1004 | |||
993 | battery->pm_nb.notifier_call = battery_notify; | 1005 | battery->pm_nb.notifier_call = battery_notify; |
994 | register_pm_notifier(&battery->pm_nb); | 1006 | register_pm_notifier(&battery->pm_nb); |
995 | 1007 | ||
996 | return result; | 1008 | return result; |
1009 | |||
1010 | fail: | ||
1011 | sysfs_remove_battery(battery); | ||
1012 | mutex_destroy(&battery->lock); | ||
1013 | kfree(battery); | ||
1014 | return result; | ||
997 | } | 1015 | } |
998 | 1016 | ||
999 | static int acpi_battery_remove(struct acpi_device *device, int type) | 1017 | static int acpi_battery_remove(struct acpi_device *device, int type) |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 1864ad3cf895..19a61136d848 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -77,7 +77,7 @@ struct dock_dependent_device { | |||
77 | struct list_head list; | 77 | struct list_head list; |
78 | struct list_head hotplug_list; | 78 | struct list_head hotplug_list; |
79 | acpi_handle handle; | 79 | acpi_handle handle; |
80 | struct acpi_dock_ops *ops; | 80 | const struct acpi_dock_ops *ops; |
81 | void *context; | 81 | void *context; |
82 | }; | 82 | }; |
83 | 83 | ||
@@ -589,7 +589,7 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier); | |||
589 | * the dock driver after _DCK is executed. | 589 | * the dock driver after _DCK is executed. |
590 | */ | 590 | */ |
591 | int | 591 | int |
592 | register_hotplug_dock_device(acpi_handle handle, struct acpi_dock_ops *ops, | 592 | register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops, |
593 | void *context) | 593 | void *context) |
594 | { | 594 | { |
595 | struct dock_dependent_device *dd; | 595 | struct dock_dependent_device *dd; |
diff --git a/drivers/acpi/ec_sys.c b/drivers/acpi/ec_sys.c index 05b44201a614..22f918bacd35 100644 --- a/drivers/acpi/ec_sys.c +++ b/drivers/acpi/ec_sys.c | |||
@@ -92,7 +92,7 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf, | |||
92 | return count; | 92 | return count; |
93 | } | 93 | } |
94 | 94 | ||
95 | static struct file_operations acpi_ec_io_ops = { | 95 | static const struct file_operations acpi_ec_io_ops = { |
96 | .owner = THIS_MODULE, | 96 | .owner = THIS_MODULE, |
97 | .open = acpi_ec_open_io, | 97 | .open = acpi_ec_open_io, |
98 | .read = acpi_ec_read_io, | 98 | .read = acpi_ec_read_io, |
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index 467479f07c1f..0f0356ca1a9e 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
@@ -110,7 +110,7 @@ fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) | |||
110 | return result; | 110 | return result; |
111 | } | 111 | } |
112 | 112 | ||
113 | static struct thermal_cooling_device_ops fan_cooling_ops = { | 113 | static const struct thermal_cooling_device_ops fan_cooling_ops = { |
114 | .get_max_state = fan_get_max_state, | 114 | .get_max_state = fan_get_max_state, |
115 | .get_cur_state = fan_get_cur_state, | 115 | .get_cur_state = fan_get_cur_state, |
116 | .set_cur_state = fan_set_cur_state, | 116 | .set_cur_state = fan_set_cur_state, |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 372f9b70f7f4..fa32f584229f 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -155,7 +155,7 @@ static u32 acpi_osi_handler(acpi_string interface, u32 supported) | |||
155 | { | 155 | { |
156 | if (!strcmp("Linux", interface)) { | 156 | if (!strcmp("Linux", interface)) { |
157 | 157 | ||
158 | printk(KERN_NOTICE FW_BUG PREFIX | 158 | printk_once(KERN_NOTICE FW_BUG PREFIX |
159 | "BIOS _OSI(Linux) query %s%s\n", | 159 | "BIOS _OSI(Linux) query %s%s\n", |
160 | osi_linux.enable ? "honored" : "ignored", | 160 | osi_linux.enable ? "honored" : "ignored", |
161 | osi_linux.cmdline ? " via cmdline" : | 161 | osi_linux.cmdline ? " via cmdline" : |
@@ -237,8 +237,23 @@ void acpi_os_vprintf(const char *fmt, va_list args) | |||
237 | #endif | 237 | #endif |
238 | } | 238 | } |
239 | 239 | ||
240 | #ifdef CONFIG_KEXEC | ||
241 | static unsigned long acpi_rsdp; | ||
242 | static int __init setup_acpi_rsdp(char *arg) | ||
243 | { | ||
244 | acpi_rsdp = simple_strtoul(arg, NULL, 16); | ||
245 | return 0; | ||
246 | } | ||
247 | early_param("acpi_rsdp", setup_acpi_rsdp); | ||
248 | #endif | ||
249 | |||
240 | acpi_physical_address __init acpi_os_get_root_pointer(void) | 250 | acpi_physical_address __init acpi_os_get_root_pointer(void) |
241 | { | 251 | { |
252 | #ifdef CONFIG_KEXEC | ||
253 | if (acpi_rsdp) | ||
254 | return acpi_rsdp; | ||
255 | #endif | ||
256 | |||
242 | if (efi_enabled) { | 257 | if (efi_enabled) { |
243 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) | 258 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) |
244 | return efi.acpi20; | 259 | return efi.acpi20; |
@@ -1083,7 +1098,13 @@ struct osi_setup_entry { | |||
1083 | bool enable; | 1098 | bool enable; |
1084 | }; | 1099 | }; |
1085 | 1100 | ||
1086 | static struct osi_setup_entry __initdata osi_setup_entries[OSI_STRING_ENTRIES_MAX]; | 1101 | static struct osi_setup_entry __initdata |
1102 | osi_setup_entries[OSI_STRING_ENTRIES_MAX] = { | ||
1103 | {"Module Device", true}, | ||
1104 | {"Processor Device", true}, | ||
1105 | {"3.0 _SCP Extensions", true}, | ||
1106 | {"Processor Aggregator Device", true}, | ||
1107 | }; | ||
1087 | 1108 | ||
1088 | void __init acpi_osi_setup(char *str) | 1109 | void __init acpi_osi_setup(char *str) |
1089 | { | 1110 | { |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index f907cfbfa13c..7f9eba9a0b02 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -303,6 +303,61 @@ void acpi_pci_irq_del_prt(struct pci_bus *bus) | |||
303 | /* -------------------------------------------------------------------------- | 303 | /* -------------------------------------------------------------------------- |
304 | PCI Interrupt Routing Support | 304 | PCI Interrupt Routing Support |
305 | -------------------------------------------------------------------------- */ | 305 | -------------------------------------------------------------------------- */ |
306 | #ifdef CONFIG_X86_IO_APIC | ||
307 | extern int noioapicquirk; | ||
308 | extern int noioapicreroute; | ||
309 | |||
310 | static int bridge_has_boot_interrupt_variant(struct pci_bus *bus) | ||
311 | { | ||
312 | struct pci_bus *bus_it; | ||
313 | |||
314 | for (bus_it = bus ; bus_it ; bus_it = bus_it->parent) { | ||
315 | if (!bus_it->self) | ||
316 | return 0; | ||
317 | if (bus_it->self->irq_reroute_variant) | ||
318 | return bus_it->self->irq_reroute_variant; | ||
319 | } | ||
320 | return 0; | ||
321 | } | ||
322 | |||
323 | /* | ||
324 | * Some chipsets (e.g. Intel 6700PXH) generate a legacy INTx when the IRQ | ||
325 | * entry in the chipset's IO-APIC is masked (as, e.g. the RT kernel does | ||
326 | * during interrupt handling). When this INTx generation cannot be disabled, | ||
327 | * we reroute these interrupts to their legacy equivalent to get rid of | ||
328 | * spurious interrupts. | ||
329 | */ | ||
330 | static int acpi_reroute_boot_interrupt(struct pci_dev *dev, | ||
331 | struct acpi_prt_entry *entry) | ||
332 | { | ||
333 | if (noioapicquirk || noioapicreroute) { | ||
334 | return 0; | ||
335 | } else { | ||
336 | switch (bridge_has_boot_interrupt_variant(dev->bus)) { | ||
337 | case 0: | ||
338 | /* no rerouting necessary */ | ||
339 | return 0; | ||
340 | case INTEL_IRQ_REROUTE_VARIANT: | ||
341 | /* | ||
342 | * Remap according to INTx routing table in 6700PXH | ||
343 | * specs, intel order number 302628-002, section | ||
344 | * 2.15.2. Other chipsets (80332, ...) have the same | ||
345 | * mapping and are handled here as well. | ||
346 | */ | ||
347 | dev_info(&dev->dev, "PCI IRQ %d -> rerouted to legacy " | ||
348 | "IRQ %d\n", entry->index, | ||
349 | (entry->index % 4) + 16); | ||
350 | entry->index = (entry->index % 4) + 16; | ||
351 | return 1; | ||
352 | default: | ||
353 | dev_warn(&dev->dev, "Cannot reroute IRQ %d to legacy " | ||
354 | "IRQ: unknown mapping\n", entry->index); | ||
355 | return -1; | ||
356 | } | ||
357 | } | ||
358 | } | ||
359 | #endif /* CONFIG_X86_IO_APIC */ | ||
360 | |||
306 | static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin) | 361 | static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin) |
307 | { | 362 | { |
308 | struct acpi_prt_entry *entry; | 363 | struct acpi_prt_entry *entry; |
@@ -311,6 +366,9 @@ static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin) | |||
311 | 366 | ||
312 | entry = acpi_pci_irq_find_prt_entry(dev, pin); | 367 | entry = acpi_pci_irq_find_prt_entry(dev, pin); |
313 | if (entry) { | 368 | if (entry) { |
369 | #ifdef CONFIG_X86_IO_APIC | ||
370 | acpi_reroute_boot_interrupt(dev, entry); | ||
371 | #endif /* CONFIG_X86_IO_APIC */ | ||
314 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %s[%c] _PRT entry\n", | 372 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %s[%c] _PRT entry\n", |
315 | pci_name(dev), pin_name(pin))); | 373 | pci_name(dev), pin_name(pin))); |
316 | return entry; | 374 | return entry; |
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index d06078d660ad..2672c798272f 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
@@ -485,7 +485,8 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) | |||
485 | root->secondary.end = 0xFF; | 485 | root->secondary.end = 0xFF; |
486 | printk(KERN_WARNING FW_BUG PREFIX | 486 | printk(KERN_WARNING FW_BUG PREFIX |
487 | "no secondary bus range in _CRS\n"); | 487 | "no secondary bus range in _CRS\n"); |
488 | status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN, NULL, &bus); | 488 | status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN, |
489 | NULL, &bus); | ||
489 | if (ACPI_SUCCESS(status)) | 490 | if (ACPI_SUCCESS(status)) |
490 | root->secondary.start = bus; | 491 | root->secondary.start = bus; |
491 | else if (status == AE_NOT_FOUND) | 492 | else if (status == AE_NOT_FOUND) |
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 79cb65332894..870550d6a4bf 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c | |||
@@ -244,7 +244,7 @@ processor_set_cur_state(struct thermal_cooling_device *cdev, | |||
244 | return result; | 244 | return result; |
245 | } | 245 | } |
246 | 246 | ||
247 | struct thermal_cooling_device_ops processor_cooling_ops = { | 247 | const struct thermal_cooling_device_ops processor_cooling_ops = { |
248 | .get_max_state = processor_get_max_state, | 248 | .get_max_state = processor_get_max_state, |
249 | .get_cur_state = processor_get_cur_state, | 249 | .get_cur_state = processor_get_cur_state, |
250 | .set_cur_state = processor_set_cur_state, | 250 | .set_cur_state = processor_set_cur_state, |
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c index 50658ff887d9..6e36d0c0057c 100644 --- a/drivers/acpi/sbs.c +++ b/drivers/acpi/sbs.c | |||
@@ -130,6 +130,9 @@ struct acpi_sbs { | |||
130 | 130 | ||
131 | #define to_acpi_sbs(x) container_of(x, struct acpi_sbs, charger) | 131 | #define to_acpi_sbs(x) container_of(x, struct acpi_sbs, charger) |
132 | 132 | ||
133 | static int acpi_sbs_remove(struct acpi_device *device, int type); | ||
134 | static int acpi_battery_get_state(struct acpi_battery *battery); | ||
135 | |||
133 | static inline int battery_scale(int log) | 136 | static inline int battery_scale(int log) |
134 | { | 137 | { |
135 | int scale = 1; | 138 | int scale = 1; |
@@ -195,6 +198,8 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy, | |||
195 | 198 | ||
196 | if ((!battery->present) && psp != POWER_SUPPLY_PROP_PRESENT) | 199 | if ((!battery->present) && psp != POWER_SUPPLY_PROP_PRESENT) |
197 | return -ENODEV; | 200 | return -ENODEV; |
201 | |||
202 | acpi_battery_get_state(battery); | ||
198 | switch (psp) { | 203 | switch (psp) { |
199 | case POWER_SUPPLY_PROP_STATUS: | 204 | case POWER_SUPPLY_PROP_STATUS: |
200 | if (battery->rate_now < 0) | 205 | if (battery->rate_now < 0) |
@@ -225,11 +230,17 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy, | |||
225 | case POWER_SUPPLY_PROP_POWER_NOW: | 230 | case POWER_SUPPLY_PROP_POWER_NOW: |
226 | val->intval = abs(battery->rate_now) * | 231 | val->intval = abs(battery->rate_now) * |
227 | acpi_battery_ipscale(battery) * 1000; | 232 | acpi_battery_ipscale(battery) * 1000; |
233 | val->intval *= (acpi_battery_mode(battery)) ? | ||
234 | (battery->voltage_now * | ||
235 | acpi_battery_vscale(battery) / 1000) : 1; | ||
228 | break; | 236 | break; |
229 | case POWER_SUPPLY_PROP_CURRENT_AVG: | 237 | case POWER_SUPPLY_PROP_CURRENT_AVG: |
230 | case POWER_SUPPLY_PROP_POWER_AVG: | 238 | case POWER_SUPPLY_PROP_POWER_AVG: |
231 | val->intval = abs(battery->rate_avg) * | 239 | val->intval = abs(battery->rate_avg) * |
232 | acpi_battery_ipscale(battery) * 1000; | 240 | acpi_battery_ipscale(battery) * 1000; |
241 | val->intval *= (acpi_battery_mode(battery)) ? | ||
242 | (battery->voltage_now * | ||
243 | acpi_battery_vscale(battery) / 1000) : 1; | ||
233 | break; | 244 | break; |
234 | case POWER_SUPPLY_PROP_CAPACITY: | 245 | case POWER_SUPPLY_PROP_CAPACITY: |
235 | val->intval = battery->state_of_charge; | 246 | val->intval = battery->state_of_charge; |
@@ -903,8 +914,6 @@ static void acpi_sbs_callback(void *context) | |||
903 | } | 914 | } |
904 | } | 915 | } |
905 | 916 | ||
906 | static int acpi_sbs_remove(struct acpi_device *device, int type); | ||
907 | |||
908 | static int acpi_sbs_add(struct acpi_device *device) | 917 | static int acpi_sbs_add(struct acpi_device *device) |
909 | { | 918 | { |
910 | struct acpi_sbs *sbs; | 919 | struct acpi_sbs *sbs; |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 6c949602cbd1..3ed80b2ca907 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -428,6 +428,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
428 | DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), | 428 | DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), |
429 | }, | 429 | }, |
430 | }, | 430 | }, |
431 | { | ||
432 | .callback = init_old_suspend_ordering, | ||
433 | .ident = "Asus A8N-SLI DELUXE", | ||
434 | .matches = { | ||
435 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
436 | DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI DELUXE"), | ||
437 | }, | ||
438 | }, | ||
439 | { | ||
440 | .callback = init_old_suspend_ordering, | ||
441 | .ident = "Asus A8N-SLI Premium", | ||
442 | .matches = { | ||
443 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
444 | DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI Premium"), | ||
445 | }, | ||
446 | }, | ||
431 | {}, | 447 | {}, |
432 | }; | 448 | }; |
433 | #endif /* CONFIG_SUSPEND */ | 449 | #endif /* CONFIG_SUSPEND */ |
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index 77255f250dbb..c538d0ef10ff 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c | |||
@@ -149,12 +149,12 @@ static int param_get_debug_level(char *buffer, const struct kernel_param *kp) | |||
149 | return result; | 149 | return result; |
150 | } | 150 | } |
151 | 151 | ||
152 | static struct kernel_param_ops param_ops_debug_layer = { | 152 | static const struct kernel_param_ops param_ops_debug_layer = { |
153 | .set = param_set_uint, | 153 | .set = param_set_uint, |
154 | .get = param_get_debug_layer, | 154 | .get = param_get_debug_layer, |
155 | }; | 155 | }; |
156 | 156 | ||
157 | static struct kernel_param_ops param_ops_debug_level = { | 157 | static const struct kernel_param_ops param_ops_debug_level = { |
158 | .set = param_set_uint, | 158 | .set = param_set_uint, |
159 | .get = param_get_debug_level, | 159 | .get = param_get_debug_level, |
160 | }; | 160 | }; |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 2607e17b520f..48fbc647b178 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -812,7 +812,7 @@ acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal, | |||
812 | thermal_zone_unbind_cooling_device); | 812 | thermal_zone_unbind_cooling_device); |
813 | } | 813 | } |
814 | 814 | ||
815 | static struct thermal_zone_device_ops acpi_thermal_zone_ops = { | 815 | static const struct thermal_zone_device_ops acpi_thermal_zone_ops = { |
816 | .bind = acpi_thermal_bind_cooling_device, | 816 | .bind = acpi_thermal_bind_cooling_device, |
817 | .unbind = acpi_thermal_unbind_cooling_device, | 817 | .unbind = acpi_thermal_unbind_cooling_device, |
818 | .get_temp = thermal_get_temp, | 818 | .get_temp = thermal_get_temp, |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index ada4b4d9bdc8..08a44b532f7c 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -307,7 +307,7 @@ video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long st | |||
307 | return acpi_video_device_lcd_set_level(video, level); | 307 | return acpi_video_device_lcd_set_level(video, level); |
308 | } | 308 | } |
309 | 309 | ||
310 | static struct thermal_cooling_device_ops video_cooling_ops = { | 310 | static const struct thermal_cooling_device_ops video_cooling_ops = { |
311 | .get_max_state = video_get_max_state, | 311 | .get_max_state = video_get_max_state, |
312 | .get_cur_state = video_get_cur_state, | 312 | .get_cur_state = video_get_cur_state, |
313 | .set_cur_state = video_set_cur_state, | 313 | .set_cur_state = video_set_cur_state, |