diff options
-rw-r--r-- | arch/i386/Kconfig | 4 | ||||
-rw-r--r-- | arch/i386/kernel/reboot_fixups.c | 13 |
2 files changed, 15 insertions, 2 deletions
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index d2f6a247414d..b1b2b30b1b8e 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
@@ -441,8 +441,8 @@ config X86_REBOOTFIXUPS | |||
441 | this config is intended, is when reboot ends with a stalled/hung | 441 | this config is intended, is when reboot ends with a stalled/hung |
442 | system. | 442 | system. |
443 | 443 | ||
444 | Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1. | 444 | Currently, the only fixup is for the Geode machines using |
445 | combination. | 445 | CS5530A and CS5536 chipsets. |
446 | 446 | ||
447 | Say Y if you want to enable the fixup. Currently, it's safe to | 447 | Say Y if you want to enable the fixup. Currently, it's safe to |
448 | enable this option even if you don't need it. | 448 | enable this option even if you don't need it. |
diff --git a/arch/i386/kernel/reboot_fixups.c b/arch/i386/kernel/reboot_fixups.c index 2d78d918340f..03e1cce58f49 100644 --- a/arch/i386/kernel/reboot_fixups.c +++ b/arch/i386/kernel/reboot_fixups.c | |||
@@ -5,12 +5,14 @@ | |||
5 | * | 5 | * |
6 | * List of supported fixups: | 6 | * List of supported fixups: |
7 | * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> | 7 | * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> |
8 | * geode-gx/lx/cs5536 - Andres Salomon <dilinger@debian.org> | ||
8 | * | 9 | * |
9 | */ | 10 | */ |
10 | 11 | ||
11 | #include <asm/delay.h> | 12 | #include <asm/delay.h> |
12 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
13 | #include <asm/reboot_fixups.h> | 14 | #include <asm/reboot_fixups.h> |
15 | #include <asm/msr.h> | ||
14 | 16 | ||
15 | static void cs5530a_warm_reset(struct pci_dev *dev) | 17 | static void cs5530a_warm_reset(struct pci_dev *dev) |
16 | { | 18 | { |
@@ -21,6 +23,16 @@ static void cs5530a_warm_reset(struct pci_dev *dev) | |||
21 | return; | 23 | return; |
22 | } | 24 | } |
23 | 25 | ||
26 | static void cs5536_warm_reset(struct pci_dev *dev) | ||
27 | { | ||
28 | /* | ||
29 | * 6.6.2.12 Soft Reset (DIVIL_SOFT_RESET) | ||
30 | * writing 1 to the LSB of this MSR causes a hard reset. | ||
31 | */ | ||
32 | wrmsrl(0x51400017, 1ULL); | ||
33 | udelay(50); /* shouldn't get here but be safe and spin a while */ | ||
34 | } | ||
35 | |||
24 | struct device_fixup { | 36 | struct device_fixup { |
25 | unsigned int vendor; | 37 | unsigned int vendor; |
26 | unsigned int device; | 38 | unsigned int device; |
@@ -29,6 +41,7 @@ struct device_fixup { | |||
29 | 41 | ||
30 | static struct device_fixup fixups_table[] = { | 42 | static struct device_fixup fixups_table[] = { |
31 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, | 43 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, |
44 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, cs5536_warm_reset }, | ||
32 | }; | 45 | }; |
33 | 46 | ||
34 | /* | 47 | /* |