aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/i386/Kconfig4
-rw-r--r--arch/i386/kernel/reboot_fixups.c13
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
15static void cs5530a_warm_reset(struct pci_dev *dev) 17static 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
26static 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
24struct device_fixup { 36struct 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
30static struct device_fixup fixups_table[] = { 42static 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/*