summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Gapon <avg@icyb.net.ua>2008-10-19 21:03:41 +0000
committerUwe Hermann <uwe@hermann-uwe.de>2008-10-19 21:03:41 +0000
commitc880a369de89134007477c47968cec2a852195f9 (patch)
tree66ed1674e19365e01a26a232634d4d48775e26c8
parent1aa329dcb0543dabe9b2eb538bb1ec1f183a10f9 (diff)
downloadcoreboot-c880a369de89134007477c47968cec2a852195f9.tar.xz
Add register definitions for W83627HF based on publicly available
specification and local testing. Also tweak a little bit algorithm for (internal) device ID calculation: Chips from the W83627HF/F/HG/G family have an ID of 0x52 and a multitude of revisions (0x1x, 0x3a, 0x41, maybe more), chips from the W83627HF/GF family have the same device ID but revisions 0xfx. Please note that the last line of the patch simply fixes the comment about internal device ID composition (upper half of reg 0x21 is used). I chose the most conservative way of detecting W83627HF - only if reg 0x21 value matches 0xFx we skip the previous logic and keep using it for all other revisions. Signed-off-by: Andriy Gapon <avg@icyb.net.ua> Acked-by: Uwe Hermann <uwe@hermann-uwe.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3670 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-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] */