diff options
| -rw-r--r-- | arch/x86/kernel/acpi/wakeup_64.S | 30 | ||||
| -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/ec.c | 9 | ||||
| -rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 25 |
6 files changed, 62 insertions, 36 deletions
diff --git a/arch/x86/kernel/acpi/wakeup_64.S b/arch/x86/kernel/acpi/wakeup_64.S index bcc293423a70..96258d9dc974 100644 --- a/arch/x86/kernel/acpi/wakeup_64.S +++ b/arch/x86/kernel/acpi/wakeup_64.S | |||
| @@ -13,7 +13,6 @@ | |||
| 13 | * Hooray, we are in Long 64-bit mode (but still running in low memory) | 13 | * Hooray, we are in Long 64-bit mode (but still running in low memory) |
| 14 | */ | 14 | */ |
| 15 | ENTRY(wakeup_long64) | 15 | ENTRY(wakeup_long64) |
| 16 | wakeup_long64: | ||
| 17 | movq saved_magic, %rax | 16 | movq saved_magic, %rax |
| 18 | movq $0x123456789abcdef0, %rdx | 17 | movq $0x123456789abcdef0, %rdx |
| 19 | cmpq %rdx, %rax | 18 | cmpq %rdx, %rax |
| @@ -34,16 +33,12 @@ wakeup_long64: | |||
| 34 | 33 | ||
| 35 | movq saved_rip, %rax | 34 | movq saved_rip, %rax |
| 36 | jmp *%rax | 35 | jmp *%rax |
| 36 | ENDPROC(wakeup_long64) | ||
| 37 | 37 | ||
| 38 | bogus_64_magic: | 38 | bogus_64_magic: |
| 39 | jmp bogus_64_magic | 39 | jmp bogus_64_magic |
| 40 | 40 | ||
| 41 | .align 2 | 41 | ENTRY(do_suspend_lowlevel) |
| 42 | .p2align 4,,15 | ||
| 43 | .globl do_suspend_lowlevel | ||
| 44 | .type do_suspend_lowlevel,@function | ||
| 45 | do_suspend_lowlevel: | ||
| 46 | .LFB5: | ||
| 47 | subq $8, %rsp | 42 | subq $8, %rsp |
| 48 | xorl %eax, %eax | 43 | xorl %eax, %eax |
| 49 | call save_processor_state | 44 | call save_processor_state |
| @@ -67,7 +62,7 @@ do_suspend_lowlevel: | |||
| 67 | pushfq | 62 | pushfq |
| 68 | popq pt_regs_flags(%rax) | 63 | popq pt_regs_flags(%rax) |
| 69 | 64 | ||
| 70 | movq $.L97, saved_rip(%rip) | 65 | movq $resume_point, saved_rip(%rip) |
| 71 | 66 | ||
| 72 | movq %rsp, saved_rsp | 67 | movq %rsp, saved_rsp |
| 73 | movq %rbp, saved_rbp | 68 | movq %rbp, saved_rbp |
| @@ -78,14 +73,12 @@ do_suspend_lowlevel: | |||
| 78 | addq $8, %rsp | 73 | addq $8, %rsp |
| 79 | movl $3, %edi | 74 | movl $3, %edi |
| 80 | xorl %eax, %eax | 75 | xorl %eax, %eax |
| 81 | jmp acpi_enter_sleep_state | 76 | call acpi_enter_sleep_state |
| 82 | .L97: | 77 | /* in case something went wrong, restore the machine status and go on */ |
| 83 | .p2align 4,,7 | 78 | jmp resume_point |
| 84 | .L99: | ||
| 85 | .align 4 | ||
| 86 | movl $24, %eax | ||
| 87 | movw %ax, %ds | ||
| 88 | 79 | ||
| 80 | .align 4 | ||
| 81 | resume_point: | ||
| 89 | /* We don't restore %rax, it must be 0 anyway */ | 82 | /* We don't restore %rax, it must be 0 anyway */ |
| 90 | movq $saved_context, %rax | 83 | movq $saved_context, %rax |
| 91 | movq saved_context_cr4(%rax), %rbx | 84 | movq saved_context_cr4(%rax), %rbx |
| @@ -117,12 +110,9 @@ do_suspend_lowlevel: | |||
| 117 | xorl %eax, %eax | 110 | xorl %eax, %eax |
| 118 | addq $8, %rsp | 111 | addq $8, %rsp |
| 119 | jmp restore_processor_state | 112 | jmp restore_processor_state |
| 120 | .LFE5: | 113 | ENDPROC(do_suspend_lowlevel) |
| 121 | .Lfe5: | 114 | |
| 122 | .size do_suspend_lowlevel, .Lfe5-do_suspend_lowlevel | ||
| 123 | |||
| 124 | .data | 115 | .data |
| 125 | ALIGN | ||
| 126 | ENTRY(saved_rbp) .quad 0 | 116 | ENTRY(saved_rbp) .quad 0 |
| 127 | ENTRY(saved_rsi) .quad 0 | 117 | ENTRY(saved_rsi) .quad 0 |
| 128 | ENTRY(saved_rdi) .quad 0 | 118 | ENTRY(saved_rdi) .quad 0 |
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/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/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index 65dc41540c62..45940f31fe9e 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c | |||
| @@ -166,6 +166,7 @@ struct fujitsu_hotkey_t { | |||
| 166 | struct platform_device *pf_device; | 166 | struct platform_device *pf_device; |
| 167 | struct kfifo *fifo; | 167 | struct kfifo *fifo; |
| 168 | spinlock_t fifo_lock; | 168 | spinlock_t fifo_lock; |
| 169 | int rfkill_supported; | ||
| 169 | int rfkill_state; | 170 | int rfkill_state; |
| 170 | int logolamp_registered; | 171 | int logolamp_registered; |
| 171 | int kblamps_registered; | 172 | int kblamps_registered; |
| @@ -526,7 +527,7 @@ static ssize_t | |||
| 526 | show_lid_state(struct device *dev, | 527 | show_lid_state(struct device *dev, |
| 527 | struct device_attribute *attr, char *buf) | 528 | struct device_attribute *attr, char *buf) |
| 528 | { | 529 | { |
| 529 | if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD) | 530 | if (!(fujitsu_hotkey->rfkill_supported & 0x100)) |
| 530 | return sprintf(buf, "unknown\n"); | 531 | return sprintf(buf, "unknown\n"); |
| 531 | if (fujitsu_hotkey->rfkill_state & 0x100) | 532 | if (fujitsu_hotkey->rfkill_state & 0x100) |
| 532 | return sprintf(buf, "open\n"); | 533 | return sprintf(buf, "open\n"); |
| @@ -538,7 +539,7 @@ static ssize_t | |||
| 538 | show_dock_state(struct device *dev, | 539 | show_dock_state(struct device *dev, |
| 539 | struct device_attribute *attr, char *buf) | 540 | struct device_attribute *attr, char *buf) |
| 540 | { | 541 | { |
| 541 | if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD) | 542 | if (!(fujitsu_hotkey->rfkill_supported & 0x200)) |
| 542 | return sprintf(buf, "unknown\n"); | 543 | return sprintf(buf, "unknown\n"); |
| 543 | if (fujitsu_hotkey->rfkill_state & 0x200) | 544 | if (fujitsu_hotkey->rfkill_state & 0x200) |
| 544 | return sprintf(buf, "docked\n"); | 545 | return sprintf(buf, "docked\n"); |
| @@ -550,7 +551,7 @@ static ssize_t | |||
| 550 | show_radios_state(struct device *dev, | 551 | show_radios_state(struct device *dev, |
| 551 | struct device_attribute *attr, char *buf) | 552 | struct device_attribute *attr, char *buf) |
| 552 | { | 553 | { |
| 553 | if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD) | 554 | if (!(fujitsu_hotkey->rfkill_supported & 0x20)) |
| 554 | return sprintf(buf, "unknown\n"); | 555 | return sprintf(buf, "unknown\n"); |
| 555 | if (fujitsu_hotkey->rfkill_state & 0x20) | 556 | if (fujitsu_hotkey->rfkill_state & 0x20) |
| 556 | return sprintf(buf, "on\n"); | 557 | return sprintf(buf, "on\n"); |
| @@ -928,8 +929,17 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
| 928 | ; /* No action, result is discarded */ | 929 | ; /* No action, result is discarded */ |
| 929 | vdbg_printk(FUJLAPTOP_DBG_INFO, "Discarded %i ringbuffer entries\n", i); | 930 | vdbg_printk(FUJLAPTOP_DBG_INFO, "Discarded %i ringbuffer entries\n", i); |
| 930 | 931 | ||
| 931 | fujitsu_hotkey->rfkill_state = | 932 | fujitsu_hotkey->rfkill_supported = |
| 932 | call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0); | 933 | call_fext_func(FUNC_RFKILL, 0x0, 0x0, 0x0); |
| 934 | |||
| 935 | /* Make sure our bitmask of supported functions is cleared if the | ||
| 936 | RFKILL function block is not implemented, like on the S7020. */ | ||
| 937 | if (fujitsu_hotkey->rfkill_supported == UNSUPPORTED_CMD) | ||
| 938 | fujitsu_hotkey->rfkill_supported = 0; | ||
| 939 | |||
| 940 | if (fujitsu_hotkey->rfkill_supported) | ||
| 941 | fujitsu_hotkey->rfkill_state = | ||
| 942 | call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0); | ||
| 933 | 943 | ||
| 934 | /* Suspect this is a keymap of the application panel, print it */ | 944 | /* Suspect this is a keymap of the application panel, print it */ |
| 935 | printk(KERN_INFO "fujitsu-laptop: BTNI: [0x%x]\n", | 945 | printk(KERN_INFO "fujitsu-laptop: BTNI: [0x%x]\n", |
| @@ -1005,8 +1015,9 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, | |||
| 1005 | 1015 | ||
| 1006 | input = fujitsu_hotkey->input; | 1016 | input = fujitsu_hotkey->input; |
| 1007 | 1017 | ||
| 1008 | fujitsu_hotkey->rfkill_state = | 1018 | if (fujitsu_hotkey->rfkill_supported) |
| 1009 | call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0); | 1019 | fujitsu_hotkey->rfkill_state = |
| 1020 | call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0); | ||
| 1010 | 1021 | ||
| 1011 | switch (event) { | 1022 | switch (event) { |
| 1012 | case ACPI_FUJITSU_NOTIFY_CODE1: | 1023 | case ACPI_FUJITSU_NOTIFY_CODE1: |
