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