summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/superiotool/README1
-rw-r--r--util/superiotool/winbond.c46
2 files changed, 44 insertions, 3 deletions
diff --git a/util/superiotool/README b/util/superiotool/README
index 3a73ccf62d..a1d85b1cdf 100644
--- a/util/superiotool/README
+++ b/util/superiotool/README
@@ -82,6 +82,7 @@ either version 2 of the license, or (at your option) any later version.
Contributors
------------
+Andriy Gapon <avg@icyb.net.ua>
Bingxun Shi <bingxunshi@gmail.com>
Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
David Hendricks <david.hendricks@gmail.com>
diff --git a/util/superiotool/winbond.c b/util/superiotool/winbond.c
index ededd49cd6..4e2794470b 100644
--- a/util/superiotool/winbond.c
+++ b/util/superiotool/winbond.c
@@ -39,7 +39,45 @@ static const struct superio_registers reg_table[] = {
/* ID and rev[3..0] */
{0x527, "W83977CTF", { /* TODO: Not yet in sensors-detect */
{EOT}}},
- {0x52f, "W83977EF/EG", {/* TODO: Not yet in sensors-detect */
+ {0x52f, "W83977EF/EG", {
+ {NOLDN, NULL,
+ {0x02,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x2a,
+ 0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
+ {RSVD,0x52,MISC,0xff,0xfe,MISC,0x00,MISC,0x00,0x00,
+ 0x00,0x00,RSVD,RSVD,RSVD,EOT}},
+ /* Some register defaults depend on the value of PNPCSV. */
+ {0x0, "Floppy",
+ {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
+ 0xf5,EOT},
+ {0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
+ 0x00,EOT}},
+ {0x1, "Parallel port",
+ {0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
+ {0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
+ {0x2, "COM1",
+ {0x30,0x60,0x61,0x70,0xf0,EOT},
+ {0x01,0x03,0xf8,0x04,0x00,EOT}},
+ {0x3, "COM2",
+ {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
+ {0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
+ {0x5, "Keyboard",
+ {0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
+ {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
+ {0x7, "GPIO 1",
+ {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x72,0xe0,
+ 0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf1,EOT},
+ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,EOT}},
+ {0x8, "GPIO 2",
+ {0x30,0x60,0x61,0x70,0x72,0xe8,0xe9,0xea,0xeb,0xec,
+ 0xed,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
+ {0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x00,RSVD,0x00,0x00,0x00,EOT}},
+ {0xa, "ACPI",
+ {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
+ 0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,0xfe,0xff,EOT},
+ {0x00,0x00,0x00,0x00,MISC,MISC,MISC,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,RSVD,RSVD,EOT}},
{EOT}}},
{0x595, "W83627SF", { /* TODO: Not yet in sensors-detect */
{EOT}}},
@@ -457,12 +495,14 @@ static void probe_idregs_winbond_helper(const char *init, uint16_t port)
rev = regval(port, DEVICE_REV_REG);
olddevid = regval(port, DEVICE_ID_REG_OLD) & 0x0f;
- if (devid == 0x52 || devid == 0x68 || devid == 0x88)
+ if (devid == 0x52 && (rev & 0xf0) != 0xf0)
+ id = devid; /* ID only */
+ else if (devid == 0x68 || devid == 0x88)
id = devid; /* ID only */
else if ((devid == 0x97) && ((rev & 0xf0) == 0x70))
id = (devid << 8) | rev; /* ID and rev */
else
- id = (devid << 4) | ((rev & 0xf0) >> 4); /* ID and rev[3..0] */
+ id = (devid << 4) | ((rev & 0xf0) >> 4); /* ID and rev[7..4] */
if (olddevid == 0x0a || olddevid == 0x0c || olddevid == 0x0d)
id = olddevid & 0x0f; /* ID[3..0] */