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