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 |
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 --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);