aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/ibm_acpi.c
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2006-11-24 08:47:13 -0500
committerLen Brown <len.brown@intel.com>2006-12-07 01:38:44 -0500
commit49a13cd6a2acd284ee106eaea7eeea8f2cc6796a (patch)
tree346eba3f7d4c449d01976c9a461ff75de2b22f79 /drivers/acpi/ibm_acpi.c
parenta12095c2b50c8a7c80517e37c00d6e6c863d43c5 (diff)
ACPI: ibm-acpi: store embedded controller firmware version for matching
This patch changes the ThinkPad Embedded Controller DMI matching code to store the firmware version of the EC for later usage, e.g. for quirks. It also prints the firmware version when starting up. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Diffstat (limited to 'drivers/acpi/ibm_acpi.c')
-rw-r--r--drivers/acpi/ibm_acpi.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c
index 4001ad193ddc..3c091c4b461f 100644
--- a/drivers/acpi/ibm_acpi.c
+++ b/drivers/acpi/ibm_acpi.c
@@ -77,6 +77,7 @@
77#include <linux/module.h> 77#include <linux/module.h>
78#include <linux/init.h> 78#include <linux/init.h>
79#include <linux/types.h> 79#include <linux/types.h>
80#include <linux/string.h>
80#include <linux/proc_fs.h> 81#include <linux/proc_fs.h>
81#include <linux/backlight.h> 82#include <linux/backlight.h>
82#include <asm/uaccess.h> 83#include <asm/uaccess.h>
@@ -361,7 +362,7 @@ enum { /* Fan control constants */
361 * control */ 362 * control */
362}; 363};
363 364
364static int ibm_thinkpad_ec_found; 365static char* ibm_thinkpad_ec_found = NULL;
365 366
366struct ibm_struct { 367struct ibm_struct {
367 char *name; 368 char *name;
@@ -2540,11 +2541,15 @@ static void acpi_ibm_exit(void)
2540 ibm_exit(&ibms[i]); 2541 ibm_exit(&ibms[i]);
2541 2542
2542 remove_proc_entry(IBM_DIR, acpi_root_dir); 2543 remove_proc_entry(IBM_DIR, acpi_root_dir);
2544
2545 if (ibm_thinkpad_ec_found)
2546 kfree(ibm_thinkpad_ec_found);
2543} 2547}
2544 2548
2545static int __init check_dmi_for_ec(void) 2549static char* __init check_dmi_for_ec(void)
2546{ 2550{
2547 struct dmi_device *dev = NULL; 2551 struct dmi_device *dev = NULL;
2552 char ec_fw_string[18];
2548 2553
2549 /* 2554 /*
2550 * ThinkPad T23 or newer, A31 or newer, R50e or newer, 2555 * ThinkPad T23 or newer, A31 or newer, R50e or newer,
@@ -2554,10 +2559,15 @@ static int __init check_dmi_for_ec(void)
2554 * See http://thinkwiki.org/wiki/List_of_DMI_IDs 2559 * See http://thinkwiki.org/wiki/List_of_DMI_IDs
2555 */ 2560 */
2556 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) { 2561 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
2557 if (strstr(dev->name, "IBM ThinkPad Embedded Controller")) 2562 if (sscanf(dev->name,
2558 return 1; 2563 "IBM ThinkPad Embedded Controller -[%17c",
2564 ec_fw_string) == 1) {
2565 ec_fw_string[sizeof(ec_fw_string) - 1] = 0;
2566 ec_fw_string[strcspn(ec_fw_string, " ]")] = 0;
2567 return kstrdup(ec_fw_string, GFP_KERNEL);
2568 }
2559 } 2569 }
2560 return 0; 2570 return NULL;
2561} 2571}
2562 2572
2563static int __init acpi_ibm_init(void) 2573static int __init acpi_ibm_init(void)
@@ -2581,6 +2591,9 @@ static int __init acpi_ibm_init(void)
2581 2591
2582 /* Models with newer firmware report the EC in DMI */ 2592 /* Models with newer firmware report the EC in DMI */
2583 ibm_thinkpad_ec_found = check_dmi_for_ec(); 2593 ibm_thinkpad_ec_found = check_dmi_for_ec();
2594 if (ibm_thinkpad_ec_found)
2595 printk(IBM_INFO "ThinkPad EC firmware %s\n",
2596 ibm_thinkpad_ec_found);
2584 2597
2585 /* these handles are not required */ 2598 /* these handles are not required */
2586 IBM_HANDLE_INIT(vid); 2599 IBM_HANDLE_INIT(vid);