Add detection and dump support for the SMSC FDC37N958FR (trivial).
[coreboot.git] / util / superiotool / smsc.c
1 /*
2  * This file is part of the superiotool project.
3  *
4  * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include "superiotool.h"
22
23 #define DEVICE_ID_REG_OLD       0x0d
24 #define DEVICE_REV_REG_OLD      0x0e
25
26 #define DEVICE_ID_REG           0x20
27 #define DEVICE_REV_REG          0x21
28
29 static const struct superio_registers reg_table[] = {
30         /* The following Super I/Os use the 0x20/0x21 ID registers. */
31         {0x0e, "LPC47N252", {   /* From sensors-detect */
32                 {EOT}}},
33         {0x14, "LPC47M172", {
34                 {EOT}}},
35         {0x40, "FDC37C67x", {   /* E.g. FDC37C672. Chiprev: 0x01 */
36                 {EOT}}},
37         {0x42, "FDC37B80x/FDC37M707", {
38                 {EOT}}},
39         {0x09, "FDC37N958FR", { /* Found in e.g. Dell Latitude CPi A366XT. */
40                 {NOLDN, NULL,
41                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x28,
42                          0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
43                         {0x03,NANA,0x44,0x00,0x00,0x00,0x04,MISC,MISC,0x00,
44                          NANA,NANA,NANA,NANA,NANA,EOT}},
45                 {0x0, "Floppy",
46                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
47                          EOT},
48                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
49                          EOT}},
50                 {0x3, "Parallel port",
51                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
52                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
53                 {0x4, "COM1",
54                         {0x30,0x60,0x61,0x70,0xf0,EOT},
55                         {0x00,0x00,0x00,0x00,0x00,EOT}},
56                 {0x5, "COM2",
57                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,0xf1,0xf2,
58                          EOT},
59                         {NANA,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x03,
60                          EOT}},
61                 {0x6, "Real-time clock (RTC)",
62                         {0x30,0x62,0x63,0x70,0xf0,EOT},
63                         {0x00,0x00,0x70,0x00,0x00,EOT}},
64                 {0x7, "Keyboard",
65                         {0x30,0x70,0x72,0xf0,EOT},
66                         {0x00,0x00,0x00,0x00,EOT}},
67                 {0x8, "Aux I/O",
68                         {0x30,0xb0,0xb1,0xb2,0xb3,0xb8,0xc0,0xc1,0xc2,0xc3,
69                          0xc4,0xc5,0xc6,0xc8,0xca,0xcb,0xcc,0xd0,0xd1,0xd2,
70                          0xd3,0xd4,0xd5,0xd6,0xd7,0xe0,0xe1,0xe2,0xe3,0xe4,
71                          0xe5,0xe6,0xe7,0xef,0xf0,0xf1,0xf2,0xf3,0xf4,0xf6,
72                          0xf9,0xfa,EOT},
73                         {0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x01,NANA,NANA,
74                          NANA,0x00,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
75                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
76                          NANA,NANA,NANA,NANA,NANA,0x00,0x00,0x00,0x00,NANA,
77                          NANA,NANA,EOT}},
78                 {0xa, "ACPI",
79                         {0x30,0x60,0x61,0x70,0xf0,EOT},
80                         {0x00,0x00,0x00,NANA,NANA,EOT}},
81                 {EOT}}},
82         {0x44, "FDC37B78x", {
83                 {NOLDN, NULL,
84                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x28,
85                          0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
86                         {0x03,NANA,0x44,0x00,0x00,0x00,0x04,MISC,MISC,0x00,
87                          NANA,NANA,NANA,NANA,NANA,EOT}},
88                 {0x0, "Floppy",
89                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
90                          EOT},
91                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
92                          EOT}},
93                 {0x3, "Parallel port",
94                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
95                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
96                 {0x4, "COM1",
97                         {0x30,0x60,0x61,0x70,0xf0,EOT},
98                         {0x00,0x00,0x00,0x00,0x00,EOT}},
99                 {0x5, "COM2",
100                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,0xf1,0xf2,
101                          EOT},
102                         {NANA,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x03,
103                          EOT}},
104                 {0x6, "Real-time clock (RTC)",
105                         {0x30,0x62,0x63,0x70,0xf0,EOT},
106                         {0x00,0x00,0x70,0x00,0x00,EOT}},
107                 {0x7, "Keyboard",
108                         {0x30,0x70,0x72,0xf0,EOT},
109                         {0x00,0x00,0x00,0x00,EOT}},
110                 {0x8, "Aux I/O",
111                         {0x30,0xb0,0xb1,0xb2,0xb3,0xb8,0xc0,0xc1,0xc2,0xc3,
112                          0xc4,0xc5,0xc6,0xc8,0xca,0xcb,0xcc,0xd0,0xd1,0xd2,
113                          0xd3,0xd4,0xd5,0xd6,0xd7,0xe0,0xe1,0xe2,0xe3,0xe4,
114                          0xe5,0xe6,0xe7,0xef,0xf0,0xf1,0xf2,0xf3,0xf4,0xf6,
115                          0xf9,0xfa,EOT},
116                         {0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x01,NANA,NANA,
117                          NANA,0x00,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
118                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
119                          NANA,NANA,NANA,NANA,NANA,0x00,0x00,0x00,0x00,NANA,
120                          NANA,NANA,EOT}},
121                 {0xa, "ACPI",
122                         {0x30,0x60,0x61,0x70,0xf0,EOT},
123                         {0x00,0x00,0x00,NANA,NANA,EOT}},
124                 {EOT}}},
125         {0x47, "FDC37M60x", {   /* TODO: Not yet in sensors-detect */
126                 {EOT}}},
127         {0x4c, "FDC37B72x", {
128                 {NOLDN, NULL,
129                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x28,
130                          0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
131                         {0x03,NANA,0x4c,0x00,0x00,0x00,0x04,MISC,MISC,0x00,
132                          NANA,NANA,NANA,NANA,NANA,EOT}},
133                 {0x0, "Floppy",
134                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
135                          EOT},
136                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
137                          EOT}},
138                 {0x3, "Parallel port",
139                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
140                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
141                 {0x4, "COM1",
142                         {0x30,0x60,0x61,0x70,0xf0,EOT},
143                         {0x00,0x00,0x00,0x00,0x00,EOT}},
144                 {0x5, "COM2",
145                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
146                         {NANA,0x00,0x00,0x00,0x00,0x02,0x03,EOT}},
147                 {0x7, "Keyboard",
148                         {0x30,0x70,0x72,0xf0,EOT},
149                         {0x00,0x00,0x00,0x00,EOT}},
150                 {0x8, "Aux I/O",
151                         {0x30,0xb0,0xb1,0xb2,0xb3,0xb8,0xc0,0xc1,0xc2,0xc3,
152                          0xc4,0xc5,0xc6,0xc8,0xca,0xcb,0xcc,0xd0,0xd1,0xd2,
153                          0xd3,0xd4,0xd5,0xd6,0xd7,0xe0,0xe1,0xe2,0xe3,0xe4,
154                          0xe5,0xe6,0xe7,0xef,0xf0,0xf1,0xf2,0xf3,0xf4,0xf6,
155                          0xf9,0xfa,EOT},
156                         {0x00,NANA,NANA,NANA,NANA,NANA,0x00,0x01,NANA,NANA,
157                          NANA,0x00,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
158                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
159                          NANA,NANA,NANA,NANA,NANA,0x00,0x00,0x00,MISC,NANA,
160                          NANA,NANA,EOT}},
161                 {0xa, "ACPI",
162                         {0x30,0x60,0x61,0x70,0xf0,EOT},
163                         {0x00,0x00,0x00,NANA,NANA,EOT}},
164                 {EOT}}},
165         {0x4d, "FDC37M81x", {
166                 {NOLDN, NULL,
167                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x2b,
168                          0x2c,0x2d,0x2e,0x2f,EOT},
169                         {0x03,0x00,0x4d,NANA,0x00,0x00,0x04,MISC,MISC,NANA,
170                          NANA,NANA,NANA,NANA,EOT}},
171                 {0x0, "Floppy",
172                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
173                          0xf5,EOT},
174                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
175                          0x00,EOT}},
176                 {0x3, "Parallel port",
177                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
178                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
179                 {0x4, "COM1",
180                         {0x30,0x60,0x61,0x70,0xf0,EOT},
181                         {0x00,0x00,0x00,0x00,0x00,EOT}},
182                 {0x5, "COM2",
183                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
184                         {0x00,0x00,0x00,RSVD,RSVD,0x00,0x00,0x02,0x03,EOT}},
185                 {0x7, "Keyboard",
186                         {0x30,0x70,0x72,0xf0,EOT},
187                         {0x00,0x00,0x00,0x00,EOT}},
188                 {0x8, "Aux I/O",
189                         /* Only 0xf6 existing (and reserved) or 0xf6..0xfb? */
190                         {0x30,0xb4,0xb5,0xb6,0xb7,0xc0,0xc1,0xc2,0xc3,0xc4,
191                          0xc5,0xc6,0xc7,0xc8,0xf1,0xf2,0xf3,0xf4,0xf6,0xf7,
192                          0xf8,0xf9,0xfa,0xfb,EOT},
193                         {0x00,NANA,NANA,NANA,NANA,0x02,0x01,NANA,NANA,NANA,
194                          NANA,NANA,NANA,NANA,0x00,0x00,0x00,0x00,RSVD,RSVD,
195                          RSVD,RSVD,RSVD,RSVD,EOT}},
196                 {EOT}}},
197         {0x51, "LPC47B27x", {
198                 {EOT}}},
199         {0x52, "LPC47B37x", {
200                 {EOT}}},
201         {0x54, "LPC47U33x", {
202                 {EOT}}},
203         {0x56, "LPC47B34x", {
204                 {EOT}}},
205         {0x57, "LPC47S42x", {
206                 {EOT}}},
207         {0x59, "LPC47M10x/112/13x", {
208                 {NOLDN, NULL,
209                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x28,
210                          0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
211                         {RSVD,0x00,0x59,NANA,0x00,0x00,0x44,MISC,MISC,RSVD,
212                          NANA,NANA,NANA,NANA,NANA,NANA,EOT}},
213                 {0x0, "Floppy",
214                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
215                          0xf5,EOT},
216                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
217                          0x00,EOT}},
218                 {0x3, "Parallel port",
219                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
220                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
221                 {0x4, "COM1",
222                         {0x30,0x60,0x61,0x70,0xf0,EOT},
223                         {0x00,0x00,0x00,0x00,0x00,EOT}},
224                 {0x5, "COM2",
225                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,0xf1,
226                          0xf2,EOT},
227                         {NANA,0x00,0x00,RSVD,RSVD,0x00,RSVD,0x00,0x02,
228                          0x03,EOT}},
229                 {0x7, "Keyboard",
230                         {0x30,0x70,0x72,0xf0,EOT},
231                         {0x00,0x00,0x00,0x00,EOT}},
232                 {0x9, "Game port",
233                         {0x30,0x60,0x61,EOT},
234                         {0x00,0x00,0x00,EOT}},
235                 {0xa, "Power Management Events (PME)",
236                         {0x30,0x60,0x61,0xf0,0xf1,EOT},
237                         {0x00,0x00,0x00,NANA,RSVD,EOT}},
238                 {0xb, "MPU-401",
239                         {0x30,0x60,0x61,0x70,EOT},
240                         {0x00,0x03,0x30,0x05,EOT}},
241                 {EOT}}},
242         {0x5d, "LPC47B357", {   /* From sensors-detect (no datasheet) */
243                 {EOT}}},
244         {0x5f, "LPC47M14x", {
245                 {EOT}}},
246         {0x60, "LPC47M15x/192/997", {
247                 {EOT}}},
248         {0x62, "LPC47S45x", {
249                 {EOT}}},
250         {0x6b, "LPC47M292", {   /* From sensors-detect */
251                 {EOT}}},
252         {0x6e, "LPC47B387", {   /* TODO: Not yet in sensors-detect */
253                 /* Found in the HP Compaq Business Desktop d530 Series */
254                 /* http://thread.gmane.org/gmane.linux.bios/26648 */
255                 /* We cannot find a public datasheet for this Super I/O. */
256                 {EOT}}},
257         {0x6f, "LPC47B397", {
258                 {EOT}}},
259         {0x74, "LPC47M182", {
260                 {EOT}}},
261         {0x76, "LPC47M584", {   /* From sensors-detect (no datasheet) */
262                 {EOT}}},
263         {0x77, "A8000", {       /* ASUS A8000, a rebranded DME1737(?) */
264                 {NOLDN, NULL,
265                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x28,
266                          0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
267                         {RSVD,0x00,0x77,NANA,0x00,RSVD,0x44,MISC,MISC,RSVD,
268                          NANA,NANA,NANA,NANA,NANA,NANA,EOT}},
269                 {0x0, "Floppy",
270                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
271                          0xf5,EOT},
272                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
273                          0x00,EOT}},
274                 {0x3, "Parallel port",
275                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
276                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
277                 {0x4, "COM1",
278                         {0x30,0x60,0x61,0x70,0xf0,EOT},
279                         {0x00,0x00,0x00,0x00,0x00,EOT}},
280                 {0x5, "COM2",
281                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
282                         {0x00,0x00,0x00,0x00,0x00,0x02,0x03,EOT}},
283                 {0x7, "Keyboard",
284                         {0x30,0x70,0x72,0xf0,EOT},
285                         {0x00,0x00,0x00,0x00,EOT}},
286                 {0xa, "Runtime registers",
287                         {0x30,0x60,0x61,0x62,0x63,0xf0,0xf1,0xf2,EOT},
288                         {0x00,0x00,0x00,0x00,0x00,NANA,RSVD,0x04,EOT}},
289                 {EOT}}},
290         {0x78, "DME1737", {
291                 {NOLDN, NULL,
292                         {0x03,0x07,0x20,0x21,0x22,0x23,0x24,0x26,0x27,0x28,
293                          0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
294                         {RSVD,0x00,0x77,NANA,0x00,RSVD,0x44,MISC,MISC,RSVD,
295                          NANA,NANA,NANA,NANA,NANA,NANA,EOT}},
296                 {0x0, "Floppy",
297                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
298                          0xf5,EOT},
299                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
300                          0x00,EOT}},
301                 {0x3, "Parallel port",
302                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
303                         {0x00,0x00,0x00,0x00,0x04,0x3c,0x00,EOT}},
304                 {0x4, "COM1",
305                         {0x30,0x60,0x61,0x70,0xf0,EOT},
306                         {0x00,0x00,0x00,0x00,0x00,EOT}},
307                 {0x5, "COM2",
308                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
309                         {0x00,0x00,0x00,0x00,0x00,0x02,0x03,EOT}},
310                 {0x7, "Keyboard",
311                         {0x30,0x70,0x72,0xf0,EOT},
312                         {0x00,0x00,0x00,0x00,EOT}},
313                 {0xa, "Runtime registers",
314                         {0x30,0x60,0x61,0x62,0x63,0xf0,0xf1,0xf2,EOT},
315                         {0x00,0x00,0x00,0x00,0x00,NANA,RSVD,0x04,EOT}},
316                 {EOT}}},
317         {0x79, "SCH5504", {     /* From sensors-detect (no datasheet) */
318                 {EOT}}},
319 #if 0
320         {0x7a, "Unknown", {     /* Found in Toshiba Satellite A80-117. */
321                 {EOT}}},
322 #endif
323         {0x7c, "SCH3112", {
324                 {EOT}}},
325         {0x7d, "SCH3114", {
326                 {EOT}}},
327         {0x7f, "SCH3116", {
328                 {EOT}}},
329         {0x81, "SCH5307", {
330                 {EOT}}},
331         {0x85, "SCH5317", {     /* From sensors-detect */
332                 {EOT}}},
333         {0x90, "SCH4307", {     /* From sensors-detect */
334                 {EOT}}},
335
336         /* The following Super I/Os use the 0x0d/0x0e ID registers. */
337         {0x03, "FDC37C669", {
338                 /* Init: 0x55, 0x55. Exit: 0xaa. Ports: 0x3f0/0x370. */
339                 /* Chiprev: 0x02. */
340                 {EOT}}},
341         {0x04, "FDC37C669FR", { /* TODO: Not yet in sensors-detect. */
342                 /* Init: 0x55, 0x55. Exit: 0xaa. Ports: 0x3f0/0x370. */
343                 {EOT}}},
344         {0x28, "FDC37N769", {
345                 /* Init: 0x55. Exit: 0xaa. Ports: 0x3f0/0x370. */
346                 {NOLDN, NULL,
347                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
348                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
349                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
350                          0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
351                          0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
352                         {0x28,0x9c,0x88,0x70,0x00,0x00,0xff,0x00,0x00,0x00,
353                          0x00,0x00,0x02,0x28,NANA,0x00,0x00,0x80,RSVD,RSVD,
354                          NANA,NANA,NANA,0x03,RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,
355                          0x80,0x00,0x3c,RSVD,RSVD,0x00,0x00,0x00,0x00,0x00,
356                          0x00,0x00,RSVD,0x00,0x00,0x03,0x00,0x00,EOT}},
357                 {EOT}}},
358         {0x5a, "LPC47N227", {
359                 /* Init: 0x55. Exit: 0xaa. Ports: 0x2e/0x4e. */
360                 {NOLDN, NULL,
361                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
362                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
363                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
364                          0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
365                          0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,
366                          0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,EOT},
367                         {0x28,0x9c,0x08,0x70,0x00,0x00,0xff,0x00,RSVD,0x00,
368                          0x00,0x00,0x02,0x5a,NANA,0x00,0x00,0x80,MISC,0x00,
369                          NANA,NANA,NANA,0x03,RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,
370                          RSVD,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
371                          0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
372                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,EOT}},
373                 {EOT}}},
374         {0x65, "FDC37C665GT/IR", {
375                 /* Init: 0x55, 0x55. Exit: 0xaa. Port: 0x3f0. */
376                 /* Chiprev: 0x02 = FDC37C665GT, 0x82 = FDC37C665IR */
377                 {EOT}}},
378         {0x66, "FDC37C666GT", {
379                 /* Init: 0x55, 0x55. Exit: 0xaa. Port: 0x3f0. Chiprev: 0x02. */
380                 {EOT}}},
381         {EOT}
382 };
383
384 static void enter_conf_mode_smsc(uint16_t port)
385 {
386         /* Some of the SMSC Super I/Os have an 0x55,0x55 init, some only
387          * require one 0x55. We do 0x55,0x55 for all of them at the moment,
388          * in the assumption that the extra 0x55 won't hurt the other
389          * Super I/Os. This is verified to be true on (at least) the FDC37N769.
390          */
391         outb(0x55, port);
392         outb(0x55, port);
393 }
394
395 static void exit_conf_mode_smsc(uint16_t port)
396 {
397         outb(0xaa, port);
398 }
399
400 static void probe_idregs_smsc_helper(uint16_t port, uint8_t idreg,
401                                      uint8_t revreg)
402 {
403         uint8_t id, rev;
404         const char *info = (idreg == 0x20) ? "(idregs=0x20/0x21) "
405                                            : "(idregs=0x0d/0x0e) ";
406
407         probing_for("SMSC", info, port);
408
409         enter_conf_mode_smsc(port);
410
411         id = regval(port, idreg);
412         rev = regval(port, revreg);
413
414         if (superio_unknown(reg_table, id)) {
415                 if (verbose)
416                         printf(NOTFOUND "id=0x%02x, rev=0x%02x\n", id, rev);
417                 exit_conf_mode_smsc(port);
418                 return;
419         }
420
421         printf("Found %s %s (id=0x%02x, rev=0x%02x) at 0x%x\n",
422                (id == 0x77 ? "ASUS" : "SMSC"), get_superio_name(reg_table, id),
423                id, rev, port);
424         chip_found = 1;
425
426         dump_superio((id == 0x77 ? "ASUS" : "SMSC"), reg_table, port, id);
427
428         exit_conf_mode_smsc(port);
429 }
430
431 void probe_idregs_smsc(uint16_t port)
432 {
433         probe_idregs_smsc_helper(port, DEVICE_ID_REG, DEVICE_REV_REG);
434         probe_idregs_smsc_helper(port, DEVICE_ID_REG_OLD, DEVICE_REV_REG_OLD);
435 }