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