Add detection support for ITE IT8228E, IT8711F, IT8722F, IT8761E,
[coreboot.git] / util / superiotool / ite.c
1 /*
2  * This file is part of the superiotool project.
3  *
4  * Copyright (C) 2007 Carl-Daniel Hailfinger
5  * Copyright (C) 2007-2008 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
24 #define CHIP_ID_BYTE1_REG       0x20
25 #define CHIP_ID_BYTE2_REG       0x21
26 #define CHIP_VERSION_REG        0x22
27 #define ISA_PNP_ADDR            0x279
28
29 static const struct superio_registers reg_table[] = {
30         {0x8228, "IT8228E", {
31                 {EOT}}},
32         {0x8661, "IT8661F/IT8770F", {
33                 {NOLDN, NULL,
34                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
35                          0x23,0x24,EOT},
36                         {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
37                          0x00,0x00,EOT}},
38                 {0x0, "Floppy",
39                         {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
40                         {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
41                 {0x1, "COM1",
42                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
43                         {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
44                 {0x2, "COM2",
45                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
46                         {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
47                 {0x3, "Parallel port",
48                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
49                          0xf0,EOT},
50                         {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
51                          0x03,EOT}},
52                 {0x4, "IR",
53                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
54                          0x74,0x75,0xf0,EOT},
55                         {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
56                          0x01,0x00,0x00,EOT}},
57                 {0x5, "GPIO",
58                         {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
59                          0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
60                          0xf9,0xfa,0xfb,0xfc,EOT},
61                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
62                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
63                          0x00,0x00,0x00,0x00,EOT}},
64                 {EOT}}},
65         {0x8673, "IT8673F", {
66                 {EOT}}},
67         {0x8681, "IT8671F/IT8687R", {
68                 {EOT}}},
69         {0x8702, "IT8702F", {
70                 {EOT}}},
71         {0x8705, "IT8705F/AF / IT8700F", {
72                 {NOLDN, NULL,
73                         {0x20,0x21,0x22,0x23,0x24,EOT},
74                         {0x87,0x05,0x00,0x00,NANA,EOT}},
75                 {0x0, "Floppy",
76                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
77                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
78                 {0x1, "COM1",
79                         {0x30,0x60,0x61,0x70,0xf0,EOT},
80                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
81                 {0x2, "COM2",
82                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
83                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
84                 {0x3, "Parallel port",
85                         {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
86                          0xf0,EOT},
87                         {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
88                          0x03,EOT}},
89                 {0x4, "Environment controller",
90                         {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
91                          0xf3,0xf4,0xf5,0xf6,EOT},
92                         {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
93                          0x00,0x00,NANA,NANA,EOT}},
94                 {0x5, "GPIO",
95                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
96                          0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
97                          0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
98                          0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
99                          0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
100                          0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
101                          0xfd,0xfe,0xff,EOT},
102                         {0x00,0x00,0x00,0xff,0xe0,0xff,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,
106                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
107                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
108                          0x00,NANA,0x00,EOT}},
109                 {0x6, "Game port",
110                         {0x30,0x60,0x61,EOT},
111                         {0x00,0x02,0x01,EOT}},
112                 {0x7, "Consumer IR",
113                         {0x30,0x60,0x61,0x70,0xf0,EOT},
114                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
115                 {0x8, "MIDI port",
116                         {0x30,0x60,0x61,0x70,0xf0,EOT},
117                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
118                 {EOT}}},
119         {0x8706, "IT8706R", {   /* TODO: Not yet in sensors-detect */
120                 /* This is a "Special General Purpose I/O chip". */
121                 {EOT}}},
122         {0x8708, "IT8708F", {
123                 {NOLDN, NULL,
124                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
125                          0x2a,0x2e,0x2f,EOT},
126                         {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
127                          0xff,0x00,0x00,EOT}},
128                 {0x0, "Floppy",
129                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
130                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
131                 {0x1, "COM1",
132                         {0x30,0x60,0x61,0x70,0xf0,EOT},
133                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
134                 {0x2, "COM2",
135                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
136                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
137                 {0x3, "Parallel port",
138                         {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
139                          0xf0,EOT},
140                         {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
141                          0x03,EOT}},
142                 {0x4, "SWC",
143                         {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
144                          0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
145                         {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
146                          0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
147                 {0x5, "Keyboard",
148                         /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
149                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
150                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
151                 {0x6, "Mouse",
152                         {0x30,0x70,0x71,0xf0,EOT},
153                         {0x00,0x0c,0x02,0x00,EOT}},
154                 {0x7, "GPIO",
155                         {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
156                          0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
157                          0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
158                          0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
159                          0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
160                          0xfc,EOT},
161                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
162                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
163                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
164                          0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
165                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
166                          0x00,EOT}},
167                 {0x8, "Game port",
168                         {0x30,0x60,0x61,EOT},
169                         {0x00,0x02,0x01,EOT}},
170                 {0x9, "Consumer IR",
171                         {0x30,0x60,0x61,0x70,0xf0,EOT},
172                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
173                 {0xa, "MIDI port",
174                         {0x30,0x60,0x61,0x70,0xf0,EOT},
175                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
176                 {EOT}}},
177         {0x8710, "IT8710F", {   /* TODO: Not yet in sensors-detect */
178                 {EOT}}},
179         {0x8711, "IT8711F", {   /* 0x8711 is a guess, not found in datasheet. */
180                 {EOT}}},
181         {0x8712, "IT8712F", {
182                 {NOLDN, NULL,
183                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
184                         {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
185                 {0x0, "Floppy",
186                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
187                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
188                 {0x1, "COM1",
189                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
190                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
191                 {0x2, "COM2",
192                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
193                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
194                 {0x3, "Parallel port",
195                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
196                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
197                 {0x4, "Environment controller",
198                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
199                          0xf4,0xf5,0xf6,EOT},
200                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
201                          0x00,NANA,NANA,EOT}},
202                 {0x5, "Keyboard",
203                         /* TODO: 0xf0: Error in datasheet? */
204                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
205                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
206                 {0x6, "Mouse",
207                         {0x30,0x70,0x71,0xf0,EOT},
208                         {0x00,0x0c,0x02,0x00,EOT}},
209                 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
210                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
211                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
212                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
213                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
214                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
215                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
216                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
217                          0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
218                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
219                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
220                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
221                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
222                 {0x8, "MIDI port",
223                         {0x30,0x60,0x61,0x70,0xf0,EOT},
224                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
225                 {0x9, "Game port",
226                         {0x30,0x60,0x61,EOT},
227                         {0x00,0x02,0x01,EOT}},
228                 {0xa, "Consumer IR",
229                         {0x30,0x60,0x61,0x70,0xf0,EOT},
230                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
231                 {EOT}}},
232         {0x8716, "IT8716F", {
233                 {NOLDN, NULL,
234                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
235                         {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
236                 {0x0, "Floppy",
237                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
238                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
239                 {0x1, "COM1",
240                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
241                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
242                 {0x2, "COM2",
243                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
244                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
245                 {0x3, "Parallel port",
246                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
247                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
248                 {0x4, "Environment controller",
249                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
250                          0xf4,0xf5,0xf6,EOT},
251                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
252                          0x00,NANA,NANA,EOT}},
253                 {0x5, "Keyboard",
254                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
255                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
256                 {0x6, "Mouse",
257                         {0x30,0x70,0x71,0xf0,EOT},
258                         {0x00,0x0c,0x02,0x00,EOT}},
259                 {0x7, "GPIO",
260                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
261                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
262                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
263                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
264                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
265                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
266                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
267                          0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
268                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
269                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
270                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
271                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
272                 {0x8, "MIDI port",
273                         {0x30,0x60,0x61,0x70,0xf0,EOT},
274                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
275                 {0x9, "Game port",
276                         {0x30,0x60,0x61,EOT},
277                         {0x00,0x02,0x01,EOT}},
278                 {0xa, "Consumer IR",
279                         {0x30,0x60,0x61,0x70,0xf0,EOT},
280                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
281                 {EOT}}},
282         {0x8718, "IT8718F", {
283                 {NOLDN, NULL,
284                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
285                         {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
286                 {0x0, "Floppy",
287                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
288                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
289                 {0x1, "COM1",
290                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
291                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
292                 {0x2, "COM2",
293                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
294                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
295                 {0x3, "Parallel port",
296                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
297                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
298                 {0x4, "Environment controller",
299                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
300                          0xf4,0xf5,0xf6,EOT},
301                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
302                          0x00,NANA,NANA,EOT}},
303                 {0x5, "Keyboard",
304                         /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
305                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
306                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
307                 {0x6, "Mouse",
308                         {0x30,0x70,0x71,0xf0,EOT},
309                         {0x00,0x0c,0x02,0x00,EOT}},
310                 {0x7, "GPIO",
311                         /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
312                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
313                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
314                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
315                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
316                          0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
317                          0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
318                          0xfb,0xfc,0xfd,0xfe,0xff,EOT},
319                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
320                          0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
321                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
322                          0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
323                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
324                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
325                          0x00,NANA,0x00,0x00,0x00,EOT}},
326                 {0xa, "Consumer IR",
327                         {0x30,0x60,0x61,0x70,0xf0,EOT},
328                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
329                 {EOT}}},
330         {0x8720, "IT8720F", {   /* From sensors-detect */
331                 {EOT}}},
332         {0x8722, "IT8722F", {
333                 {EOT}}},
334         {0x8726, "IT8726F", {
335                 /* Datasheet wrongly says that the ID is 0x8716. */
336                 {NOLDN, NULL,
337                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
338                         {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
339                 {0x0, "Floppy",
340                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
341                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
342                 {0x1, "COM1",
343                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
344                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
345                 {0x2, "COM2",
346                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
347                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
348                 {0x3, "Parallel port",
349                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
350                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
351                 {0x4, "Environment controller",
352                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
353                          0xf4,0xf5,0xf6,EOT},
354                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
355                          0x00,MISC,MISC,EOT}},
356                 {0x5, "Keyboard",
357                         /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
358                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
359                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
360                 {0x6, "Mouse",
361                         {0x30,0x70,0x71,0xf0,EOT},
362                         {0x00,0x0c,0x02,0x00,EOT}},
363                 {0x7, "GPIO",
364                         /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
365                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
366                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
367                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
368                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
369                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
370                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
371                         {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
372                          0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
373                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
374                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
375                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
376                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
377                 {0x8, "MIDI port",
378                         {0x30,0x60,0x61,0x70,0xf0,EOT},
379                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
380                 {0x9, "Game port",
381                         {0x30,0x60,0x61,EOT},
382                         {0x00,0x02,0x01,EOT}},
383                 {0xa, "Consumer IR",
384                         {0x30,0x60,0x61,0x70,0xf0,EOT},
385                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
386                 {EOT}}},
387         {0x8761, "IT8761E", {
388                 {EOT}}},
389         {0x8780, "IT8780F", {
390                 {EOT}}},
391         {EOT}
392 };
393
394 static const struct superio_registers ec_table[] = {
395         {0x8716, "IT8716F", {
396                 {NOLDN, NULL,
397                         {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
398                          0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
399                          0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
400                          0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
401                          0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
402                          0x59,0x5c,
403                          0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
404                          0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
405                          0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
406                          0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
407                          0x9b,0x9c,0x9d,EOT},
408                         {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
409                          NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
410                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
411                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
412                          NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
413                          0x00,0x00,
414                          0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
415                          0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
416                          0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
417                          0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
418                          0x00,0x00,0x7f,EOT}},
419                 {EOT}}},
420         {0x8718, "IT8718F", {
421                 {NOLDN, NULL,
422                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
423                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
424                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
425                          0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
426                          0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
427                          0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
428                          0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
429                          0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
430                          0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
431                          0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
432                          0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
433                          0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
434                          0xa6,EOT},
435                         {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
436                          0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
437                          0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
438                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
439                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
440                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
441                          NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
442                          0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
443                          0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
444                          0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
445                          0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
446                          0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
447                          0x00,EOT}},
448                 {EOT}}},
449         {EOT}
450 };
451
452 /* Works for: IT8661F/IT8770F */
453 static const uint8_t initkey_it8661f[][4] = {
454         {0x86, 0x61, 0x55, 0x55},       /* 0x3f0 */
455         {0x86, 0x61, 0x55, 0xaa},       /* 0x3bd */
456         {0x86, 0x61, 0xaa, 0x55},       /* 0x370 */
457 };
458
459 /* Works for: IT8671F/IT8687R, IT8673F */
460 static const uint8_t initkey_it8671f[][4] = {
461         {0x86, 0x80, 0x55, 0x55},       /* 0x3f0 */
462         {0x86, 0x80, 0x55, 0xaa},       /* 0x3bd */
463         {0x86, 0x80, 0xaa, 0x55},       /* 0x370 */
464 };
465
466 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
467 static const uint8_t initkey_mbpnp[] = {
468         0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
469         0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
470         0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
471 };
472
473 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
474 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
475 {
476         int i, idx;
477
478         /* Determine Super I/O config port. */
479         idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
480         for (i = 0; i < 4; i++)
481                 OUTB(init[idx][i], ISA_PNP_ADDR);
482
483         /* Sequentially write the 32 MB PnP init values. */
484         for (i = 0; i < 32; i++)
485                 OUTB(initkey_mbpnp[i], port);
486 }
487
488 static void enter_conf_mode_ite(uint16_t port)
489 {
490         OUTB(0x87, port);
491         OUTB(0x01, port);
492         OUTB(0x55, port);
493         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
494 }
495
496 static void enter_conf_mode_ite_it8761e(uint16_t port)
497 {
498         OUTB(0x87, port);
499         OUTB(0x61, port);
500         OUTB(0x55, port);
501         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
502 }
503
504 static void enter_conf_mode_ite_it8228e(uint16_t port)
505 {
506         OUTB(0x82, port);
507         OUTB(0x28, port);
508         OUTB(0x55, port);
509         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
510 }
511
512 static void exit_conf_mode_ite(uint16_t port)
513 {
514         regwrite(port, 0x02, 0x02);
515 }
516
517 static void probe_idregs_ite_helper(const char *init, uint16_t port)
518 {
519         uint16_t id, chipver, ecport;
520
521         probing_for("ITE", init, port);
522
523         id = regval(port, CHIP_ID_BYTE1_REG) << 8;
524         id |= regval(port, CHIP_ID_BYTE2_REG);
525         chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
526
527         if (superio_unknown(reg_table, id)) {
528                 if (verbose)
529                         printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
530                 return;
531         }
532
533         printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
534                get_superio_name(reg_table, id), id, chipver, port);
535         chip_found = 1;
536
537         dump_superio("ITE", reg_table, port, id);
538
539         if (extra_dump) {
540                 regwrite(port, 0x07, 0x04); /* Select LDN 4 (EC). */
541
542                 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
543                 ecport = regval(port, 0x60) << 8;
544                 ecport |= regval(port, 0x61);
545
546                 /* EC address register = EC base address + 5. */
547                 ecport += 5;
548
549                 printf("Environment controller (0x%04x)\n", ecport);
550                 dump_superio("ITE-EC", ec_table, ecport, id);
551         }
552 }
553
554 void probe_idregs_ite(uint16_t port)
555 {
556         if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
557                 enter_conf_mode_ite_legacy(port, initkey_it8661f);
558                 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
559                 exit_conf_mode_ite(port);
560
561                 enter_conf_mode_ite_legacy(port, initkey_it8671f);
562                 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
563                 exit_conf_mode_ite(port);
564         } else {
565                 enter_conf_mode_ite(port);
566                 probe_idregs_ite_helper("(init=standard) ", port);
567                 exit_conf_mode_ite(port);
568
569                 enter_conf_mode_ite_it8761e(port);
570                 probe_idregs_ite_helper("(init=it8761e) ", port);
571                 exit_conf_mode_ite(port);
572
573                 enter_conf_mode_ite_it8228e(port);
574                 probe_idregs_ite_helper("(init=it8228e) ", port);
575                 exit_conf_mode_ite(port);
576
577                 enter_conf_mode_winbond_fintek_ite_8787(port);
578                 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
579                 exit_conf_mode_winbond_fintek_ite_8787(port);
580         }
581 }
582
583 void print_ite_chips(void)
584 {
585         print_vendor_chips("ITE", reg_table);
586         print_vendor_chips("ITE EC", ec_table);
587 }