aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2010-05-16 18:45:23 -0400
committerHenrique de Moraes Holschuh <hmh@hmh.eng.br>2010-05-16 18:45:23 -0400
commite28393c0c4416dffb46ca481e670f10c6a35baca (patch)
tree10a634cbd97b0c0dee551c4d3392e43f0a40aa58 /drivers/platform
parentb65b34895437915f411882dd40d704eb0863ffb0 (diff)
thinkpad-acpi: constrain IBM-era support to IBM boxes
Lenovo is playing around with its ACPI BIOS, and will end up reusing method names. Their memory is not nearly as long as thinkpad-acpi's... Secure most of the old IBM codepaths against running in a non-IBM box. This would happen on the Lenovo X100e in video_init(), for example. We would misdetect it as an ancient model 570 firmware. Also, refuse to load the driver if we cannot identify the vendor. No ACPI ThinkPad in existence lacks this information, AFAIK. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c57
1 files changed, 39 insertions, 18 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 63290b33c879..21759dacff6c 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -480,6 +480,15 @@ static unsigned long __init tpacpi_check_quirks(
480 return 0; 480 return 0;
481} 481}
482 482
483static inline bool __pure __init tpacpi_is_lenovo(void)
484{
485 return thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO;
486}
487
488static inline bool __pure __init tpacpi_is_ibm(void)
489{
490 return thinkpad_id.vendor == PCI_VENDOR_ID_IBM;
491}
483 492
484/**************************************************************************** 493/****************************************************************************
485 **************************************************************************** 494 ****************************************************************************
@@ -1886,7 +1895,9 @@ static int __init thinkpad_acpi_driver_init(struct ibm_init_struct *iibm)
1886 (thinkpad_id.ec_version_str) ? 1895 (thinkpad_id.ec_version_str) ?
1887 thinkpad_id.ec_version_str : "unknown"); 1896 thinkpad_id.ec_version_str : "unknown");
1888 1897
1889 if (thinkpad_id.vendor && thinkpad_id.model_str) 1898 BUG_ON(!thinkpad_id.vendor);
1899
1900 if (thinkpad_id.model_str)
1890 printk(TPACPI_INFO "%s %s, model %s\n", 1901 printk(TPACPI_INFO "%s %s, model %s\n",
1891 (thinkpad_id.vendor == PCI_VENDOR_ID_IBM) ? 1902 (thinkpad_id.vendor == PCI_VENDOR_ID_IBM) ?
1892 "IBM" : ((thinkpad_id.vendor == 1903 "IBM" : ((thinkpad_id.vendor ==
@@ -3353,7 +3364,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
3353 goto err_exit; 3364 goto err_exit;
3354 } 3365 }
3355 3366
3356 if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO) { 3367 if (tpacpi_is_lenovo()) {
3357 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY, 3368 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3358 "using Lenovo default hot key map\n"); 3369 "using Lenovo default hot key map\n");
3359 memcpy(hotkey_keycode_map, &lenovo_keycode_map, 3370 memcpy(hotkey_keycode_map, &lenovo_keycode_map,
@@ -4422,7 +4433,8 @@ static int __init video_init(struct ibm_init_struct *iibm)
4422 vdbg_printk(TPACPI_DBG_INIT, "initializing video subdriver\n"); 4433 vdbg_printk(TPACPI_DBG_INIT, "initializing video subdriver\n");
4423 4434
4424 TPACPI_ACPIHANDLE_INIT(vid); 4435 TPACPI_ACPIHANDLE_INIT(vid);
4425 TPACPI_ACPIHANDLE_INIT(vid2); 4436 if (tpacpi_is_ibm())
4437 TPACPI_ACPIHANDLE_INIT(vid2);
4426 4438
4427 if (vid2_handle && acpi_evalf(NULL, &ivga, "\\IVGA", "d") && ivga) 4439 if (vid2_handle && acpi_evalf(NULL, &ivga, "\\IVGA", "d") && ivga)
4428 /* G41, assume IVGA doesn't change */ 4440 /* G41, assume IVGA doesn't change */
@@ -4431,10 +4443,12 @@ static int __init video_init(struct ibm_init_struct *iibm)
4431 if (!vid_handle) 4443 if (!vid_handle)
4432 /* video switching not supported on R30, R31 */ 4444 /* video switching not supported on R30, R31 */
4433 video_supported = TPACPI_VIDEO_NONE; 4445 video_supported = TPACPI_VIDEO_NONE;
4434 else if (acpi_evalf(vid_handle, &video_orig_autosw, "SWIT", "qd")) 4446 else if (tpacpi_is_ibm() &&
4447 acpi_evalf(vid_handle, &video_orig_autosw, "SWIT", "qd"))
4435 /* 570 */ 4448 /* 570 */
4436 video_supported = TPACPI_VIDEO_570; 4449 video_supported = TPACPI_VIDEO_570;
4437 else if (acpi_evalf(vid_handle, &video_orig_autosw, "^VADL", "qd")) 4450 else if (tpacpi_is_ibm() &&
4451 acpi_evalf(vid_handle, &video_orig_autosw, "^VADL", "qd"))
4438 /* 600e/x, 770e, 770x */ 4452 /* 600e/x, 770e, 770x */
4439 video_supported = TPACPI_VIDEO_770; 4453 video_supported = TPACPI_VIDEO_770;
4440 else 4454 else
@@ -4811,8 +4825,10 @@ static int __init light_init(struct ibm_init_struct *iibm)
4811 4825
4812 vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n"); 4826 vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n");
4813 4827
4814 TPACPI_ACPIHANDLE_INIT(ledb); 4828 if (tpacpi_is_ibm()) {
4815 TPACPI_ACPIHANDLE_INIT(lght); 4829 TPACPI_ACPIHANDLE_INIT(ledb);
4830 TPACPI_ACPIHANDLE_INIT(lght);
4831 }
4816 TPACPI_ACPIHANDLE_INIT(cmos); 4832 TPACPI_ACPIHANDLE_INIT(cmos);
4817 INIT_WORK(&tpacpi_led_thinklight.work, light_set_status_worker); 4833 INIT_WORK(&tpacpi_led_thinklight.work, light_set_status_worker);
4818 4834
@@ -5284,10 +5300,10 @@ static int __init led_init(struct ibm_init_struct *iibm)
5284 if (!led_handle) 5300 if (!led_handle)
5285 /* led not supported on R30, R31 */ 5301 /* led not supported on R30, R31 */
5286 led_supported = TPACPI_LED_NONE; 5302 led_supported = TPACPI_LED_NONE;
5287 else if (strlencmp(led_path, "SLED") == 0) 5303 else if (tpacpi_is_ibm() && strlencmp(led_path, "SLED") == 0)
5288 /* 570 */ 5304 /* 570 */
5289 led_supported = TPACPI_LED_570; 5305 led_supported = TPACPI_LED_570;
5290 else if (strlencmp(led_path, "SYSL") == 0) 5306 else if (tpacpi_is_ibm() && strlencmp(led_path, "SYSL") == 0)
5291 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */ 5307 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */
5292 led_supported = TPACPI_LED_OLD; 5308 led_supported = TPACPI_LED_OLD;
5293 else 5309 else
@@ -5741,11 +5757,12 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
5741 TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8; 5757 TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8;
5742 } 5758 }
5743 } else if (acpi_tmp7) { 5759 } else if (acpi_tmp7) {
5744 if (acpi_evalf(ec_handle, NULL, "UPDT", "qv")) { 5760 if (tpacpi_is_ibm() &&
5761 acpi_evalf(ec_handle, NULL, "UPDT", "qv")) {
5745 /* 600e/x, 770e, 770x */ 5762 /* 600e/x, 770e, 770x */
5746 thermal_read_mode = TPACPI_THERMAL_ACPI_UPDT; 5763 thermal_read_mode = TPACPI_THERMAL_ACPI_UPDT;
5747 } else { 5764 } else {
5748 /* Standard ACPI TMPx access, max 8 sensors */ 5765 /* IBM/LENOVO DSDT EC.TMPx access, max 8 sensors */
5749 thermal_read_mode = TPACPI_THERMAL_ACPI_TMP07; 5766 thermal_read_mode = TPACPI_THERMAL_ACPI_TMP07;
5750 } 5767 }
5751 } else { 5768 } else {
@@ -6249,7 +6266,7 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
6249 } 6266 }
6250 6267
6251 /* Safety */ 6268 /* Safety */
6252 if (thinkpad_id.vendor != PCI_VENDOR_ID_IBM && 6269 if (!tpacpi_is_ibm() &&
6253 (brightness_mode == TPACPI_BRGHT_MODE_ECNVRAM || 6270 (brightness_mode == TPACPI_BRGHT_MODE_ECNVRAM ||
6254 brightness_mode == TPACPI_BRGHT_MODE_EC)) 6271 brightness_mode == TPACPI_BRGHT_MODE_EC))
6255 return -EINVAL; 6272 return -EINVAL;
@@ -7968,9 +7985,11 @@ static int __init fan_init(struct ibm_init_struct *iibm)
7968 tp_features.second_fan = 0; 7985 tp_features.second_fan = 0;
7969 fan_control_desired_level = 7; 7986 fan_control_desired_level = 7;
7970 7987
7971 TPACPI_ACPIHANDLE_INIT(fans); 7988 if (tpacpi_is_ibm()) {
7972 TPACPI_ACPIHANDLE_INIT(gfan); 7989 TPACPI_ACPIHANDLE_INIT(fans);
7973 TPACPI_ACPIHANDLE_INIT(sfan); 7990 TPACPI_ACPIHANDLE_INIT(gfan);
7991 TPACPI_ACPIHANDLE_INIT(sfan);
7992 }
7974 7993
7975 quirks = tpacpi_check_quirks(fan_quirk_table, 7994 quirks = tpacpi_check_quirks(fan_quirk_table,
7976 ARRAY_SIZE(fan_quirk_table)); 7995 ARRAY_SIZE(fan_quirk_table));
@@ -8662,6 +8681,10 @@ static int __init probe_for_thinkpad(void)
8662 if (acpi_disabled) 8681 if (acpi_disabled)
8663 return -ENODEV; 8682 return -ENODEV;
8664 8683
8684 /* It would be dangerous to run the driver in this case */
8685 if (!tpacpi_is_ibm() && !tpacpi_is_lenovo())
8686 return -ENODEV;
8687
8665 /* 8688 /*
8666 * Non-ancient models have better DMI tagging, but very old models 8689 * Non-ancient models have better DMI tagging, but very old models
8667 * don't. tpacpi_is_fw_known() is a cheat to help in that case. 8690 * don't. tpacpi_is_fw_known() is a cheat to help in that case.
@@ -9059,9 +9082,7 @@ static int __init thinkpad_acpi_module_init(void)
9059 tpacpi_inputdev->name = "ThinkPad Extra Buttons"; 9082 tpacpi_inputdev->name = "ThinkPad Extra Buttons";
9060 tpacpi_inputdev->phys = TPACPI_DRVR_NAME "/input0"; 9083 tpacpi_inputdev->phys = TPACPI_DRVR_NAME "/input0";
9061 tpacpi_inputdev->id.bustype = BUS_HOST; 9084 tpacpi_inputdev->id.bustype = BUS_HOST;
9062 tpacpi_inputdev->id.vendor = (thinkpad_id.vendor) ? 9085 tpacpi_inputdev->id.vendor = thinkpad_id.vendor;
9063 thinkpad_id.vendor :
9064 PCI_VENDOR_ID_IBM;
9065 tpacpi_inputdev->id.product = TPACPI_HKEY_INPUT_PRODUCT; 9086 tpacpi_inputdev->id.product = TPACPI_HKEY_INPUT_PRODUCT;
9066 tpacpi_inputdev->id.version = TPACPI_HKEY_INPUT_VERSION; 9087 tpacpi_inputdev->id.version = TPACPI_HKEY_INPUT_VERSION;
9067 tpacpi_inputdev->dev.parent = &tpacpi_pdev->dev; 9088 tpacpi_inputdev->dev.parent = &tpacpi_pdev->dev;