Blame view
arch/x86/kernel/reboot_fixups_32.c
2.51 KB
a2f7c3541 [PATCH] x86 reboo... |
1 |
/* |
a2f7c3541 [PATCH] x86 reboo... |
2 3 4 5 |
* This is a good place to put board specific reboot fixups. * * List of supported fixups: * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> |
95069f89e GEODE: reboot fix... |
6 |
* geode-gx/lx/cs5536 - Andres Salomon <dilinger@debian.org> |
a2f7c3541 [PATCH] x86 reboo... |
7 8 9 10 11 |
* */ #include <asm/delay.h> #include <linux/pci.h> |
3d034aecd PCI: pci_get_devi... |
12 |
#include <linux/interrupt.h> |
973efae21 [PATCH] i386: cle... |
13 |
#include <asm/reboot_fixups.h> |
95069f89e GEODE: reboot fix... |
14 |
#include <asm/msr.h> |
2e8c12436 cs5535: move the ... |
15 |
#include <linux/cs5535.h> |
a2f7c3541 [PATCH] x86 reboo... |
16 17 18 19 20 21 22 23 24 |
static void cs5530a_warm_reset(struct pci_dev *dev) { /* writing 1 to the reset control register, 0x44 causes the cs5530a to perform a system warm reset */ pci_write_config_byte(dev, 0x44, 0x1); udelay(50); /* shouldn't get here but be safe and spin-a-while */ return; } |
95069f89e GEODE: reboot fix... |
25 26 |
static void cs5536_warm_reset(struct pci_dev *dev) { |
0387f4511 GEODE: use symbol... |
27 28 |
/* writing 1 to the LSB of this MSR causes a hard reset */ wrmsrl(MSR_DIVIL_SOFT_RESET, 1ULL); |
95069f89e GEODE: reboot fix... |
29 30 |
udelay(50); /* shouldn't get here but be safe and spin a while */ } |
ff472a114 x86: add the RDC ... |
31 32 33 34 35 36 37 38 39 40 41 42 |
static void rdc321x_reset(struct pci_dev *dev) { unsigned i; /* Voluntary reset the watchdog timer */ outl(0x80003840, 0xCF8); /* Generate a CPU reset on next tick */ i = inl(0xCFC); /* Use the minimum timer resolution */ i |= 0x1600; outl(i, 0xCFC); outb(1, 0x92); } |
37bc9f507 x86: Ce4100: Add ... |
43 44 45 46 47 48 49 50 51 |
static void ce4100_reset(struct pci_dev *dev) { int i; for (i = 0; i < 10; i++) { outb(0x2, 0xcf9); udelay(50); } } |
a2f7c3541 [PATCH] x86 reboo... |
52 53 54 55 56 |
struct device_fixup { unsigned int vendor; unsigned int device; void (*reboot_fixup)(struct pci_dev *); }; |
37bc9f507 x86: Ce4100: Add ... |
57 58 59 60 |
/* * PCI ids solely used for fixups_table go here */ #define PCI_DEVICE_ID_INTEL_CE4100 0x0708 |
ebdd561a1 x86: constify dat... |
61 |
static const struct device_fixup fixups_table[] = { |
a2f7c3541 [PATCH] x86 reboo... |
62 |
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, |
95069f89e GEODE: reboot fix... |
63 |
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, cs5536_warm_reset }, |
6d1b30e30 x86: reboot fixup... |
64 |
{ PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SC1100_BRIDGE, cs5530a_warm_reset }, |
ff472a114 x86: add the RDC ... |
65 |
{ PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030, rdc321x_reset }, |
37bc9f507 x86: Ce4100: Add ... |
66 |
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100, ce4100_reset }, |
a2f7c3541 [PATCH] x86 reboo... |
67 68 69 70 71 72 73 74 75 76 |
}; /* * we see if any fixup is available for our current hardware. if there * is a fixup, we call it and we expect to never return from it. if we * do return, we keep looking and then eventually fall back to the * standard mach_reboot on return. */ void mach_reboot_fixups(void) { |
ebdd561a1 x86: constify dat... |
77 |
const struct device_fixup *cur; |
a2f7c3541 [PATCH] x86 reboo... |
78 79 |
struct pci_dev *dev; int i; |
3d034aecd PCI: pci_get_devi... |
80 81 82 83 |
/* we can be called from sysrq-B code. In such a case it is * prohibited to dig PCI */ if (in_interrupt()) return; |
38e548ee1 [PATCH] arch/i386... |
84 |
for (i=0; i < ARRAY_SIZE(fixups_table); i++) { |
a2f7c3541 [PATCH] x86 reboo... |
85 |
cur = &(fixups_table[i]); |
874ec33ff [PATCH] sparse cl... |
86 |
dev = pci_get_device(cur->vendor, cur->device, NULL); |
a2f7c3541 [PATCH] x86 reboo... |
87 88 89 90 |
if (!dev) continue; cur->reboot_fixup(dev); |
57fea8f7a x86/reboot: Add p... |
91 |
pci_dev_put(dev); |
a2f7c3541 [PATCH] x86 reboo... |
92 |
} |
a2f7c3541 [PATCH] x86 reboo... |
93 |
} |