| From ad68652412276f68ad4fe3e1ecf5ee6880876783 Mon Sep 17 00:00:00 2001 |
| From: Ondrej Zary <linux@rainbow-software.org> |
| Date: Tue, 11 Dec 2012 22:18:05 +0100 |
| Subject: x86, 8042: Enable A20 using KBC to fix S3 resume on some MSI laptops |
| |
| From: Ondrej Zary <linux@rainbow-software.org> |
| |
| commit ad68652412276f68ad4fe3e1ecf5ee6880876783 upstream. |
| |
| Some MSI laptop BIOSes are broken - INT 15h code uses port 92h to enable A20 |
| line but resume code assumes that KBC was used. |
| The laptop will not resume from S3 otherwise but powers off after a while |
| and then powers on again stuck with a blank screen. |
| |
| Fix it by enabling A20 using KBC in i8042_platform_init for x86. |
| |
| Fixes https://bugzilla.kernel.org/show_bug.cgi?id=12878 |
| |
| Signed-off-by: Ondrej Zary <linux@rainbow-software.org> |
| Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> |
| Cc: Rafael J. Wysocki <rjw@sisk.pl> |
| Link: http://lkml.kernel.org/r/201212112218.06551.linux@rainbow-software.org |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/input/serio/i8042-x86ia64io.h | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/drivers/input/serio/i8042-x86ia64io.h |
| +++ b/drivers/input/serio/i8042-x86ia64io.h |
| @@ -921,6 +921,7 @@ static int __init i8042_platform_init(vo |
| int retval; |
| |
| #ifdef CONFIG_X86 |
| + u8 a20_on = 0xdf; |
| /* Just return if pre-detection shows no i8042 controller exist */ |
| if (!x86_platform.i8042_detect()) |
| return -ENODEV; |
| @@ -960,6 +961,14 @@ static int __init i8042_platform_init(vo |
| |
| if (dmi_check_system(i8042_dmi_dritek_table)) |
| i8042_dritek = true; |
| + |
| + /* |
| + * A20 was already enabled during early kernel init. But some buggy |
| + * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to |
| + * resume from S3. So we do it here and hope that nothing breaks. |
| + */ |
| + i8042_command(&a20_on, 0x10d1); |
| + i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */ |
| #endif /* CONFIG_X86 */ |
| |
| return retval; |