reboot_fixups.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. #include <asm/delay.h>
  11. #include <linux/pci.h>
  12. #include <linux/reboot_fixups.h>
  13. static void cs5530a_warm_reset(struct pci_dev *dev)
  14. {
  15. /* writing 1 to the reset control register, 0x44 causes the
  16. cs5530a to perform a system warm reset */
  17. pci_write_config_byte(dev, 0x44, 0x1);
  18. udelay(50); /* shouldn't get here but be safe and spin-a-while */
  19. return;
  20. }
  21. struct device_fixup {
  22. unsigned int vendor;
  23. unsigned int device;
  24. void (*reboot_fixup)(struct pci_dev *);
  25. };
  26. static struct device_fixup fixups_table[] = {
  27. { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset },
  28. };
  29. /*
  30. * we see if any fixup is available for our current hardware. if there
  31. * is a fixup, we call it and we expect to never return from it. if we
  32. * do return, we keep looking and then eventually fall back to the
  33. * standard mach_reboot on return.
  34. */
  35. void mach_reboot_fixups(void)
  36. {
  37. struct device_fixup *cur;
  38. struct pci_dev *dev;
  39. int i;
  40. for (i=0; i < ARRAY_SIZE(fixups_table); i++) {
  41. cur = &(fixups_table[i]);
  42. dev = pci_get_device(cur->vendor, cur->device, NULL);
  43. if (!dev)
  44. continue;
  45. cur->reboot_fixup(dev);
  46. }
  47. }