[coreboot] r3670 - trunk/util/superiotool

svn at coreboot.org svn at coreboot.org
Sun Oct 19 23:03:41 CEST 2008


Author: uwe
Date: 2008-10-19 23:03:41 +0200 (Sun, 19 Oct 2008)
New Revision: 3670

Modified:
   trunk/util/superiotool/README
   trunk/util/superiotool/winbond.c
Log:
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 at icyb.net.ua>
Acked-by: Uwe Hermann <uwe at hermann-uwe.de>



Modified: trunk/util/superiotool/README
===================================================================
--- trunk/util/superiotool/README	2008-10-18 21:14:13 UTC (rev 3669)
+++ trunk/util/superiotool/README	2008-10-19 21:03:41 UTC (rev 3670)
@@ -82,6 +82,7 @@
 Contributors
 ------------
 
+Andriy Gapon <avg at icyb.net.ua>
 Bingxun Shi <bingxunshi at gmail.com>
 Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
 David Hendricks <david.hendricks at gmail.com>

Modified: trunk/util/superiotool/winbond.c
===================================================================
--- trunk/util/superiotool/winbond.c	2008-10-18 21:14:13 UTC (rev 3669)
+++ trunk/util/superiotool/winbond.c	2008-10-19 21:03:41 UTC (rev 3670)
@@ -39,7 +39,45 @@
 	/* 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 @@
 	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] */





More information about the coreboot mailing list