linux/arch/i386/kernel/reboot_fixups.c
<<
>>
Prefs
   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 * geode-gx/lx/cs5536 - Andres Salomon <dilinger@debian.org>
   9 *
  10 */
  11
  12#include <asm/delay.h>
  13#include <linux/pci.h>
  14#include <asm/reboot_fixups.h>
  15#include <asm/msr.h>
  16
  17static void cs5530a_warm_reset(struct pci_dev *dev)
  18{
  19        /* writing 1 to the reset control register, 0x44 causes the
  20        cs5530a to perform a system warm reset */
  21        pci_write_config_byte(dev, 0x44, 0x1);
  22        udelay(50); /* shouldn't get here but be safe and spin-a-while */
  23        return;
  24}
  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
  36struct device_fixup {
  37        unsigned int vendor;
  38        unsigned int device;
  39        void (*reboot_fixup)(struct pci_dev *);
  40};
  41
  42static struct device_fixup fixups_table[] = {
  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 },
  45};
  46
  47/*
  48 * we see if any fixup is available for our current hardware. if there
  49 * is a fixup, we call it and we expect to never return from it. if we
  50 * do return, we keep looking and then eventually fall back to the
  51 * standard mach_reboot on return.
  52 */
  53void mach_reboot_fixups(void)
  54{
  55        struct device_fixup *cur;
  56        struct pci_dev *dev;
  57        int i;
  58
  59        for (i=0; i < ARRAY_SIZE(fixups_table); i++) {
  60                cur = &(fixups_table[i]);
  61                dev = pci_get_device(cur->vendor, cur->device, NULL);
  62                if (!dev)
  63                        continue;
  64
  65                cur->reboot_fixup(dev);
  66        }
  67}
  68
  69
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.