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