diff mbox series

[v9,3/3] thermal: thermal_core: Allow rebooting after critical temp

Message ID 20231001030014.1244633-3-festevam@gmail.com (mailing list archive)
State Superseded, archived
Headers show
Series [v9,1/3] dt-bindings: thermal-zones: Document critical-action | expand

Commit Message

Fabio Estevam Oct. 1, 2023, 3 a.m. UTC
From: Fabio Estevam <festevam@denx.de>

Currently, the default mechanism is to trigger a shutdown after the
critical temperature is reached.

In some embedded cases, such behavior does not suit well, as the board may
be unattended in the field and rebooting may be a better approach.

The bootloader may also check the temperature and only allow the boot to
proceed when the temperature is below a certain threshold.

Introduce support for allowing a reboot to be triggered after the
critical temperature is reached.

If the "critical-action" devicetree property is not found, fall back to
the shutdown action to preserve the existing default behavior.

If a custom ops->critical exists, then it takes preference over
critical-actions.

Tested on a i.MX8MM board with the following devicetree changes:

	thermal-zones {
		cpu-thermal {
			critical-action = "reboot";
		};
	};

Signed-off-by: Fabio Estevam <festevam@denx.de>
---
Changes since v8:
- Simplify the logic for calling thermal_zone_device_critical_reboot(). (Daniel).

 drivers/thermal/thermal_of.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Daniel Lezcano Oct. 1, 2023, 5:25 p.m. UTC | #1
On 01/10/2023 05:00, Fabio Estevam wrote:
> From: Fabio Estevam <festevam@denx.de>
> 
> Currently, the default mechanism is to trigger a shutdown after the
> critical temperature is reached.
> 
> In some embedded cases, such behavior does not suit well, as the board may
> be unattended in the field and rebooting may be a better approach.
> 
> The bootloader may also check the temperature and only allow the boot to
> proceed when the temperature is below a certain threshold.
> 
> Introduce support for allowing a reboot to be triggered after the
> critical temperature is reached.
> 
> If the "critical-action" devicetree property is not found, fall back to
> the shutdown action to preserve the existing default behavior.
> 
> If a custom ops->critical exists, then it takes preference over
> critical-actions.
> 
> Tested on a i.MX8MM board with the following devicetree changes:
> 
> 	thermal-zones {
> 		cpu-thermal {
> 			critical-action = "reboot";
> 		};
> 	};
> 
> Signed-off-by: Fabio Estevam <festevam@denx.de>
> ---

Sounds good to me


> Changes since v8:
> - Simplify the logic for calling thermal_zone_device_critical_reboot(). (Daniel).
> 
>   drivers/thermal/thermal_of.c | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
> index 1e0655b63259..4d6c22e0ed85 100644
> --- a/drivers/thermal/thermal_of.c
> +++ b/drivers/thermal/thermal_of.c
> @@ -475,6 +475,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
>   	struct thermal_zone_params tzp = {};
>   	struct thermal_zone_device_ops *of_ops;
>   	struct device_node *np;
> +	const char *action;
>   	int delay, pdelay;
>   	int ntrips, mask;
>   	int ret;
> @@ -511,6 +512,11 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
>   
>   	mask = GENMASK_ULL((ntrips) - 1, 0);
>   
> +	ret = of_property_read_string(np, "critical-action", &action);
> +	if (!ret)
> +		if (!of_ops->critical && !strcasecmp(action, "reboot"))
> +			of_ops->critical = thermal_zone_device_critical_reboot;
> +
>   	tz = thermal_zone_device_register_with_trips(np->name, trips, ntrips,
>   						     mask, data, of_ops, &tzp,
>   						     pdelay, delay);
diff mbox series

Patch

diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 1e0655b63259..4d6c22e0ed85 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -475,6 +475,7 @@  static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
 	struct thermal_zone_params tzp = {};
 	struct thermal_zone_device_ops *of_ops;
 	struct device_node *np;
+	const char *action;
 	int delay, pdelay;
 	int ntrips, mask;
 	int ret;
@@ -511,6 +512,11 @@  static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
 
 	mask = GENMASK_ULL((ntrips) - 1, 0);
 
+	ret = of_property_read_string(np, "critical-action", &action);
+	if (!ret)
+		if (!of_ops->critical && !strcasecmp(action, "reboot"))
+			of_ops->critical = thermal_zone_device_critical_reboot;
+
 	tz = thermal_zone_device_register_with_trips(np->name, trips, ntrips,
 						     mask, data, of_ops, &tzp,
 						     pdelay, delay);