xref: /openbmc/linux/arch/alpha/kernel/pc873xx.c (revision 543203d2)
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 
pc873xx_get_base(void)16*543203d2SRandy Dunlap unsigned int __init pc873xx_get_base(void)
17932e0c20SMorten H. Larsen {
18932e0c20SMorten H. Larsen 	return base;
19932e0c20SMorten H. Larsen }
20932e0c20SMorten H. Larsen 
pc873xx_get_model(void)21*543203d2SRandy Dunlap char *__init pc873xx_get_model(void)
22932e0c20SMorten H. Larsen {
23932e0c20SMorten H. Larsen 	return pc873xx_names[model];
24932e0c20SMorten H. Larsen }
25932e0c20SMorten H. Larsen 
pc873xx_read(unsigned int base,int reg)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 
pc873xx_write(unsigned int base,int reg,unsigned char data)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 
pc873xx_probe(void)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 
pc873xx_enable_epp19(void)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 
pc873xx_enable_ide(void)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