blob: 1cfa3170379fd4ea97fdf2b4192f0f1ad547b600 [file] [log] [blame]
Uwe Hermann0120e1a2007-09-16 18:11:03 +00001/*
Uwe Hermannafe83092007-09-28 15:45:43 +00002 * This file is part of the superiotool project.
Uwe Hermann0120e1a2007-09-16 18:11:03 +00003 *
4 * Copyright (C) 2007 Carl-Daniel Hailfinger
5 * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "superiotool.h"
23
Uwe Hermann07024692007-09-20 22:13:48 +000024#define CHIP_ID_BYTE1_REG 0x20
25#define CHIP_ID_BYTE2_REG 0x21
26#define CHIP_VERSION_REG 0x22
Urja Rannikko38204a22008-10-23 23:33:18 +000027#define ISA_PNP_ADDR 0x279
Uwe Hermann07024692007-09-20 22:13:48 +000028
Uwe Hermann246be7d2007-10-31 22:22:11 +000029static const struct superio_registers reg_table[] = {
Urja Rannikko38204a22008-10-23 23:33:18 +000030 {0x8661, "IT8661F/IT8770F", {
Robinson P. Tryondc817692007-10-05 13:47:04 +000031 {NOLDN, NULL,
Uwe Hermannb0ae9762008-10-14 16:34:38 +000032 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
33 0x23,0x24,EOT},
34 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
35 0x00,0x00,EOT}},
Robinson P. Tryondc817692007-10-05 13:47:04 +000036 {0x0, "Floppy",
37 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
38 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
39 {0x1, "COM1",
40 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
41 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
42 {0x2, "COM2",
43 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
44 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
45 {0x3, "Parallel port",
46 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
47 0xf0,EOT},
48 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
49 0x03,EOT}},
50 {0x4, "IR",
51 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
52 0x74,0x75,0xf0,EOT},
53 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
54 0x01,0x00,0x00,EOT}},
55 {0x5, "GPIO",
56 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
57 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
58 0xf9,0xfa,0xfb,0xfc,EOT},
59 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
60 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
61 0x00,0x00,0x00,0x00,EOT}},
62 {EOT}}},
Urja Rannikko38204a22008-10-23 23:33:18 +000063 {0x8673, "IT8673F", {
64 {EOT}}},
65 {0x8681, "IT8671F/IT8687R", {
66 {EOT}}},
Uwe Hermann07024692007-09-20 22:13:48 +000067 {0x8702, "IT8702F", {
Uwe Hermann0120e1a2007-09-16 18:11:03 +000068 {EOT}}},
Uwe Hermann44bb7772007-10-07 21:50:29 +000069 {0x8705, "IT8705F/AF / IT8700F", {
Robinson P. Tryon43541032007-10-04 15:44:19 +000070 {NOLDN, NULL,
Uwe Hermannb0ae9762008-10-14 16:34:38 +000071 {0x20,0x21,0x22,0x23,0x24,EOT},
72 {0x87,0x05,0x00,0x00,NANA,EOT}},
Robinson P. Tryon43541032007-10-04 15:44:19 +000073 {0x0, "Floppy",
74 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
75 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
76 {0x1, "COM1",
77 {0x30,0x60,0x61,0x70,0xf0,EOT},
78 {0x00,0x03,0xf8,0x04,0x00,EOT}},
79 {0x2, "COM2",
80 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
81 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
82 {0x3, "Parallel port",
83 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
84 0xf0,EOT},
85 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
86 0x03,EOT}},
87 {0x4, "Environment controller",
88 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
89 0xf3,0xf4,0xf5,0xf6,EOT},
90 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
91 0x00,0x00,NANA,NANA,EOT}},
92 {0x5, "GPIO",
Robinson P. Tryondc817692007-10-05 13:47:04 +000093 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
94 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
95 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
96 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
97 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
98 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
99 0xfd,0xfe,0xff,EOT},
Robinson P. Tryon43541032007-10-04 15:44:19 +0000100 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
101 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
102 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
103 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
104 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
105 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
Robinson P. Tryondc817692007-10-05 13:47:04 +0000106 0x00,NANA,0x00,EOT}},
Robinson P. Tryon43541032007-10-04 15:44:19 +0000107 {0x6, "Game port",
108 {0x30,0x60,0x61,EOT},
109 {0x00,0x02,0x01,EOT}},
110 {0x7, "Consumer IR",
111 {0x30,0x60,0x61,0x70,0xf0,EOT},
112 {0x00,0x03,0x10,0x0b,0x00,EOT}},
113 {0x8, "MIDI port",
114 {0x30,0x60,0x61,0x70,0xf0,EOT},
115 {0x00,0x03,0x00,0x0a,0x00,EOT}},
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000116 {EOT}}},
Uwe Hermann44bb7772007-10-07 21:50:29 +0000117 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
118 /* This is a "Special General Purpose I/O chip". */
119 {EOT}}},
Uwe Hermann07024692007-09-20 22:13:48 +0000120 {0x8708, "IT8708F", {
Uwe Hermann2c290e32007-09-20 00:00:49 +0000121 {NOLDN, NULL,
Uwe Hermannb0ae9762008-10-14 16:34:38 +0000122 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
123 0x2a,0x2e,0x2f,EOT},
124 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
125 0xff,0x00,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000126 {0x0, "Floppy",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000127 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
128 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000129 {0x1, "COM1",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000130 {0x30,0x60,0x61,0x70,0xf0,EOT},
131 {0x00,0x03,0xf8,0x04,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000132 {0x2, "COM2",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000133 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
134 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000135 {0x3, "Parallel port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000136 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
137 0xf0,EOT},
138 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
139 0x03,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000140 {0x4, "SWC",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000141 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
142 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
143 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
144 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000145 {0x5, "Keyboard",
Uwe Hermann2c290e32007-09-20 00:00:49 +0000146 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000147 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
148 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000149 {0x6, "Mouse",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000150 {0x30,0x70,0x71,0xf0,EOT},
151 {0x00,0x0c,0x02,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000152 {0x7, "GPIO",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000153 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
154 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
155 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
156 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
157 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
158 0xfc,EOT},
159 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
160 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
161 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
162 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
163 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
164 0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000165 {0x8, "Game port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000166 {0x30,0x60,0x61,EOT},
167 {0x00,0x02,0x01,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000168 {0x9, "Consumer IR",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000169 {0x30,0x60,0x61,0x70,0xf0,EOT},
170 {0x00,0x03,0x10,0x0b,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000171 {0xa, "MIDI port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000172 {0x30,0x60,0x61,0x70,0xf0,EOT},
173 {0x00,0x03,0x00,0x0a,0x00,EOT}},
174 {EOT}}},
Uwe Hermann44bb7772007-10-07 21:50:29 +0000175 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000176 {EOT}}},
Uwe Hermann07024692007-09-20 22:13:48 +0000177 {0x8712, "IT8712F", {
Uwe Hermann2c290e32007-09-20 00:00:49 +0000178 {NOLDN, NULL,
Uwe Hermannb0ae9762008-10-14 16:34:38 +0000179 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
180 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000181 {0x0, "Floppy",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000182 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
183 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000184 {0x1, "COM1",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000185 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
186 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000187 {0x2, "COM2",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000188 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
189 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000190 {0x3, "Parallel port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000191 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
192 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000193 {0x4, "Environment controller",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000194 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
195 0xf4,0xf5,0xf6,EOT},
196 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
197 0x00,NANA,NANA,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000198 {0x5, "Keyboard",
199 /* TODO: 0xf0: Error in datasheet? */
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000200 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
201 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000202 {0x6, "Mouse",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000203 {0x30,0x70,0x71,0xf0,EOT},
204 {0x00,0x0c,0x02,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000205 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000206 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
207 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
208 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
209 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
210 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
211 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
212 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
Uwe Hermann07024692007-09-20 22:13:48 +0000213 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000214 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
215 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
216 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
217 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000218 {0x8, "MIDI port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000219 {0x30,0x60,0x61,0x70,0xf0,EOT},
220 {0x00,0x03,0x00,0x0a,0x00,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000221 {0x9, "Game port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000222 {0x30,0x60,0x61,EOT},
223 {0x00,0x02,0x01,EOT}},
Uwe Hermann07024692007-09-20 22:13:48 +0000224 {0xa, "Consumer IR",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000225 {0x30,0x60,0x61,0x70,0xf0,EOT},
226 {0x00,0x03,0x10,0x0b,0x00,EOT}},
227 {EOT}}},
Uwe Hermann07024692007-09-20 22:13:48 +0000228 {0x8716, "IT8716F", {
Uwe Hermann2c290e32007-09-20 00:00:49 +0000229 {NOLDN, NULL,
Uwe Hermannb0ae9762008-10-14 16:34:38 +0000230 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
231 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000232 {0x0, "Floppy",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000233 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
234 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000235 {0x1, "COM1",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000236 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
237 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000238 {0x2, "COM2",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000239 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
240 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000241 {0x3, "Parallel port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000242 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
243 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000244 {0x4, "Environment controller",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000245 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
246 0xf4,0xf5,0xf6,EOT},
247 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
248 0x00,NANA,NANA,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000249 {0x5, "Keyboard",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000250 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
251 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000252 {0x6, "Mouse",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000253 {0x30,0x70,0x71,0xf0,EOT},
254 {0x00,0x0c,0x02,0x00,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000255 {0x7, "GPIO",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000256 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
257 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
258 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
259 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
260 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
261 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
262 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
263 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
264 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
265 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
266 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
267 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000268 {0x8, "MIDI port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000269 {0x30,0x60,0x61,0x70,0xf0,EOT},
270 {0x00,0x03,0x00,0x0a,0x00,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000271 {0x9, "Game port",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000272 {0x30,0x60,0x61,EOT},
273 {0x00,0x02,0x01,EOT}},
Uwe Hermann11887f22007-12-07 23:55:20 +0000274 {0xa, "Consumer IR",
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000275 {0x30,0x60,0x61,0x70,0xf0,EOT},
276 {0x00,0x03,0x10,0x0b,0x00,EOT}},
277 {EOT}}},
Uwe Hermann07024692007-09-20 22:13:48 +0000278 {0x8718, "IT8718F", {
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000279 {NOLDN, NULL,
Uwe Hermannb0ae9762008-10-14 16:34:38 +0000280 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
281 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000282 {0x0, "Floppy",
283 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
284 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
285 {0x1, "COM1",
286 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
287 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
288 {0x2, "COM2",
289 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
290 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
291 {0x3, "Parallel port",
292 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
293 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
294 {0x4, "Environment controller",
295 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
296 0xf4,0xf5,0xf6,EOT},
297 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
298 0x00,NANA,NANA,EOT}},
299 {0x5, "Keyboard",
Josh Profittb9c6b0e2008-10-14 16:28:50 +0000300 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000301 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
302 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
303 {0x6, "Mouse",
304 {0x30,0x70,0x71,0xf0,EOT},
305 {0x00,0x0c,0x02,0x00,EOT}},
306 {0x7, "GPIO",
Josh Profittb9c6b0e2008-10-14 16:28:50 +0000307 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000308 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
309 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
310 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
Josh Profittb9c6b0e2008-10-14 16:28:50 +0000311 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
312 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
313 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
314 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000315 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
316 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
317 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
Josh Profittb9c6b0e2008-10-14 16:28:50 +0000318 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000319 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
320 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
Josh Profittb9c6b0e2008-10-14 16:28:50 +0000321 0x00,NANA,0x00,0x00,0x00,EOT}},
Uwe Hermann420f6ab2007-09-21 14:48:04 +0000322 {0xa, "Consumer IR",
323 {0x30,0x60,0x61,0x70,0xf0,EOT},
324 {0x00,0x03,0x10,0x0b,0x00,EOT}},
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000325 {EOT}}},
Uwe Hermanncfb6ac72008-10-01 20:16:58 +0000326 {0x8720, "IT8720F", { /* From sensors-detect */
327 {EOT}}},
Uwe Hermann44bb7772007-10-07 21:50:29 +0000328 {0x8726, "IT8726F", {
329 /* Datasheet wrongly says that the ID is 0x8716. */
Josh Profittb9c6b0e2008-10-14 16:28:50 +0000330 {NOLDN, NULL,
331 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
332 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
333 {0x0, "Floppy",
334 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
335 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
336 {0x1, "COM1",
337 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
338 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
339 {0x2, "COM2",
340 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
341 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
342 {0x3, "Parallel port",
343 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
344 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
345 {0x4, "Environment controller",
346 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
347 0xf4,0xf5,0xf6,EOT},
348 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
349 0x00,MISC,MISC,EOT}},
350 {0x5, "Keyboard",
351 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
352 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
353 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
354 {0x6, "Mouse",
355 {0x30,0x70,0x71,0xf0,EOT},
356 {0x00,0x0c,0x02,0x00,EOT}},
357 {0x7, "GPIO",
358 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
359 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
360 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
361 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
362 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
363 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
364 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
365 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
366 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
367 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
368 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
369 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
370 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
371 {0x8, "MIDI port",
372 {0x30,0x60,0x61,0x70,0xf0,EOT},
373 {0x00,0x03,0x00,0x0a,0x00,EOT}},
374 {0x9, "Game port",
375 {0x30,0x60,0x61,EOT},
376 {0x00,0x02,0x01,EOT}},
377 {0xa, "Consumer IR",
378 {0x30,0x60,0x61,0x70,0xf0,EOT},
379 {0x00,0x03,0x10,0x0b,0x00,EOT}},
Uwe Hermann44bb7772007-10-07 21:50:29 +0000380 {EOT}}},
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000381 {EOT}
382};
383
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000384static const struct superio_registers ec_table[] = {
385 {0x8716, "IT8716F", {
386 {NOLDN, NULL,
387 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
388 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
389 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
390 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
391 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
Uwe Hermann8cb24582008-05-08 13:50:23 +0000392 0x59,0x5c,
393 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
394 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
395 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
396 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
397 0x9b,0x9c,0x9d,EOT},
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000398 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
399 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
400 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
401 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
402 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
Uwe Hermann8cb24582008-05-08 13:50:23 +0000403 0x00,0x00,
404 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000405 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
406 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
407 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
408 0x00,0x00,0x7f,EOT}},
409 {EOT}}},
Uwe Hermannbbd337e2008-05-08 14:37:12 +0000410 {0x8718, "IT8718F", {
411 {NOLDN, NULL,
412 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
413 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
414 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
415 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
416 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
417 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
418 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
419 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
420 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
421 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
422 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
423 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
424 0xa6,EOT},
425 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
426 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
427 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
428 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
429 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
430 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
431 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
432 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
433 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
434 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
435 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
436 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
437 0x00,EOT}},
438 {EOT}}},
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000439 {EOT}
440};
441
Urja Rannikko38204a22008-10-23 23:33:18 +0000442/* Works for: IT8661F/IT8770F */
443static const uint8_t initkey_it8661f[][4] = {
444 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
445 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
446 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
447};
448
449/* Works for: IT8671F/IT8687R, IT8673F */
450static const uint8_t initkey_it8671f[][4] = {
451 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
452 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
453 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
454};
455
456/* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
457static const uint8_t initkey_mbpnp[] = {
458 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
459 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
460 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
461};
462
463/* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
464static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
465{
466 int i, idx;
467
468 /* Determine Super I/O config port. */
469 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
470 for (i = 0; i < 4; i++)
Andriy Gaponb64aa602008-10-28 22:13:38 +0000471 OUTB(init[idx][i], ISA_PNP_ADDR);
Urja Rannikko38204a22008-10-23 23:33:18 +0000472
473 /* Sequentially write the 32 MB PnP init values. */
474 for (i = 0; i < 32; i++)
Andriy Gaponb64aa602008-10-28 22:13:38 +0000475 OUTB(initkey_mbpnp[i], port);
Urja Rannikko38204a22008-10-23 23:33:18 +0000476}
477
Uwe Hermann07024692007-09-20 22:13:48 +0000478/**
Uwe Hermann0f867322007-09-24 01:40:09 +0000479 * IT871[01]F and IT8708F use 0x87, 0x87
Uwe Hermann07024692007-09-20 22:13:48 +0000480 * IT8761F uses 0x87, 0x61, 0x55, 0x55/0xaa
481 * IT86xxF series uses different ports
Uwe Hermann07024692007-09-20 22:13:48 +0000482 */
Uwe Hermann3acf31e2007-09-19 01:55:35 +0000483static void enter_conf_mode_ite(uint16_t port)
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000484{
Andriy Gaponb64aa602008-10-28 22:13:38 +0000485 OUTB(0x87, port);
486 OUTB(0x01, port);
487 OUTB(0x55, port);
488 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
Uwe Hermann25a6c0f2007-09-19 00:48:42 +0000489}
490
Uwe Hermann3acf31e2007-09-19 01:55:35 +0000491static void exit_conf_mode_ite(uint16_t port)
Uwe Hermann25a6c0f2007-09-19 00:48:42 +0000492{
493 regwrite(port, 0x02, 0x02);
494}
495
Uwe Hermannafe83092007-09-28 15:45:43 +0000496static void probe_idregs_ite_helper(const char *init, uint16_t port)
Uwe Hermann25a6c0f2007-09-19 00:48:42 +0000497{
Uwe Hermanneec5ff42008-03-01 18:49:39 +0000498 uint16_t id, chipver, ecport;
Uwe Hermann25a6c0f2007-09-19 00:48:42 +0000499
Uwe Hermann8b8d0392007-10-04 15:23:38 +0000500 probing_for("ITE", init, port);
501
Uwe Hermann07024692007-09-20 22:13:48 +0000502 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
503 id |= regval(port, CHIP_ID_BYTE2_REG);
504 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
505
506 if (superio_unknown(reg_table, id)) {
Uwe Hermann8b8d0392007-10-04 15:23:38 +0000507 if (verbose)
508 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000509 return;
510 }
511
Uwe Hermann8b8d0392007-10-04 15:23:38 +0000512 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
Uwe Hermann07024692007-09-20 22:13:48 +0000513 get_superio_name(reg_table, id), id, chipver, port);
Uwe Hermanne9d46162007-10-07 20:01:23 +0000514 chip_found = 1;
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000515
Uwe Hermann07024692007-09-20 22:13:48 +0000516 dump_superio("ITE", reg_table, port, id);
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000517
518 if (extra_dump) {
Uwe Hermanneec5ff42008-03-01 18:49:39 +0000519 regwrite(port, 0x07, 0x04); /* Select LDN 4 (EC). */
520
521 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000522 ecport = regval(port, 0x60) << 8;
523 ecport |= regval(port, 0x61);
Uwe Hermanneec5ff42008-03-01 18:49:39 +0000524
525 /* EC address register = EC base address + 5. */
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000526 ecport += 5;
527
Uwe Hermanneec5ff42008-03-01 18:49:39 +0000528 printf("Environment controller (0x%04x)\n", ecport);
Ronald Hoogenboom0be73bb2008-02-25 22:32:41 +0000529 dump_superio("ITE-EC", ec_table, ecport, id);
530 }
Uwe Hermannb4db2202007-09-20 23:37:56 +0000531}
Uwe Hermann25a6c0f2007-09-19 00:48:42 +0000532
Uwe Hermannb4db2202007-09-20 23:37:56 +0000533void probe_idregs_ite(uint16_t port)
534{
Urja Rannikko38204a22008-10-23 23:33:18 +0000535 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
536 enter_conf_mode_ite_legacy(port, initkey_it8661f);
537 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
538 exit_conf_mode_ite(port);
Uwe Hermannb4db2202007-09-20 23:37:56 +0000539
Urja Rannikko38204a22008-10-23 23:33:18 +0000540 enter_conf_mode_ite_legacy(port, initkey_it8671f);
541 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
542 exit_conf_mode_ite(port);
543 } else {
544 enter_conf_mode_ite(port);
545 probe_idregs_ite_helper("(init=0x87,0x01,0x55,0x55/0xaa) ", port);
546 exit_conf_mode_ite(port);
547
548 enter_conf_mode_winbond_fintek_ite_8787(port);
549 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
550 exit_conf_mode_winbond_fintek_ite_8787(port);
551 }
Uwe Hermann0120e1a2007-09-16 18:11:03 +0000552}
Robinson P. Tryon552cfb72008-01-15 22:30:55 +0000553
554void print_ite_chips(void)
555{
556 print_vendor_chips("ITE", reg_table);
Uwe Hermann969a9f62008-03-17 13:43:48 +0000557 print_vendor_chips("ITE EC", ec_table);
Robinson P. Tryon552cfb72008-01-15 22:30:55 +0000558}