/ util / superiotool / winbond.c
winbond.c
   1  /* SPDX-License-Identifier: GPL-2.0-or-later */
   2  
   3  #include "superiotool.h"
   4  
   5  #define DEVICE_ID_REG_OLD	0x09
   6  
   7  #define DEVICE_ID_REG		0x20
   8  #define DEVICE_REV_REG		0x21
   9  
  10  /**
  11   * The ID entries must be in 0xYYZ format, where YY is the device ID,
  12   * and Z is bits 7..4 of the device revision register. We do not match
  13   * bits 3..0 of the device revision here (at least for newer Super I/Os).
  14   *
  15   * But some of the older versions use both bytes (0x20 and 0x21), where
  16   * register 0x21 holds the ID and the full 8 bits of 0x21 hold the revision.
  17   *
  18   * Some other Super I/Os only use bits 3..0 of 0x09 as ID.
  19   */
  20  static const struct superio_registers reg_table[] = {
  21  	/* ID and rev[3..0] */
  22  	{0x527, "W83977CTF", {	/* TODO: Not yet in sensors-detect */
  23  		{EOT}}},
  24  	{0x52f, "W83977EF/EG", {
  25  		{NOLDN, NULL,
  26  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x2a,
  27  			 0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
  28  			{RSVD,0x52,MISC,0xff,0xfe,MISC,0x00,MISC,0x00,0x00,
  29  			 0x00,0x00,RSVD,RSVD,RSVD,EOT}},
  30  		/* Some register defaults depend on the value of PNPCSV. */
  31  		{0x0, "Floppy",
  32  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
  33  			 0xf5,EOT},
  34  			{0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
  35  			 0x00,EOT}},
  36  		{0x1, "Parallel port",
  37  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
  38  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
  39  		{0x2, "COM1",
  40  			{0x30,0x60,0x61,0x70,0xf0,EOT},
  41  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
  42  		{0x3, "COM2",
  43  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
  44  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
  45  		{0x5, "Keyboard",
  46  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
  47  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
  48  		{0x7, "GPIO 1",
  49  			{0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x72,0xe0,
  50  			 0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf1,EOT},
  51  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  52  			 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,EOT}},
  53  		{0x8, "GPIO 2",
  54  			{0x30,0x60,0x61,0x70,0x72,0xe8,0xe9,0xea,0xeb,0xec,
  55  			 0xed,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
  56  			{0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,
  57  			 0x01,0x00,RSVD,0x00,0x00,0x00,EOT}},
  58  		{0xa, "ACPI",
  59  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
  60  			 0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,0xfe,0xff,EOT},
  61  			{0x00,0x00,0x00,0x00,MISC,MISC,MISC,0x00,0x00,0x00,
  62  			 0x00,0x00,0x00,0x00,0x00,0x00,0x00,RSVD,RSVD,EOT}},
  63  		{EOT}}},
  64  	{0x595, "W83627SF", {	/* TODO: Not yet in sensors-detect */
  65  		{EOT}}},
  66  	{0x601, "W83697HF/F/HG", { /* No G version? */
  67  		{NOLDN, NULL,
  68  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,
  69  			 0x2a,EOT},
  70  			{0x60,NANA,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
  71  			 MISC,EOT}},
  72  		/* Some register defaults depend on the value of PNPCSV. */
  73  		{0x0, "Floppy",
  74  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
  75  			 0xf5,EOT},
  76  			{0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
  77  			 0x00,EOT}},
  78  		{0x1, "Parallel port",
  79  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
  80  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
  81  		{0x2, "COM1",
  82  			{0x30,0x60,0x61,0x70,0xf0,EOT},
  83  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
  84  		{0x3, "COM2",
  85  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
  86  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
  87  		{0x6, "Consumer IR",
  88  			{0x30,0x60,0x61,0x70,EOT},
  89  			{0x00,0x00,0x00,0x00,EOT}},
  90  		{0x7, "Game port, GPIO 1",
  91  			{0x30,0x60,0x61,0x62,0x63,0xf0,0xf1,0xf2,EOT},
  92  			{0x00,0x02,0x01,0x00,0x00,0xff,0x00,0x00,EOT}},
  93  		{0x8, "MIDI port, GPIO 5",
  94  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
  95  			 0xf4,0xf5,EOT},
  96  			{0x00,0x03,0x30,0x00,0x00,0x09,0xff,0x00,0x00,0x00,
  97  			 0x00,0x00,EOT}},
  98  		{0x9, "GPIO 2, GPIO 3, GPIO 4",
  99  			{0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,
 100  			 0xf7,0xf8,0xf5,EOT},
 101  			{0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,
 102  			 0x00,0x00,0x00,EOT}},
 103  		{0xa, "ACPI",
 104  			{0x30,0x70,0xe0,0xe1,0xe2,0xe5,0xe6,0xe7,
 105  			 0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
 106  			{0x00,0x00,0x00,0x00,NANA,0x00,0x00,0x00,
 107  			 0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
 108  		{0xb, "Hardware monitor",
 109  			{0x30,0x60,0x61,0x70,EOT},
 110  			{0x00,0x00,0x00,0x00,EOT}},
 111  		{EOT}}},
 112  	{0x610, "W83L517D/D-F", {
 113  		{EOT}}},
 114  	{0x708, "W83637HF/HG", {
 115  		{EOT}}},
 116  	{0x828, "W83627THF/THG", { /* We assume rev is bits 3..0 of 0x21. */
 117  		{NOLDN, NULL,
 118  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,0x2a,
 119  			 0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 120  			{0x82,NANA,0xff,0x00,MISC,0x00,MISC,0x00,0x00,0x00,
 121  			 MISC,MISC,MISC,0x00,0x00,EOT}},
 122  		/* Some register defaults depend on the value of PNPCSV. */
 123  		{0x0, "Floppy",
 124  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
 125  			 0xf5,EOT},
 126  			{0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
 127  			 0x00,EOT}},
 128  		{0x1, "Parallel port",
 129  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 130  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 131  		{0x2, "COM1",
 132  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 133  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 134  		{0x3, "COM2",
 135  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 136  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 137  		{0x5, "Keyboard",
 138  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 139  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
 140  		{0x7, "GPIO 1, GPIO 5, game port, MIDI port",
 141  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
 142  			 0xf4,0xf5,EOT},
 143  			{0x00,0x02,0x01,0x03,0x30,0x09,0xff,0x00,0x00,0xff,
 144  			 0x00,0x00,EOT}},
 145  		{0x8, "GPIO 2",
 146  			{0x30,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,EOT},
 147  			{0x00,0xff,0x00,0x00,0x00,RSVD,0x00,0x00,0x00,EOT}},
 148  		{0x9, "GPIO 3, GPIO 4",
 149  			{0x30,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
 150  			{0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,EOT}},
 151  		{0xa, "ACPI",
 152  			/* Note: Datasheet says 0xe2 can't be read/written. */
 153  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 154  			 0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,0xfe,0xff,EOT},
 155  			{0x00,0x00,0x00,0x00,MISC,MISC,0x00,0x00,0x00,0x00,
 156  			 0x00,0x00,0x00,0x00,0x00,0x00,0x00,RSVD,RSVD,EOT}},
 157  		{0xb, "Hardware monitor",
 158  			{0x30,0x60,0x61,0x70,EOT},
 159  			{0x00,0x00,0x00,0x00,EOT}},
 160  		{EOT}}},
 161  #if 0
 162  	{0x85x, "W83687THF", {	/* TODO: sensors-detect: 0x85 */
 163  		{EOT}}},
 164  #endif
 165  	{0xa02, "W83627DHG", {
 166  		{NOLDN, NULL,
 167  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
 168  			 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 169  			{0x00,0xa0,NANA,0xff,0x00,MISC,0x00,MISC,RSVD,0x50,
 170  			 0x00,0x00,RSVD,0xe2,0x21,0x00,0x00,EOT}},
 171  		{0x0, "Floppy",
 172  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
 173  			 EOT},
 174  			{0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00,0x00,
 175  			 EOT}},
 176  		{0x1, "Parallel port",
 177  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 178  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 179  		{0x2, "COM1",
 180  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 181  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 182  		{0x3, "COM2",
 183  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 184  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 185  		{0x5, "Keyboard",
 186  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 187  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
 188  		{0x6, "Serial peripheral interface",
 189  			{0x30,0x62,0x63,EOT},
 190  			{0x00,0x00,0x00,EOT}},
 191  		{0x7, "GPIO 6",
 192  			{0x30,0xf4,0xf5,0xf6,0xf7,EOT},
 193  			{0x00,0xff,0x00,0x00,0x00,EOT}},
 194  		{0x8, "WDTO#, PLED",
 195  			{0x30,0xf5,0xf6,0xf7,EOT},
 196  			{0x00,0x00,0x00,0x00,EOT}},
 197  		{0x9, "GPIO 2, GPIO 3, GPIO 4, GPIO 5",
 198  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,
 199  			 0xe9,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xfe,
 200  			 EOT},
 201  			{0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,
 202  			 0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
 203  			 EOT}},
 204  		{0xa, "ACPI",
 205  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 206  			 0xe8,0xe9,0xf2,0xf3,0xf4,0xf6,0xf7,0xfe,EOT},
 207  			{0x00,0x00,0x01,0x00,0xff,0x08,0x00,RSVD,0x1c,0x00,
 208  			 RSVD,RSVD,0x7c,0x00,0x00,0x00,0x00,0x00,EOT}},
 209  		{0xb, "Hardware monitor",
 210  			{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
 211  			{0x00,0x00,0x00,0x00,0x81,0x00,0x00,EOT}},
 212  		{0xc, "PECI, SST",
 213  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe8,0xf1,0xfe,0xff,
 214  			 EOT},
 215  			{0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x48,0x00,0x00,
 216  			 EOT}},
 217  		{EOT}}},
 218  	{0xa23, "W83627UHG = NCT6627UD", {	/* TODO: Not yet in sensors-detect	   */
 219  		{NOLDN, NULL,			/* CR2B (485) is only valid for chip rev.E */
 220  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
 221  			 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 222  			{0x00,0xa2,NANA,0xff,0xF0,MISC,0x00,MISC,RSVD,0x00,
 223  			 0x00,0x00,0x00,0x02,0x00,0x00,0x00,EOT}},
 224  		{0x0, "Floppy",
 225  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
 226  			 EOT},
 227  			{0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00,0x00,
 228  			 EOT}},
 229  		{0x1, "Parallel port",
 230  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 231  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 232  		{0x2, "UART A",
 233  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 234  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 235  		{0x3, "UART B",
 236  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 237  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 238  		{0x5, "Keyboard",
 239  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 240  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
 241  		{0x6, "UART C",
 242  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 243  			{0x01,0x03,0xE0,0x04,0x00,EOT}},
 244  		{0x7, "GPIO 3, GPIO 4",
 245  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,EOT},
 246  			{0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,EOT}},
 247  		{0x8, "WDTO#, PLED, GPIO 5,6 & GPIO Base Address",
 248  			{0x30,0x60,0x61,
 249  			 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
 250  			 0xF5,0xF6,0xF7,EOT},
 251  			{0x02,0x00,0x00,
 252  			 0xFF,0x00,0x00,0x00,0xFF,0x1F,0x00,0x00,
 253  			 0x00,0x00,0x00,EOT}},
 254  		{0x9, "GPIO 1, GPIO 2 and SUSLED",
 255  			{0x30,
 256  			 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 257  			 0xF3,EOT},
 258  			{0x00,
 259  			 0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,
 260  			 0x00,EOT}},
 261  		{0xa, "ACPI",
 262  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 263  			 0xe8,0xe9,0xf2,0xf3,0xf4,0xf6,0xf7,0xfe,EOT},
 264  			{0x00,0x00,0x01,0x00,0xff,0x08,0x00,0x00,0x1c,0x00,
 265  			 RSVD,RSVD,0x3e,0x00,0x00,0x00,0x00,0x00,EOT}},
 266  		{0xb, "Hardware monitor",
 267  			{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
 268  			{0x00,0x00,0x00,0x00,RSVD,RSVD,0x00,EOT}},
 269  		{0xc, "PECI, SST",
 270  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,
 271  			 0xf1,0xf2,0xf3,0xfe,0xff,EOT},
 272  			{0x00,0x48,0x48,0x48,0x48,0x00,RSVD,RSVD,0x00,
 273  			 0x48,0x50,0x10,0x23,0x5A,EOT}},
 274  		{0xD, "UART D",
 275  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 276  			{0x00,0x02,0xe0,0x03,0x00,EOT}},
 277  		{0xE, "UART E",
 278  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 279  			{0x00,0x03,0xe8,0x04,0x00,EOT}},
 280  		{0xF, "UART F",
 281  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 282  			{0x00,0x02,0xe8,0x03,0x00,EOT}},
 283  		{EOT}}},
 284  	{0xa51, "W83667HG", {
 285  		{NOLDN, NULL,
 286  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
 287  			 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 288  			{0x00,0xb3,NANA,0xff,0x00,MISC,0x00,MISC,0xff,0x20,
 289  			 0x00,0x00,0x7f,0x0a,0x08,0x00,MISC,EOT}},
 290  		{0x0, "Floppy",
 291  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
 292  			 EOT},
 293  			{0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00,0x00,
 294  			 EOT}},
 295  		{0x1, "Parallel port",
 296  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 297  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 298  		{0x2, "COM1",
 299  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 300  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 301  		{0x3, "COM2",
 302  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 303  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 304  		{0x5, "Keyboard",
 305  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 306  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,EOT}},
 307  		{0x6, "Serial peripheral interface",
 308  			{0x30,0x62,0x63,EOT},
 309  			{0x00,0x00,0x00,EOT}},
 310  		{0x7, "GPIO 6, GPIO 7, GPIO 8, GPIO 9",
 311  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,
 312  			 0xe9,0xea,0xeb,0xec,0xed,0xee,0xf4,0xf5,0xf6,0xf7,
 313  			 0xf8,EOT},
 314  			{0x18,0xff,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0xff,
 315  			 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,
 316  			 0x00,EOT}},
 317  		{0x8, "WDTO#, GPIO 1",
 318  			{0x30,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,EOT},
 319  			{0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
 320  		{0x9, "GPIO 2, GPIO 3, GPIO 4, GPIO 5",
 321  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,
 322  			 0xe9,0xea,0xeb,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,
 323  			 0xf7,0xfe,EOT},
 324  			{0x05,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
 325  			 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
 326  			 0x00,0x00,EOT}},
 327  		{0xa, "ACPI",
 328  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
 329  			 0xf2,0xf3,0xf4,0xf6,0xf7,0xfe,0xff,EOT},
 330  			{0x01,0x00,0xff,0x00,0x00,0x02,0x1c,0x00,RSVD,0x00,
 331  			 0x7c,0x00,0x00,0x00,0x00,0x00,0x30,EOT}},
 332  		{0xb, "Hardware monitor, SB-TSI",
 333  			{0x30,0x60,0x61,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,
 334  			 0xf5,EOT},
 335  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,
 336  			 0x10,EOT}},
 337  		{0xc, "PECI",
 338  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe8,0xe9,0xea,
 339  			 0xec,0xee,0xef,0xf1,0xf2,0xf3,0xfe,0xff,EOT},
 340  			{0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,RSVD,0x00,
 341  			 0x00,0x01,0x5a,0x48,0x50,0x10,0x80,0x01,EOT}},
 342  		{0xd, "VID",
 343  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xec,
 344  			 0xed,0xee,0xef,0xf3,EOT},
 345  			{0x00,0x00,NANA,NANA,0x07,0x00,NANA,0x00,0x14,0x01,
 346  			 0x00,0x88,0x00,0x04,EOT}},
 347  		{0xf, "GPIO Push-Pull or Open-Drain selection",
 348  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
 349  			 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,
 350  			 0xfa,0xfb,0xfc,0xfd,0xfe,0xff,EOT},
 351  			{0xff,0xff,0xfd,0xff,0xf7,0xcb,0x3f,0xff,0xff,0x00,
 352  			 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 353  			 NANA,NANA,NANA,NANA,NANA,NANA,EOT}},
 354  		{EOT}}},
 355  	{0xb07, "W83627DHG-P/-PT", {
 356  		{NOLDN, NULL,
 357  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
 358  			 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 359  			{0x00,0xb0,NANA,0xff,0x00,MISC,0x00,MISC,RSVD,0x50,
 360  			 0x00,0x00,RSVD,0xe2,0x21,0x00,0x00,EOT}},
 361  		{0x0, "Floppy",
 362  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
 363  			 EOT},
 364  			{0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00,0x00,
 365  			 EOT}},
 366  		{0x1, "Parallel port",
 367  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 368  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 369  		{0x2, "COM1",
 370  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 371  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 372  		{0x3, "COM2",
 373  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 374  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 375  		{0x5, "Keyboard",
 376  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 377  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
 378  		{0x6, "Serial peripheral interface",
 379  			{0x30,0x62,0x63,EOT},
 380  			{0x00,0x00,0x00,EOT}},
 381  		{0x7, "GPIO 6",
 382  			{0x30,0xf4,0xf5,0xf6,0xf7,0xf8,EOT},
 383  			{0x00,0xff,0x00,0x00,0x00,0x00,EOT}},
 384  		{0x8, "WDTO#, PLED",
 385  			{0x30,0xf5,0xf6,0xf7,EOT},
 386  			{0x00,0x00,0x00,0x00,EOT}},
 387  		{0x9, "GPIO 2, GPIO 3, GPIO 4, GPIO 5",
 388  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,
 389  			 0xe9,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
 390  			 0xf9,0xfa,0xfe,EOT},
 391  			{0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,
 392  			 0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
 393  			 0x00,0x00,0x00,EOT}},
 394  		{0xa, "ACPI",
 395  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 396  			 0xe8,0xe9,0xf2,0xf3,0xf4,0xf6,0xf7,0xfe,EOT},
 397  			{0x00,0x00,0x01,0x00,0xff,0x08,0x00,RSVD,0x1c,0x00,
 398  			 RSVD,RSVD,0x7c,0x00,0x00,0x00,0x00,0x00,EOT}},
 399  		{0xb, "Hardware monitor",
 400  			{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
 401  			{0x00,0x00,0x00,0x00,0x81,0x00,0x00,EOT}},
 402  		{0xc, "PECI, SST",
 403  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe8,0xe9,0xea,0xec,
 404  			 0xee,0xef,0xf1,0xf2,0xf3,0xfe,0xff,EOT},
 405  			{0x00,0x48,0x48,0x48,0x48,0x00,0x00,RSVD,0x00,0x00,
 406  			 0x01,0x5a,0x48,0x50,0x10,0x00,0x00,EOT}},
 407  		{EOT}}},
 408  	{0xb35, "Nuvoton NCT5571D", {
 409  		{NOLDN, NULL,
 410  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
 411  			 0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 412  			{RSVD,0xb3,NANA,0xff,0x00,0x40,0x00,MISC,0xff,0x20,0x00,
 413  			 0x00,0x7f,0x0a,0x08,0x00,MISC,EOT}},
 414  		{0x2, "COM1",
 415  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 416  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 417  		{0x5, "Keyboard",
 418  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 419  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,EOT}},
 420  		{0x7, "GPIO 6, GPIO 8, GPIO 9",
 421  			{0x30,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,
 422  			 0xee,0xf4,0xf5,0xf6,0xf7,0xf8,EOT},
 423  			{0x18,0xef,MISC,0x00,0x00,0xff,MISC,0x00,0x00,RSVD,0x00,
 424  			 0x00,0xff,MISC,0x00,0x00,0x00,EOT}},
 425  		{0x9, "GPIO 2, GPIO 3, GPIO 5",
 426  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe9,0xea,
 427  			 0xeb,0xf4,0xf5,0xf6,0xf7,0xfe,EOT},
 428  			{0x05,0xff,MISC,0x00,0x00,0xff,MISC,0x00,0x00,0x00,0x00,
 429  			 0x00,0xff,MISC,0x00,0x00,0x00,EOT}},
 430  		{0xa, "ACPI",
 431  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xf2,
 432  			 0xf3,0xf4,0xf6,0xf7,0xfe,0xff,EOT},
 433  			{0x01,0x00,0xff,0x00,0x00,0x02,0x1c,0x00,RSVD,0x00,0x7c,
 434  			 0x00,0x00,0x00,0x00,0x00,0x30,EOT}},
 435  		{0xb, "Hardware monitor",
 436  			{0x30,0x60,0x61,0x70,0xe0,0xe1,0xe2,0xe3,0xf0,0xf5,EOT},
 437  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0x10,EOT}},
 438  		{0xc, "PECI",
 439  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe8,0xe9,0xea,0xec,
 440  			 0xee,0xef,0xf1,0xf2,0xf3,0xfe,0xff,EOT},
 441  			{0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,RSVD,0x00,0x00,
 442  			 0x01,0x5a,0x48,0x50,0x10,0x80,0x01,EOT}},
 443  		{0xd, "SUSLED",
 444  			{0xec,EOT},
 445  			{0x01,EOT}},
 446  		{0xf, "GPIO Push-Pull/OD Select",
 447  			{0xe0,0xe1,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xf0,0xf1,
 448  			 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
 449  			 0xfd,0xfe,0xff,EOT},
 450  			{RSVD,0xfd,RSVD,0xf7,0xcb,RSVD,0xff,0xff,0x00,MISC,MISC,
 451  			 MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,
 452  			 MISC,MISC,MISC,EOT}},
 453  		{EOT}}},
 454  
 455  	/* ID and rev */
 456  	{0x9771, "W83977F-A/G-A/AF-A/AG-A", {
 457  		{EOT}}},
 458  	{0x9777, "W83977AF", {
 459  		/*
 460  		 * W83977AF as found on the Advantech PCM-5820. We weren't able
 461  		 * to find a datasheet (so far) which lists the 0x77 revision,
 462  		 * but the hardware is there in the wild, so detect it...
 463  		 */
 464  		{EOT}}},
 465  	{0x9773, "W83977TF", {
 466  		{NOLDN, NULL,
 467  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x2a,0x2b,
 468  			 0x2c,0x2d,0x2e,0x2f,EOT},
 469  			{0x97,0x73,0xff,0xfe,MISC,0x00,MISC,0x00,0x00,0x00,
 470  			 0x00,RSVD,RSVD,RSVD,EOT}},
 471  		{0x0, "Floppy",
 472  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
 473  			 EOT},
 474  			{0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
 475  			 EOT}},
 476  		{0x1, "Parallel port",
 477  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 478  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 479  		{0x2, "COM1",
 480  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 481  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 482  		{0x3, "COM2",
 483  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 484  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 485  		{0x5, "Keyboard / mouse",
 486  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 487  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
 488  		{0x7, "GPIO 1",
 489  			{0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x72,0xe0,
 490  			 0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf1,EOT},
 491  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
 492  			 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,EOT}},
 493  		{0x8, "GPIO 2",
 494  			{0x30,0x60,0x61,0x70,0x72,0xe8,0xe9,0xea,0xeb,0xec,
 495  			 0xed,0xee,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
 496  			{0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,
 497  			 0x01,0x01,0x00,RSVD,0x00,0x00,0x00,EOT}},
 498  		{0x9, "GPIO 3",
 499  			{0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x72,0xe0,
 500  			 0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf1,EOT},
 501  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
 502  			 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,EOT}},
 503  		{0xa, "ACPI",
 504  			{0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0xe0,0xe1,
 505  			 0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,
 506  			 0xf7,0xfe,0xff,EOT},
 507  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 508  			 NANA,MISC,RSVD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 509  			 0x00,RSVD,RSVD,EOT}},
 510  		{EOT}}},
 511  	{0x9774, "W83977ATF", {
 512  		{EOT}}},
 513  
 514  	{0xb07, "W83527HG", {	/* TODO: Not yet in sensors-detect */
 515  		{NOLDN, NULL,
 516  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
 517  			 0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 518  			{0xB0,0x73,0xff,0x00,MISC,0x00,0x00,RSVD,0x50,0x00,
 519  			 0x00,RSVD,0xe2,0x21,0x00,0x00,EOT}},
 520  		{0x5, "Keyboard",
 521  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 522  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
 523  		{0x8, "WDTO#, PLED",
 524  			{0x30,0xf5,0xf6,0xf7,EOT},
 525  			{0x00,0x00,0x00,0x00,EOT}},
 526  		{0x9, "GPIO 2, GPIO3, GPIO5",
 527  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe9,
 528  			 0xf0,0xf1,0xf2,0xf3,0xf8,0xf9,0xfa,0xfe,EOT},
 529  			{0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,
 530  			 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
 531  		{0xa, "ACPI",
 532  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 533  			 0xe8,0xe9,0xf2,0xf3,0xf4,0xf6,0xf7,0xfe,EOT},
 534  			{0x00,0x00,0x01,0x00,0xff,0x08,0x00,0x00,0x1c,0x00,
 535  			 RSVD,RSVD,0x7c,0x00,0x00,0x00,0x00,0x00,EOT}},
 536  		{0xb, "Hardware monitor",
 537  			{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,EOT},
 538  			{0x00,0x00,0x00,0x00,0x81,RSVD,0x00,EOT}},
 539  		{0xc, "PECI",
 540  			{0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe8,0xe9,0xea,0xec,
 541  			 0xfe,0xff,EOT},
 542  			{0x00,0x48,0x48,0x48,0x48,0x00,0x00,RSVD,0x00,0x00,
 543  			 0x00,0x00,EOT}},
 544  		{EOT}}},
 545  	/* ID only */
 546  	{0x52, "W83627HF/F/HG/G", {
 547  		{NOLDN, NULL,
 548  			{0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,
 549  			 0x2a,0x2b,0x2c,0x2e,0x2f,EOT},
 550  			{0x00,0x52,NANA,0xff,0x00,MISC,0x00,0x00,0x00,0x00,
 551  			 0x7c,0xc0,0x00,0x00,0x00,EOT}},
 552  		{0x0, "Floppy",
 553  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
 554  			 0xf5,EOT},
 555  			{0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
 556  			 0x00,EOT}},
 557  		{0x1, "Parallel port",
 558  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 559  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 560  		{0x2, "COM1",
 561  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 562  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 563  		{0x3, "COM2",
 564  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 565  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 566  		{0x5, "Keyboard",
 567  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 568  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
 569  		{0x6, "Consumer IR",
 570  			{0x30,0x60,0x61,0x70,EOT},
 571  			{0x00,0x00,0x00,0x00,EOT}},
 572  		{0x7, "Game port, MIDI port, GPIO 1",
 573  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
 574  			{0x00,0x02,0x01,0x03,0x30,0x09,0xff,0x00,0x00,EOT}},
 575  		{0x8, "GPIO 2, watchdog timer",
 576  			{0x30,0xf0,0xf1,0xf2,0xf3,0xf5,0xf6,0xf6,0xf7,EOT},
 577  			{0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
 578  		{0x9, "GPIO 3",
 579  			{0x30,0xf0,0xf1,0xf2,0xf3,EOT},
 580  			{0x00,0xff,0x00,0x00,0x00,EOT}},
 581  		{0xa, "ACPI",
 582  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 583  			 0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,0xfe,0xff,EOT},
 584  			{0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
 585  			 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
 586  		{0xb, "Hardware monitor",
 587  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 588  			{0x00,0x00,0x00,0x00,0x00,EOT}},
 589  		{EOT}}},
 590  	{0x68, "W83697SF/UF/UG", {
 591  		/* ID:  0x68 (for W83697SF/UF/UG)
 592  		 * Rev: 0x1X (for W83697SF)
 593  		 *      0x0X (for W83697SF) -- sic!
 594  		 *      0x1X (for W83697UF/UG)
 595  		 */
 596  		{NOLDN, NULL,
 597  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,0x2a,
 598  			 0x2b,0x2c,EOT},
 599  			{0x68,NANA,0xef,0xfe,MISC,0x00,0x00,0x00,0x00,MISC,
 600  			 0x00,0x30,EOT}},
 601  		{0x0, "Floppy",
 602  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,0xf5,
 603  			 EOT},
 604  			{0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
 605  			 EOT}},
 606  		{0x1, "Parallel port",
 607  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 608  			{0x01,0x03,0x78,0x07,0x03,0x3f,EOT}},
 609  		{0x2, "COM1",
 610  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 611  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 612  		{0x3, "COM2",
 613  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 614  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 615  		{0x7, "Game port, GPIO 1",
 616  			{0x30,0x60,0x61,0x62,0x63,0xf0,0xf1,0xf2,EOT},
 617  			{0x00,0x02,0x01,0x00,0x00,0xff,0x00,0x00,EOT}},
 618  		{0x8, "MIDI port, GPIO 5",
 619  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
 620  			 0xf4,0xf5,EOT},
 621  			{0x00,0x03,0x30,0x00,0x00,0x09,0xff,0x00,0x00,0x00,
 622  			 0x00,0x00,EOT}},
 623  		{0x9, "GPIO 2, GPIO 3, GPIO 4",
 624  			{0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,
 625  			 0xf7,0xf8,EOT},
 626  			{0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,
 627  			 0x00,0x00,EOT}},
 628  		{0xa, "ACPI",
 629  			{0x30,0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf6,0xf7,0xf9,
 630  			 0xfa,EOT},
 631  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 632  			 0x00,EOT}},
 633  		{0xb, "PWM",
 634  			{0x30,0x60,0x61,EOT},
 635  			{0x00,0x00,0x00,EOT}},
 636  		{0xc, "Smart card",
 637  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 638  			{0x00,0x00,0x00,0x00,0x00,EOT}},
 639  		{0xd, "URC, GPIO 6",
 640  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
 641  			 0xf4,EOT},
 642  			{0x00,0x03,0xe8,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
 643  			 0x00,EOT}},
 644  		{0xe, "URD, GPIO 7",
 645  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
 646  			 EOT},
 647  			{0x00,0x02,0xe8,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
 648  			 EOT}},
 649  		{0xf, "GPIO 8",
 650  			{0x30,0x60,0x61,0xf0,0xf1,0xf2,EOT},
 651  			{0x00,0x00,0x00,0xff,0x00,0x00,EOT}},
 652  		{EOT}}},
 653  	{0x88, "W83627EHF/EF/EHG/EG", {
 654  		/*
 655  		 * As per datasheet the ID should be 0x886? here.
 656  		 * Not mentioned in the datasheet, but sensors-detect says
 657  		 * 0x8853 is also possible. Also, the ASUS A8V-E Deluxe
 658  		 * (W83627EHF) has an ID of 0x8854 (verified on hardware).
 659  		 * So we now assume all 0x88?? IDs to mean W83627EHF/EF/EHG/EG.
 660  		 */
 661  		{NOLDN, NULL,
 662  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
 663  			 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
 664  			{0x88,MISC,0xff,0x00,MISC,0x00,MISC,RSVD,0x50,
 665  			 0x04,0x00,RSVD,0x00,0x21,0x00,0x00,EOT}},
 666  		{0x0, "Floppy",
 667  			{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
 668  			 0xf5,EOT},
 669  			{0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00,
 670  			 0x00,EOT}},
 671  		{0x1, "Parallel port",
 672  			{0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
 673  			{0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
 674  		{0x2, "COM1",
 675  			{0x30,0x60,0x61,0x70,0xf0,EOT},
 676  			{0x01,0x03,0xf8,0x04,0x00,EOT}},
 677  		{0x3, "COM2",
 678  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 679  			{0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
 680  		{0x5, "Keyboard",
 681  			{0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
 682  			{0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
 683  		{0x6, "Serial flash interface",
 684  			{0x30,0x62,0x63,EOT},
 685  			{0x00,0x00,0x00,EOT}},
 686  		{0x7, "GPIO 1, GPIO 6, game port, MIDI port",
 687  			{0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
 688  			 0xf4,0xf5,0xf6,0xf7,EOT},
 689  			{0x00,0x02,0x01,0x03,0x30,0x09,0xff,0x00,0x00,0x00,
 690  			 0xff,0x00,0x00,0x00,EOT}},
 691  		{0x8, "WDTO#, PLED",
 692  			{0x30,0xf5,0xf6,0xf7,EOT},
 693  			{0x00,0x00,0x00,0x00,EOT}},
 694  		{0x9, "GPIO 2, GPIO 3, GPIO 4, GPIO 5, SUSLED",
 695  			{0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xf0,0xf1,0xf2,
 696  			 0xf3,0xf4,0xf5,0xf6,0xf7,EOT},
 697  			{0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,
 698  			 0x00,0xff,0x00,0x00,0x00,EOT}},
 699  		{0xa, "ACPI",
 700  			{0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
 701  			 0xe8,0xf2,0xf3,0xf4,0xf6,0xf7,EOT},
 702  			{0x00,0x00,0x01,0x00,0xff,0x08,0x00,RSVD,0x00,0x00,
 703  			 RSVD,0x7c,0x00,0x00,0x00,0x00,EOT}},
 704  		{0xb, "Hardware monitor",
 705  			{0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
 706  			{0x00,0x00,0x00,0x00,0xc1,0x00,EOT}},
 707  		{EOT}}},
 708  
 709  	/* ID[3..0] */
 710  	{0xa, "W83877F", {
 711  		{EOT}}},
 712  	{0xb, "W83877AF", {
 713  		{NOLDN, NULL,
 714  			{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
 715  			 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
 716  			 0x14,0x15,0x16,0x17,0x1e,0x20,0x21,0x22,0x23,0x24,
 717  			 0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,EOT},
 718  			{0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x0a,
 719  			 0x1f,0x0c,0x28,0xa3,RSVD,RSVD,0x00,0x00,0x00,0x00,
 720  			 0x00,0x00,0x0e,0x00,MISC,MISC,MISC,MISC,MISC,MISC,
 721  			 MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,EOT}},
 722  		{EOT}}},
 723  	{0xc, "W83877TF", {
 724  		{EOT}}},
 725  	{0xd, "W83877ATF/ATG", {
 726  		{EOT}}},
 727  	{EOT}
 728  };
 729  
 730  static const struct superio_registers hwm_table[] = {
 731  	{0x828, "W83627THF/THG", {
 732  		{NOLDN, NULL,
 733  			{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
 734  			 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
 735  			 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
 736  			 0x1e,0x1f,
 737  			 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
 738  			 0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,
 739  			 0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,
 740  			 0x3f,
 741  			 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
 742  			 0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,EOT},
 743  			{RSVD,0xff,RSVD,0xff,0x00,0x00,0x00,0x00,0x01,0x01,
 744  			 0x01,0x01,0x3c,0x3c,0x0a,0x0a,RSVD,0xff,0x00,0x00,
 745  			 0x00,0x01,0x01,0x3c,0x43,RSVD,0xff,0xff,RSVD,RSVD,
 746  			 NANA,NANA,
 747  			 NANA,NANA,NANA,NANA,NANA,RSVD,RSVD,NANA,NANA,NANA,
 748  			 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 749  			 RSVD,RSVD,RSVD,RSVD,NANA,NANA,NANA,NANA,NANA,RSVD,
 750  			 RSVD,
 751  			 0x03,0x00,0x00,0xfe,0xff,RSVD,RSVD,0x5f,NANA,0x03,
 752  			 RSVD,0x44,0x18,0x15,0x80,0x5c,EOT}},
 753  		{0x0, "Bank 0",
 754  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 755  			 0x5d,0x5e,0x5f,EOT},
 756  			{NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x80,0x90,0x70,
 757  			 0x00,RSVD,RSVD,EOT}},
 758  		{0x1, "Bank 1",
 759  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,EOT},
 760  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,EOT}},
 761  		{0x2, "Bank 2",
 762  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,EOT},
 763  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,EOT}},
 764  		{0x4, "Bank 4",
 765  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x59,0x5a,
 766  			 0x5b,EOT},
 767  			{0x00,0xff,RSVD,0x00,0x00,0x00,0x00,0x00,0x00,
 768  			 0x00,EOT}},
 769  		{0x5, "Bank 5",
 770  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,EOT},
 771  			{NANA,NANA,RSVD,RSVD,NANA,NANA,NANA,NANA,EOT}},
 772  		{0x6, "Bank 6",
 773  			{0x50,EOT},
 774  			{RSVD,EOT}},
 775  		{EOT}}},
 776  	{0xa02, "W83627DHG", {
 777  		{NOLDN, NULL,
 778  			{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
 779  			 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
 780  			 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
 781  			 0x1e,0x1f,EOT},
 782  			{0x04,0xff,0x04,NANA,0x01,0x00,0x00,0x00,0x01,0x01,
 783  			 0x01,0x01,0x3c,0x3c,0x0a,0x0a,0x04,0xff,0x00,0x00,
 784  			 0x00,0x01,0x01,0x3c,0x43,RSVD,RSVD,RSVD,RSVD,RSVD,
 785  			 RSVD,RSVD,EOT}},
 786  		{NOLDN, NULL, /* Value RAM */
 787  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
 788  			 0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,
 789  			 0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,
 790  			 0x3e,0x3f,EOT},
 791  			{NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 792  			 NANA,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,
 793  			 MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,
 794  			 MISC,MISC,EOT}},
 795  		{NOLDN, NULL,
 796  			{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
 797  			 0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,EOT},
 798  			{0x03,0x00,0x00,0xff,0xff,RSVD,0x07,0x55,0x2d,0x00,
 799  			 0x00,0x44,0x10,0x95,0x80,0xa3,EOT}},
 800  		{0x0, "Bank 0",
 801  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 802  			 0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,
 803  			 0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
 804  			 0x6e,EOT},
 805  			{RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,0x00,0x80,0xc1,0x70,
 806  			 RSVD,RSVD,RSVD,0x04,0x04,RSVD,0x04,NANA,0x40,0x00,
 807  			 0x01,0x01,0x3c,0xff,0x01,0xff,0x01,0xff,0xff,0xff,
 808  			 0xff,EOT}},
 809  		{0x1, "Bank 1",
 810  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,EOT},
 811  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,EOT}},
 812  		{0x2, "Bank 2",
 813  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,EOT},
 814  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,EOT}},
 815  		{0x4, "Bank 4",
 816  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 817  			 0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,EOT},
 818  			{0x00,0x13,RSVD,0x00,0x00,0x00,0x00,RSVD,RSVD,0x00,
 819  			 0x00,0x00,RSVD,RSVD,RSVD,RSVD,EOT}},
 820  		{0x5, "Bank 5", /* Value RAM 2 */
 821  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 822  			 0x5a,0x5b,0x5c,EOT},
 823  			{NANA,NANA,RSVD,NANA,MISC,MISC,MISC,MISC,RSVD,RSVD,
 824  			 RSVD,RSVD,MISC,EOT}},
 825  		{0x6, "Bank 6",
 826  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,EOT},
 827  			{RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,EOT}},
 828  		{EOT}}},
 829  	{0x88, "W83627EHF/EF/EHG/EG", {
 830  		{NOLDN, NULL,
 831  			{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
 832  			 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
 833  			 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
 834  			 0x1e,0x1f,EOT},
 835  			{0x04,0xff,0x04,0xff,0x01,0x00,0x00,0x00,0x01,0x01,
 836  			 0x01,0x01,0x3c,0x3c,0x0a,0x0a,0x04,0xff,0x00,0x00,
 837  			 0x00,0x01,0x01,0x3c,0x43,RSVD,RSVD,RSVD,RSVD,RSVD,
 838  			 RSVD,RSVD,EOT}},
 839  		{NOLDN, NULL, /* Value RAM */
 840  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
 841  			 0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,
 842  			 0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,
 843  			 0x3e,0x3f,EOT},
 844  			{NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 845  			 NANA,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,
 846  			 MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,MISC,
 847  			 MISC,NANA,EOT}},
 848  		{NOLDN, NULL,
 849  			{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
 850  			 0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,EOT},
 851  			{0x03,0x00,0x00,0xde,0xff,RSVD,0x07,0x55,0x2d,RSVD,
 852  			 0x64,0x44,0x10,0x15,0x80,0x5c,EOT}},
 853  		{0x0, "Bank 0",
 854  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 855  			 0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,
 856  			 0x64,0x65,0x66,0x67,0x68,0x69,0x6a,EOT},
 857  			{RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,0x00,0x80,0xa1,0x70,
 858  			 RSVD,RSVD,RSVD,0x00,RSVD,RSVD,0x04,0xff,0x40,0x00,
 859  			 0x01,0x01,0x3c,0xff,0x01,0xff,0x01,EOT}},
 860  		{0x1, "Bank 1",
 861  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,EOT},
 862  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,EOT}},
 863  		{0x2, "Bank 2",
 864  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,EOT},
 865  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,EOT}},
 866  		{0x4, "Bank 4",
 867  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 868  			 0x5a,0x5b,0x5c,0x5d,EOT},
 869  			{0x00,0x00,RSVD,0x00,0x00,0x00,0x00,RSVD,RSVD,0x00,
 870  			 0x00,0x00,RSVD,RSVD,EOT}},
 871  		{0x5, "Bank 5", /* Value RAM 2 */
 872  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 873  			 0x5a,0x5b,0x5c,EOT},
 874  			{NANA,NANA,RSVD,RSVD,MISC,MISC,MISC,MISC,MISC,MISC,
 875  			 RSVD,RSVD,MISC,EOT}},
 876  		{0x6, "Bank 6",
 877  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,EOT},
 878  			{RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,EOT}},
 879  		{EOT}}},
 880  	{0xb07, "W83627DHG-P/-PT", {
 881  		{NOLDN, NULL,
 882  			{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
 883  			 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
 884  			 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
 885  			 0x1e,0x1f,EOT},
 886  			{0x04,0xff,0x04,NANA,0x01,0x00,0x00,0x00,0x01,0x01,
 887  			 0x01,0x01,0x3c,0x3c,0x0a,0x0a,0x04,0xff,0x00,0x00,
 888  			 0x00,0x01,0x01,0x3c,0x43,RSVD,RSVD,RSVD,RSVD,RSVD,
 889  			 RSVD,RSVD,EOT}},
 890  		{NOLDN, NULL,
 891  			{0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
 892  			 0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,
 893  			 0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,
 894  			 0x3e,0x3f,EOT},
 895  			{NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 896  			 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 897  			 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
 898  			 NANA,NANA,EOT}},
 899  		{NOLDN, NULL,
 900  			{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
 901  			 0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,EOT},
 902  			{0x03,0x00,0x00,0xff,0xff,0x00,0x3f,0x55,0x2d,0x00,
 903  			 0x00,0x44,0x10,0x95,0x80,0xa3,EOT}},
 904  		{0x0, "Bank 0",
 905  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 906  			 0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,
 907  			 0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
 908  			 0x6e,0x6f,EOT},
 909  			{RSVD,RSVD,RSVD,RSVD,RSVD,RSVD,0x00,0x80,0xc1,0x70,
 910  			 RSVD,RSVD,RSVD,0x04,0x04,RSVD,0x04,NANA,0x40,0x00,
 911  			 0x01,0x01,0x3c,0xff,0x01,0xff,0x01,0xff,0xff,0xff,
 912  			 0xff,0x00,EOT}},
 913  		{0x0, "Bank 0 [...]",
 914  			{0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
 915  			 0x7a,0x7b,0x7c,0x7d,EOT},
 916  			{0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,
 917  			 0x00,0x00,0x00,NANA,EOT}},
 918  		{0x1, "Bank 1",
 919  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,     0x58,0x59,
 920  			 0x5a,0x5b,0x5c,0x5d,0x5e,     EOT},
 921  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,     0x00,0x00,
 922  			 0x00,0x00,0x00,0x00,0x0e,     EOT}},
 923  		{0x2, "Bank 2",
 924  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,     EOT},
 925  			{NANA,NANA,0x00,0x4b,0x00,0x50,0x00,     EOT}},
 926  		{0x4, "Bank 4",
 927  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 928  			 0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,EOT},
 929  			{0x00,0x13,RSVD,0x00,0x00,0x00,0x00,RSVD,RSVD,0x00,
 930  			 0x00,0x00,RSVD,RSVD,RSVD,RSVD,EOT}},
 931  		{0x5, "Bank 5",
 932  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 933  			 0x5a,0x5b,0x5c,EOT},
 934  			{NANA,NANA,RSVD,NANA,NANA,NANA,NANA,NANA,RSVD,RSVD,
 935  			 RSVD,RSVD,NANA,EOT}},
 936  		{0x6, "Bank 6",
 937  			{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
 938  			 0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,EOT},
 939  			{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 940  			 0x0d,0xff,0xff,0xff,0xff,0xff,EOT}},
 941  		{EOT}}},
 942  	{EOT}
 943  };
 944  
 945  static void enter_conf_mode_winbond_88(uint16_t port)
 946  {
 947  	OUTB(0x88, port);
 948  }
 949  
 950  static void enter_conf_mode_winbond_89(uint16_t port)
 951  {
 952  	OUTB(0x89, port);
 953  }
 954  
 955  static void enter_conf_mode_winbond_86(uint16_t port)
 956  {
 957  	OUTB(0x86, port);
 958  	OUTB(0x86, port);
 959  }
 960  
 961  static int chip_found_at_port;
 962  
 963  static void probe_idregs_winbond_helper(const char *init, uint16_t port)
 964  {
 965  	uint16_t id, hwmport;
 966  	uint8_t devid, rev, olddevid;
 967  
 968  	probing_for("Winbond", init, port);
 969  
 970  	devid = regval(port, DEVICE_ID_REG);
 971  	rev = regval(port, DEVICE_REV_REG);
 972  	olddevid = regval(port, DEVICE_ID_REG_OLD) & 0x0f;
 973  
 974  	if (devid == 0x52 && (rev & 0xf0) != 0xf0)
 975  		id = devid;				 /* ID only */
 976  	else if (devid == 0x68 || devid == 0x88)
 977  		id = devid;				 /* ID only */
 978  	else if ((devid == 0x97) && ((rev & 0xf0) == 0x70))
 979  		id = (devid << 8) | rev;		 /* ID and rev */
 980  	else
 981  		id = (devid << 4) | ((rev & 0xf0) >> 4); /* ID and rev[7..4] */
 982  
 983  	if (olddevid >= 0x0a && olddevid <= 0x0d)
 984  		id = olddevid & 0x0f;			 /* ID[3..0] */
 985  
 986  	if (superio_unknown(reg_table, id)) {
 987  		if (verbose)
 988  			printf(NOTFOUND "id/oldid=0x%02x/0x%02x, rev=0x%02x\n",
 989  			       devid, olddevid, rev);
 990  		return;
 991  	}
 992  
 993  	if (olddevid >= 0x0a && olddevid <= 0x0d)
 994  		printf("Found Winbond %s (id=0x%02x) at 0x%x\n",
 995  		       get_superio_name(reg_table, id), olddevid, port);
 996  	else
 997  		printf("Found Winbond %s (id=0x%02x, rev=0x%02x) at 0x%x\n",
 998  		       get_superio_name(reg_table, id), devid, rev, port);
 999  	chip_found = 1;
1000  	chip_found_at_port = 1;
1001  
1002  	dump_superio("Winbond", reg_table, port, id, LDN_SEL);
1003  
1004  	if (extra_dump) {
1005  		regwrite(port, LDN_SEL, 0x0b); /* Select LDN 0xb (HWM). */
1006  
1007  		if ((regval(port, 0x30) & (1 << 0)) != (1 << 0)) {
1008  			printf("Hardware Monitor disabled or does not exist.\n");
1009  			return;
1010  		}
1011  
1012  		/* Get HWM base address (stored in LDN 0xb, index 0x60/0x61). */
1013  		hwmport = regval(port, 0x60) << 8;
1014  		hwmport |= regval(port, 0x61);
1015  
1016  		/* HWM address register = HWM base address + 5. */
1017  		hwmport += 5;
1018  
1019  		printf("Hardware monitor (0x%04x)\n", hwmport);
1020  		dump_superio("Winbond-HWM", hwm_table, hwmport, id,
1021  			     WINBOND_HWM_SEL);
1022  	}
1023  }
1024  
1025  void probe_idregs_winbond(uint16_t port)
1026  {
1027  	chip_found_at_port = 0;
1028  
1029  	enter_conf_mode_winbond_88(port);
1030  	probe_idregs_winbond_helper("(init=0x88) ", port);
1031  	exit_conf_mode_winbond_fintek_ite_8787(port);
1032  	if (chip_found_at_port)
1033  		return;
1034  
1035  	enter_conf_mode_winbond_89(port);
1036  	probe_idregs_winbond_helper("(init=0x89) ", port);
1037  	exit_conf_mode_winbond_fintek_ite_8787(port);
1038  	if (chip_found_at_port)
1039  		return;
1040  
1041  	enter_conf_mode_winbond_86(port);
1042  	probe_idregs_winbond_helper("(init=0x86,0x86) ", port);
1043  	exit_conf_mode_winbond_fintek_ite_8787(port);
1044  	if (chip_found_at_port)
1045  		return;
1046  
1047  	enter_conf_mode_winbond_fintek_ite_8787(port);
1048  	probe_idregs_winbond_helper("(init=0x87,0x87) ", port);
1049  	exit_conf_mode_winbond_fintek_ite_8787(port);
1050  	if (chip_found_at_port)
1051  		return;
1052  }
1053  
1054  void print_winbond_chips(void)
1055  {
1056  	print_vendor_chips("Winbond", reg_table);
1057  	print_vendor_chips("Winbond-HWM", hwm_table);
1058  }