Message ID | 20210621184058.4110-3-digetx@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | Support temperature trips by HWMON core and LM90 driver | expand |
On Mon, Jun 21, 2021 at 09:40:58PM +0300, Dmitry Osipenko wrote: > Support set_trips() callback of thermal device ops. This allows HWMON > device to operatively notify thermal core about temperature changes, which > is very handy to have in a case where HWMON sensor is used by CPU thermal > zone that performs passive cooling and emergency shutdown on overheat. > Thermal core will be able to react faster to temperature changes. > I think that warrants an explanation why it doesn't matter if the code doesn't really set any trip points. > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > --- > drivers/hwmon/hwmon.c | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c > index fd47ab4e6892..e74dc81e650d 100644 > --- a/drivers/hwmon/hwmon.c > +++ b/drivers/hwmon/hwmon.c > @@ -153,8 +153,40 @@ static int hwmon_thermal_get_temp(void *data, int *temp) > return 0; > } > > +static int hwmon_thermal_set_trips(void *data, int low, int high) > +{ > + struct hwmon_thermal_data *tdata = data; > + struct hwmon_device *hwdev = to_hwmon_device(tdata->dev); > + const struct hwmon_chip_info *chip = hwdev->chip; > + const struct hwmon_channel_info **info = chip->info; > + unsigned int i; > + > + if (!chip->ops->write) > + return 0; > + > + for (i = 1; info[i] && info[i]->type != hwmon_temp; i++) > + continue; Why start with index 1 ? While index 0 is commonly used for chip data, that is not mandatory. > + > + if (info[i] && info[i]->config[tdata->index] & HWMON_T_MIN) { > + int err = chip->ops->write(tdata->dev, hwmon_temp, > + hwmon_temp_min, tdata->index, low); checkpatch will complain here because it expects an empty line after a declaration. Since err is used in multiple conditionals, I would suggest to declare it once in the function header. > + if (err < 0 && err != -EOPNOTSUPP) "< 0" is unnecessary. > + return err; > + } > + > + if (info[i] && info[i]->config[tdata->index] & HWMON_T_MAX) { > + int err = chip->ops->write(tdata->dev, hwmon_temp, > + hwmon_temp_max, tdata->index, high); > + if (err < 0 && err != -EOPNOTSUPP) "< 0" is unnecessary. > + return err; > + } > + > + return 0; > +} > + > static const struct thermal_zone_of_device_ops hwmon_thermal_ops = { > .get_temp = hwmon_thermal_get_temp, > + .set_trips = hwmon_thermal_set_trips, > }; > > static void hwmon_thermal_remove_sensor(void *data)
21.06.2021 23:30, Guenter Roeck пишет: > On Mon, Jun 21, 2021 at 09:40:58PM +0300, Dmitry Osipenko wrote: >> Support set_trips() callback of thermal device ops. This allows HWMON >> device to operatively notify thermal core about temperature changes, which >> is very handy to have in a case where HWMON sensor is used by CPU thermal >> zone that performs passive cooling and emergency shutdown on overheat. >> Thermal core will be able to react faster to temperature changes. >> > > I think that warrants an explanation why it doesn't matter if the > code doesn't really set any trip points. I'll extend the commit message. >> Signed-off-by: Dmitry Osipenko <digetx@gmail.com> >> --- >> drivers/hwmon/hwmon.c | 32 ++++++++++++++++++++++++++++++++ >> 1 file changed, 32 insertions(+) >> >> diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c >> index fd47ab4e6892..e74dc81e650d 100644 >> --- a/drivers/hwmon/hwmon.c >> +++ b/drivers/hwmon/hwmon.c >> @@ -153,8 +153,40 @@ static int hwmon_thermal_get_temp(void *data, int *temp) >> return 0; >> } >> >> +static int hwmon_thermal_set_trips(void *data, int low, int high) >> +{ >> + struct hwmon_thermal_data *tdata = data; >> + struct hwmon_device *hwdev = to_hwmon_device(tdata->dev); >> + const struct hwmon_chip_info *chip = hwdev->chip; >> + const struct hwmon_channel_info **info = chip->info; >> + unsigned int i; >> + >> + if (!chip->ops->write) >> + return 0; >> + >> + for (i = 1; info[i] && info[i]->type != hwmon_temp; i++) >> + continue; > > Why start with index 1 ? While index 0 is commonly used for chip data, > that is not mandatory. This is borrowed from hwmon_thermal_register_sensors(). >> + >> + if (info[i] && info[i]->config[tdata->index] & HWMON_T_MIN) { >> + int err = chip->ops->write(tdata->dev, hwmon_temp, >> + hwmon_temp_min, tdata->index, low); > > checkpatch will complain here because it expects an empty line after a > declaration. Since err is used in multiple conditionals, I would suggest > to declare it once in the function header. Okay, although checkpatch is happy. ./scripts/checkpatch.pl --strict v3* --------------------------------------------------------------- v3-0001-hwmon-lm90-Prevent-integer-underflows-of-temperat.patch --------------------------------------------------------------- total: 0 errors, 0 warnings, 0 checks, 27 lines checked v3-0001-hwmon-lm90-Prevent-integer-underflows-of-temperat.patch has no obvious style problems and is ready for submission. ----------------------------------------------------------- v3-0002-hwmon-Support-set_trips-of-thermal-device-ops.patch ----------------------------------------------------------- total: 0 errors, 0 warnings, 0 checks, 40 lines checked >> + if (err < 0 && err != -EOPNOTSUPP) > > "< 0" is unnecessary. > >> + return err; >> + } >> + >> + if (info[i] && info[i]->config[tdata->index] & HWMON_T_MAX) { >> + int err = chip->ops->write(tdata->dev, hwmon_temp, >> + hwmon_temp_max, tdata->index, high); >> + if (err < 0 && err != -EOPNOTSUPP) > > "< 0" is unnecessary. I'll remove it in v4.
diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c index fd47ab4e6892..e74dc81e650d 100644 --- a/drivers/hwmon/hwmon.c +++ b/drivers/hwmon/hwmon.c @@ -153,8 +153,40 @@ static int hwmon_thermal_get_temp(void *data, int *temp) return 0; } +static int hwmon_thermal_set_trips(void *data, int low, int high) +{ + struct hwmon_thermal_data *tdata = data; + struct hwmon_device *hwdev = to_hwmon_device(tdata->dev); + const struct hwmon_chip_info *chip = hwdev->chip; + const struct hwmon_channel_info **info = chip->info; + unsigned int i; + + if (!chip->ops->write) + return 0; + + for (i = 1; info[i] && info[i]->type != hwmon_temp; i++) + continue; + + if (info[i] && info[i]->config[tdata->index] & HWMON_T_MIN) { + int err = chip->ops->write(tdata->dev, hwmon_temp, + hwmon_temp_min, tdata->index, low); + if (err < 0 && err != -EOPNOTSUPP) + return err; + } + + if (info[i] && info[i]->config[tdata->index] & HWMON_T_MAX) { + int err = chip->ops->write(tdata->dev, hwmon_temp, + hwmon_temp_max, tdata->index, high); + if (err < 0 && err != -EOPNOTSUPP) + return err; + } + + return 0; +} + static const struct thermal_zone_of_device_ops hwmon_thermal_ops = { .get_temp = hwmon_thermal_get_temp, + .set_trips = hwmon_thermal_set_trips, }; static void hwmon_thermal_remove_sensor(void *data)
Support set_trips() callback of thermal device ops. This allows HWMON device to operatively notify thermal core about temperature changes, which is very handy to have in a case where HWMON sensor is used by CPU thermal zone that performs passive cooling and emergency shutdown on overheat. Thermal core will be able to react faster to temperature changes. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- drivers/hwmon/hwmon.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)