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