1932e0c20SMorten H. Larsen #include <linux/ioport.h> 2932e0c20SMorten H. Larsen #include <asm/io.h> 3932e0c20SMorten H. Larsen 4932e0c20SMorten H. Larsen #include "pc873xx.h" 5932e0c20SMorten H. Larsen 6932e0c20SMorten H. Larsen static unsigned pc873xx_probelist[] = {0x398, 0x26e, 0}; 7932e0c20SMorten H. Larsen 8932e0c20SMorten H. Larsen static char *pc873xx_names[] = { 9932e0c20SMorten H. Larsen "PC87303", "PC87306", "PC87312", "PC87332", "PC87334" 10932e0c20SMorten H. Larsen }; 11932e0c20SMorten H. Larsen 12932e0c20SMorten H. Larsen static unsigned int base, model; 13932e0c20SMorten H. Larsen 14932e0c20SMorten H. Larsen 15932e0c20SMorten H. Larsen unsigned int __init pc873xx_get_base() 16932e0c20SMorten H. Larsen { 17932e0c20SMorten H. Larsen return base; 18932e0c20SMorten H. Larsen } 19932e0c20SMorten H. Larsen 20932e0c20SMorten H. Larsen char *__init pc873xx_get_model() 21932e0c20SMorten H. Larsen { 22932e0c20SMorten H. Larsen return pc873xx_names[model]; 23932e0c20SMorten H. Larsen } 24932e0c20SMorten H. Larsen 25932e0c20SMorten H. Larsen static unsigned char __init pc873xx_read(unsigned int base, int reg) 26932e0c20SMorten H. Larsen { 27932e0c20SMorten H. Larsen outb(reg, base); 28932e0c20SMorten H. Larsen return inb(base + 1); 29932e0c20SMorten H. Larsen } 30932e0c20SMorten H. Larsen 31932e0c20SMorten H. Larsen static void __init pc873xx_write(unsigned int base, int reg, unsigned char data) 32932e0c20SMorten H. Larsen { 33932e0c20SMorten H. Larsen unsigned long flags; 34932e0c20SMorten H. Larsen 35932e0c20SMorten H. Larsen local_irq_save(flags); 36932e0c20SMorten H. Larsen outb(reg, base); 37932e0c20SMorten H. Larsen outb(data, base + 1); 38932e0c20SMorten H. Larsen outb(data, base + 1); /* Must be written twice */ 39932e0c20SMorten H. Larsen local_irq_restore(flags); 40932e0c20SMorten H. Larsen } 41932e0c20SMorten H. Larsen 42932e0c20SMorten H. Larsen int __init pc873xx_probe(void) 43932e0c20SMorten H. Larsen { 44932e0c20SMorten H. Larsen int val, index = 0; 45932e0c20SMorten H. Larsen 46932e0c20SMorten H. Larsen while ((base = pc873xx_probelist[index++])) { 47932e0c20SMorten H. Larsen 48932e0c20SMorten H. Larsen if (request_region(base, 2, "Super IO PC873xx") == NULL) 49932e0c20SMorten H. Larsen continue; 50932e0c20SMorten H. Larsen 51932e0c20SMorten H. Larsen val = pc873xx_read(base, REG_SID); 52932e0c20SMorten H. Larsen if ((val & 0xf0) == 0x10) { 53932e0c20SMorten H. Larsen model = PC87332; 54932e0c20SMorten H. Larsen break; 55932e0c20SMorten H. Larsen } else if ((val & 0xf8) == 0x70) { 56932e0c20SMorten H. Larsen model = PC87306; 57932e0c20SMorten H. Larsen break; 58932e0c20SMorten H. Larsen } else if ((val & 0xf8) == 0x50) { 59932e0c20SMorten H. Larsen model = PC87334; 60932e0c20SMorten H. Larsen break; 61932e0c20SMorten H. Larsen } else if ((val & 0xf8) == 0x40) { 62932e0c20SMorten H. Larsen model = PC87303; 63932e0c20SMorten H. Larsen break; 64932e0c20SMorten H. Larsen } 65932e0c20SMorten H. Larsen 66932e0c20SMorten H. Larsen release_region(base, 2); 67932e0c20SMorten H. Larsen } 68932e0c20SMorten H. Larsen 69932e0c20SMorten H. Larsen return (base == 0) ? -1 : 1; 70932e0c20SMorten H. Larsen } 71932e0c20SMorten H. Larsen 72932e0c20SMorten H. Larsen void __init pc873xx_enable_epp19(void) 73932e0c20SMorten H. Larsen { 74932e0c20SMorten H. Larsen unsigned char data; 75932e0c20SMorten H. Larsen 76932e0c20SMorten H. Larsen printk(KERN_INFO "PC873xx enabling EPP v1.9\n"); 77932e0c20SMorten H. Larsen data = pc873xx_read(base, REG_PCR); 78932e0c20SMorten H. Larsen pc873xx_write(base, REG_PCR, (data & 0xFC) | 0x02); 79932e0c20SMorten H. Larsen } 80932e0c20SMorten H. Larsen 81932e0c20SMorten H. Larsen void __init pc873xx_enable_ide(void) 82932e0c20SMorten H. Larsen { 83932e0c20SMorten H. Larsen unsigned char data; 84932e0c20SMorten H. Larsen 85932e0c20SMorten H. Larsen printk(KERN_INFO "PC873xx enabling IDE interrupt\n"); 86932e0c20SMorten H. Larsen data = pc873xx_read(base, REG_FER); 87932e0c20SMorten H. Larsen pc873xx_write(base, REG_FER, data | 0x40); 88932e0c20SMorten H. Larsen } 89