diff options
author | Peter Feuerer <peter@piie.net> | 2014-11-28 09:20:50 -0500 |
---|---|---|
committer | Darren Hart <dvhart@linux.intel.com> | 2014-12-04 06:24:55 -0500 |
commit | 48c8dd64345ba2a8c41556095c7adacb1c8af7c1 (patch) | |
tree | b5b60ca9dc8a3130af130625339a627cf9c4bf04 /drivers/platform | |
parent | 7438d9905a18527e4020e810fa61b4d016c8b476 (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/Kconfig | 3 | ||||
-rw-r--r-- | drivers/platform/x86/acerhdf.c | 36 |
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 | ||
39 | config ACERHDF | 39 | config 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 | ||
259 | static const struct bios_settings_t *bios_cfg __read_mostly; | 259 | static 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 | */ | ||
265 | static struct thermal_zone_params acerhdf_zone_params = { | ||
266 | .governor_name = "bang_bang", | ||
267 | }; | ||
268 | |||
261 | static int acerhdf_get_temp(int *temp) | 269 | static 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 | ||
450 | static 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 | |||
442 | static int acerhdf_get_trip_temp(struct thermal_zone_device *thermal, int trip, | 461 | static 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 | ||