xref: /openbmc/linux/arch/alpha/kernel/pc873xx.c (revision 932e0c20)
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