diff -urN oldtree/drivers/acpi/ibm_acpi.c newtree/drivers/acpi/ibm_acpi.c
--- oldtree/drivers/acpi/ibm_acpi.c	2006-09-17 05:38:20.000000000 -0400
+++ newtree/drivers/acpi/ibm_acpi.c	2006-09-17 07:13:47.000000000 -0400
@@ -1293,28 +1293,46 @@
 	if (!thermal_tmp_supported)
 		len += sprintf(p + len, "temperatures:\tnot supported\n");
 	else {
-		int i, t;
+		int i;
 		char tmpi[] = "TMPi";
-		s8 tmp[8];
+		/* 
+		 * A few ThinkPads (e.g. R52, T43) have 3 unnamed sensors. We
+		 * want their values as well.
+		 */
+		static const size_t named_count = 8;
+		static const size_t unnamed_count = 3;
+		static const size_t unnamed_addresses[] = { 0xC0, 0xC1, 0xC2 };
+		static const size_t total_count = named_count + unnamed_count;
+		s8 tmp[total_count];
 
 		if (thermal_updt_supported)
 			if (!acpi_evalf(ec_handle, NULL, "UPDT", "v"))
 				return -EIO;
 
-		for (i = 0; i < 8; i++) {
+		for (i = 0; i < named_count; i++) {
+			int t;
 			tmpi[3] = '0' + i;
 			if (!acpi_evalf(ec_handle, &t, tmpi, "d"))
 				return -EIO;
-			if (thermal_updt_supported)
-				tmp[i] = (t - 2732 + 5) / 10;
-			else
-				tmp[i] = t;
+			tmp[i] = (s8)t;
 		}
 
-		len += sprintf(p + len,
-			       "temperatures:\t%d %d %d %d %d %d %d %d\n",
-			       tmp[0], tmp[1], tmp[2], tmp[3],
-			       tmp[4], tmp[5], tmp[6], tmp[7]);
+		for (i = 0; i < unnamed_count; ++i) {
+			size_t address = unnamed_addresses[i];
+			u8 t;
+			if (!acpi_ec_read(address, &t))
+				return -EIO;
+			tmp[i+named_count] = (s8)t;
+		}
+
+		len += sprintf(p + len, "temperatures:\t" );
+		for (i = 0; i < total_count; ++i) {
+			int value = thermal_updt_supported 
+			          ? (tmp[i] - 2732 + 5) / 10
+			          : tmp[i];
+			len += sprintf(p + len, "%d%c", value,
+			               i == total_count - 1 ? '\n' : ' ');
+		}
 	}
 
 	return len;
@@ -1529,6 +1547,7 @@
 {
 	int len = 0;
 	int s;
+	char status_read = 0;
 	u8 lo, hi, status;
 
 	if (gfan_handle) {
@@ -1541,16 +1560,27 @@
 		/* all except 570, 600e/x, 770e, 770x */
 		if (!acpi_ec_read(fan_status_offset, &status))
 			len += sprintf(p + len, "status:\t\tunreadable\n");
-		else
+		else {
 			len += sprintf(p + len, "status:\t\t%s\n",
-				       enabled(status, 7));
+					status ? "enabled" : "disabled");
+			status_read = 1;
 
+		}
 		if (!acpi_ec_read(fan_rpm_offset, &lo) ||
 		    !acpi_ec_read(fan_rpm_offset + 1, &hi))
 			len += sprintf(p + len, "speed:\t\tunreadable\n");
 		else
 			len += sprintf(p + len, "speed:\t\t%d\n",
 				       (hi << 8) + lo);
+		if (status_read) {
+			if (status & 0x40)
+				len += sprintf(p + len, "level:\t\tdisengaged\n");
+			else if (status & 0x80)
+				len += sprintf(p + len, "level:\t\tauto\n");
+			else
+				len += sprintf(p + len, "level:\t\t%d\n", status);
+		}
+
 	}
 
 	if (sfan_handle)
@@ -1559,7 +1589,10 @@
 			       " (<level> is 0-7)\n");
 	if (!gfan_handle)
 		/* all except 570, 600e/x, 770e, 770x */
-		len += sprintf(p + len, "commands:\tenable, disable\n");
+                len += sprintf(p + len, 
+                              "commands:\tenable, disable, level <level>\n"
+                              "         \t(<level> is 0-7, auto "
+                              "or disengaged)\n");
 	if (fans_handle)
 		/* X31, X40 */
 		len += sprintf(p + len, "commands:\tspeed <speed>"
@@ -1580,7 +1613,8 @@
 			/* 570, 770x-JL */
 			if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", level))
 				return -EIO;
-		} else if (!gfan_handle && strlencmp(cmd, "enable") == 0) {
+                } else if (!gfan_handle && ( (strlencmp(cmd, "enable") == 0) || 
+                                (strlencmp(cmd, "level auto") == 0) ) ) {
 			/* all except 570, 600e/x, 770e, 770x */
 			if (!acpi_ec_write(fan_status_offset, 0x80))
 				return -EIO;
@@ -1588,6 +1622,17 @@
 			/* all except 570, 600e/x, 770e, 770x */
 			if (!acpi_ec_write(fan_status_offset, 0x00))
 				return -EIO;
+                } else if (!gfan_handle && 
+				strlencmp(cmd, "level disengaged") == 0) {
+                        /* all except 570, 600e/x, 770e, 770x */
+                        if (!acpi_ec_write(fan_status_offset, 0x40))
+                                return -EIO;
+                } else if (!gfan_handle &&
+                    sscanf(cmd, "level %d", &level) == 1 &&
+                    level >=0 && level <= 7) {
+                        /* all except 570, 600e/x, 770e, 770x */
+                        if (!acpi_ec_write(fan_status_offset, level))
+                                return -EIO;
 		} else if (fans_handle &&
 			   sscanf(cmd, "speed %d", &speed) == 1 &&
 			   speed >= 0 && speed <= 65535) {
Files oldtree/scripts/kconfig/mconf and newtree/scripts/kconfig/mconf differ
