Add support to IT85xx series
[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         {0x8502, "IT8502E/TE/G", {
33                 {NOLDN, NULL,
34                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
35                          0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
36                         {0x85,0x02,0x71,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
37                          NANA,NANA,NANA,0x00,NANA,EOT}},
38                 {0x1, "UART1",
39                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
40                         {0x00,0x03,0xf8,0x00,0x00,0x04,0x02,0x00,EOT}},
41                 {0x4, "System Wake-Up",
42                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
43                         {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,EOT}},
44                 {0x5, "Mouse",
45                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
46                         {0x01,0x00,0x00,0x00,0x00,0x0C,0x01,NANA,EOT}},
47                 {0x6, "Keyboard",
48                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
49                         {0x01,0x00,0x60,0x00,0x64,0x01,0x01,NANA,EOT}},
50                 {0xf, "Shared Memory/Flash",
51                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
52                         0xf6,EOT},
53                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
54                         0x00,EOT}},
55                 {0x10, "BRAM",
56                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf3,0xf4,
57                         0xf5,EOT},
58                         {0x00,0x00,0x70,0x00,0x72,0x08,0x01,NANA,NANA,
59                         NANA,EOT}},
60                 {0x11, "Power Channel 1",
61                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
62
63                         {0x00,0x00,0x62,0x00,0x66,0x01,0x01,EOT}},
64                 {0x12, "Power Channel 2",
65                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
66                         {0x00,0x00,0x68,0x00,0x6c,0x01,0x01,EOT}},
67                 {0x17, "Power Channel 3",
68                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
69                         {0x00,0x00,0x6a,0x00,0x6e,0x01,0x01,EOT}},
70                 {EOT}}},
71         {0x8510, "IT8510E/TE/G", {
72                 {EOT}}},
73         {0x8511, "IT8511E/TE/G", {
74                 {NOLDN, NULL,
75                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
76                          0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
77                         {0x85,0x11,0x10,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
78                          NANA,NANA,NANA,0x00,NANA,EOT}},
79                 {0x4, "System Wake-Up",
80                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
81                         {0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,EOT}},
82                 {0x5, "Mouse",
83                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
84                         {0x01,0x00,0x00,0x00,0x00,0x0C,0x03,NANA,EOT}},
85                 {0x6, "Keyboard",
86                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
87                         {0x01,0x00,0x60,0x00,0x64,0x01,0x03,NANA,EOT}},
88                 {0xf, "Shared Memory/Flash",
89                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
90                         0xf6,EOT},
91                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
92                         0x00,EOT}},
93                 {0x10, "Real-Time Clock",
94                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,0xf1,
95                         0xf2,0xf3,0xf4,0xf5,EOT},
96                         {0x00,0x00,0x70,0x00,0x72,0x08,0x00,0x00,0x49,
97                         0x4A,NANA,NANA,NANA,EOT}},
98                 {0x11, "Power Channel 1",
99                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
100                         {0x00,0x00,0x62,0x00,0x66,0x01,0x03,EOT}},
101                 {0x12, "Power Channel 2",
102                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
103                         {0x00,0x00,0x68,0x00,0x6c,0x01,0x03,EOT}},
104                 {EOT}}},
105         {0x8512, "IT8512E/F/G", {
106                 {NOLDN, NULL,
107                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
108                          0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
109                         {0x85,0x12,0x22,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
110                          NANA,NANA,NANA,0x00,NANA,EOT}},
111                 {0x4, "System Wake-Up",
112                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
113                         {0x00,0x00,0x00,0x00,0x00,0x00,0x03,EOT}},
114                 {0x5, "Mouse",
115                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
116                         {0x00,0x00,0x00,0x00,0x00,0x0C,0x03,NANA,EOT}},
117                 {0x6, "Keyboard",
118                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
119                         {0x00,0x00,0x60,0x00,0x64,0x01,0x03,NANA,EOT}},
120                 {0xf, "Shared Memory/Flash",
121                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
122                         0xf6,EOT},
123                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
124                         0x00,EOT}},
125                 {0x10, "BRAM",
126                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf3,0xf4,
127                         0xf5,EOT},
128                         {0x00,0x00,0x70,0x00,0x72,0x08,0x00,NANA,NANA,
129                         NANA,EOT}},
130                 {0x11, "Power Channel 1",
131                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
132                         {0x00,0x00,0x62,0x00,0x66,0x01,0x03,EOT}},
133                 {0x12, "Power Channel 2",
134                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
135                         {0x00,0x00,0x68,0x00,0x6c,0x01,0x03,EOT}},
136                 {EOT}}},
137         {0x8513, "IT8513E/F/G", {
138                 {EOT}}},
139         {0x8661, "IT8661F/IT8770F", {
140                 {NOLDN, NULL,
141                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
142                          0x23,0x24,EOT},
143                         {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
144                          0x00,0x00,EOT}},
145                 {0x0, "Floppy",
146                         {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
147                         {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
148                 {0x1, "COM1",
149                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
150                         {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
151                 {0x2, "COM2",
152                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
153                         {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
154                 {0x3, "Parallel port",
155                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
156                          0xf0,EOT},
157                         {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
158                          0x03,EOT}},
159                 {0x4, "IR",
160                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
161                          0x74,0x75,0xf0,EOT},
162                         {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
163                          0x01,0x00,0x00,EOT}},
164                 {0x5, "GPIO",
165                         {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
166                          0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
167                          0xf9,0xfa,0xfb,0xfc,EOT},
168                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
169                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
170                          0x00,0x00,0x00,0x00,EOT}},
171                 {EOT}}},
172         {0x8673, "IT8673F", {
173                 {EOT}}},
174         {0x8681, "IT8671F/IT8687R", {
175                 {NOLDN, NULL,
176                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
177                          0x23,0x24,0x25,0x26,0x2e,0x2f,EOT},
178                         {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x81,0x00,
179                          0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
180                 {0x0, "Floppy",
181                         {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
182                         {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
183                 {0x1, "COM1",
184                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
185                         {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
186                 {0x2, "COM2",
187                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
188                          0x74,0x75,0xf0,0xf1,EOT},
189                         {0x00,0x00,0x02,0xf8,0x03,0x00,0x03,0x02,0x0a,0x02,
190                          0x00,0x01,0x00,0x00,EOT}},
191                 {0x3, "Parallel port",
192                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
193                          0xf0,EOT},
194                         {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
195                          0x03,EOT}},
196                 {0x4, "APC",
197                         {0x30,0xf0,0xf1,0xf2,0xf4,0xf5,0xf6,EOT},
198                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
199                 {0x5, "Keyboard",
200                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
201                         {MISC,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
202                 {0x6, "Mouse",
203                         {0x30,0x70,0x71,0xf0,EOT},
204                         {0x00,0x0c,0x02,0x00,EOT}},
205                 {0x7, "GPIO",
206                         {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
207                          0x70,0x71,0x72,0x73,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,
208                          0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
209                          0xe0,0xe1,0xe2,0xe3,0xe4,EOT},
210                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
211                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
212                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
213                          0x00,0x00,0x00,0x00,0x00,EOT}},
214                 {EOT}}},
215         {0x8701, "IT8703F", {
216                 {NOLDN, NULL,
217                         {0x20,0x21,0x23,0x24,0x26,0x29,0x2a,0x2b,EOT},
218                         {0x87,0x00,0x00,0x80,0x00,0x00,0x7c,0xc0,EOT}},
219                 {0x0, "Floppy",
220                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf3,0xf4,
221                          0xf5,EOT},
222                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
223                          0x00,EOT}},
224                 {0x1, "Parallel port",
225                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
226                         {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
227                 {0x2, "COM1",
228                         {0x30,0x60,0x61,0x70,0xf0,EOT},
229                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
230                 {0x3, "COM2",
231                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
232                         {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
233                 {0x5, "Keyboard",
234                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
235                         {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
236                 {0x6, "Consumer IR",
237                         {0x30,0x60,0x61,0x70,EOT},
238                         {0x00,0x00,0x00,0x00,EOT}},
239                 {0x7, "Game port, MIDI, GPIO set 1",
240                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
241                         {0x00,0x02,0x01,0x03,0x30,0x00,0xff,0x00,0x00,EOT}},
242                 {0x8, "GPIO set 2",
243                         {0x30,0xf0,0xf1,0xf2,0xf3,0xf5,EOT},
244                         {0x00,0xff,0x00,0x00,0x00,0x00,EOT}},
245                 {0x9, "GPIO set 3 and 4",
246                         {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
247                         {0x00,0x02,0x90,0xff,0x00,0x00,0x00,0x00,EOT}},
248                 {0xa, "ACPI",
249                         {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
250                          0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
251                         {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
252                          NANA,NANA,0x00,0x00,0x00,EOT}},
253                 {0xc, "GPIO set 5, 6 and 7",
254                         {0x30,0x60,0x61,0xf0,0xf3,0xf6,EOT},
255                         {0x00,0x03,0x70,0x00,0xff,0xff,EOT}},
256                 {EOT}}},
257         {0x8702, "IT8702F", {
258                 {EOT}}},
259         {0x8705, "IT8705F/AF / IT8700F", {
260                 {NOLDN, NULL,
261                         {0x20,0x21,0x22,0x23,0x24,EOT},
262                         {0x87,0x05,0x00,0x00,NANA,EOT}},
263                 {0x0, "Floppy",
264                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
265                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
266                 {0x1, "COM1",
267                         {0x30,0x60,0x61,0x70,0xf0,EOT},
268                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
269                 {0x2, "COM2",
270                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
271                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
272                 {0x3, "Parallel port",
273                         {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
274                          0xf0,EOT},
275                         {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
276                          0x03,EOT}},
277                 {0x4, "Environment controller",
278                         {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
279                          0xf3,0xf4,0xf5,0xf6,EOT},
280                         {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
281                          0x00,0x00,NANA,NANA,EOT}},
282                 {0x5, "GPIO",
283                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
284                          0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
285                          0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
286                          0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
287                          0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
288                          0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
289                          0xfd,0xfe,0xff,EOT},
290                         {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
291                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
292                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
293                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
294                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
295                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
296                          0x00,NANA,0x00,EOT}},
297                 {0x6, "Game port",
298                         {0x30,0x60,0x61,EOT},
299                         {0x00,0x02,0x01,EOT}},
300                 {0x7, "Consumer IR",
301                         {0x30,0x60,0x61,0x70,0xf0,EOT},
302                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
303                 {0x8, "MIDI port",
304                         {0x30,0x60,0x61,0x70,0xf0,EOT},
305                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
306                 {EOT}}},
307         {0x8706, "IT8706R", {   /* TODO: Not yet in sensors-detect */
308                 /* This is a "Special General Purpose I/O chip". */
309                 {EOT}}},
310         {0x8708, "IT8708F", {
311                 {NOLDN, NULL,
312                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
313                          0x2a,0x2e,0x2f,EOT},
314                         {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
315                          0xff,0x00,0x00,EOT}},
316                 {0x0, "Floppy",
317                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
318                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
319                 {0x1, "COM1",
320                         {0x30,0x60,0x61,0x70,0xf0,EOT},
321                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
322                 {0x2, "COM2",
323                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
324                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
325                 {0x3, "Parallel port",
326                         {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
327                          0xf0,EOT},
328                         {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
329                          0x03,EOT}},
330                 {0x4, "SWC",
331                         {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
332                          0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
333                         {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
334                          0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
335                 {0x5, "Keyboard",
336                         /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
337                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
338                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
339                 {0x6, "Mouse",
340                         {0x30,0x70,0x71,0xf0,EOT},
341                         {0x00,0x0c,0x02,0x00,EOT}},
342                 {0x7, "GPIO",
343                         {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
344                          0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
345                          0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
346                          0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
347                          0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
348                          0xfc,EOT},
349                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
350                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
351                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
352                          0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
353                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
354                          0x00,EOT}},
355                 {0x8, "Game port",
356                         {0x30,0x60,0x61,EOT},
357                         {0x00,0x02,0x01,EOT}},
358                 {0x9, "Consumer IR",
359                         {0x30,0x60,0x61,0x70,0xf0,EOT},
360                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
361                 {0xa, "MIDI port",
362                         {0x30,0x60,0x61,0x70,0xf0,EOT},
363                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
364                 {EOT}}},
365         {0x8710, "IT8710F", {   /* TODO: Not yet in sensors-detect */
366                 {EOT}}},
367         {0x8711, "IT8711F", {   /* 0x8711 is a guess, not found in datasheet. */
368                 {EOT}}},
369         {0x8712, "IT8712F", {
370                 {NOLDN, NULL,
371                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
372                         {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
373                 {0x0, "Floppy",
374                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
375                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
376                 {0x1, "COM1",
377                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
378                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
379                 {0x2, "COM2",
380                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
381                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
382                 {0x3, "Parallel port",
383                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
384                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
385                 {0x4, "Environment controller",
386                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
387                          0xf4,0xf5,0xf6,EOT},
388                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
389                          0x00,NANA,NANA,EOT}},
390                 {0x5, "Keyboard",
391                         /* TODO: 0xf0: Error in datasheet? */
392                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
393                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
394                 {0x6, "Mouse",
395                         {0x30,0x70,0x71,0xf0,EOT},
396                         {0x00,0x0c,0x02,0x00,EOT}},
397                 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
398                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
399                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
400                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
401                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
402                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
403                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
404                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
405                          0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
406                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
407                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
408                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
409                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
410                 {0x8, "MIDI port",
411                         {0x30,0x60,0x61,0x70,0xf0,EOT},
412                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
413                 {0x9, "Game port",
414                         {0x30,0x60,0x61,EOT},
415                         {0x00,0x02,0x01,EOT}},
416                 {0xa, "Consumer IR",
417                         {0x30,0x60,0x61,0x70,0xf0,EOT},
418                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
419                 {EOT}}},
420         {0x8716, "IT8716F", {
421                 {NOLDN, NULL,
422                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
423                         {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
424                 {0x0, "Floppy",
425                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
426                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
427                 {0x1, "COM1",
428                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
429                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
430                 {0x2, "COM2",
431                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
432                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
433                 {0x3, "Parallel port",
434                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
435                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
436                 {0x4, "Environment controller",
437                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
438                          0xf4,0xf5,0xf6,EOT},
439                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
440                          0x00,NANA,NANA,EOT}},
441                 {0x5, "Keyboard",
442                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
443                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
444                 {0x6, "Mouse",
445                         {0x30,0x70,0x71,0xf0,EOT},
446                         {0x00,0x0c,0x02,0x00,EOT}},
447                 {0x7, "GPIO",
448                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
449                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
450                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
451                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
452                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
453                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
454                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
455                          0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
456                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
457                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
458                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
459                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
460                 {0x8, "MIDI port",
461                         {0x30,0x60,0x61,0x70,0xf0,EOT},
462                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
463                 {0x9, "Game port",
464                         {0x30,0x60,0x61,EOT},
465                         {0x00,0x02,0x01,EOT}},
466                 {0xa, "Consumer IR",
467                         {0x30,0x60,0x61,0x70,0xf0,EOT},
468                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
469                 {EOT}}},
470         {0x8718, "IT8718F", {
471                 {NOLDN, NULL,
472                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
473                         {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
474                 {0x0, "Floppy",
475                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
476                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
477                 {0x1, "COM1",
478                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
479                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
480                 {0x2, "COM2",
481                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
482                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
483                 {0x3, "Parallel port",
484                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
485                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
486                 {0x4, "Environment controller",
487                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
488                          0xf4,0xf5,0xf6,EOT},
489                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
490                          0x00,NANA,NANA,EOT}},
491                 {0x5, "Keyboard",
492                         /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
493                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
494                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
495                 {0x6, "Mouse",
496                         {0x30,0x70,0x71,0xf0,EOT},
497                         {0x00,0x0c,0x02,0x00,EOT}},
498                 {0x7, "GPIO",
499                         /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
500                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
501                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
502                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
503                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
504                          0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
505                          0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
506                          0xfb,0xfc,0xfd,0xfe,0xff,EOT},
507                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
508                          0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
509                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
510                          0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
511                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
512                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
513                          0x00,NANA,0x00,0x00,0x00,EOT}},
514                 {0xa, "Consumer IR",
515                         {0x30,0x60,0x61,0x70,0xf0,EOT},
516                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
517                 {EOT}}},
518         {0x8720, "IT8720F", {   /* From sensors-detect */
519                 {EOT}}},
520         {0x8722, "IT8722F", {
521                 {EOT}}},
522         {0x8726, "IT8726F", {
523                 /* Datasheet wrongly says that the ID is 0x8716. */
524                 {NOLDN, NULL,
525                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
526                         {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
527                 {0x0, "Floppy",
528                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
529                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
530                 {0x1, "COM1",
531                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
532                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
533                 {0x2, "COM2",
534                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
535                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
536                 {0x3, "Parallel port",
537                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
538                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
539                 {0x4, "Environment controller",
540                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
541                          0xf4,0xf5,0xf6,EOT},
542                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
543                          0x00,MISC,MISC,EOT}},
544                 {0x5, "Keyboard",
545                         /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
546                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
547                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
548                 {0x6, "Mouse",
549                         {0x30,0x70,0x71,0xf0,EOT},
550                         {0x00,0x0c,0x02,0x00,EOT}},
551                 {0x7, "GPIO",
552                         /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
553                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
554                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
555                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
556                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
557                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
558                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
559                         {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
560                          0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
561                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
562                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
563                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
564                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
565                 {0x8, "MIDI port",
566                         {0x30,0x60,0x61,0x70,0xf0,EOT},
567                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
568                 {0x9, "Game port",
569                         {0x30,0x60,0x61,EOT},
570                         {0x00,0x02,0x01,EOT}},
571                 {0xa, "Consumer IR",
572                         {0x30,0x60,0x61,0x70,0xf0,EOT},
573                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
574                 {EOT}}},
575         {0x8761, "IT8761E", {
576                 {EOT}}},
577         {0x8780, "IT8780F", {
578                 {EOT}}},
579         {EOT}
580 };
581
582 static const struct superio_registers ec_table[] = {
583         {0x8716, "IT8716F", {
584                 {NOLDN, NULL,
585                         {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
586                          0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
587                          0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
588                          0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
589                          0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
590                          0x59,0x5c,
591                          0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
592                          0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
593                          0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
594                          0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
595                          0x9b,0x9c,0x9d,EOT},
596                         {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
597                          NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
598                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
599                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
600                          NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
601                          0x00,0x00,
602                          0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
603                          0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
604                          0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
605                          0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
606                          0x00,0x00,0x7f,EOT}},
607                 {EOT}}},
608         {0x8718, "IT8718F", {
609                 {NOLDN, NULL,
610                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
611                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
612                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
613                          0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
614                          0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
615                          0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
616                          0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
617                          0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
618                          0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
619                          0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
620                          0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
621                          0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
622                          0xa6,EOT},
623                         {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
624                          0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
625                          0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
626                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
627                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
628                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
629                          NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
630                          0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
631                          0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
632                          0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
633                          0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
634                          0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
635                          0x00,EOT}},
636                 {EOT}}},
637         {EOT}
638 };
639
640 /* Works for: IT8661F/IT8770F */
641 static const uint8_t initkey_it8661f[][4] = {
642         {0x86, 0x61, 0x55, 0x55},       /* 0x3f0 */
643         {0x86, 0x61, 0x55, 0xaa},       /* 0x3bd */
644         {0x86, 0x61, 0xaa, 0x55},       /* 0x370 */
645 };
646
647 /* Works for: IT8671F/IT8687R, IT8673F */
648 static const uint8_t initkey_it8671f[][4] = {
649         {0x86, 0x80, 0x55, 0x55},       /* 0x3f0 */
650         {0x86, 0x80, 0x55, 0xaa},       /* 0x3bd */
651         {0x86, 0x80, 0xaa, 0x55},       /* 0x370 */
652 };
653
654 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
655 static const uint8_t initkey_mbpnp[] = {
656         0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
657         0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
658         0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
659 };
660
661 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
662 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
663 {
664         int i, idx;
665
666         /* Determine Super I/O config port. */
667         idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
668         for (i = 0; i < 4; i++)
669                 OUTB(init[idx][i], ISA_PNP_ADDR);
670
671         /* Sequentially write the 32 MB PnP init values. */
672         for (i = 0; i < 32; i++)
673                 OUTB(initkey_mbpnp[i], port);
674 }
675
676 static void enter_conf_mode_ite(uint16_t port)
677 {
678         OUTB(0x87, port);
679         OUTB(0x01, port);
680         OUTB(0x55, port);
681         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
682 }
683
684 static void enter_conf_mode_ite_it8502e(uint16_t port)
685 {
686         OUTB(0x85, port);
687         OUTB(0x02, port);
688         OUTB(0x55, port);
689         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
690 }
691
692 static void enter_conf_mode_ite_it8761e(uint16_t port)
693 {
694         OUTB(0x87, port);
695         OUTB(0x61, port);
696         OUTB(0x55, port);
697         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
698 }
699
700 static void enter_conf_mode_ite_it8228e(uint16_t port)
701 {
702         OUTB(0x82, port);
703         OUTB(0x28, port);
704         OUTB(0x55, port);
705         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
706 }
707
708 static void exit_conf_mode_ite(uint16_t port)
709 {
710         regwrite(port, 0x02, 0x02);
711 }
712
713 static void probe_idregs_ite_helper(const char *init, uint16_t port)
714 {
715         uint16_t id, chipver, ecport;
716
717         probing_for("ITE", init, port);
718
719         id = regval(port, CHIP_ID_BYTE1_REG) << 8;
720         id |= regval(port, CHIP_ID_BYTE2_REG);
721         chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
722
723         if (superio_unknown(reg_table, id)) {
724                 if (verbose)
725                         printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
726                 return;
727         }
728
729         printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
730                get_superio_name(reg_table, id), id, chipver, port);
731         chip_found = 1;
732
733         dump_superio("ITE", reg_table, port, id, LDN_SEL);
734
735         if (extra_dump) {
736                 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
737
738                 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
739                 ecport = regval(port, 0x60) << 8;
740                 ecport |= regval(port, 0x61);
741
742                 /* EC address register = EC base address + 5. */
743                 ecport += 5;
744
745                 printf("Environment controller (0x%04x)\n", ecport);
746                 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
747         }
748 }
749
750 void probe_idregs_ite(uint16_t port)
751 {
752         if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
753                 enter_conf_mode_ite_legacy(port, initkey_it8661f);
754                 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
755                 exit_conf_mode_ite(port);
756
757                 enter_conf_mode_ite_legacy(port, initkey_it8671f);
758                 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
759                 exit_conf_mode_ite(port);
760         } else {
761                 enter_conf_mode_ite(port);
762                 probe_idregs_ite_helper("(init=standard) ", port);
763                 exit_conf_mode_ite(port);
764
765                 enter_conf_mode_ite_it8502e(port);
766                 probe_idregs_ite_helper("(init=it8502e) ", port);
767                 exit_conf_mode_ite(port);
768
769                 enter_conf_mode_ite_it8761e(port);
770                 probe_idregs_ite_helper("(init=it8761e) ", port);
771                 exit_conf_mode_ite(port);
772
773                 enter_conf_mode_ite_it8228e(port);
774                 probe_idregs_ite_helper("(init=it8228e) ", port);
775                 exit_conf_mode_ite(port);
776
777                 enter_conf_mode_winbond_fintek_ite_8787(port);
778                 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
779                 exit_conf_mode_winbond_fintek_ite_8787(port);
780         }
781 }
782
783 void print_ite_chips(void)
784 {
785         print_vendor_chips("ITE", reg_table);
786         print_vendor_chips("ITE-EC", ec_table);
787 }