Message ID | 20241018073139.1268995-1-wenst@chromium.org |
---|---|
State | New |
Headers | show |
Series | [v4] thermal/of: support thermal zones w/o trips subnode | expand |
On 28/10/2024 18:19, Daniel Lezcano wrote: > From: Icenowy Zheng <uwu@icenowy.me> > > Although the current device tree binding of thermal zones require the > trips subnode, the binding in kernel v5.15 does not require it, and many > device trees shipped with the kernel, for example, > allwinner/sun50i-a64.dtsi and mediatek/mt8183-kukui.dtsi in ARM64, still > comply to the old binding and contain no trips subnode. > > Allow the code to successfully register thermal zones w/o trips subnode > for DT binding compatibility now. > > Furtherly, the inconsistency between DTs and bindings should be resolved > by either adding empty trips subnode or dropping the trips subnode > requirement. > > Fixes: d0c75fa2c17f ("thermal/of: Initialize trip points separately") > Signed-off-by: Icenowy Zheng <uwu@icenowy.me> > [wenst@chromium.org: Reworked logic and kernel log messages] > Signed-off-by: Chen-Yu Tsai <wenst@chromium.org> > Reviewed-by: Rafael J. Wysocki <rafael@kernel.org> > Link: https://lore.kernel.org/r/20241018073139.1268995-1-wenst@chromium.org > Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> In order to fix a conflict when merging this patch I did the following changes. Let me know if you [dis]agree with the changes This change will go through the 'fixes' branch, so for v6.12 Thanks > --- > drivers/thermal/thermal_of.c | 21 ++++++++++----------- > 1 file changed, 10 insertions(+), 11 deletions(-) > > diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c > index a4caf7899f8e..07e09897165f 100644 > --- a/drivers/thermal/thermal_of.c > +++ b/drivers/thermal/thermal_of.c > @@ -99,18 +99,15 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n > struct device_node *trips; > int ret, count; > > + *ntrips = 0; > + > trips = of_get_child_by_name(np, "trips"); > - if (!trips) { > - pr_err("Failed to find 'trips' node\n"); > - return ERR_PTR(-EINVAL); > - } > + if (!trips) > + return NULL; > > count = of_get_child_count(trips); > - if (!count) { > - pr_err("No trip point defined\n"); > - ret = -EINVAL; > - goto out_of_node_put; > - } > + if (!count) > + return NULL; > > tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL); > if (!tt) { > @@ -133,7 +130,6 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n > > out_kfree: > kfree(tt); > - *ntrips = 0; > out_of_node_put: > of_node_put(trips); > > @@ -401,11 +397,14 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * > > trips = thermal_of_trips_init(np, &ntrips); > if (IS_ERR(trips)) { > - pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id); > + pr_err("Failed to parse trip points for %pOFn id=%d\n", sensor, id); > ret = PTR_ERR(trips); > goto out_of_node_put; > } > > + if (!trips) > + pr_info("No trip points found for %pOFn id=%d\n", sensor, id); > + > ret = thermal_of_monitor_init(np, &delay, &pdelay); > if (ret) { > pr_err("Failed to initialize monitoring delays from %pOFn\n", np);
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c index 93f7c6f8d06d..abafce22c91f 100644 --- a/drivers/thermal/thermal_of.c +++ b/drivers/thermal/thermal_of.c @@ -99,14 +99,16 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n struct device_node *trips __free(device_node) = of_get_child_by_name(np, "trips"); if (!trips) { - pr_err("Failed to find 'trips' node\n"); - return ERR_PTR(-EINVAL); + pr_debug("Failed to find 'trips' node\n"); + *ntrips = 0; + return NULL; } count = of_get_child_count(trips); if (!count) { - pr_err("No trip point defined\n"); - return ERR_PTR(-EINVAL); + pr_debug("No trip point defined\n"); + *ntrips = 0; + return NULL; } struct thermal_trip *tt __free(kfree) = kzalloc(sizeof(*tt) * count, GFP_KERNEL); @@ -386,11 +388,14 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * trips = thermal_of_trips_init(np, &ntrips); if (IS_ERR(trips)) { - pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id); + pr_err("Failed to parse trip points for %pOFn id=%d\n", sensor, id); ret = PTR_ERR(trips); goto out_of_node_put; } + if (!trips) + pr_info("No trip points found for %pOFn id=%d\n", sensor, id); + ret = thermal_of_monitor_init(np, &delay, &pdelay); if (ret) { pr_err("Failed to initialize monitoring delays from %pOFn\n", np);