aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorPeter Feuerer <peter@piie.net>2014-11-28 09:20:50 -0500
committerDarren Hart <dvhart@linux.intel.com>2014-12-04 06:24:55 -0500
commit48c8dd64345ba2a8c41556095c7adacb1c8af7c1 (patch)
treeb5b60ca9dc8a3130af130625339a627cf9c4bf04 /drivers/platform
parent7438d9905a18527e4020e810fa61b4d016c8b476 (diff)
acerhdf: Use bang-bang thermal governor
acerhdf has been doing an on-off fan control using hysteresis by post-manipulating the outcome of thermal subsystem trip point handling. This patch enables acerhdf to use the bang-bang governor, which is intended for on-off controlled fans. Cc: platform-driver-x86@vger.kernel.org Cc: Darren Hart <dvhart@infradead.org> Cc: Andrew Morton <akpm@linux-foundation.org> CC: Zhang Rui <rui.zhang@intel.com> Cc: Andreas Mohr <andi@lisas.de> Cc: Javi Merino <javi.merino@arm.com> Acked-and-tested-by: Borislav Petkov <bp@suse.de> Signed-off-by: Peter Feuerer <peter@piie.net> Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/Kconfig3
-rw-r--r--drivers/platform/x86/acerhdf.c36
2 files changed, 33 insertions, 6 deletions
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 854cc5049b69..ba7761107d83 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -38,7 +38,8 @@ config ACER_WMI
38 38
39config ACERHDF 39config ACERHDF
40 tristate "Acer Aspire One temperature and fan driver" 40 tristate "Acer Aspire One temperature and fan driver"
41 depends on THERMAL && ACPI 41 select THERMAL_GOV_BANG_BANG
42 depends on ACPI
42 ---help--- 43 ---help---
43 This is a driver for Acer Aspire One netbooks. It allows to access 44 This is a driver for Acer Aspire One netbooks. It allows to access
44 the temperature sensor and to control the fan. 45 the temperature sensor and to control the fan.
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index f30767fb4521..7fe7dbf2f4ef 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -50,7 +50,7 @@
50 */ 50 */
51#undef START_IN_KERNEL_MODE 51#undef START_IN_KERNEL_MODE
52 52
53#define DRV_VER "0.5.30" 53#define DRV_VER "0.7.0"
54 54
55/* 55/*
56 * According to the Atom N270 datasheet, 56 * According to the Atom N270 datasheet,
@@ -258,6 +258,14 @@ static const struct bios_settings_t bios_tbl[] = {
258 258
259static const struct bios_settings_t *bios_cfg __read_mostly; 259static const struct bios_settings_t *bios_cfg __read_mostly;
260 260
261/*
262 * this struct is used to instruct thermal layer to use bang_bang instead of
263 * default governor for acerhdf
264 */
265static struct thermal_zone_params acerhdf_zone_params = {
266 .governor_name = "bang_bang",
267};
268
261static int acerhdf_get_temp(int *temp) 269static int acerhdf_get_temp(int *temp)
262{ 270{
263 u8 read_temp; 271 u8 read_temp;
@@ -439,6 +447,17 @@ static int acerhdf_get_trip_type(struct thermal_zone_device *thermal, int trip,
439 return 0; 447 return 0;
440} 448}
441 449
450static int acerhdf_get_trip_hyst(struct thermal_zone_device *thermal, int trip,
451 unsigned long *temp)
452{
453 if (trip != 0)
454 return -EINVAL;
455
456 *temp = fanon - fanoff;
457
458 return 0;
459}
460
442static int acerhdf_get_trip_temp(struct thermal_zone_device *thermal, int trip, 461static int acerhdf_get_trip_temp(struct thermal_zone_device *thermal, int trip,
443 unsigned long *temp) 462 unsigned long *temp)
444{ 463{
@@ -463,6 +482,7 @@ static struct thermal_zone_device_ops acerhdf_dev_ops = {
463 .get_mode = acerhdf_get_mode, 482 .get_mode = acerhdf_get_mode,
464 .set_mode = acerhdf_set_mode, 483 .set_mode = acerhdf_set_mode,
465 .get_trip_type = acerhdf_get_trip_type, 484 .get_trip_type = acerhdf_get_trip_type,
485 .get_trip_hyst = acerhdf_get_trip_hyst,
466 .get_trip_temp = acerhdf_get_trip_temp, 486 .get_trip_temp = acerhdf_get_trip_temp,
467 .get_crit_temp = acerhdf_get_crit_temp, 487 .get_crit_temp = acerhdf_get_crit_temp,
468}; 488};
@@ -515,9 +535,7 @@ static int acerhdf_set_cur_state(struct thermal_cooling_device *cdev,
515 } 535 }
516 536
517 if (state == 0) { 537 if (state == 0) {
518 /* turn fan off only if below fanoff temperature */ 538 if (cur_state == ACERHDF_FAN_AUTO)
519 if ((cur_state == ACERHDF_FAN_AUTO) &&
520 (cur_temp < fanoff))
521 acerhdf_change_fanstate(ACERHDF_FAN_OFF); 539 acerhdf_change_fanstate(ACERHDF_FAN_OFF);
522 } else { 540 } else {
523 if (cur_state == ACERHDF_FAN_OFF) 541 if (cur_state == ACERHDF_FAN_OFF)
@@ -696,11 +714,19 @@ static int acerhdf_register_thermal(void)
696 return -EINVAL; 714 return -EINVAL;
697 715
698 thz_dev = thermal_zone_device_register("acerhdf", 1, 0, NULL, 716 thz_dev = thermal_zone_device_register("acerhdf", 1, 0, NULL,
699 &acerhdf_dev_ops, NULL, 0, 717 &acerhdf_dev_ops,
718 &acerhdf_zone_params, 0,
700 (kernelmode) ? interval*1000 : 0); 719 (kernelmode) ? interval*1000 : 0);
701 if (IS_ERR(thz_dev)) 720 if (IS_ERR(thz_dev))
702 return -EINVAL; 721 return -EINVAL;
703 722
723 if (strcmp(thz_dev->governor->name,
724 acerhdf_zone_params.governor_name)) {
725 pr_err("Didn't get thermal governor %s, perhaps not compiled into thermal subsystem.\n",
726 acerhdf_zone_params.governor_name);
727 return -EINVAL;
728 }
729
704 return 0; 730 return 0;
705} 731}
706 732