Message ID | 20240814213927.49075-1-kontakt@matthias-fetzer.de (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | [v3] platform/x86: thinkpad_acpi: Add Thinkpad Edge E531 fan support | expand |
On Wed, 14 Aug 2024, Matthias Fetzer wrote: > Fan control on the E531 is done using the ACPI methods FANG and > FANW. The correct parameters and register values were found by > analyzing EC firmware as well as DSDT. This has been tested on > my Thinkpad Edge E531 (6885CTO, BIOS HEET52WW 1.33). > > Signed-off-by: Matthias Fetzer <kontakt@matthias-fetzer.de> > --- Thanks for the update, looks good now. Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Hi Matthias, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on v6.11-rc3 next-20240815] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Matthias-Fetzer/platform-x86-thinkpad_acpi-Add-Thinkpad-Edge-E531-fan-support/20240815-054239 base: linus/master patch link: https://lore.kernel.org/r/20240814213927.49075-1-kontakt%40matthias-fetzer.de patch subject: [PATCH v3] platform/x86: thinkpad_acpi: Add Thinkpad Edge E531 fan support config: i386-randconfig-001-20240815 (https://download.01.org/0day-ci/archive/20240816/202408160253.fMJW95oi-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240816/202408160253.fMJW95oi-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202408160253.fMJW95oi-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/platform/x86/thinkpad_acpi.c: In function 'fan_set_level': >> drivers/platform/x86/thinkpad_acpi.c:8214:13: warning: variable 'rc' set but not used [-Wunused-but-set-variable] 8214 | int rc; | ^~ vim +/rc +8214 drivers/platform/x86/thinkpad_acpi.c 8211 8212 static int fan_set_level(int level) 8213 { > 8214 int rc; 8215 8216 if (!fan_control_allowed) 8217 return -EPERM; 8218 8219 switch (fan_control_access_mode) { 8220 case TPACPI_FAN_WR_ACPI_SFAN: 8221 if ((level < 0) || (level > 7)) 8222 return -EINVAL; 8223 8224 if (tp_features.second_fan_ctl) { 8225 if (!fan_select_fan2() || 8226 !acpi_evalf(sfan_handle, NULL, NULL, "vd", level)) { 8227 pr_warn("Couldn't set 2nd fan level, disabling support\n"); 8228 tp_features.second_fan_ctl = 0; 8229 } 8230 fan_select_fan1(); 8231 } 8232 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", level)) 8233 return -EIO; 8234 break; 8235 8236 case TPACPI_FAN_WR_ACPI_FANS: 8237 case TPACPI_FAN_WR_TPEC: 8238 if (!(level & TP_EC_FAN_AUTO) && 8239 !(level & TP_EC_FAN_FULLSPEED) && 8240 ((level < 0) || (level > 7))) 8241 return -EINVAL; 8242 8243 /* safety net should the EC not support AUTO 8244 * or FULLSPEED mode bits and just ignore them */ 8245 if (level & TP_EC_FAN_FULLSPEED) 8246 level |= 7; /* safety min speed 7 */ 8247 else if (level & TP_EC_FAN_AUTO) 8248 level |= 4; /* safety min speed 4 */ 8249 8250 if (tp_features.second_fan_ctl) { 8251 if (!fan_select_fan2() || 8252 !acpi_ec_write(fan_status_offset, level)) { 8253 pr_warn("Couldn't set 2nd fan level, disabling support\n"); 8254 tp_features.second_fan_ctl = 0; 8255 } 8256 fan_select_fan1(); 8257 8258 } 8259 if (!acpi_ec_write(fan_status_offset, level)) 8260 return -EIO; 8261 else 8262 tp_features.fan_ctrl_status_undef = 0; 8263 break; 8264 8265 case TPACPI_FAN_WR_ACPI_FANW: 8266 if (!(level & TP_EC_FAN_AUTO) && (level < 0 || level > 7)) 8267 return -EINVAL; 8268 if (level & TP_EC_FAN_FULLSPEED) 8269 return -EINVAL; 8270 8271 if (level & TP_EC_FAN_AUTO) { 8272 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x05)) { 8273 rc = -EIO; 8274 break; 8275 } 8276 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0x00)) { 8277 rc = -EIO; 8278 break; 8279 } 8280 } else { 8281 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x45)) { 8282 rc = -EIO; 8283 break; 8284 } 8285 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0xff)) { 8286 rc = -EIO; 8287 break; 8288 } 8289 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8102, level * 100 / 7)) { 8290 rc = -EIO; 8291 break; 8292 } 8293 } 8294 break; 8295 8296 default: 8297 return -ENXIO; 8298 } 8299 8300 vdbg_printk(TPACPI_DBG_FAN, 8301 "fan control: set fan control register to 0x%02x\n", level); 8302 return 0; 8303 } 8304
Am 15.08.24 um 21:00 schrieb kernel test robot: > Hi Matthias, > > kernel test robot noticed the following build warnings: > > [auto build test WARNING on linus/master] > [also build test WARNING on v6.11-rc3 next-20240815] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Matthias-Fetzer/platform-x86-thinkpad_acpi-Add-Thinkpad-Edge-E531-fan-support/20240815-054239 > base: linus/master > patch link: https://lore.kernel.org/r/20240814213927.49075-1-kontakt%40matthias-fetzer.de > patch subject: [PATCH v3] platform/x86: thinkpad_acpi: Add Thinkpad Edge E531 fan support > config: i386-randconfig-001-20240815 (https://download.01.org/0day-ci/archive/20240816/202408160253.fMJW95oi-lkp@intel.com/config) > compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240816/202408160253.fMJW95oi-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202408160253.fMJW95oi-lkp@intel.com/ > > All warnings (new ones prefixed by >>): > > drivers/platform/x86/thinkpad_acpi.c: In function 'fan_set_level': >>> drivers/platform/x86/thinkpad_acpi.c:8214:13: warning: variable 'rc' set but not used [-Wunused-but-set-variable] > 8214 | int rc; > | ^~ > I guess just removing the variable and returning -EIO directly should be a good approach. What do you think? > > vim +/rc +8214 drivers/platform/x86/thinkpad_acpi.c > > 8211 > 8212 static int fan_set_level(int level) > 8213 { >> 8214 int rc; > 8215 > 8216 if (!fan_control_allowed) > 8217 return -EPERM; > 8218 > 8219 switch (fan_control_access_mode) { > 8220 case TPACPI_FAN_WR_ACPI_SFAN: > 8221 if ((level < 0) || (level > 7)) > 8222 return -EINVAL; > 8223 > 8224 if (tp_features.second_fan_ctl) { > 8225 if (!fan_select_fan2() || > 8226 !acpi_evalf(sfan_handle, NULL, NULL, "vd", level)) { > 8227 pr_warn("Couldn't set 2nd fan level, disabling support\n"); > 8228 tp_features.second_fan_ctl = 0; > 8229 } > 8230 fan_select_fan1(); > 8231 } > 8232 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", level)) > 8233 return -EIO; > 8234 break; > 8235 > 8236 case TPACPI_FAN_WR_ACPI_FANS: > 8237 case TPACPI_FAN_WR_TPEC: > 8238 if (!(level & TP_EC_FAN_AUTO) && > 8239 !(level & TP_EC_FAN_FULLSPEED) && > 8240 ((level < 0) || (level > 7))) > 8241 return -EINVAL; > 8242 > 8243 /* safety net should the EC not support AUTO > 8244 * or FULLSPEED mode bits and just ignore them */ > 8245 if (level & TP_EC_FAN_FULLSPEED) > 8246 level |= 7; /* safety min speed 7 */ > 8247 else if (level & TP_EC_FAN_AUTO) > 8248 level |= 4; /* safety min speed 4 */ > 8249 > 8250 if (tp_features.second_fan_ctl) { > 8251 if (!fan_select_fan2() || > 8252 !acpi_ec_write(fan_status_offset, level)) { > 8253 pr_warn("Couldn't set 2nd fan level, disabling support\n"); > 8254 tp_features.second_fan_ctl = 0; > 8255 } > 8256 fan_select_fan1(); > 8257 > 8258 } > 8259 if (!acpi_ec_write(fan_status_offset, level)) > 8260 return -EIO; > 8261 else > 8262 tp_features.fan_ctrl_status_undef = 0; > 8263 break; > 8264 > 8265 case TPACPI_FAN_WR_ACPI_FANW: > 8266 if (!(level & TP_EC_FAN_AUTO) && (level < 0 || level > 7)) > 8267 return -EINVAL; > 8268 if (level & TP_EC_FAN_FULLSPEED) > 8269 return -EINVAL; > 8270 > 8271 if (level & TP_EC_FAN_AUTO) { > 8272 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x05)) { > 8273 rc = -EIO; > 8274 break; > 8275 } > 8276 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0x00)) { > 8277 rc = -EIO; > 8278 break; > 8279 } > 8280 } else { > 8281 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x45)) { > 8282 rc = -EIO; > 8283 break; > 8284 } > 8285 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0xff)) { > 8286 rc = -EIO; > 8287 break; > 8288 } > 8289 if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8102, level * 100 / 7)) { > 8290 rc = -EIO; > 8291 break; > 8292 } > 8293 } > 8294 break; > 8295 > 8296 default: > 8297 return -ENXIO; > 8298 } > 8299 > 8300 vdbg_printk(TPACPI_DBG_FAN, > 8301 "fan control: set fan control register to 0x%02x\n", level); > 8302 return 0; > 8303 } > 8304 >
On Thu, 15 Aug 2024, Matthias Fetzer wrote: > > > Am 15.08.24 um 21:00 schrieb kernel test robot: > > Hi Matthias, > > > > kernel test robot noticed the following build warnings: > > > > [auto build test WARNING on linus/master] > > [also build test WARNING on v6.11-rc3 next-20240815] > > [If your patch is applied to the wrong git tree, kindly drop us a note. > > And when submitting patch, we suggest to use '--base' as documented in > > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > > > url: > > https://github.com/intel-lab-lkp/linux/commits/Matthias-Fetzer/platform-x86-thinkpad_acpi-Add-Thinkpad-Edge-E531-fan-support/20240815-054239 > > base: linus/master > > patch link: > > https://lore.kernel.org/r/20240814213927.49075-1-kontakt%40matthias-fetzer.de > > patch subject: [PATCH v3] platform/x86: thinkpad_acpi: Add Thinkpad Edge > > E531 fan support > > config: i386-randconfig-001-20240815 > > (https://download.01.org/0day-ci/archive/20240816/202408160253.fMJW95oi-lkp@intel.com/config) > > compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 > > reproduce (this is a W=1 build): > > (https://download.01.org/0day-ci/archive/20240816/202408160253.fMJW95oi-lkp@intel.com/reproduce) > > > > If you fix the issue in a separate patch/commit (i.e. not just a new version > > of > > the same patch/commit), kindly add following tags > > | Reported-by: kernel test robot <lkp@intel.com> > > | Closes: > > https://lore.kernel.org/oe-kbuild-all/202408160253.fMJW95oi-lkp@intel.com/ > > > > All warnings (new ones prefixed by >>): > > > > drivers/platform/x86/thinkpad_acpi.c: In function 'fan_set_level': > > > > drivers/platform/x86/thinkpad_acpi.c:8214:13: warning: variable 'rc' set > > > > but not used [-Wunused-but-set-variable] > > 8214 | int rc; > > | ^~ > > > > I guess just removing the variable and returning -EIO directly should be > a good approach. > > What do you think? Yes, it seems that's what the existing code does. That avoids printing the debug message errornously (as the operation ended up failing, not succeeding).
On Fri, 16 Aug 2024, Matthias Fetzer wrote: > Fan control on the E531 is done using the ACPI methods FANG and > FANW. The correct parameters and register values were found by > analyzing EC firmware as well as DSDT. This has been tested on > my Thinkpad Edge E531 (6885CTO, BIOS HEET52WW 1.33). > > Signed-off-by: Matthias Fetzer <kontakt@matthias-fetzer.de> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 397b409064c9..64d1b49b7e48 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -7751,6 +7751,28 @@ static struct ibm_struct volume_driver_data = { * EC 0x2f (HFSP) might be available *for reading*, but do not use * it for writing. * + * TPACPI_FAN_RD_ACPI_FANG: + * ACPI FANG method: returns fan control register + * + * Takes one parameter which is 0x8100 plus the offset to EC memory + * address 0xf500 and returns the byte at this address. + * + * 0xf500: + * When the value is less than 9 automatic mode is enabled + * 0xf502: + * Contains the current fan speed from 0-100% + * 0xf506: + * Bit 7 has to be set in order to enable manual control by + * writing a value >= 9 to 0xf500 + * + * TPACPI_FAN_WR_ACPI_FANW: + * ACPI FANG method: sets fan control registers + * + * Takes 0x8100 plus the offset to EC memory address 0xf500 and the + * value to be written there as parameters. + * + * see TPACPI_FAN_RD_ACPI_FANG + * * TPACPI_FAN_WR_TPEC: * ThinkPad EC register 0x2f (HFSP): fan control loop mode * Supported on almost all ThinkPads @@ -7884,6 +7906,7 @@ enum { /* Fan control constants */ enum fan_status_access_mode { TPACPI_FAN_NONE = 0, /* No fan status or control */ TPACPI_FAN_RD_ACPI_GFAN, /* Use ACPI GFAN */ + TPACPI_FAN_RD_ACPI_FANG, /* Use ACPI FANG */ TPACPI_FAN_RD_TPEC, /* Use ACPI EC regs 0x2f, 0x84-0x85 */ TPACPI_FAN_RD_TPEC_NS, /* Use non-standard ACPI EC regs (eg: L13 Yoga gen2 etc.) */ }; @@ -7891,6 +7914,7 @@ enum fan_status_access_mode { enum fan_control_access_mode { TPACPI_FAN_WR_NONE = 0, /* No fan control */ TPACPI_FAN_WR_ACPI_SFAN, /* Use ACPI SFAN */ + TPACPI_FAN_WR_ACPI_FANW, /* Use ACPI FANW */ TPACPI_FAN_WR_TPEC, /* Use ACPI EC reg 0x2f */ TPACPI_FAN_WR_ACPI_FANS, /* Use ACPI FANS and EC reg 0x2f */ }; @@ -7924,9 +7948,13 @@ TPACPI_HANDLE(fans, ec, "FANS"); /* X31, X40, X41 */ TPACPI_HANDLE(gfan, ec, "GFAN", /* 570 */ "\\FSPD", /* 600e/x, 770e, 770x */ ); /* all others */ +TPACPI_HANDLE(fang, ec, "FANG", /* E531 */ + ); /* all others */ TPACPI_HANDLE(sfan, ec, "SFAN", /* 570 */ "JFNS", /* 770x-JL */ ); /* all others */ +TPACPI_HANDLE(fanw, ec, "FANW", /* E531 */ + ); /* all others */ /* * Unitialized HFSP quirk: ACPI DSDT and EC fail to initialize the @@ -8033,6 +8061,23 @@ static int fan_get_status(u8 *status) break; } + case TPACPI_FAN_RD_ACPI_FANG: { + /* E531 */ + int mode, speed; + + if (unlikely(!acpi_evalf(fang_handle, &mode, NULL, "dd", 0x8100))) + return -EIO; + if (unlikely(!acpi_evalf(fang_handle, &speed, NULL, "dd", 0x8102))) + return -EIO; + + if (likely(status)) { + *status = speed * 7 / 100; + if (mode < 9) + *status |= TP_EC_FAN_AUTO; + } + + break; + } case TPACPI_FAN_RD_TPEC: /* all except 570, 600e/x, 770e, 770x */ if (unlikely(!acpi_ec_read(fan_status_offset, &s))) @@ -8147,6 +8192,17 @@ static int fan2_get_speed(unsigned int *speed) if (speed) *speed = lo ? FAN_RPM_CAL_CONST / lo : 0; break; + case TPACPI_FAN_RD_ACPI_FANG: { + /* E531 */ + int speed_tmp; + + if (unlikely(!acpi_evalf(fang_handle, &speed_tmp, NULL, "dd", 0x8102))) + return -EIO; + + if (likely(speed)) + *speed = speed_tmp * 65535 / 100; + break; + } default: return -ENXIO; @@ -8157,6 +8213,8 @@ static int fan2_get_speed(unsigned int *speed) static int fan_set_level(int level) { + int rc; + if (!fan_control_allowed) return -EPERM; @@ -8206,6 +8264,37 @@ static int fan_set_level(int level) tp_features.fan_ctrl_status_undef = 0; break; + case TPACPI_FAN_WR_ACPI_FANW: + if (!(level & TP_EC_FAN_AUTO) && (level < 0 || level > 7)) + return -EINVAL; + if (level & TP_EC_FAN_FULLSPEED) + return -EINVAL; + + if (level & TP_EC_FAN_AUTO) { + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x05)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0x00)) { + rc = -EIO; + break; + } + } else { + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x45)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0xff)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8102, level * 100 / 7)) { + rc = -EIO; + break; + } + } + break; + default: return -ENXIO; } @@ -8284,6 +8373,19 @@ static int fan_set_enable(void) rc = 0; break; + case TPACPI_FAN_WR_ACPI_FANW: + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x05)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0x00)) { + rc = -EIO; + break; + } + + rc = 0; + break; + default: rc = -ENXIO; } @@ -8326,6 +8428,22 @@ static int fan_set_disable(void) fan_control_desired_level = 0; break; + case TPACPI_FAN_WR_ACPI_FANW: + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x45)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0xff)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8102, 0x00)) { + rc = -EIO; + break; + } + rc = 0; + break; + default: rc = -ENXIO; } @@ -8359,6 +8477,23 @@ static int fan_set_speed(int speed) rc = -EINVAL; break; + case TPACPI_FAN_WR_ACPI_FANW: + if (speed >= 0 && speed <= 65535) { + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8106, 0x45)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", 0x8100, 0xff)) { + rc = -EIO; + break; + } + if (!acpi_evalf(fanw_handle, NULL, NULL, "vdd", + 0x8102, speed * 100 / 65535)) + rc = -EIO; + } else + rc = -EINVAL; + break; + default: rc = -ENXIO; } @@ -8701,6 +8836,10 @@ static int __init fan_init(struct ibm_init_struct *iibm) TPACPI_ACPIHANDLE_INIT(gfan); TPACPI_ACPIHANDLE_INIT(sfan); } + if (tpacpi_is_lenovo()) { + TPACPI_ACPIHANDLE_INIT(fang); + TPACPI_ACPIHANDLE_INIT(fanw); + } quirks = tpacpi_check_quirks(fan_quirk_table, ARRAY_SIZE(fan_quirk_table)); @@ -8720,6 +8859,9 @@ static int __init fan_init(struct ibm_init_struct *iibm) if (gfan_handle) { /* 570, 600e/x, 770e, 770x */ fan_status_access_mode = TPACPI_FAN_RD_ACPI_GFAN; + } else if (fang_handle) { + /* E531 */ + fan_status_access_mode = TPACPI_FAN_RD_ACPI_FANG; } else { /* all other ThinkPads: note that even old-style * ThinkPad ECs supports the fan control register */ @@ -8766,6 +8908,11 @@ static int __init fan_init(struct ibm_init_struct *iibm) fan_control_access_mode = TPACPI_FAN_WR_ACPI_SFAN; fan_control_commands |= TPACPI_FAN_CMD_LEVEL | TPACPI_FAN_CMD_ENABLE; + } else if (fanw_handle) { + /* E531 */ + fan_control_access_mode = TPACPI_FAN_WR_ACPI_FANW; + fan_control_commands |= + TPACPI_FAN_CMD_LEVEL | TPACPI_FAN_CMD_SPEED | TPACPI_FAN_CMD_ENABLE; } else { if (!gfan_handle) { /* gfan without sfan means no fan control */ @@ -8917,6 +9064,7 @@ static int fan_read(struct seq_file *m) case TPACPI_FAN_RD_TPEC_NS: case TPACPI_FAN_RD_TPEC: + case TPACPI_FAN_RD_ACPI_FANG: /* all except 570, 600e/x, 770e, 770x */ rc = fan_get_status_safe(&status); if (rc) @@ -8937,7 +9085,7 @@ static int fan_read(struct seq_file *m) * No other levels settings available */ seq_printf(m, "level:\t\t%s\n", status & FAN_NS_CTRL ? "unknown" : "auto"); - } else { + } else if (fan_status_access_mode == TPACPI_FAN_RD_TPEC) { if (status & TP_EC_FAN_FULLSPEED) /* Disengaged mode takes precedence */ seq_printf(m, "level:\t\tdisengaged\n");
Fan control on the E531 is done using the ACPI methods FANG and FANW. The correct parameters and register values were found by analyzing EC firmware as well as DSDT. This has been tested on my Thinkpad Edge E531 (6885CTO, BIOS HEET52WW 1.33). Signed-off-by: Matthias Fetzer <kontakt@matthias-fetzer.de> --- Changes in v3: - Add missing newline - Remove redundant code Changes in v2: - Fix typo in EC memory description - Split plausibilty check for better readability drivers/platform/x86/thinkpad_acpi.c | 150 ++++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 1 deletion(-)