Add detection support for the ITE IT8721F.
[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         {0x8721, "IT8721F", {
609                 {EOT}}},
610         {0x8722, "IT8722F", {
611                 {EOT}}},
612         {0x8726, "IT8726F", {
613                 /* Datasheet wrongly says that the ID is 0x8716. */
614                 {NOLDN, NULL,
615                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
616                         {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
617                 {0x0, "Floppy",
618                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
619                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
620                 {0x1, "COM1",
621                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
622                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
623                 {0x2, "COM2",
624                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
625                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
626                 {0x3, "Parallel port",
627                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
628                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
629                 {0x4, "Environment controller",
630                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
631                          0xf4,0xf5,0xf6,EOT},
632                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
633                          0x00,MISC,MISC,EOT}},
634                 {0x5, "Keyboard",
635                         /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
636                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
637                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
638                 {0x6, "Mouse",
639                         {0x30,0x70,0x71,0xf0,EOT},
640                         {0x00,0x0c,0x02,0x00,EOT}},
641                 {0x7, "GPIO",
642                         /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
643                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
644                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
645                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
646                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
647                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
648                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
649                         {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
650                          0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
651                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
652                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
653                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
654                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
655                 {0x8, "MIDI port",
656                         {0x30,0x60,0x61,0x70,0xf0,EOT},
657                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
658                 {0x9, "Game port",
659                         {0x30,0x60,0x61,EOT},
660                         {0x00,0x02,0x01,EOT}},
661                 {0xa, "Consumer IR",
662                         {0x30,0x60,0x61,0x70,0xf0,EOT},
663                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
664                 {EOT}}},
665         {0x8761, "IT8761E", {
666                 {EOT}}},
667         {0x8780, "IT8780F", {
668                 {EOT}}},
669         {EOT}
670 };
671
672 static const struct superio_registers ec_table[] = {
673         {0x8716, "IT8716F", {
674                 {NOLDN, NULL,
675                         {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
676                          0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
677                          0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
678                          0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
679                          0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
680                          0x59,0x5c,
681                          0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
682                          0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
683                          0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
684                          0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
685                          0x9b,0x9c,0x9d,EOT},
686                         {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
687                          NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
688                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
689                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
690                          NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
691                          0x00,0x00,
692                          0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
693                          0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
694                          0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
695                          0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
696                          0x00,0x00,0x7f,EOT}},
697                 {EOT}}},
698         {0x8718, "IT8718F", {
699                 {NOLDN, NULL,
700                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
701                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
702                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
703                          0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
704                          0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
705                          0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
706                          0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
707                          0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
708                          0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
709                          0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
710                          0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
711                          0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
712                          0xa6,EOT},
713                         {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
714                          0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
715                          0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
716                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
717                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
718                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
719                          NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
720                          0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
721                          0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
722                          0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
723                          0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
724                          0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
725                          0x00,EOT}},
726                 {EOT}}},
727         {EOT}
728 };
729
730 /* Works for: IT8661F/IT8770F */
731 static const uint8_t initkey_it8661f[][4] = {
732         {0x86, 0x61, 0x55, 0x55},       /* 0x3f0 */
733         {0x86, 0x61, 0x55, 0xaa},       /* 0x3bd */
734         {0x86, 0x61, 0xaa, 0x55},       /* 0x370 */
735 };
736
737 /* Works for: IT8671F/IT8687R, IT8673F */
738 static const uint8_t initkey_it8671f[][4] = {
739         {0x86, 0x80, 0x55, 0x55},       /* 0x3f0 */
740         {0x86, 0x80, 0x55, 0xaa},       /* 0x3bd */
741         {0x86, 0x80, 0xaa, 0x55},       /* 0x370 */
742 };
743
744 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
745 static const uint8_t initkey_mbpnp[] = {
746         0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
747         0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
748         0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
749 };
750
751 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
752 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
753 {
754         int i, idx;
755
756         /* Determine Super I/O config port. */
757         idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
758         for (i = 0; i < 4; i++)
759                 OUTB(init[idx][i], ISA_PNP_ADDR);
760
761         /* Sequentially write the 32 MB PnP init values. */
762         for (i = 0; i < 32; i++)
763                 OUTB(initkey_mbpnp[i], port);
764 }
765
766 static void enter_conf_mode_ite(uint16_t port)
767 {
768         OUTB(0x87, port);
769         OUTB(0x01, port);
770         OUTB(0x55, port);
771         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
772 }
773
774 static void enter_conf_mode_ite_it8502e(uint16_t port)
775 {
776         OUTB(0x85, port);
777         OUTB(0x02, port);
778         OUTB(0x55, port);
779         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
780 }
781
782 static void enter_conf_mode_ite_it8761e(uint16_t port)
783 {
784         OUTB(0x87, port);
785         OUTB(0x61, port);
786         OUTB(0x55, port);
787         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
788 }
789
790 static void enter_conf_mode_ite_it8228e(uint16_t port)
791 {
792         OUTB(0x82, port);
793         OUTB(0x28, port);
794         OUTB(0x55, port);
795         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
796 }
797
798 static void exit_conf_mode_ite(uint16_t port)
799 {
800         regwrite(port, 0x02, 0x02);
801 }
802
803 static int chip_found_at_port;
804
805 static void probe_idregs_ite_helper(const char *init, uint16_t port)
806 {
807         uint16_t id, chipver, ecport;
808
809         probing_for("ITE", init, port);
810
811         id = regval(port, CHIP_ID_BYTE1_REG) << 8;
812         id |= regval(port, CHIP_ID_BYTE2_REG);
813         chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
814
815         if (superio_unknown(reg_table, id)) {
816                 if (verbose)
817                         printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
818                 return;
819         }
820
821         printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
822                get_superio_name(reg_table, id), id, chipver, port);
823         chip_found = 1;
824         chip_found_at_port = 1;
825
826         dump_superio("ITE", reg_table, port, id, LDN_SEL);
827
828         if (extra_dump) {
829                 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
830
831                 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
832                 ecport = regval(port, 0x60) << 8;
833                 ecport |= regval(port, 0x61);
834
835                 /* EC address register = EC base address + 5. */
836                 ecport += 5;
837
838                 printf("Environment controller (0x%04x)\n", ecport);
839                 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
840         }
841 }
842
843 void probe_idregs_ite(uint16_t port)
844 {
845         chip_found_at_port = 0;
846
847         if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
848                 enter_conf_mode_ite_legacy(port, initkey_it8661f);
849                 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
850                 exit_conf_mode_ite(port);
851                 if (chip_found_at_port) return;
852
853                 enter_conf_mode_ite_legacy(port, initkey_it8671f);
854                 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
855                 exit_conf_mode_ite(port);
856                 if (chip_found_at_port) return;
857         } else {
858                 enter_conf_mode_ite(port);
859                 probe_idregs_ite_helper("(init=standard) ", port);
860                 exit_conf_mode_ite(port);
861                 if (chip_found_at_port) return;
862
863                 enter_conf_mode_ite_it8502e(port);
864                 probe_idregs_ite_helper("(init=it8502e) ", port);
865                 exit_conf_mode_ite(port);
866                 if (chip_found_at_port) return;
867
868                 enter_conf_mode_ite_it8761e(port);
869                 probe_idregs_ite_helper("(init=it8761e) ", port);
870                 exit_conf_mode_ite(port);
871                 if (chip_found_at_port) return;
872
873                 enter_conf_mode_ite_it8228e(port);
874                 probe_idregs_ite_helper("(init=it8228e) ", port);
875                 exit_conf_mode_ite(port);
876                 if (chip_found_at_port) return;
877
878                 enter_conf_mode_winbond_fintek_ite_8787(port);
879                 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
880                 exit_conf_mode_winbond_fintek_ite_8787(port);
881                 if (chip_found_at_port) return;
882         }
883 }
884
885 void print_ite_chips(void)
886 {
887         print_vendor_chips("ITE", reg_table);
888         print_vendor_chips("ITE-EC", ec_table);
889 }