linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 0/2] Support temperature trips by HWMON core and LM90 driver
@ 2021-06-20 16:12 Dmitry Osipenko
  2021-06-20 16:12 ` [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops Dmitry Osipenko
  2021-06-20 16:12 ` [PATCH v1 2/2] hwmon: (lm90) Implement set_trips() callback Dmitry Osipenko
  0 siblings, 2 replies; 7+ messages in thread
From: Dmitry Osipenko @ 2021-06-20 16:12 UTC (permalink / raw)
  To: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare, Guenter Roeck
  Cc: linux-hwmon, linux-pm, linux-kernel, linux-tegra

Hi,

It's typical for embedded devices to use LM90-compatible sensor for
monitoring of CPU core and skin temperatures. The sensor is often
used by thermal zone that performs passive cooling and emergency
shutdown on overheat, hence it's more optimal to use interrupt for
a faster notification about temperature changes. Thermal framework
provides set_trips() callback for programming of temperature trips,
let's support it by HWMON.

Dmitry Osipenko (2):
  hwmon: Support set_trips() of thermal device ops
  hwmon: (lm90) Implement set_trips() callback

 drivers/hwmon/hwmon.c | 12 ++++++++++++
 drivers/hwmon/lm90.c  | 30 ++++++++++++++++++++++++++++++
 include/linux/hwmon.h |  9 +++++++++
 3 files changed, 51 insertions(+)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops
  2021-06-20 16:12 [PATCH v1 0/2] Support temperature trips by HWMON core and LM90 driver Dmitry Osipenko
@ 2021-06-20 16:12 ` Dmitry Osipenko
  2021-06-20 17:23   ` Guenter Roeck
  2021-06-20 16:12 ` [PATCH v1 2/2] hwmon: (lm90) Implement set_trips() callback Dmitry Osipenko
  1 sibling, 1 reply; 7+ messages in thread
From: Dmitry Osipenko @ 2021-06-20 16:12 UTC (permalink / raw)
  To: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare, Guenter Roeck
  Cc: linux-hwmon, linux-pm, linux-kernel, linux-tegra

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 | 12 ++++++++++++
 include/linux/hwmon.h |  9 +++++++++
 2 files changed, 21 insertions(+)

diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index fd47ab4e6892..4bd39ed86877 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -153,8 +153,20 @@ 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);
+
+	if (!hwdev->chip->ops->set_trips)
+		return 0;
+
+	return hwdev->chip->ops->set_trips(tdata->dev, tdata->index, low, high);
+}
+
 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)
diff --git a/include/linux/hwmon.h b/include/linux/hwmon.h
index 1e8d6ea8992e..7e5afcbf713d 100644
--- a/include/linux/hwmon.h
+++ b/include/linux/hwmon.h
@@ -390,6 +390,14 @@ enum hwmon_intrusion_attributes {
  *			Channel number
  *		@val:	Value to write
  *		The function returns 0 on success or a negative error number.
+ * @set_trips:	Callback to set temperature trips. Optional.
+ *		Parameters are:
+ *		@dev:	Pointer to hardware monitoring device
+ *		@channel:
+ *			Channel number
+ *		@low:	Low temperature trip
+ *		@high:	High temperature trip
+ *		The function returns 0 on success or a negative error number.
  */
 struct hwmon_ops {
 	umode_t (*is_visible)(const void *drvdata, enum hwmon_sensor_types type,
@@ -400,6 +408,7 @@ struct hwmon_ops {
 		    u32 attr, int channel, const char **str);
 	int (*write)(struct device *dev, enum hwmon_sensor_types type,
 		     u32 attr, int channel, long val);
+	int (*set_trips)(struct device *dev, int channel, int low, int high);
 };
 
 /**
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v1 2/2] hwmon: (lm90) Implement set_trips() callback
  2021-06-20 16:12 [PATCH v1 0/2] Support temperature trips by HWMON core and LM90 driver Dmitry Osipenko
  2021-06-20 16:12 ` [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops Dmitry Osipenko
@ 2021-06-20 16:12 ` Dmitry Osipenko
  1 sibling, 0 replies; 7+ messages in thread
From: Dmitry Osipenko @ 2021-06-20 16:12 UTC (permalink / raw)
  To: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare, Guenter Roeck
  Cc: linux-hwmon, linux-pm, linux-kernel, linux-tegra

Implement set_trips() callback in order to operatively notify thermal
core about temperature changes. Thermal core will take control over the
LM90 temperature limits only if LM90 is attached to thermal zone in a
device-tree and sensor interrupt is provided, otherwise old behaviour
is unchanged.

Currently only NVIDIA Tegra boards are specifying interrupt for LM90
sensors and only couple of boards use sensor for passive cooling of CPU,
otherwise sensor isn't actively used. Hence this change doesn't bring
any visible effects to userspace, it merely improves thermal device
capabilities of the LM90 driver.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/hwmon/lm90.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index b53f17511b05..7180af611dfb 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -1406,6 +1406,35 @@ static int lm90_write(struct device *dev, enum hwmon_sensor_types type,
 	}
 }
 
+static int lm90_set_trips(struct device *dev, int channel, int low, int high)
+{
+	struct lm90_data *data = dev_get_drvdata(dev);
+	struct i2c_client *client = data->client;
+	int err;
+
+	/*
+	 * It makes sense to set temperature trips only if interrupt is
+	 * provided since the whole point of temperature trips is to get
+	 * a quick notification about temperature changes.
+	 */
+	if (!client->irq)
+		return 0;
+
+	/* prevent integer overflow of temperature calculations */
+	low  = max(low, -255000);
+	high = min(high, 255000);
+
+	err = lm90_temp_write(dev, hwmon_temp_min, channel, low);
+	if (err < 0)
+		return err;
+
+	err = lm90_temp_write(dev, hwmon_temp_max, channel, high);
+	if (err < 0)
+		return err;
+
+	return 0;
+}
+
 static umode_t lm90_is_visible(const void *data, enum hwmon_sensor_types type,
 			       u32 attr, int channel)
 {
@@ -1804,6 +1833,7 @@ static const struct hwmon_ops lm90_ops = {
 	.is_visible = lm90_is_visible,
 	.read = lm90_read,
 	.write = lm90_write,
+	.set_trips = lm90_set_trips,
 };
 
 static int lm90_probe(struct i2c_client *client)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops
  2021-06-20 16:12 ` [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops Dmitry Osipenko
@ 2021-06-20 17:23   ` Guenter Roeck
  2021-06-20 17:38     ` Dmitry Osipenko
  0 siblings, 1 reply; 7+ messages in thread
From: Guenter Roeck @ 2021-06-20 17:23 UTC (permalink / raw)
  To: Dmitry Osipenko
  Cc: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare,
	linux-hwmon, linux-pm, linux-kernel, linux-tegra

On Sun, Jun 20, 2021 at 07:12:22PM +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.
> 

Why would this require a driver callback, and why can it not be handled
in the hwmon core alone ? The hwmon core could register a set_trip function
if the chip (driver) supports setting low and high limits, and it could
call the appropriate driver functions when hwmon_thermal_set_trips()
is called.

Guenter

> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> ---
>  drivers/hwmon/hwmon.c | 12 ++++++++++++
>  include/linux/hwmon.h |  9 +++++++++
>  2 files changed, 21 insertions(+)
> 
> diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
> index fd47ab4e6892..4bd39ed86877 100644
> --- a/drivers/hwmon/hwmon.c
> +++ b/drivers/hwmon/hwmon.c
> @@ -153,8 +153,20 @@ 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);
> +
> +	if (!hwdev->chip->ops->set_trips)
> +		return 0;
> +
> +	return hwdev->chip->ops->set_trips(tdata->dev, tdata->index, low, high);
> +}
> +
>  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)
> diff --git a/include/linux/hwmon.h b/include/linux/hwmon.h
> index 1e8d6ea8992e..7e5afcbf713d 100644
> --- a/include/linux/hwmon.h
> +++ b/include/linux/hwmon.h
> @@ -390,6 +390,14 @@ enum hwmon_intrusion_attributes {
>   *			Channel number
>   *		@val:	Value to write
>   *		The function returns 0 on success or a negative error number.
> + * @set_trips:	Callback to set temperature trips. Optional.
> + *		Parameters are:
> + *		@dev:	Pointer to hardware monitoring device
> + *		@channel:
> + *			Channel number
> + *		@low:	Low temperature trip
> + *		@high:	High temperature trip
> + *		The function returns 0 on success or a negative error number.
>   */
>  struct hwmon_ops {
>  	umode_t (*is_visible)(const void *drvdata, enum hwmon_sensor_types type,
> @@ -400,6 +408,7 @@ struct hwmon_ops {
>  		    u32 attr, int channel, const char **str);
>  	int (*write)(struct device *dev, enum hwmon_sensor_types type,
>  		     u32 attr, int channel, long val);
> +	int (*set_trips)(struct device *dev, int channel, int low, int high);
>  };
>  
>  /**
> -- 
> 2.30.2
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops
  2021-06-20 17:23   ` Guenter Roeck
@ 2021-06-20 17:38     ` Dmitry Osipenko
  2021-06-20 19:21       ` Guenter Roeck
  0 siblings, 1 reply; 7+ messages in thread
From: Dmitry Osipenko @ 2021-06-20 17:38 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare,
	linux-hwmon, linux-pm, linux-kernel, linux-tegra

20.06.2021 20:23, Guenter Roeck пишет:
> On Sun, Jun 20, 2021 at 07:12:22PM +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.
>>
> 
> Why would this require a driver callback, and why can it not be handled
> in the hwmon core alone ? The hwmon core could register a set_trip function
> if the chip (driver) supports setting low and high limits, and it could
> call the appropriate driver functions when hwmon_thermal_set_trips()
> is called.

I wasn't sure about what other hwmon drivers may need and want to do for
programming of the trips, so decided to start with this variant. I'll
prepare v2 since you're suggesting that the universal callback should
work okay for all drivers, thanks.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops
  2021-06-20 17:38     ` Dmitry Osipenko
@ 2021-06-20 19:21       ` Guenter Roeck
  2021-06-20 20:35         ` Dmitry Osipenko
  0 siblings, 1 reply; 7+ messages in thread
From: Guenter Roeck @ 2021-06-20 19:21 UTC (permalink / raw)
  To: Dmitry Osipenko
  Cc: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare,
	linux-hwmon, linux-pm, linux-kernel, linux-tegra

On Sun, Jun 20, 2021 at 08:38:27PM +0300, Dmitry Osipenko wrote:
> 20.06.2021 20:23, Guenter Roeck пишет:
> > On Sun, Jun 20, 2021 at 07:12:22PM +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.
> >>
> > 
> > Why would this require a driver callback, and why can it not be handled
> > in the hwmon core alone ? The hwmon core could register a set_trip function
> > if the chip (driver) supports setting low and high limits, and it could
> > call the appropriate driver functions when hwmon_thermal_set_trips()
> > is called.
> 
> I wasn't sure about what other hwmon drivers may need and want to do for
> programming of the trips, so decided to start with this variant. I'll
> prepare v2 since you're suggesting that the universal callback should
> work okay for all drivers, thanks.

It will require some checks during probe to make sure that writeable limits
exist, but that is still better than per-driver code. If for whatever
reason some platform expects a different set of registers (say,
critical limits instead of warning limits to attach to trip points),
or if some platform expects that limits are _not_ used as trip points,
that would not be driver but platform specific. You would not be able
to address that on driver level with a single callback either (after all,
lm90 compatible chips support up to three sets of limits).
That means you already made an implementation specific choice with your
code, by selecting one of those three sets of limits to act as trip
points, and by making trip point support mandatory for all lm90 compatible
chips. If we need to make that configurable, we'll need a better solution
than a single driver callback, and that solution may as well be generic
and driver independent.

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops
  2021-06-20 19:21       ` Guenter Roeck
@ 2021-06-20 20:35         ` Dmitry Osipenko
  0 siblings, 0 replies; 7+ messages in thread
From: Dmitry Osipenko @ 2021-06-20 20:35 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Zhang Rui, Daniel Lezcano, Amit Kucheria, Jean Delvare,
	linux-hwmon, linux-pm, linux-kernel, linux-tegra

20.06.2021 22:21, Guenter Roeck пишет:
> On Sun, Jun 20, 2021 at 08:38:27PM +0300, Dmitry Osipenko wrote:
>> 20.06.2021 20:23, Guenter Roeck пишет:
>>> On Sun, Jun 20, 2021 at 07:12:22PM +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.
>>>>
>>>
>>> Why would this require a driver callback, and why can it not be handled
>>> in the hwmon core alone ? The hwmon core could register a set_trip function
>>> if the chip (driver) supports setting low and high limits, and it could
>>> call the appropriate driver functions when hwmon_thermal_set_trips()
>>> is called.
>>
>> I wasn't sure about what other hwmon drivers may need and want to do for
>> programming of the trips, so decided to start with this variant. I'll
>> prepare v2 since you're suggesting that the universal callback should
>> work okay for all drivers, thanks.
> 
> It will require some checks during probe to make sure that writeable limits
> exist, but that is still better than per-driver code. If for whatever
> reason some platform expects a different set of registers (say,
> critical limits instead of warning limits to attach to trip points),
> or if some platform expects that limits are _not_ used as trip points,
> that would not be driver but platform specific. You would not be able
> to address that on driver level with a single callback either (after all,
> lm90 compatible chips support up to three sets of limits).
> That means you already made an implementation specific choice with your
> code, by selecting one of those three sets of limits to act as trip
> points, and by making trip point support mandatory for all lm90 compatible
> chips. If we need to make that configurable, we'll need a better solution
> than a single driver callback, and that solution may as well be generic
> and driver independent.

Thank you for the clarification! If device makes a special use of lm90,
then very likely that it won't attach sensor to thermal zone. At least
all devices supported by mainline kernel should be okay here.

I think other sensors should be in a similar position. If a more complex
solution will be needed, then indeed hwmon API could be improved
further. The thermal device is created only for hwmon sensors that are
attached to thermal zone in a device-tree, so the scope of potentially
affected device should be small. Seems lm90 is actually the only hwmon
sensor that is used by thermal zones today.

AFAICS, all drivers return -EOPNOTSUPP if limits can't be changed, so we
could equal this error code to success in a case of set_trips(). The
set_trips() is very optional, if driver can't set limits, then the trips
won't trigger and thermal core will continue to work like set_trips()
wasn't hooked up. I'll implement this in v2.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-06-20 20:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-20 16:12 [PATCH v1 0/2] Support temperature trips by HWMON core and LM90 driver Dmitry Osipenko
2021-06-20 16:12 ` [PATCH v1 1/2] hwmon: Support set_trips() of thermal device ops Dmitry Osipenko
2021-06-20 17:23   ` Guenter Roeck
2021-06-20 17:38     ` Dmitry Osipenko
2021-06-20 19:21       ` Guenter Roeck
2021-06-20 20:35         ` Dmitry Osipenko
2021-06-20 16:12 ` [PATCH v1 2/2] hwmon: (lm90) Implement set_trips() callback Dmitry Osipenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).