Message ID | 20241018073139.1268995-1-wenst@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4] thermal/of: support thermal zones w/o trips subnode | expand |
On Fri, Oct 18, 2024 at 9:31 AM Chen-Yu Tsai <wenst@chromium.org> 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> > --- > This patch is based on Krzysztof's cleanup patches > - thermal: of: Use scoped memory and OF handling to simplify thermal_of_trips_init() [1] > > Changes since v3: > - Set *ntrips = 0 and return NULL from thermal_of_trips_init() if > no trip points are found in the device tree (Rafael) > - Dropped log level of "no trip points found" message to INFO > - Reworded new "failed to find trip points" message to "no trip points > found" > - Reworded existing "failed to find trip points" message to "failed to > parse trip points" > > I dropped Mark's reviewed-by because of the new changes. > > Changes since v2: > - Stacked on top of Krzysztof's cleanup patches > - thermal: of: Use scoped memory and OF handling to simplify thermal_of_trips_init() [1] > - Adjusted to account for eliminated error path > > [1] https://lore.kernel.org/all/20241010-b4-cleanup-h-of-node-put-thermal-v4-2-bfbe29ad81f4@linaro.org/ > > Changes since v1: > - set *ntrips at beginning of thermal_of_trips_init() > - Keep goto out_of_node_put in of_get_child_count(trips) == 0 branch > - Check return value of thermal_of_trips_init(), if it is -ENXIO, print > warning and clear |trips| pointer > - Drop |mask| change, as the variable was removed > > --- > drivers/thermal/thermal_of.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > 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); > --
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);