[lm-sensors] [PATCH 11/34] drivers/hwmon changes for SMBIOS and System Firmware

Prarit Bhargava prarit at redhat.com
Mon Jul 18 15:08:25 CEST 2011


As part of the new SMBIOS and System Firmware code:

- Replace old dmi* structures and functions with new sysfw* and smbios*
structures and functions in individual drivers
- cleanup sysfw_id lookup tables
- add exactmatch functionality
- edit udev notifiers
- cleanup of includes for dmi.h and mod_devicetable.h which were included in
some files that did not need them

Cc: lm-sensors at lm-sensors.org
Signed-off-by: Prarit Bhargava <prarit at redhat.com>
---
 drivers/hwmon/abituguru.c    |   18 ++++++--
 drivers/hwmon/abituguru3.c   |   75 ++++++++++++++++--------------
 drivers/hwmon/adcxx.c        |    1 -
 drivers/hwmon/applesmc.c     |   73 +++++++++++++++++------------
 drivers/hwmon/asus_atk0110.c |   10 ++--
 drivers/hwmon/fschmd.c       |  104 ++++++++++++++++++++++--------------------
 drivers/hwmon/it87.c         |   42 ++++++++++-------
 drivers/hwmon/lm70.c         |    1 -
 8 files changed, 181 insertions(+), 143 deletions(-)

diff --git a/drivers/hwmon/abituguru.c b/drivers/hwmon/abituguru.c
index 65a35cf..b9053cb 100644
--- a/drivers/hwmon/abituguru.c
+++ b/drivers/hwmon/abituguru.c
@@ -34,7 +34,7 @@
 #include <linux/platform_device.h>
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/io.h>
 
 /* Banks */
@@ -1444,15 +1444,25 @@ static int __init abituguru_detect(void)
 
 static struct platform_device *abituguru_pdev;
 
+static struct sysfw_id abitguru_id_table[] = {
+	{
+		 .ident = "Abit Motherboards",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR,
+				    "http://www.abit.com.tw/"),
+		},
+		.exactmatch = 1,
+	},
+	{},
+};
+
 static int __init abituguru_init(void)
 {
 	int address, err;
 	struct resource res = { .flags = IORESOURCE_IO };
-	const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
 
 	/* safety check, refuse to load on non Abit motherboards */
-	if (!force && (!board_vendor ||
-			strcmp(board_vendor, "http://www.abit.com.tw/")))
+	if (!force && !sysfw_callback(abitguru_id_table))
 		return -ENODEV;
 
 	address = abituguru_detect();
diff --git a/drivers/hwmon/abituguru3.c b/drivers/hwmon/abituguru3.c
index d30855a..7d36abc 100644
--- a/drivers/hwmon/abituguru3.c
+++ b/drivers/hwmon/abituguru3.c
@@ -36,7 +36,8 @@
 #include <linux/platform_device.h>
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
-#include <linux/dmi.h>
+#include <linux/smbios.h>
+#include <linux/sysfw.h>
 #include <linux/io.h>
 
 /* uGuru3 bank addresses */
@@ -121,11 +122,11 @@ struct abituguru3_sensor_info {
 };
 
 /* Avoid use of flexible array members */
-#define ABIT_UGURU3_MAX_DMI_NAMES 2
+#define ABIT_UGURU3_MAX_SMBIOS_NAMES 2
 
 struct abituguru3_motherboard_info {
 	u16 id;
-	const char *dmi_name[ABIT_UGURU3_MAX_DMI_NAMES + 1];
+	const char *smbios_name[ABIT_UGURU3_MAX_SMBIOS_NAMES + 1];
 	/* + 1 -> end of sensors indicated by a sensor with name == NULL */
 	struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1];
 };
@@ -170,7 +171,7 @@ struct abituguru3_data {
 
 /* Constants */
 static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
-	{ 0x000C, { NULL } /* Unknown, need DMI string */, {
+	{ 0x000C, { NULL } /* Unknown, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 10, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -192,7 +193,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "AUX1 Fan",		35, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x000D, { NULL } /* Abit AW8, need DMI string */, {
+	{ 0x000D, { NULL } /* Abit AW8, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 10, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -221,7 +222,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "AUX5 Fan",		39, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x000E, { NULL } /* AL-8, need DMI string */, {
+	{ 0x000E, { NULL } /* AL-8, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 10, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -242,7 +243,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "SYS Fan",		34, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x000F, { NULL } /* Unknown, need DMI string */, {
+	{ 0x000F, { NULL } /* Unknown, need SMBIOS string */, {
 
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 10, 1, 0 },
@@ -264,7 +265,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "SYS Fan",		34, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x0010, { NULL } /* Abit NI8 SLI GR, need DMI string */, {
+	{ 0x0010, { NULL } /* Abit NI8 SLI GR, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 10, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -313,7 +314,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "AUX3 Fan",		37, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x0012, { NULL } /* Abit AN8 32X, need DMI string */, {
+	{ 0x0012, { NULL } /* Abit AN8 32X, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 20, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -335,7 +336,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "AUX1 Fan",		36, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x0013, { NULL } /* Abit AW8D, need DMI string */, {
+	{ 0x0013, { NULL } /* Abit AW8D, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 10, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -385,7 +386,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "SYS Fan",		34, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x0015, { NULL } /* Unknown, need DMI string */, {
+	{ 0x0015, { NULL } /* Unknown, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR",		 1, 0, 20, 1, 0 },
 		{ "DDR VTT",		 2, 0, 10, 1, 0 },
@@ -437,7 +438,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "OTES1 Fan",		38, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x0017, { NULL } /* Unknown, need DMI string */, {
+	{ 0x0017, { NULL } /* Unknown, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR2",		 1, 0, 20, 1, 0 },
 		{ "DDR2 VTT",		 2, 0, 10, 1, 0 },
@@ -544,7 +545,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
 		{ "AUX4 Fan",		37, 2, 60, 1, 0 },
 		{ NULL, 0, 0, 0, 0, 0 } }
 	},
-	{ 0x001B, { NULL } /* Unknown, need DMI string */, {
+	{ 0x001B, { NULL } /* Unknown, need SMBIOS string */, {
 		{ "CPU Core",		 0, 0, 10, 1, 0 },
 		{ "DDR3",		 1, 0, 20, 1, 0 },
 		{ "DDR3 VTT",		 2, 0, 10, 1, 0 },
@@ -1119,23 +1120,23 @@ static struct platform_driver abituguru3_driver = {
 	.resume = abituguru3_resume
 };
 
-static int __init abituguru3_dmi_detect(void)
+static int __init abituguru3_smbios_detect(void)
 {
 	const char *board_vendor, *board_name;
 	int i, err = (force) ? 1 : -ENODEV;
-	const char *const *dmi_name;
+	const char *const *smbios_name;
 	size_t sublen;
 
-	board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
+	board_vendor = sysfw_lookup(SYSFW_BOARD_VENDOR);
 	if (!board_vendor || strcmp(board_vendor, "http://www.abit.com.tw/"))
 		return err;
 
-	board_name = dmi_get_system_info(DMI_BOARD_NAME);
+	board_name = sysfw_lookup(SYSFW_BOARD_NAME);
 	if (!board_name)
 		return err;
 
 	/* At the moment, we don't care about the part of the vendor
-	 * DMI string contained in brackets. Truncate the string at
+	 * SMBIOS string contained in brackets. Truncate the string at
 	 * the first occurrence of a bracket. Trim any trailing space
 	 * from the substring.
 	 */
@@ -1144,11 +1145,11 @@ static int __init abituguru3_dmi_detect(void)
 		sublen--;
 
 	for (i = 0; abituguru3_motherboards[i].id; i++) {
-		dmi_name = abituguru3_motherboards[i].dmi_name;
-		for ( ; *dmi_name; dmi_name++) {
-			if (strlen(*dmi_name) != sublen)
+		smbios_name = abituguru3_motherboards[i].smbios_name;
+		for ( ; *smbios_name; smbios_name++) {
+			if (strlen(*smbios_name) != sublen)
 				continue;
-			if (!strncasecmp(board_name, *dmi_name, sublen))
+			if (!strncasecmp(board_name, *smbios_name, sublen))
 				return 0;
 		}
 	}
@@ -1158,7 +1159,8 @@ static int __init abituguru3_dmi_detect(void)
 }
 
 /* FIXME: Manual detection should die eventually; we need to collect stable
- *        DMI model names first before we can rely entirely on CONFIG_DMI.
+ *        SMBIOS model names first before we can rely entirely on
+ *	  CONFIG_SMBIOS.
  */
 
 static int __init abituguru3_detect(void)
@@ -1192,21 +1194,26 @@ static int __init abituguru3_init(void)
 	struct resource res = { .flags = IORESOURCE_IO };
 	int err;
 
-	/* Attempt DMI detection first */
-	err = abituguru3_dmi_detect();
-	if (err < 0)
-		return err;
-
-	/* Fall back to manual detection if there was no exact
-	 * board name match, or force was specified.
-	 */
-	if (err > 0) {
+	err = 1;
+	if (smbios_available) {
+		/* Attempts SMBIOS detection first */
+		err = abituguru3_smbios_detect();
+		if (err < 0)
+			return err;
+	}
+	if (err) {
+		/* Fall back to manual detection if there was no exact
+		 * board name match, or force was specified.
+		 */
 		err = abituguru3_detect();
 		if (err)
 			return err;
 
-		pr_warn("this motherboard was not detected using DMI. "
-			"Please send the output of \"dmidecode\" to the abituguru3 maintainer (see MAINTAINERS)\n");
+		if (smbios_available)
+			pr_warn("this motherboard was not detected using "
+				"SMBIOS.  Please send the output of "
+				"\"dmidecode\" to the abituguru3 maintainer "
+				"(see MAINTAINERS)\n");
 	}
 
 	err = platform_driver_register(&abituguru3_driver);
diff --git a/drivers/hwmon/adcxx.c b/drivers/hwmon/adcxx.c
index b2cacbe..ff47453 100644
--- a/drivers/hwmon/adcxx.c
+++ b/drivers/hwmon/adcxx.c
@@ -44,7 +44,6 @@
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/mutex.h>
-#include <linux/mod_devicetable.h>
 #include <linux/spi/spi.h>
 
 #define DRVNAME		"adcxx"
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
index 4c07436..a2dc0f8 100644
--- a/drivers/hwmon/applesmc.c
+++ b/drivers/hwmon/applesmc.c
@@ -36,7 +36,7 @@
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/timer.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/mutex.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/io.h>
@@ -1184,46 +1184,59 @@ static void applesmc_release_key_backlight(void)
 	destroy_workqueue(applesmc_led_wq);
 }
 
-static int applesmc_dmi_match(const struct dmi_system_id *id)
-{
-	return 1;
-}
-
-/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
- * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
-static __initdata struct dmi_system_id applesmc_whitelist[] = {
-	{ applesmc_dmi_match, "Apple MacBook Air", {
-	  DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
-	  DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
+static __initdata struct sysfw_id applesmc_whitelist[] = {
+	{
+		.ident = "Apple MacBook Air",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "Apple"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MacBookAir")
+		},
+		.exactmatch = 1,
 	},
-	{ applesmc_dmi_match, "Apple MacBook Pro", {
-	  DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
-	  DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro") },
+	{
+		.ident = "Apple MacBook Pro",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "Apple"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MacBookPro")
+		},
+		.exactmatch = 1,
 	},
-	{ applesmc_dmi_match, "Apple MacBook", {
-	  DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
-	  DMI_MATCH(DMI_PRODUCT_NAME, "MacBook") },
+	{
+		.ident = "Apple MacBook",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "Apple"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MacBook")
+		},
 	},
-	{ applesmc_dmi_match, "Apple Macmini", {
-	  DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
-	  DMI_MATCH(DMI_PRODUCT_NAME, "Macmini") },
+	{
+		.ident = "Apple Macmini",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "Apple"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "Macmini")
+		},
 	},
-	{ applesmc_dmi_match, "Apple MacPro", {
-	  DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
-	  DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
+	{
+		.ident = "Apple MacPro",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "Apple"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "MacPro")
+		},
 	},
-	{ applesmc_dmi_match, "Apple iMac", {
-	  DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
-	  DMI_MATCH(DMI_PRODUCT_NAME, "iMac") },
+	{
+		.ident = "Apple iMac",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "Apple"),
+			SYSFW_MATCH(SYSFW_PRODUCT_NAME, "iMac")
+		},
 	},
-	{ .ident = NULL }
+	{}
 };
 
 static int __init applesmc_init(void)
 {
 	int ret;
 
-	if (!dmi_check_system(applesmc_whitelist)) {
+	if (!sysfw_callback(applesmc_whitelist)) {
 		pr_warn("supported laptop not found!\n");
 		ret = -ENODEV;
 		goto out;
@@ -1329,4 +1342,4 @@ module_exit(applesmc_exit);
 MODULE_AUTHOR("Nicolas Boichat");
 MODULE_DESCRIPTION("Apple SMC");
 MODULE_LICENSE("GPL v2");
-MODULE_DEVICE_TABLE(dmi, applesmc_whitelist);
+MODULE_DEVICE_TABLE(sysfw, applesmc_whitelist);
diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c
index dcb78a7..b355020 100644
--- a/drivers/hwmon/asus_atk0110.c
+++ b/drivers/hwmon/asus_atk0110.c
@@ -13,7 +13,7 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 
 #include <acpi/acpi.h>
 #include <acpi/acpixf.h>
@@ -27,15 +27,15 @@ static bool new_if;
 module_param(new_if, bool, 0);
 MODULE_PARM_DESC(new_if, "Override detection heuristic and force the use of the new ATK0110 interface");
 
-static const struct dmi_system_id __initconst atk_force_new_if[] = {
+static const struct sysfw_id __initconst atk_force_new_if[] = {
 	{
 		/* Old interface has broken MCH temp monitoring */
 		.ident = "Asus Sabertooth X58",
 		.matches = {
-			DMI_MATCH(DMI_BOARD_NAME, "SABERTOOTH X58")
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "SABERTOOTH X58")
 		}
 	},
-	{ }
+	{}
 };
 
 /* Minimum time between readings, enforced in order to avoid
@@ -1435,7 +1435,7 @@ static int __init atk0110_init(void)
 		return -EBUSY;
 	}
 
-	if (dmi_check_system(atk_force_new_if))
+	if (sysfw_callback(atk_force_new_if))
 		new_if = true;
 
 	ret = acpi_bus_register_driver(&atk_driver);
diff --git a/drivers/hwmon/fschmd.c b/drivers/hwmon/fschmd.c
index aa6d8b6..ce28caf 100644
--- a/drivers/hwmon/fschmd.c
+++ b/drivers/hwmon/fschmd.c
@@ -41,7 +41,7 @@
 #include <linux/err.h>
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
-#include <linux/dmi.h>
+#include <linux/smbios.h>
 #include <linux/fs.h>
 #include <linux/watchdog.h>
 #include <linux/miscdevice.h>
@@ -290,14 +290,14 @@ struct fschmd_data {
 	u8 fan_ripple[7];	/* divider for rps */
 };
 
-/* Global variables to hold information read from special DMI tables, which are
-   available on FSC machines with an fscher or later chip. There is no need to
-   protect these with a lock as they are only modified from our attach function
-   which always gets called with the i2c-core lock held and never accessed
-   before the attach function is done with them. */
-static int dmi_mult[6] = { 490, 200, 100, 100, 200, 100 };
-static int dmi_offset[6] = { 0, 0, 0, 0, 0, 0 };
-static int dmi_vref = -1;
+/* Global variables to hold information read from special SMBIOS tables, which
+   are available on FSC machines with an fscher or later chip. There is no need
+   to protect these with a lock as they are only modified from our attach
+   function which always gets called with the i2c-core lock held and never
+   accessed before the attach function is done with them. */
+static int smbios_mult[6] = { 490, 200, 100, 100, 200, 100 };
+static int smbios_offset[6] = { 0, 0, 0, 0, 0, 0 };
+static int smbios_vref = -1;
 
 /* Somewhat ugly :( global data pointer list with all fschmd devices, so that
    we can find our device data as when using misc_register there is no other
@@ -326,8 +326,8 @@ static ssize_t show_in_value(struct device *dev,
 	struct fschmd_data *data = fschmd_update_device(dev);
 
 	if (data->kind == fscher || data->kind >= fschrc)
-		return sprintf(buf, "%d\n", (data->volt[index] * dmi_vref *
-			dmi_mult[index]) / 255 + dmi_offset[index]);
+		return sprintf(buf, "%d\n", (data->volt[index] * smbios_vref *
+			smbios_mult[index]) / 255 + smbios_offset[index]);
 	else
 		return sprintf(buf, "%d\n", (data->volt[index] *
 			max_reading[index] + 128) / 255);
@@ -930,54 +930,56 @@ static const struct file_operations watchdog_fops = {
  * Detect, register, unregister and update device functions
  */
 
-/* DMI decode routine to read voltage scaling factors from special DMI tables,
-   which are available on FSC machines with an fscher or later chip. */
-static void fschmd_dmi_decode(const struct dmi_header *header, void *dummy)
+/* SMBIOS decode routine to read voltage scaling factors from special SMBIOS
+   tables which are available on FSC machines with an fscher or later chip. */
+static int fschmd_smbios_decode(const union smbios_struct *ss, void *dummy)
 {
 	int i, mult[3] = { 0 }, offset[3] = { 0 }, vref = 0, found = 0;
 
-	/* dmi code ugliness, we get passed the address of the contents of
-	   a complete DMI record, but in the form of a dmi_header pointer, in
-	   reality this address holds header->length bytes of which the header
-	   are the first 4 bytes */
-	u8 *dmi_data = (u8 *)header;
+	/* smbios code ugliness, we get passed the address of the contents of
+	   a complete SMBIOS record, but in the form of a smbios_header pointer,
+	   in reality this address holds header->length bytes of which the
+	   header are the first 4 bytes */
+	u8 *smbios_data = (u8 *)ss;
 
 	/* We are looking for OEM-specific type 185 */
-	if (header->type != 185)
-		return;
+	if (ss->header.type != 185)
+		return SMBIOS_WALK_CONTINUE;
 
 	/* we are looking for what Siemens calls "subtype" 19, the subtype
-	   is stored in byte 5 of the dmi block */
-	if (header->length < 5 || dmi_data[4] != 19)
-		return;
+	   is stored in byte 5 of the smbios block */
+	if (ss->header.length < 5 || smbios_data[4] != 19)
+		return SMBIOS_WALK_CONTINUE;
 
 	/* After the subtype comes 1 unknown byte and then blocks of 5 bytes,
 	   consisting of what Siemens calls an "Entity" number, followed by
 	   2 16-bit words in LSB first order */
-	for (i = 6; (i + 4) < header->length; i += 5) {
+	for (i = 6; (i + 4) < ss->header.length; i += 5) {
 		/* entity 1 - 3: voltage multiplier and offset */
-		if (dmi_data[i] >= 1 && dmi_data[i] <= 3) {
-			/* Our in sensors order and the DMI order differ */
+		if (smbios_data[i] >= 1 && smbios_data[i] <= 3) {
+			/* Our in sensors order and the SMBIOS order differ */
 			const int shuffle[3] = { 1, 0, 2 };
-			int in = shuffle[dmi_data[i] - 1];
+			int in = shuffle[smbios_data[i] - 1];
 
 			/* Check for twice the same entity */
 			if (found & (1 << in))
-				return;
+				return SMBIOS_WALK_CONTINUE;
 
-			mult[in] = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
-			offset[in] = dmi_data[i + 3] | (dmi_data[i + 4] << 8);
+			mult[in] = smbios_data[i + 1] |
+				   (smbios_data[i + 2] << 8);
+			offset[in] = smbios_data[i + 3] |
+				     (smbios_data[i + 4] << 8);
 
 			found |= 1 << in;
 		}
 
 		/* entity 7: reference voltage */
-		if (dmi_data[i] == 7) {
+		if (smbios_data[i] == 7) {
 			/* Check for twice the same entity */
 			if (found & 0x08)
-				return;
+				return SMBIOS_WALK_CONTINUE;
 
-			vref = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
+			vref = smbios_data[i + 1] | (smbios_data[i + 2] << 8);
 
 			found |= 0x08;
 		}
@@ -985,20 +987,22 @@ static void fschmd_dmi_decode(const struct dmi_header *header, void *dummy)
 
 	if (found == 0x0F) {
 		for (i = 0; i < 3; i++) {
-			dmi_mult[i] = mult[i] * 10;
-			dmi_offset[i] = offset[i] * 10;
+			smbios_mult[i] = mult[i] * 10;
+			smbios_offset[i] = offset[i] * 10;
 		}
-		/* According to the docs there should be separate dmi entries
+		/* According to the docs there should be separate smbios entries
 		   for the mult's and offsets of in3-5 of the syl, but on
 		   my test machine these are not present */
-		dmi_mult[3] = dmi_mult[2];
-		dmi_mult[4] = dmi_mult[1];
-		dmi_mult[5] = dmi_mult[2];
-		dmi_offset[3] = dmi_offset[2];
-		dmi_offset[4] = dmi_offset[1];
-		dmi_offset[5] = dmi_offset[2];
-		dmi_vref = vref;
+		smbios_mult[3] = smbios_mult[2];
+		smbios_mult[4] = smbios_mult[1];
+		smbios_mult[5] = smbios_mult[2];
+		smbios_offset[3] = smbios_offset[2];
+		smbios_offset[4] = smbios_offset[1];
+		smbios_offset[5] = smbios_offset[2];
+		smbios_vref = vref;
 	}
+
+	return SMBIOS_WALK_CONTINUE;
 }
 
 static int fschmd_detect(struct i2c_client *client,
@@ -1072,14 +1076,14 @@ static int fschmd_probe(struct i2c_client *client,
 		data->temp_max[2] = 50 + 128;
 	}
 
-	/* Read the special DMI table for fscher and newer chips */
-	if ((kind == fscher || kind >= fschrc) && dmi_vref == -1) {
-		dmi_walk(fschmd_dmi_decode, NULL);
-		if (dmi_vref == -1) {
+	/* Read the special SMBIOS table for fscher and newer chips */
+	if ((kind == fscher || kind >= fschrc) && smbios_vref == -1) {
+		smbios_walk(fschmd_smbios_decode, NULL);
+		if (smbios_vref == -1) {
 			dev_warn(&client->dev,
 				"Couldn't get voltage scaling factors from "
-				"BIOS DMI table, using builtin defaults\n");
-			dmi_vref = 33;
+				"SMBIOS table, using builtin defaults\n");
+			smbios_vref = 33;
 		}
 	}
 
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index bb6405b..a0c5021 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -52,7 +52,7 @@
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
 #include <linux/string.h>
-#include <linux/dmi.h>
+#include <linux/sysfw.h>
 #include <linux/acpi.h>
 #include <linux/io.h>
 
@@ -219,7 +219,7 @@ struct it87_sio_data {
 	u8 vid_value;
 	u8 beep_pin;
 	u8 internal;	/* Internal sensors can be labeled */
-	/* Features skipped based on config or DMI */
+	/* Features skipped based on config or SMBIOS */
 	u8 skip_vid;
 	u8 skip_fan;
 	u8 skip_pwm;
@@ -1541,13 +1541,24 @@ static const struct attribute_group it87_group_label = {
 	.attrs = it87_attributes_vid,
 };
 
+static struct sysfw_id __initdata it87_id_table[] = {
+	{
+		 .ident = "nVIDIA FN68PT",
+		.matches = {
+			SYSFW_MATCH(SYSFW_BOARD_VENDOR, "nVIDIA"),
+			SYSFW_MATCH(SYSFW_BOARD_NAME, "FN68PT"),
+		},
+		.exactmatch = 1,
+	},
+	{},
+};
+
 /* SuperIO detection - will change isa_address if a chip is found */
 static int __init it87_find(unsigned short *address,
 	struct it87_sio_data *sio_data)
 {
 	int err;
 	u16 chip_type;
-	const char *board_vendor, *board_name;
 
 	err = superio_enter();
 	if (err)
@@ -1671,21 +1682,16 @@ static int __init it87_find(unsigned short *address,
 	if (sio_data->beep_pin)
 		pr_info("Beeping is supported\n");
 
-	/* Disable specific features based on DMI strings */
-	board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
-	board_name = dmi_get_system_info(DMI_BOARD_NAME);
-	if (board_vendor && board_name) {
-		if (strcmp(board_vendor, "nVIDIA") == 0
-		 && strcmp(board_name, "FN68PT") == 0) {
-			/* On the Shuttle SN68PT, FAN_CTL2 is apparently not
-			   connected to a fan, but to something else. One user
-			   has reported instant system power-off when changing
-			   the PWM2 duty cycle, so we disable it.
-			   I use the board name string as the trigger in case
-			   the same board is ever used in other systems. */
-			pr_info("Disabling pwm2 due to hardware constraints\n");
-			sio_data->skip_pwm = (1 << 1);
-		}
+	/* Disable specific features based on system firmware strings */
+	if (sysfw_callback(it87_id_table)) {
+		/* On the Shuttle SN68PT, FAN_CTL2 is apparently not
+		   connected to a fan, but to something else. One user
+		   has reported instant system power-off when changing
+		   the PWM2 duty cycle, so we disable it.
+		   I use the board name string as the trigger in case
+		   the same board is ever used in other systems. */
+		pr_info("Disabling pwm2 due to hardware constraints\n");
+		sio_data->skip_pwm = (1 << 1);
 	}
 
 exit:
diff --git a/drivers/hwmon/lm70.c b/drivers/hwmon/lm70.c
index c274ea2..bdb34f8 100644
--- a/drivers/hwmon/lm70.c
+++ b/drivers/hwmon/lm70.c
@@ -34,7 +34,6 @@
 #include <linux/sysfs.h>
 #include <linux/hwmon.h>
 #include <linux/mutex.h>
-#include <linux/mod_devicetable.h>
 #include <linux/spi/spi.h>
 #include <linux/slab.h>
 
-- 
1.6.5.2





More information about the lm-sensors mailing list