Commit eaa7571b authored by Henrique de Moraes Holschuh's avatar Henrique de Moraes Holschuh Committed by Len Brown

ACPI: thinkpad-acpi: add a safety net for TPEC fan control mode

The Linux ThinkPad community is not positive that all ThinkPads that do
HFSP EC fan control do implement full-speed and auto modes, some of the
earlier ones supporting HFSP might not.

If the EC ignores the AUTO or FULL-SPEED bits, it will pay attention to the
lower three bits that set the fan level.  And as thinkpad-acpi was leaving
these set to zero, it would stop(!) the fan, which is Not A Good Thing.

So, as a safety net, we now make sure to also set the fan level part of the
HFSP register to speed 7 for full-speed, and a minimum of speed 4 for auto
mode.
Signed-off-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent fe98a52c
...@@ -3185,6 +3185,13 @@ static int fan_set_level(int level) ...@@ -3185,6 +3185,13 @@ static int fan_set_level(int level)
((level < 0) || (level > 7))) ((level < 0) || (level > 7)))
return -EINVAL; return -EINVAL;
/* safety net should the EC not support AUTO
* or FULLSPEED mode bits and just ignore them */
if (level & TP_EC_FAN_FULLSPEED)
level |= 7; /* safety min speed 7 */
else if (level & TP_EC_FAN_FULLSPEED)
level |= 4; /* safety min speed 4 */
if (!acpi_ec_write(fan_status_offset, level)) if (!acpi_ec_write(fan_status_offset, level))
return -EIO; return -EIO;
else else
...@@ -3233,8 +3240,10 @@ static int fan_set_enable(void) ...@@ -3233,8 +3240,10 @@ static int fan_set_enable(void)
break; break;
/* Don't go out of emergency fan mode */ /* Don't go out of emergency fan mode */
if (s != 7) if (s != 7) {
s = TP_EC_FAN_AUTO; s &= 0x07;
s |= TP_EC_FAN_AUTO | 4; /* min fan speed 4 */
}
if (!acpi_ec_write(fan_status_offset, s)) if (!acpi_ec_write(fan_status_offset, s))
rc = -EIO; rc = -EIO;
...@@ -3252,8 +3261,7 @@ static int fan_set_enable(void) ...@@ -3252,8 +3261,7 @@ static int fan_set_enable(void)
s &= 0x07; s &= 0x07;
/* Set fan to at least level 4 */ /* Set fan to at least level 4 */
if (s < 4) s |= 4;
s = 4;
if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", s)) if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", s))
rc= -EIO; rc= -EIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment