0e43614c02e48cd3a312e8673226a932b8d553ac
[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         {0x8780, "IT8780F", {
712                 {EOT}}},
713         {EOT}
714 };
715
716 static const struct superio_registers ec_table[] = {
717         {0x8716, "IT8716F", {
718                 {NOLDN, NULL,
719                         {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
720                          0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
721                          0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
722                          0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
723                          0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
724                          0x59,0x5c,
725                          0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
726                          0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
727                          0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
728                          0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
729                          0x9b,0x9c,0x9d,EOT},
730                         {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
731                          NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
732                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
733                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
734                          NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
735                          0x00,0x00,
736                          0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
737                          0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
738                          0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
739                          0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
740                          0x00,0x00,0x7f,EOT}},
741                 {EOT}}},
742         {0x8718, "IT8718F", {
743                 {NOLDN, NULL,
744                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
745                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
746                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
747                          0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
748                          0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
749                          0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
750                          0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
751                          0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
752                          0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
753                          0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
754                          0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
755                          0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
756                          0xa6,EOT},
757                         {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
758                          0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
759                          0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
760                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
761                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
762                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
763                          NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
764                          0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
765                          0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
766                          0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
767                          0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
768                          0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
769                          0x00,EOT}},
770                 {EOT}}},
771         {EOT}
772 };
773
774 /* Works for: IT8661F/IT8770F */
775 static const uint8_t initkey_it8661f[][4] = {
776         {0x86, 0x61, 0x55, 0x55},       /* 0x3f0 */
777         {0x86, 0x61, 0x55, 0xaa},       /* 0x3bd */
778         {0x86, 0x61, 0xaa, 0x55},       /* 0x370 */
779 };
780
781 /* Works for: IT8671F/IT8687R, IT8673F */
782 static const uint8_t initkey_it8671f[][4] = {
783         {0x86, 0x80, 0x55, 0x55},       /* 0x3f0 */
784         {0x86, 0x80, 0x55, 0xaa},       /* 0x3bd */
785         {0x86, 0x80, 0xaa, 0x55},       /* 0x370 */
786 };
787
788 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
789 static const uint8_t initkey_mbpnp[] = {
790         0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
791         0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
792         0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
793 };
794
795 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
796 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
797 {
798         int i, idx;
799
800         /* Determine Super I/O config port. */
801         idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
802         for (i = 0; i < 4; i++)
803                 OUTB(init[idx][i], ISA_PNP_ADDR);
804
805         /* Sequentially write the 32 MB PnP init values. */
806         for (i = 0; i < 32; i++)
807                 OUTB(initkey_mbpnp[i], port);
808 }
809
810 static void enter_conf_mode_ite(uint16_t port)
811 {
812         OUTB(0x87, port);
813         OUTB(0x01, port);
814         OUTB(0x55, port);
815         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
816 }
817
818 static void enter_conf_mode_ite_it8502e(uint16_t port)
819 {
820         OUTB(0x85, port);
821         OUTB(0x02, port);
822         OUTB(0x55, port);
823         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
824 }
825
826 static void enter_conf_mode_ite_it8761e(uint16_t port)
827 {
828         OUTB(0x87, port);
829         OUTB(0x61, port);
830         OUTB(0x55, port);
831         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
832 }
833
834 static void enter_conf_mode_ite_it8228e(uint16_t port)
835 {
836         OUTB(0x82, port);
837         OUTB(0x28, port);
838         OUTB(0x55, port);
839         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
840 }
841
842 static void exit_conf_mode_ite(uint16_t port)
843 {
844         regwrite(port, 0x02, 0x02);
845 }
846
847 static int chip_found_at_port;
848
849 static void probe_idregs_ite_helper(const char *init, uint16_t port)
850 {
851         uint16_t id, chipver, ecport;
852
853         probing_for("ITE", init, port);
854
855         id = regval(port, CHIP_ID_BYTE1_REG) << 8;
856         id |= regval(port, CHIP_ID_BYTE2_REG);
857         chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
858
859         if (superio_unknown(reg_table, id)) {
860                 if (verbose)
861                         printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
862                 return;
863         }
864
865         printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
866                get_superio_name(reg_table, id), id, chipver, port);
867         chip_found = 1;
868         chip_found_at_port = 1;
869
870         dump_superio("ITE", reg_table, port, id, LDN_SEL);
871
872         if (extra_dump) {
873                 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
874
875                 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
876                 ecport = regval(port, 0x60) << 8;
877                 ecport |= regval(port, 0x61);
878
879                 /* EC address register = EC base address + 5. */
880                 ecport += 5;
881
882                 printf("Environment controller (0x%04x)\n", ecport);
883                 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
884         }
885 }
886
887 void probe_idregs_ite(uint16_t port)
888 {
889         chip_found_at_port = 0;
890
891         if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
892                 enter_conf_mode_ite_legacy(port, initkey_it8661f);
893                 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
894                 exit_conf_mode_ite(port);
895                 if (chip_found_at_port) return;
896
897                 enter_conf_mode_ite_legacy(port, initkey_it8671f);
898                 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
899                 exit_conf_mode_ite(port);
900                 if (chip_found_at_port) return;
901         } else {
902                 enter_conf_mode_ite(port);
903                 probe_idregs_ite_helper("(init=standard) ", port);
904                 exit_conf_mode_ite(port);
905                 if (chip_found_at_port) return;
906
907                 enter_conf_mode_ite_it8502e(port);
908                 probe_idregs_ite_helper("(init=it8502e) ", port);
909                 exit_conf_mode_ite(port);
910                 if (chip_found_at_port) return;
911
912                 enter_conf_mode_ite_it8761e(port);
913                 probe_idregs_ite_helper("(init=it8761e) ", port);
914                 exit_conf_mode_ite(port);
915                 if (chip_found_at_port) return;
916
917                 enter_conf_mode_ite_it8228e(port);
918                 probe_idregs_ite_helper("(init=it8228e) ", port);
919                 exit_conf_mode_ite(port);
920                 if (chip_found_at_port) return;
921
922                 enter_conf_mode_winbond_fintek_ite_8787(port);
923                 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
924                 exit_conf_mode_winbond_fintek_ite_8787(port);
925                 if (chip_found_at_port) return;
926         }
927 }
928
929 void print_ite_chips(void)
930 {
931         print_vendor_chips("ITE", reg_table);
932         print_vendor_chips("ITE-EC", ec_table);
933 }