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