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
This commit is contained in:
Andriy Gapon 2008-10-19 21:03:41 +00:00 committed by Uwe Hermann
parent 1aa329dcb0
commit c880a369de
2 changed files with 44 additions and 3 deletions

View File

@ -82,6 +82,7 @@ either version 2 of the license, or (at your option) any later version.
Contributors Contributors
------------ ------------
Andriy Gapon <avg@icyb.net.ua>
Bingxun Shi <bingxunshi@gmail.com> Bingxun Shi <bingxunshi@gmail.com>
Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
David Hendricks <david.hendricks@gmail.com> David Hendricks <david.hendricks@gmail.com>

View File

@ -39,7 +39,45 @@ static const struct superio_registers reg_table[] = {
/* ID and rev[3..0] */ /* ID and rev[3..0] */
{0x527, "W83977CTF", { /* TODO: Not yet in sensors-detect */ {0x527, "W83977CTF", { /* TODO: Not yet in sensors-detect */
{EOT}}}, {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}}}, {EOT}}},
{0x595, "W83627SF", { /* TODO: Not yet in sensors-detect */ {0x595, "W83627SF", { /* TODO: Not yet in sensors-detect */
{EOT}}}, {EOT}}},
@ -457,12 +495,14 @@ static void probe_idregs_winbond_helper(const char *init, uint16_t port)
rev = regval(port, DEVICE_REV_REG); rev = regval(port, DEVICE_REV_REG);
olddevid = regval(port, DEVICE_ID_REG_OLD) & 0x0f; 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 */ id = devid; /* ID only */
else if ((devid == 0x97) && ((rev & 0xf0) == 0x70)) else if ((devid == 0x97) && ((rev & 0xf0) == 0x70))
id = (devid << 8) | rev; /* ID and rev */ id = (devid << 8) | rev; /* ID and rev */
else 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) if (olddevid == 0x0a || olddevid == 0x0c || olddevid == 0x0d)
id = olddevid & 0x0f; /* ID[3..0] */ id = olddevid & 0x0f; /* ID[3..0] */