linux/arch/alpha/kernel/pc873xx.c
<<
>>
Prefs
   1#include <linux/ioport.h>
   2#include <asm/io.h>
   3
   4#include "pc873xx.h"
   5
   6static unsigned pc873xx_probelist[] = {0x398, 0x26e, 0};
   7
   8static char *pc873xx_names[] = {
   9        "PC87303", "PC87306", "PC87312", "PC87332", "PC87334"
  10};
  11
  12static unsigned int base, model;
  13
  14
  15unsigned int __init pc873xx_get_base()
  16{
  17        return base;
  18}
  19
  20char *__init pc873xx_get_model()
  21{
  22        return pc873xx_names[model];
  23}
  24
  25static unsigned char __init pc873xx_read(unsigned int base, int reg)
  26{
  27        outb(reg, base);
  28        return inb(base + 1);
  29}
  30
  31static void __init pc873xx_write(unsigned int base, int reg, unsigned char data)
  32{
  33        unsigned long flags;
  34
  35        local_irq_save(flags);
  36        outb(reg, base);
  37        outb(data, base + 1);
  38        outb(data, base + 1);           /* Must be written twice */
  39        local_irq_restore(flags);
  40}
  41
  42int __init pc873xx_probe(void)
  43{
  44        int val, index = 0;
  45
  46        while ((base = pc873xx_probelist[index++])) {
  47
  48                if (request_region(base, 2, "Super IO PC873xx") == NULL)
  49                        continue;
  50
  51                val = pc873xx_read(base, REG_SID);
  52                if ((val & 0xf0) == 0x10) {
  53                        model = PC87332;
  54                        break;
  55                } else if ((val & 0xf8) == 0x70) {
  56                        model = PC87306;
  57                        break;
  58                } else if ((val & 0xf8) == 0x50) {
  59                        model = PC87334;
  60                        break;
  61                } else if ((val & 0xf8) == 0x40) {
  62                        model = PC87303;
  63                        break;
  64                }
  65
  66                release_region(base, 2);
  67        }
  68
  69        return (base == 0) ? -1 : 1;
  70}
  71
  72void __init pc873xx_enable_epp19(void)
  73{
  74        unsigned char data;
  75
  76        printk(KERN_INFO "PC873xx enabling EPP v1.9\n");
  77        data = pc873xx_read(base, REG_PCR);
  78        pc873xx_write(base, REG_PCR, (data & 0xFC) | 0x02);
  79}
  80
  81void __init pc873xx_enable_ide(void)
  82{
  83        unsigned char data;
  84
  85        printk(KERN_INFO "PC873xx enabling IDE interrupt\n");
  86        data = pc873xx_read(base, REG_FER);
  87        pc873xx_write(base, REG_FER, data | 0x40);
  88}
  89