Message ID | 20241028171901.2484882-1-daniel.lezcano@linaro.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | 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);
On Tue, Oct 29, 2024 at 1:23 AM Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > > 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 Looks fine to me. Thanks ChenYu > 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); > > > -- > <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs > > Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | > <http://twitter.com/#!/linaroorg> Twitter | > <http://www.linaro.org/linaro-blog/> Blog
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);