Hi Peter, On Mon, May 12, 2014 at 11:27:08AM +0100, Peter Feuerer wrote: > Javi Merino writes: > > On Sat, May 03, 2014 at 06:59:24PM +0100, Peter Feuerer wrote: > >> 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: Andrew Morton <a...@linux-foundation.org> > >> CC: Zhang Rui <rui.zh...@intel.com> > >> Cc: Andreas Mohr <a...@lisas.de> > >> Cc: Borislav Petkov <b...@suse.de> > >> Cc: Javi Merino <javi.mer...@arm.com> > >> Signed-off-by: Peter Feuerer <pe...@piie.net> > >> --- > >> drivers/platform/x86/Kconfig | 2 +- > >> drivers/platform/x86/acerhdf.c | 34 +++++++++++++++++++++++++++++----- > >> 2 files changed, 30 insertions(+), 6 deletions(-) > >> > >> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig > >> index 27df2c5..0c15d89 100644 > >> --- a/drivers/platform/x86/Kconfig > >> +++ b/drivers/platform/x86/Kconfig > >> @@ -38,7 +38,7 @@ config ACER_WMI > >> > >> config ACERHDF > >> tristate "Acer Aspire One temperature and fan driver" > >> - depends on THERMAL && ACPI > >> + depends on ACPI && THERMAL_GOV_BANG_BANG > >> ---help--- > >> This is a driver for Acer Aspire One netbooks. It allows to access > >> the temperature sensor and to control the fan. > >> diff --git a/drivers/platform/x86/acerhdf.c > >> b/drivers/platform/x86/acerhdf.c > >> index 176edbd..afaa849 100644 > >> --- a/drivers/platform/x86/acerhdf.c > >> +++ b/drivers/platform/x86/acerhdf.c > >> @@ -50,7 +50,7 @@ > >> */ > >> #undef START_IN_KERNEL_MODE > >> > >> -#define DRV_VER "0.5.30" > >> +#define DRV_VER "0.5.31" > >> > >> /* > >> * According to the Atom N270 datasheet, > >> @@ -259,6 +259,14 @@ static const struct bios_settings_t bios_tbl[] = { > >> > >> static const struct bios_settings_t *bios_cfg __read_mostly; > >> > >> +/* > >> + * this struct is used to instruct thermal layer to use bang_bang instead > >> of > >> + * default governor for acerhdf > >> + */ > >> +static struct thermal_zone_params acerhdf_zone_params = { > >> + .governor_name = "bang_bang", > >> +}; > >> + > >> static int acerhdf_get_temp(int *temp) > >> { > >> u8 read_temp; > >> @@ -440,6 +448,15 @@ static int acerhdf_get_trip_type(struct > >> thermal_zone_device *thermal, int trip, > >> return 0; > >> } > >> > >> +static int acerhdf_get_trip_hyst(struct thermal_zone_device *thermal, int > >> trip, > >> + unsigned long *temp) > >> +{ > >> + if (trip == 0) > >> + *temp = fanon - fanoff; > >> + > >> + return 0; > >> +} > >> + > > > > I think you should only return 0 if you've updated the temperature. > > Otherwise you're telling the calling function that everything went all > > right but you may be leaving garbage in *temp. What about > > > > if (trip != 0) > > return -EINVAL; > > > > *temp = fanon - fanoff; > > return 0; > > Yes, sounds good. What about trip == 1? This is a valid trip point for > acerhdf (critical) and one could argue, that it has a valid hysteresis of > 0. - Thus EINVAL would be wrong here.
Then for trip == 1 you should also write something in *temp if it's a valid trip point and you don't want to return -EINVAL. I don't know what is the correct hysteresis for trip == 1. Maybe 0? What I'm trying to say is that you should return 0 only if you've updated *temp. Cheers, Javi -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/