diff options
author | Andres Salomon <dilinger@queued.net> | 2007-07-06 14:17:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-06 14:45:11 -0400 |
commit | 95069f89e80bb49ecc1b135bf85747e8dc6681f9 (patch) | |
tree | 33f11de09544bfd37d7bee25b7d3ace0bdac4412 /arch/i386/kernel | |
parent | 1feb17e286339382a1ae36e0fecc4d88c2d7f123 (diff) |
GEODE: reboot fixup for geode machines with CS5536 boards
Writing to MSR 0x51400017 forces a hard reset on CS5536-based machines,
this has the reboot fixup do just that if such a board is detected.
Acked-by: Jordan Crouse <jordan.crouse@amd.com>
Signed-off-by: Andres Salomon <dilinger@debian.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r-- | arch/i386/kernel/reboot_fixups.c | 13 |
1 files changed, 13 insertions, 0 deletions
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 | /* |