| Jaya Kumar | a2f7c35 | 2005-05-01 08:58:49 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * linux/arch/i386/kernel/reboot_fixups.c | 
|  | 3 | * | 
|  | 4 | * This is a good place to put board specific reboot fixups. | 
|  | 5 | * | 
|  | 6 | * List of supported fixups: | 
|  | 7 | * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> | 
|  | 8 | * | 
|  | 9 | */ | 
|  | 10 |  | 
|  | 11 | #include <asm/delay.h> | 
|  | 12 | #include <linux/pci.h> | 
|  | 13 |  | 
|  | 14 | static void cs5530a_warm_reset(struct pci_dev *dev) | 
|  | 15 | { | 
|  | 16 | /* writing 1 to the reset control register, 0x44 causes the | 
|  | 17 | cs5530a to perform a system warm reset */ | 
|  | 18 | pci_write_config_byte(dev, 0x44, 0x1); | 
|  | 19 | udelay(50); /* shouldn't get here but be safe and spin-a-while */ | 
|  | 20 | return; | 
|  | 21 | } | 
|  | 22 |  | 
|  | 23 | struct device_fixup { | 
|  | 24 | unsigned int vendor; | 
|  | 25 | unsigned int device; | 
|  | 26 | void (*reboot_fixup)(struct pci_dev *); | 
|  | 27 | }; | 
|  | 28 |  | 
|  | 29 | static struct device_fixup fixups_table[] = { | 
|  | 30 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, | 
|  | 31 | }; | 
|  | 32 |  | 
|  | 33 | /* | 
|  | 34 | * we see if any fixup is available for our current hardware. if there | 
|  | 35 | * is a fixup, we call it and we expect to never return from it. if we | 
|  | 36 | * do return, we keep looking and then eventually fall back to the | 
|  | 37 | * standard mach_reboot on return. | 
|  | 38 | */ | 
|  | 39 | void mach_reboot_fixups(void) | 
|  | 40 | { | 
|  | 41 | struct device_fixup *cur; | 
|  | 42 | struct pci_dev *dev; | 
|  | 43 | int i; | 
|  | 44 |  | 
|  | 45 | for (i=0; i < (sizeof(fixups_table)/sizeof(fixups_table[0])); i++) { | 
|  | 46 | cur = &(fixups_table[i]); | 
|  | 47 | dev = pci_get_device(cur->vendor, cur->device, 0); | 
|  | 48 | if (!dev) | 
|  | 49 | continue; | 
|  | 50 |  | 
|  | 51 | cur->reboot_fixup(dev); | 
|  | 52 | } | 
|  | 53 |  | 
|  | 54 | printk(KERN_WARNING "No reboot fixup found for your hardware\n"); | 
|  | 55 | } | 
|  | 56 |  |