Re: [PATCH v3 4/6] acerhdf: Use bang-bang thermal governor
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 > >> CC: Zhang Rui > >> Cc: Andreas Mohr > >> Cc: Borislav Petkov > >> Cc: Javi Merino > >> Signed-off-by: Peter Feuerer > >> --- > >> 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/
Re: [PATCH v3 4/6] acerhdf: Use bang-bang thermal governor
Hi Javi, Javi Merino writes: Hi Peter, 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 CC: Zhang Rui Cc: Andreas Mohr Cc: Borislav Petkov Cc: Javi Merino Signed-off-by: Peter Feuerer --- 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. thanks and kind regards, --peter; -- 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/
Re: [PATCH v3 4/6] acerhdf: Use bang-bang thermal governor
Hi Peter, 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 > CC: Zhang Rui > Cc: Andreas Mohr > Cc: Borislav Petkov > Cc: Javi Merino > Signed-off-by: Peter Feuerer > --- > 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; 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/
[PATCH v3 4/6] 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: Andrew Morton CC: Zhang Rui Cc: Andreas Mohr Cc: Borislav Petkov Cc: Javi Merino Signed-off-by: Peter Feuerer --- 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; +} + static int acerhdf_get_trip_temp(struct thermal_zone_device *thermal, int trip, unsigned long *temp) { @@ -464,6 +481,7 @@ static struct thermal_zone_device_ops acerhdf_dev_ops = { .get_mode = acerhdf_get_mode, .set_mode = acerhdf_set_mode, .get_trip_type = acerhdf_get_trip_type, + .get_trip_hyst = acerhdf_get_trip_hyst, .get_trip_temp = acerhdf_get_trip_temp, .get_crit_temp = acerhdf_get_crit_temp, }; @@ -516,9 +534,7 @@ static int acerhdf_set_cur_state(struct thermal_cooling_device *cdev, } if (state == 0) { - /* turn fan off only if below fanoff temperature */ - if ((cur_state == ACERHDF_FAN_AUTO) && - (cur_temp < fanoff)) + if (cur_state == ACERHDF_FAN_AUTO) acerhdf_change_fanstate(ACERHDF_FAN_OFF); } else { if (cur_state == ACERHDF_FAN_OFF) @@ -697,11 +713,19 @@ static int acerhdf_register_thermal(void) return -EINVAL; thz_dev = thermal_zone_device_register("acerhdf", 1, 0, NULL, - &acerhdf_dev_ops, NULL, 0, + &acerhdf_dev_ops, + &acerhdf_zone_params, 0, (kernelmode) ? interval*1000 : 0); if (IS_ERR(thz_dev)) return -EINVAL; + if (strcmp(thz_dev->governor->name, + acerhdf_zone_params.governor_name)) { + pr_err("Didn't get thermal governor %s, perhaps not compiled into thermal subsystem.\n", + acerhdf_zone_params.governor_name); + return -EINVAL; + } + return 0; } -- 1.9.2 -- 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/