linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 00/30] Rework the trip points creation
@ 2022-09-26 14:05 Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function Daniel Lezcano
                   ` (29 more replies)
  0 siblings, 30 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Raju Rangoju, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Peter Kaestle,
	Hans de Goede, Mark Gross, Miquel Raynal, Amit Kucheria,
	Nicolas Saenz Julienne, Broadcom Kernel Team, Florian Fainelli,
	Ray Jui, Scott Branden, Support Opensource, Lukasz Luba,
	Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	NXP Linux Team, Thara Gopinath, Andy Gross, Bjorn Andersson,
	Niklas Söderlund, Bartlomiej Zolnierkiewicz,
	Krzysztof Kozlowski, Alim Akhtar, Thierry Reding,
	Jonathan Hunter, Eduardo Valentin, Keerthy, Kunihiko Hayashi,
	Masami Hiramatsu, Antoine Tenart, Srinivas Pandruvada,
	Dmitry Osipenko, netdev, platform-driver-x86, linux-rpi-kernel,
	linux-arm-kernel, linux-arm-msm, linux-renesas-soc,
	linux-samsung-soc, linux-tegra, linux-omap

This work is the pre-requisite of handling correctly when the trip
point are crossed. For that we need to rework how the trip points are
declared and assigned to a thermal zone.

Even if it appears to be a common sense to have the trip points being
ordered, this no guarantee neither documentation telling that is the
case.

One solution could have been to create an ordered array of trips built
when registering the thermal zone by calling the different get_trip*
ops. However those ops receive a thermal zone pointer which is not
known as it is in the process of creating it.

This cyclic dependency shows we have to rework how we manage the trip
points.

Actually, all the trip points definition can be common to the backend
sensor drivers and we can factor out the thermal trip structure in all
of them.

Then, as we register the thermal trips array, they will be available
in the thermal zone structure and a core function can return the trip
given its id.

The get_trip_* ops won't be needed anymore and could be removed. The
resulting code will be another step forward to a self encapsulated
generic thermal framework.

Most of the drivers can be converted more or less easily. This series
does a first round with most of the drivers. Some remain and will be
converted but with a smaller set of changes as the conversion is a bit
more complex.

Changelog:
 v5:
    - Fixed a deadlock when calling thermal_zone_get_trip() while
      handling the thermal zone lock
    - Remove an extra line in the sysfs change
    - Collected tags
v4:
   - Remove extra lines on exynos changes as reported by Krzysztof Kozlowski
   - Collected tags
 v3:
   - Reorg the series to be git-bisect safe
   - Added the set_trip generic function
   - Added the get_crit_temp generic function
   - Removed more dead code in the thermal-of
   - Fixed the exynos changelog
   - Fixed the error check for the exynos drivers
   - Collected tags
 v2:
   - Added missing EXPORT_SYMBOL_GPL() for thermal_zone_get_trip()
   - Removed tab whitespace in the acerhdf driver
   - Collected tags

Cc: Raju Rangoju <rajur@chelsio.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Peter Kaestle <peter@piie.net>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Mark Gross <markgross@kernel.org>
Cc: Miquel Raynal <miquel.raynal@bootlin.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Amit Kucheria <amitk@kernel.org>
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Nicolas Saenz Julienne <nsaenz@kernel.org>
Cc: Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: Support Opensource <support.opensource@diasemi.com>
Cc: Lukasz Luba <lukasz.luba@arm.com>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: NXP Linux Team <linux-imx@nxp.com>
Cc: Thara Gopinath <thara.gopinath@linaro.org>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: "Niklas Söderlund" <niklas.soderlund@ragnatech.se>
Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Cc: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Jonathan Hunter <jonathanh@nvidia.com>
Cc: Eduardo Valentin <edubezval@gmail.com>
Cc: Keerthy <j-keerthy@ti.com>
Cc: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Antoine Tenart <atenart@kernel.org>
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Cc: Dmitry Osipenko <digetx@gmail.com>
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: platform-driver-x86@vger.kernel.org
Cc: linux-pm@vger.kernel.org
Cc: linux-rpi-kernel@lists.infradead.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-renesas-soc@vger.kernel.org
Cc: linux-samsung-soc@vger.kernel.org
Cc: linux-tegra@vger.kernel.org
Cc: linux-omap@vger.kernel.org

Daniel Lezcano (30):
  thermal/core: Add a generic thermal_zone_get_trip() function
  thermal/sysfs: Do not make get_trip_hyst optional
  thermal/core: Add a generic thermal_zone_set_trip() function
  thermal/core: Add a generic thermal_zone_get_crit_temp() function
  thermal/core/governors: Use thermal_zone_get_trip() instead of ops
    functions
  thermal/of: Use generic thermal_zone_get_trip() function
  thermal/of: Remove unused functions
  thermal/drivers/exynos: Use generic thermal_zone_get_trip() function
  thermal/drivers/exynos: of_thermal_get_ntrips()
  thermal/drivers/exynos: Replace of_thermal_is_trip_valid() by
    thermal_zone_get_trip()
  thermal/drivers/tegra: Use generic thermal_zone_get_trip() function
  thermal/drivers/uniphier: Use generic thermal_zone_get_trip() function
  thermal/drivers/hisi: Use generic thermal_zone_get_trip() function
  thermal/drivers/qcom: Use generic thermal_zone_get_trip() function
  thermal/drivers/armada: Use generic thermal_zone_get_trip() function
  thermal/drivers/rcar_gen3: Use the generic function to get the number
    of trips
  thermal/of: Remove of_thermal_get_ntrips()
  thermal/of: Remove of_thermal_is_trip_valid()
  thermal/of: Remove of_thermal_set_trip_hyst()
  thermal/of: Remove of_thermal_get_crit_temp()
  thermal/drivers/st: Use generic trip points
  thermal/drivers/imx: Use generic thermal_zone_get_trip() function
  thermal/drivers/rcar: Use generic thermal_zone_get_trip() function
  thermal/drivers/broadcom: Use generic thermal_zone_get_trip() function
  thermal/drivers/da9062: Use generic thermal_zone_get_trip() function
  thermal/drivers/ti: Remove unused macros ti_thermal_get_trip_value() /
    ti_thermal_trip_is_valid()
  thermal/drivers/acerhdf: Use generic thermal_zone_get_trip() function
  thermal/drivers/cxgb4: Use generic thermal_zone_get_trip() function
  thermal/intel/int340x: Replace parameter to simplify
  thermal/drivers/intel: Use generic thermal_zone_get_trip() function

 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h    |   2 -
 .../ethernet/chelsio/cxgb4/cxgb4_thermal.c    |  41 +----
 drivers/platform/x86/acerhdf.c                |  73 +++-----
 drivers/thermal/armada_thermal.c              |  39 ++---
 drivers/thermal/broadcom/bcm2835_thermal.c    |   8 +-
 drivers/thermal/da9062-thermal.c              |  52 +-----
 drivers/thermal/gov_bang_bang.c               |  29 ++--
 drivers/thermal/gov_fair_share.c              |  18 +-
 drivers/thermal/gov_power_allocator.c         |  51 +++---
 drivers/thermal/gov_step_wise.c               |  22 ++-
 drivers/thermal/hisi_thermal.c                |  11 +-
 drivers/thermal/imx_thermal.c                 |  72 +++-----
 .../int340x_thermal/int340x_thermal_zone.c    |  31 ++--
 .../int340x_thermal/int340x_thermal_zone.h    |   4 +-
 .../processor_thermal_device.c                |  10 +-
 drivers/thermal/intel/x86_pkg_temp_thermal.c  | 120 +++++++------
 drivers/thermal/qcom/qcom-spmi-temp-alarm.c   |  39 ++---
 drivers/thermal/rcar_gen3_thermal.c           |   2 +-
 drivers/thermal/rcar_thermal.c                |  49 +-----
 drivers/thermal/samsung/exynos_tmu.c          |  57 +++----
 drivers/thermal/st/st_thermal.c               |  47 +----
 drivers/thermal/tegra/soctherm.c              |  33 ++--
 drivers/thermal/tegra/tegra30-tsensor.c       |  17 +-
 drivers/thermal/thermal_core.c                | 160 +++++++++++++++---
 drivers/thermal/thermal_core.h                |  24 +--
 drivers/thermal/thermal_helpers.c             |  28 +--
 drivers/thermal/thermal_netlink.c             |  21 +--
 drivers/thermal/thermal_of.c                  | 116 -------------
 drivers/thermal/thermal_sysfs.c               | 127 +++++---------
 drivers/thermal/ti-soc-thermal/ti-thermal.h   |  15 --
 drivers/thermal/uniphier_thermal.c            |  27 ++-
 include/linux/thermal.h                       |  10 ++
 32 files changed, 545 insertions(+), 810 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 19:01   ` Rafael J. Wysocki
  2022-09-26 14:05 ` [PATCH v5 02/30] thermal/sysfs: Do not make get_trip_hyst optional Daniel Lezcano
                   ` (28 subsequent siblings)
  29 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal_zone_device_ops structure defines a set of ops family,
get_trip_temp(), get_trip_hyst(), get_trip_type(). Each of them is
returning a property of a trip point.

The result is the code is calling the ops everywhere to get a trip
point which is supposed to be defined in the backend driver. It is a
non-sense as a thermal trip can be generic and used by the backend
driver to declare its trip points.

Part of the thermal framework has been changed and all the OF thermal
drivers are using the same definition for the trip point and use a
thermal zone registration variant to pass those trip points which are
part of the thermal zone device structure.

Consequently, we can use a generic function to get the trip points
when they are stored in the thermal zone device structure.

This approach can be generalized to all the drivers and we can get rid
of the ops->get_trip_*. That will result to a much more simpler code
and make possible to rework how the thermal trip are handled in the
thermal core framework as discussed previously.

This change adds a function thermal_zone_get_trip() where we get the
thermal trip point structure which contains all the properties (type,
temp, hyst) instead of doing multiple calls to ops->get_trip_*.

That opens the door for trip point extension with more attributes. For
instance, replacing the trip points disabled bitmask with a 'disabled'
field in the structure.

Here we replace all the calls to ops->get_trip_* in the thermal core
code with a call to the thermal_zone_get_trip() function.

While at it, add the thermal_zone_get_num_trips() to encapsulate the
code more and reduce the grip with the thermal framework internals.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/thermal/thermal_core.c    | 115 ++++++++++++++++++++++++------
 drivers/thermal/thermal_core.h    |   2 +
 drivers/thermal/thermal_helpers.c |  28 ++++----
 drivers/thermal/thermal_netlink.c |  21 +++---
 drivers/thermal/thermal_sysfs.c   |  66 +++++++----------
 include/linux/thermal.h           |   5 ++
 6 files changed, 148 insertions(+), 89 deletions(-)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 99c0c19fa5a6..903a858df35f 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -341,35 +341,31 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
 		tz->ops->critical(tz);
 }
 
-static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
+static void handle_thermal_trip(struct thermal_zone_device *tz, int trip_id)
 {
-	enum thermal_trip_type type;
-	int trip_temp, hyst = 0;
+	struct thermal_trip trip;
 
 	/* Ignore disabled trip points */
-	if (test_bit(trip, &tz->trips_disabled))
+	if (test_bit(trip_id, &tz->trips_disabled))
 		return;
 
-	tz->ops->get_trip_temp(tz, trip, &trip_temp);
-	tz->ops->get_trip_type(tz, trip, &type);
-	if (tz->ops->get_trip_hyst)
-		tz->ops->get_trip_hyst(tz, trip, &hyst);
+	__thermal_zone_get_trip(tz, trip_id, &trip);
 
 	if (tz->last_temperature != THERMAL_TEMP_INVALID) {
-		if (tz->last_temperature < trip_temp &&
-		    tz->temperature >= trip_temp)
-			thermal_notify_tz_trip_up(tz->id, trip,
+		if (tz->last_temperature < trip.temperature &&
+		    tz->temperature >= trip.temperature)
+			thermal_notify_tz_trip_up(tz->id, trip_id,
 						  tz->temperature);
-		if (tz->last_temperature >= trip_temp &&
-		    tz->temperature < (trip_temp - hyst))
-			thermal_notify_tz_trip_down(tz->id, trip,
+		if (tz->last_temperature >= trip.temperature &&
+		    tz->temperature < (trip.temperature - trip.hysteresis))
+			thermal_notify_tz_trip_down(tz->id, trip_id,
 						    tz->temperature);
 	}
 
-	if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
-		handle_critical_trips(tz, trip, trip_temp, type);
+	if (trip.type == THERMAL_TRIP_CRITICAL || trip.type == THERMAL_TRIP_HOT)
+		handle_critical_trips(tz, trip_id, trip.temperature, trip.type);
 	else
-		handle_non_critical_trips(tz, trip);
+		handle_non_critical_trips(tz, trip_id);
 }
 
 static void update_temperature(struct thermal_zone_device *tz)
@@ -1142,6 +1138,80 @@ static void thermal_set_delay_jiffies(unsigned long *delay_jiffies, int delay_ms
 		*delay_jiffies = round_jiffies(*delay_jiffies);
 }
 
+int thermal_zone_get_num_trips(struct thermal_zone_device *tz)
+{
+	return tz->num_trips;
+}
+EXPORT_SYMBOL_GPL(thermal_zone_get_num_trips);
+
+int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp)
+{
+	int i, ret = 0;
+
+	if (tz->ops->get_crit_temp)
+		return tz->ops->get_crit_temp(tz, temp);
+	
+	if (!tz->trips)
+		return -EINVAL;
+
+	mutex_lock(&tz->lock);
+
+	for (i = 0; i < tz->num_trips; i++) {
+		if (tz->trips[i].type == THERMAL_TRIP_CRITICAL) {
+			*temp = tz->trips[i].temperature;
+			goto out;
+		}
+	}
+
+	ret = -EINVAL;
+out:
+	mutex_unlock(&tz->lock);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);
+
+int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
+			    struct thermal_trip *trip)
+{
+	int ret;
+
+	if (!tz || trip_id < 0 || trip_id >= tz->num_trips || !trip)
+		return -EINVAL;
+
+	if (tz->trips) {
+		*trip = tz->trips[trip_id];
+		return 0;
+	}
+
+	if (tz->ops->get_trip_hyst) {
+		ret = tz->ops->get_trip_hyst(tz, trip_id, &trip->hysteresis);
+		if (ret)
+			return ret;
+	} else {
+		trip->hysteresis = 0;
+	}
+
+	ret = tz->ops->get_trip_temp(tz, trip_id, &trip->temperature);
+	if (ret)
+		return ret;
+
+	return tz->ops->get_trip_type(tz, trip_id, &trip->type);
+}
+
+int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
+			  struct thermal_trip *trip)
+{
+	int ret;
+
+	mutex_lock(&tz->lock);
+	ret = __thermal_zone_get_trip(tz, trip_id, trip);
+	mutex_unlock(&tz->lock);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(thermal_zone_get_trip);
+
 /**
  * thermal_zone_device_register_with_trips() - register a new thermal zone device
  * @type:	the thermal zone device type
@@ -1174,8 +1244,6 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
 					int polling_delay)
 {
 	struct thermal_zone_device *tz;
-	enum thermal_trip_type trip_type;
-	int trip_temp;
 	int id;
 	int result;
 	int count;
@@ -1202,7 +1270,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
 		return ERR_PTR(-EINVAL);
 	}
 
-	if (num_trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp))
+	if (num_trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp) && !trips)
 		return ERR_PTR(-EINVAL);
 
 	tz = kzalloc(sizeof(*tz), GFP_KERNEL);
@@ -1252,9 +1320,10 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
 		goto release_device;
 
 	for (count = 0; count < num_trips; count++) {
-		if (tz->ops->get_trip_type(tz, count, &trip_type) ||
-		    tz->ops->get_trip_temp(tz, count, &trip_temp) ||
-		    !trip_temp)
+		struct thermal_trip trip;
+
+		result = thermal_zone_get_trip(tz, count, &trip);
+		if (result)
 			set_bit(count, &tz->trips_disabled);
 	}
 
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index 1571917bd3c8..879e91a48435 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -113,6 +113,8 @@ int thermal_build_list_of_policies(char *buf);
 /* Helpers */
 void thermal_zone_set_trips(struct thermal_zone_device *tz);
 void __thermal_zone_set_trips(struct thermal_zone_device *tz);
+int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
+			    struct thermal_trip *trip);
 int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
 
 /* sysfs I/F */
diff --git a/drivers/thermal/thermal_helpers.c b/drivers/thermal/thermal_helpers.c
index c65cdce8f856..06dded36e95e 100644
--- a/drivers/thermal/thermal_helpers.c
+++ b/drivers/thermal/thermal_helpers.c
@@ -69,7 +69,7 @@ int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
 	int ret = -EINVAL;
 	int count;
 	int crit_temp = INT_MAX;
-	enum thermal_trip_type type;
+	struct thermal_trip trip;
 
 	lockdep_assert_held(&tz->lock);
 
@@ -80,10 +80,9 @@ int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
 
 	if (IS_ENABLED(CONFIG_THERMAL_EMULATION) && tz->emul_temperature) {
 		for (count = 0; count < tz->num_trips; count++) {
-			ret = tz->ops->get_trip_type(tz, count, &type);
-			if (!ret && type == THERMAL_TRIP_CRITICAL) {
-				ret = tz->ops->get_trip_temp(tz, count,
-						&crit_temp);
+			ret = __thermal_zone_get_trip(tz, count, &trip);
+			if (!ret && trip.type == THERMAL_TRIP_CRITICAL) {
+				crit_temp = trip.temperature;
 				break;
 			}
 		}
@@ -124,29 +123,30 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
 
 void __thermal_zone_set_trips(struct thermal_zone_device *tz)
 {
-	int low = -INT_MAX;
-	int high = INT_MAX;
-	int trip_temp, hysteresis;
+	struct thermal_trip trip;
+	int low = -INT_MAX, high = INT_MAX;
 	int i, ret;
 
 	lockdep_assert_held(&tz->lock);
 
-	if (!tz->ops->set_trips || !tz->ops->get_trip_hyst)
+	if (!tz->ops->set_trips)
 		return;
 
 	for (i = 0; i < tz->num_trips; i++) {
 		int trip_low;
 
-		tz->ops->get_trip_temp(tz, i, &trip_temp);
-		tz->ops->get_trip_hyst(tz, i, &hysteresis);
+		ret = __thermal_zone_get_trip(tz, i , &trip);
+		if (ret)
+			return;
 
-		trip_low = trip_temp - hysteresis;
+		trip_low = trip.temperature - trip.hysteresis;
 
 		if (trip_low < tz->temperature && trip_low > low)
 			low = trip_low;
 
-		if (trip_temp > tz->temperature && trip_temp < high)
-			high = trip_temp;
+		if (trip.temperature > tz->temperature &&
+		    trip.temperature < high)
+			high = trip.temperature;
 	}
 
 	/* No need to change trip points */
diff --git a/drivers/thermal/thermal_netlink.c b/drivers/thermal/thermal_netlink.c
index 050d243a5fa1..2a3190d55358 100644
--- a/drivers/thermal/thermal_netlink.c
+++ b/drivers/thermal/thermal_netlink.c
@@ -452,7 +452,8 @@ static int thermal_genl_cmd_tz_get_trip(struct param *p)
 	struct sk_buff *msg = p->msg;
 	struct thermal_zone_device *tz;
 	struct nlattr *start_trip;
-	int i, id;
+	struct thermal_trip trip;
+	int ret, i, id;
 
 	if (!p->attrs[THERMAL_GENL_ATTR_TZ_ID])
 		return -EINVAL;
@@ -471,18 +472,14 @@ static int thermal_genl_cmd_tz_get_trip(struct param *p)
 
 	for (i = 0; i < tz->num_trips; i++) {
 
-		enum thermal_trip_type type;
-		int temp, hyst = 0;
-
-		tz->ops->get_trip_type(tz, i, &type);
-		tz->ops->get_trip_temp(tz, i, &temp);
-		if (tz->ops->get_trip_hyst)
-			tz->ops->get_trip_hyst(tz, i, &hyst);
-
+		ret = __thermal_zone_get_trip(tz, i, &trip);
+		if (ret)
+			goto out_cancel_nest;
+		
 		if (nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_ID, i) ||
-		    nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TYPE, type) ||
-		    nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TEMP, temp) ||
-		    nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_HYST, hyst))
+		    nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TYPE, trip.type) ||
+		    nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TEMP, trip.temperature) ||
+		    nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_HYST, trip.hysteresis))
 			goto out_cancel_nest;
 	}
 
diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
index 78c5841bdfae..75f6b151a58b 100644
--- a/drivers/thermal/thermal_sysfs.c
+++ b/drivers/thermal/thermal_sysfs.c
@@ -83,20 +83,17 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr,
 		     char *buf)
 {
 	struct thermal_zone_device *tz = to_thermal_zone(dev);
-	enum thermal_trip_type type;
-	int trip, result;
+	struct thermal_trip trip;
+	int trip_id, result;
 
-	if (!tz->ops->get_trip_type)
-		return -EPERM;
-
-	if (sscanf(attr->attr.name, "trip_point_%d_type", &trip) != 1)
+	if (sscanf(attr->attr.name, "trip_point_%d_type", &trip_id) != 1)
 		return -EINVAL;
 
-	result = tz->ops->get_trip_type(tz, trip, &type);
+	result = thermal_zone_get_trip(tz, trip_id, &trip);
 	if (result)
 		return result;
 
-	switch (type) {
+	switch (trip.type) {
 	case THERMAL_TRIP_CRITICAL:
 		return sprintf(buf, "critical\n");
 	case THERMAL_TRIP_HOT:
@@ -115,37 +112,31 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
 		      const char *buf, size_t count)
 {
 	struct thermal_zone_device *tz = to_thermal_zone(dev);
-	int trip, ret;
-	int temperature, hyst = 0;
-	enum thermal_trip_type type;
+	struct thermal_trip trip;
+	int trip_id, ret;
 
 	if (!tz->ops->set_trip_temp && !tz->trips)
 		return -EPERM;
 
-	if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip) != 1)
+	if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
 		return -EINVAL;
 
-	if (kstrtoint(buf, 10, &temperature))
+	if (kstrtoint(buf, 10, &trip.temperature))
 		return -EINVAL;
 
-	ret = tz->ops->set_trip_temp(tz, trip, temperature);
+	ret = tz->ops->set_trip_temp(tz, trip_id, trip.temperature);
 	if (ret)
 		return ret;
 
 	if (tz->trips)
-		tz->trips[trip].temperature = temperature;
-
-	if (tz->ops->get_trip_hyst) {
-		ret = tz->ops->get_trip_hyst(tz, trip, &hyst);
-		if (ret)
-			return ret;
-	}
+		tz->trips[trip_id].temperature = trip.temperature;
 
-	ret = tz->ops->get_trip_type(tz, trip, &type);
+	ret = thermal_zone_get_trip(tz, trip_id, &trip);
 	if (ret)
 		return ret;
 
-	thermal_notify_tz_trip_change(tz->id, trip, type, temperature, hyst);
+	thermal_notify_tz_trip_change(tz->id, trip_id, trip.type,
+				      trip.temperature, trip.hysteresis);
 
 	thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
@@ -157,21 +148,17 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr,
 		     char *buf)
 {
 	struct thermal_zone_device *tz = to_thermal_zone(dev);
-	int trip, ret;
-	int temperature;
-
-	if (!tz->ops->get_trip_temp)
-		return -EPERM;
+	struct thermal_trip trip;
+	int trip_id, ret;
 
-	if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip) != 1)
+	if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
 		return -EINVAL;
 
-	ret = tz->ops->get_trip_temp(tz, trip, &temperature);
-
+	ret = thermal_zone_get_trip(tz, trip_id, &trip);
 	if (ret)
 		return ret;
 
-	return sprintf(buf, "%d\n", temperature);
+	return sprintf(buf, "%d\n", trip.temperature);
 }
 
 static ssize_t
@@ -209,18 +196,17 @@ trip_point_hyst_show(struct device *dev, struct device_attribute *attr,
 		     char *buf)
 {
 	struct thermal_zone_device *tz = to_thermal_zone(dev);
-	int trip, ret;
-	int temperature;
+	struct thermal_trip trip;
+	int trip_id, ret;
 
-	if (!tz->ops->get_trip_hyst)
-		return -EPERM;
-
-	if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip) != 1)
+	if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1)
 		return -EINVAL;
 
-	ret = tz->ops->get_trip_hyst(tz, trip, &temperature);
+	ret = thermal_zone_get_trip(tz, trip_id, &trip);
+	if (ret)
+		return ret;
 
-	return ret ? ret : sprintf(buf, "%d\n", temperature);
+	return ret ? ret : sprintf(buf, "%d\n", trip.hysteresis);
 }
 
 static ssize_t
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index a5a18351a898..09dc09228717 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -335,6 +335,11 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev,
 }
 #endif
 
+int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
+			  struct thermal_trip *trip);
+
+int thermal_zone_get_num_trips(struct thermal_zone_device *tz);
+
 #ifdef CONFIG_THERMAL
 struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
 		void *, struct thermal_zone_device_ops *,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 02/30] thermal/sysfs: Do not make get_trip_hyst optional
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 19:16   ` Rafael J. Wysocki
  2022-09-26 14:05 ` [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function Daniel Lezcano
                   ` (27 subsequent siblings)
  29 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The get_trip_hyst() ops is optional. It results all around the thermal
framework code a check against the ops pointer and different action
adding more complexity and making the code less readable and
understandable.

A zero hysteresis value is perfectly valid, so instead of adding more
circumvolutions in the code, create unconditionnaly the hysteresis and
use the thermal_zone_get_trip() function which returns a zero
hysteresis if the get_trip_hyst() is not defined.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_sysfs.c | 25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
index 75f6b151a58b..18cdd7cd0008 100644
--- a/drivers/thermal/thermal_sysfs.c
+++ b/drivers/thermal/thermal_sysfs.c
@@ -424,23 +424,20 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 		return -ENOMEM;
 	}
 
-	if (tz->ops->get_trip_hyst) {
-		tz->trip_hyst_attrs = kcalloc(tz->num_trips,
-					      sizeof(*tz->trip_hyst_attrs),
-					      GFP_KERNEL);
-		if (!tz->trip_hyst_attrs) {
-			kfree(tz->trip_type_attrs);
-			kfree(tz->trip_temp_attrs);
-			return -ENOMEM;
-		}
+	tz->trip_hyst_attrs = kcalloc(tz->num_trips,
+				      sizeof(*tz->trip_hyst_attrs),
+				      GFP_KERNEL);
+	if (!tz->trip_hyst_attrs) {
+		kfree(tz->trip_type_attrs);
+		kfree(tz->trip_temp_attrs);
+		return -ENOMEM;
 	}
 
 	attrs = kcalloc(tz->num_trips * 3 + 1, sizeof(*attrs), GFP_KERNEL);
 	if (!attrs) {
 		kfree(tz->trip_type_attrs);
 		kfree(tz->trip_temp_attrs);
-		if (tz->ops->get_trip_hyst)
-			kfree(tz->trip_hyst_attrs);
+		kfree(tz->trip_hyst_attrs);
 		return -ENOMEM;
 	}
 
@@ -473,9 +470,6 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 		}
 		attrs[indx + tz->num_trips] = &tz->trip_temp_attrs[indx].attr.attr;
 
-		/* create Optional trip hyst attribute */
-		if (!tz->ops->get_trip_hyst)
-			continue;
 		snprintf(tz->trip_hyst_attrs[indx].name, THERMAL_NAME_LENGTH,
 			 "trip_point_%d_hyst", indx);
 
@@ -512,8 +506,7 @@ static void destroy_trip_attrs(struct thermal_zone_device *tz)
 
 	kfree(tz->trip_type_attrs);
 	kfree(tz->trip_temp_attrs);
-	if (tz->ops->get_trip_hyst)
-		kfree(tz->trip_hyst_attrs);
+	kfree(tz->trip_hyst_attrs);
 	kfree(tz->trips_attribute_group.attrs);
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 02/30] thermal/sysfs: Do not make get_trip_hyst optional Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 19:25   ` Rafael J. Wysocki
  2022-09-26 14:05 ` [PATCH v5 04/30] thermal/core: Add a generic thermal_zone_get_crit_temp() function Daniel Lezcano
                   ` (26 subsequent siblings)
  29 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal zone ops defines a set_trip callback where we can invoke
the backend driver to set an interrupt for the next trip point
temperature being crossed the way up or down, or setting the low level
with the hysteresis.

The ops is only called from the thermal sysfs code where the userspace
has the ability to modify a trip point characteristic.

With the effort of encapsulating the thermal framework core code,
let's create a thermal_zone_set_trip() which is the writable side of
the thermal_zone_get_trip() and put there all the ops encapsulation.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_core.c  | 45 +++++++++++++++++++++++++++++++
 drivers/thermal/thermal_sysfs.c | 48 +++++++++++----------------------
 include/linux/thermal.h         |  3 +++
 3 files changed, 64 insertions(+), 32 deletions(-)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 903a858df35f..9f61b0ab57b7 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -1212,6 +1212,51 @@ int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
 }
 EXPORT_SYMBOL_GPL(thermal_zone_get_trip);
 
+int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id,
+			  const struct thermal_trip *trip)
+{
+	struct thermal_trip t;
+	int ret = -EINVAL;
+
+	mutex_lock(&tz->lock);
+
+	if (!tz->ops->set_trip_temp && !tz->ops->set_trip_hyst && !tz->trips)
+		goto out;
+
+	ret = __thermal_zone_get_trip(tz, trip_id, &t);
+	if (ret)
+		goto out;
+
+	if ((t.temperature != trip->temperature) && tz->ops->set_trip_temp) {
+
+		ret = tz->ops->set_trip_temp(tz, trip_id, trip->temperature);
+		if (ret)
+			goto out;
+	}
+
+	if ((t.hysteresis != trip->hysteresis) && tz->ops->set_trip_hyst) {
+
+		ret = tz->ops->set_trip_hyst(tz, trip_id, trip->hysteresis);
+		if (ret)
+			goto out;
+	}
+
+	if (((t.temperature != trip->temperature) ||
+	     (t.hysteresis != trip->hysteresis)) && tz->trips)
+		tz->trips[trip_id] = *trip;
+
+out:
+	mutex_unlock(&tz->lock);
+
+	if (!ret) {
+		thermal_notify_tz_trip_change(tz->id, trip_id, trip->type,
+					      trip->temperature, trip->hysteresis);
+		thermal_zone_device_update(tz, THERMAL_TRIP_CHANGED);
+	}
+	
+	return ret;
+}
+
 /**
  * thermal_zone_device_register_with_trips() - register a new thermal zone device
  * @type:	the thermal zone device type
diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
index 18cdd7cd0008..8d7b25ab67c2 100644
--- a/drivers/thermal/thermal_sysfs.c
+++ b/drivers/thermal/thermal_sysfs.c
@@ -115,31 +115,20 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
 	struct thermal_trip trip;
 	int trip_id, ret;
 
-	if (!tz->ops->set_trip_temp && !tz->trips)
-		return -EPERM;
-
 	if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
 		return -EINVAL;
 
-	if (kstrtoint(buf, 10, &trip.temperature))
-		return -EINVAL;
-
-	ret = tz->ops->set_trip_temp(tz, trip_id, trip.temperature);
+	ret = thermal_zone_get_trip(tz, trip_id, &trip);
 	if (ret)
 		return ret;
 
-	if (tz->trips)
-		tz->trips[trip_id].temperature = trip.temperature;
+	if (kstrtoint(buf, 10, &trip.temperature))
+		return -EINVAL;
 
-	ret = thermal_zone_get_trip(tz, trip_id, &trip);
+	ret = thermal_zone_set_trip(tz, trip_id, &trip);
 	if (ret)
 		return ret;
 
-	thermal_notify_tz_trip_change(tz->id, trip_id, trip.type,
-				      trip.temperature, trip.hysteresis);
-
-	thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
-
 	return count;
 }
 
@@ -166,29 +155,24 @@ trip_point_hyst_store(struct device *dev, struct device_attribute *attr,
 		      const char *buf, size_t count)
 {
 	struct thermal_zone_device *tz = to_thermal_zone(dev);
-	int trip, ret;
-	int temperature;
-
-	if (!tz->ops->set_trip_hyst)
-		return -EPERM;
+	struct thermal_trip trip;
+	int trip_id, ret;
 
-	if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip) != 1)
+	if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1)
 		return -EINVAL;
 
-	if (kstrtoint(buf, 10, &temperature))
-		return -EINVAL;
+	ret = thermal_zone_get_trip(tz, trip_id, &trip);
+	if (ret)
+		return ret;
 
-	/*
-	 * We are not doing any check on the 'temperature' value
-	 * here. The driver implementing 'set_trip_hyst' has to
-	 * take care of this.
-	 */
-	ret = tz->ops->set_trip_hyst(tz, trip, temperature);
+	if (kstrtoint(buf, 10, &trip.hysteresis))
+		return -EINVAL;
 
-	if (!ret)
-		thermal_zone_set_trips(tz);
+	ret = thermal_zone_set_trip(tz, trip_id, &trip);
+	if (ret)
+		return ret;
 
-	return ret ? ret : count;
+	return count;
 }
 
 static ssize_t
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 09dc09228717..5350a437f245 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -338,6 +338,9 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev,
 int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
 			  struct thermal_trip *trip);
 
+int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id,
+			  const struct thermal_trip *trip);
+
 int thermal_zone_get_num_trips(struct thermal_zone_device *tz);
 
 #ifdef CONFIG_THERMAL
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 04/30] thermal/core: Add a generic thermal_zone_get_crit_temp() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (2 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 19:27   ` Rafael J. Wysocki
  2022-09-26 14:05 ` [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions Daniel Lezcano
                   ` (25 subsequent siblings)
  29 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal zone ops defines a callback to retrieve the critical
temperature. As the trip handling is being reworked, all the trip
points will be the same whatever the driver and consequently finding
the critical trip temperature will be just a loop to search for a
critical trip point type.

Provide such a generic function, so we encapsulate the ops
get_crit_temp() which can be removed when all the backend drivers are
using the generic trip points handling.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
---
 include/linux/thermal.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 5350a437f245..66373f872237 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -343,6 +343,8 @@ int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id,
 
 int thermal_zone_get_num_trips(struct thermal_zone_device *tz);
 
+int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp);
+
 #ifdef CONFIG_THERMAL
 struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
 		void *, struct thermal_zone_device_ops *,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (3 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 04/30] thermal/core: Add a generic thermal_zone_get_crit_temp() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 19:34   ` Rafael J. Wysocki
  2022-09-26 14:05 ` [PATCH v5 06/30] thermal/of: Use generic thermal_zone_get_trip() function Daniel Lezcano
                   ` (24 subsequent siblings)
  29 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Lukasz Luba, Amit Kucheria

The governors are using the ops->get_trip_* functions, Replace these
calls with thermal_zone_get_trip().

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> # IPA
---
 drivers/thermal/gov_bang_bang.c       | 29 ++++++++-------
 drivers/thermal/gov_fair_share.c      | 18 ++++------
 drivers/thermal/gov_power_allocator.c | 51 ++++++++++++---------------
 drivers/thermal/gov_step_wise.c       | 22 ++++++------
 4 files changed, 53 insertions(+), 67 deletions(-)

diff --git a/drivers/thermal/gov_bang_bang.c b/drivers/thermal/gov_bang_bang.c
index a08bbe33be96..f5b85e5ea707 100644
--- a/drivers/thermal/gov_bang_bang.c
+++ b/drivers/thermal/gov_bang_bang.c
@@ -13,26 +13,25 @@
 
 #include "thermal_core.h"
 
-static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
+static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip_id)
 {
-	int trip_temp, trip_hyst;
+	struct thermal_trip trip;
 	struct thermal_instance *instance;
+	int ret;
 
-	tz->ops->get_trip_temp(tz, trip, &trip_temp);
-
-	if (!tz->ops->get_trip_hyst) {
-		pr_warn_once("Undefined get_trip_hyst for thermal zone %s - "
-				"running with default hysteresis zero\n", tz->type);
-		trip_hyst = 0;
-	} else
-		tz->ops->get_trip_hyst(tz, trip, &trip_hyst);
+	ret = __thermal_zone_get_trip(tz, trip_id, &trip);
+	if (ret)
+		pr_warn_once("Failed to retrieve trip point %d\n", trip_id);
+	
+	if (!trip.hysteresis)
+		pr_warn_once("Zero hysteresis value for thermal zone %s\n", tz->type);
 
 	dev_dbg(&tz->device, "Trip%d[temp=%d]:temp=%d:hyst=%d\n",
-				trip, trip_temp, tz->temperature,
-				trip_hyst);
+				trip_id, trip.temperature, tz->temperature,
+				trip.hysteresis);
 
 	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
-		if (instance->trip != trip)
+		if (instance->trip != trip_id)
 			continue;
 
 		/* in case fan is in initial state, switch the fan off */
@@ -50,10 +49,10 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
 		 * enable fan when temperature exceeds trip_temp and disable
 		 * the fan in case it falls below trip_temp minus hysteresis
 		 */
-		if (instance->target == 0 && tz->temperature >= trip_temp)
+		if (instance->target == 0 && tz->temperature >= trip.temperature)
 			instance->target = 1;
 		else if (instance->target == 1 &&
-				tz->temperature <= trip_temp - trip_hyst)
+			 tz->temperature <= trip.temperature - trip.hysteresis)
 			instance->target = 0;
 
 		dev_dbg(&instance->cdev->device, "target=%d\n",
diff --git a/drivers/thermal/gov_fair_share.c b/drivers/thermal/gov_fair_share.c
index a4ee4661e9cc..bca60cd21655 100644
--- a/drivers/thermal/gov_fair_share.c
+++ b/drivers/thermal/gov_fair_share.c
@@ -21,16 +21,12 @@
  */
 static int get_trip_level(struct thermal_zone_device *tz)
 {
-	int count = 0;
-	int trip_temp;
-	enum thermal_trip_type trip_type;
-
-	if (tz->num_trips == 0 || !tz->ops->get_trip_temp)
-		return 0;
+	struct thermal_trip trip;
+	int count;
 
 	for (count = 0; count < tz->num_trips; count++) {
-		tz->ops->get_trip_temp(tz, count, &trip_temp);
-		if (tz->temperature < trip_temp)
+		__thermal_zone_get_trip(tz, count, &trip);
+		if (tz->temperature < trip.temperature)
 			break;
 	}
 
@@ -38,10 +34,8 @@ static int get_trip_level(struct thermal_zone_device *tz)
 	 * count > 0 only if temperature is greater than first trip
 	 * point, in which case, trip_point = count - 1
 	 */
-	if (count > 0) {
-		tz->ops->get_trip_type(tz, count - 1, &trip_type);
-		trace_thermal_zone_trip(tz, count - 1, trip_type);
-	}
+	if (count > 0)
+		trace_thermal_zone_trip(tz, count - 1, trip.type);
 
 	return count;
 }
diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c
index 2d1aeaba38a8..eafb28839281 100644
--- a/drivers/thermal/gov_power_allocator.c
+++ b/drivers/thermal/gov_power_allocator.c
@@ -125,16 +125,15 @@ static void estimate_pid_constants(struct thermal_zone_device *tz,
 				   u32 sustainable_power, int trip_switch_on,
 				   int control_temp)
 {
+	struct thermal_trip trip;
+	u32 temperature_threshold = control_temp;
 	int ret;
-	int switch_on_temp;
-	u32 temperature_threshold;
 	s32 k_i;
 
-	ret = tz->ops->get_trip_temp(tz, trip_switch_on, &switch_on_temp);
-	if (ret)
-		switch_on_temp = 0;
+	ret = __thermal_zone_get_trip(tz, trip_switch_on, &trip);
+	if (!ret)
+		temperature_threshold -= trip.temperature;
 
-	temperature_threshold = control_temp - switch_on_temp;
 	/*
 	 * estimate_pid_constants() tries to find appropriate default
 	 * values for thermal zones that don't provide them. If a
@@ -520,10 +519,10 @@ static void get_governor_trips(struct thermal_zone_device *tz,
 	last_passive = INVALID_TRIP;
 
 	for (i = 0; i < tz->num_trips; i++) {
-		enum thermal_trip_type type;
+		struct thermal_trip trip;
 		int ret;
 
-		ret = tz->ops->get_trip_type(tz, i, &type);
+		ret = __thermal_zone_get_trip(tz, i, &trip);
 		if (ret) {
 			dev_warn(&tz->device,
 				 "Failed to get trip point %d type: %d\n", i,
@@ -531,14 +530,14 @@ static void get_governor_trips(struct thermal_zone_device *tz,
 			continue;
 		}
 
-		if (type == THERMAL_TRIP_PASSIVE) {
+		if (trip.type == THERMAL_TRIP_PASSIVE) {
 			if (!found_first_passive) {
 				params->trip_switch_on = i;
 				found_first_passive = true;
 			} else  {
 				last_passive = i;
 			}
-		} else if (type == THERMAL_TRIP_ACTIVE) {
+		} else if (trip.type == THERMAL_TRIP_ACTIVE) {
 			last_active = i;
 		} else {
 			break;
@@ -633,7 +632,7 @@ static int power_allocator_bind(struct thermal_zone_device *tz)
 {
 	int ret;
 	struct power_allocator_params *params;
-	int control_temp;
+	struct thermal_trip trip;
 
 	ret = check_power_actors(tz);
 	if (ret)
@@ -659,13 +658,12 @@ static int power_allocator_bind(struct thermal_zone_device *tz)
 	get_governor_trips(tz, params);
 
 	if (tz->num_trips > 0) {
-		ret = tz->ops->get_trip_temp(tz,
-					params->trip_max_desired_temperature,
-					&control_temp);
+		ret = __thermal_zone_get_trip(tz, params->trip_max_desired_temperature,
+					      &trip);
 		if (!ret)
 			estimate_pid_constants(tz, tz->tzp->sustainable_power,
 					       params->trip_switch_on,
-					       control_temp);
+					       trip.temperature);
 	}
 
 	reset_pid_controller(params);
@@ -695,11 +693,11 @@ static void power_allocator_unbind(struct thermal_zone_device *tz)
 	tz->governor_data = NULL;
 }
 
-static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)
+static int power_allocator_throttle(struct thermal_zone_device *tz, int trip_id)
 {
-	int ret;
-	int switch_on_temp, control_temp;
 	struct power_allocator_params *params = tz->governor_data;
+	struct thermal_trip trip;
+	int ret;
 	bool update;
 
 	lockdep_assert_held(&tz->lock);
@@ -708,13 +706,12 @@ static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)
 	 * We get called for every trip point but we only need to do
 	 * our calculations once
 	 */
-	if (trip != params->trip_max_desired_temperature)
+	if (trip_id != params->trip_max_desired_temperature)
 		return 0;
 
-	ret = tz->ops->get_trip_temp(tz, params->trip_switch_on,
-				     &switch_on_temp);
-	if (!ret && (tz->temperature < switch_on_temp)) {
-		update = (tz->last_temperature >= switch_on_temp);
+	ret = __thermal_zone_get_trip(tz, params->trip_switch_on, &trip);
+	if (!ret && (tz->temperature < trip.temperature)) {
+		update = (tz->last_temperature >= trip.temperature);
 		tz->passive = 0;
 		reset_pid_controller(params);
 		allow_maximum_power(tz, update);
@@ -723,16 +720,14 @@ static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)
 
 	tz->passive = 1;
 
-	ret = tz->ops->get_trip_temp(tz, params->trip_max_desired_temperature,
-				&control_temp);
+	ret = __thermal_zone_get_trip(tz, params->trip_max_desired_temperature, &trip);
 	if (ret) {
-		dev_warn(&tz->device,
-			 "Failed to get the maximum desired temperature: %d\n",
+		dev_warn(&tz->device, "Failed to get the maximum desired temperature: %d\n",
 			 ret);
 		return ret;
 	}
 
-	return allocate_power(tz, control_temp);
+	return allocate_power(tz, trip.temperature);
 }
 
 static struct thermal_governor thermal_gov_power_allocator = {
diff --git a/drivers/thermal/gov_step_wise.c b/drivers/thermal/gov_step_wise.c
index cdd3354bc27f..31235e169c5a 100644
--- a/drivers/thermal/gov_step_wise.c
+++ b/drivers/thermal/gov_step_wise.c
@@ -95,30 +95,28 @@ static void update_passive_instance(struct thermal_zone_device *tz,
 		tz->passive += value;
 }
 
-static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
+static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip_id)
 {
-	int trip_temp;
-	enum thermal_trip_type trip_type;
 	enum thermal_trend trend;
 	struct thermal_instance *instance;
+	struct thermal_trip trip;
 	bool throttle = false;
 	int old_target;
 
-	tz->ops->get_trip_temp(tz, trip, &trip_temp);
-	tz->ops->get_trip_type(tz, trip, &trip_type);
+	__thermal_zone_get_trip(tz, trip_id, &trip);
 
-	trend = get_tz_trend(tz, trip);
+	trend = get_tz_trend(tz, trip_id);
 
-	if (tz->temperature >= trip_temp) {
+	if (tz->temperature >= trip.temperature) {
 		throttle = true;
-		trace_thermal_zone_trip(tz, trip, trip_type);
+		trace_thermal_zone_trip(tz, trip_id, trip.type);
 	}
 
 	dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d]:trend=%d,throttle=%d\n",
-				trip, trip_type, trip_temp, trend, throttle);
+				trip_id, trip.type, trip.temperature, trend, throttle);
 
 	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
-		if (instance->trip != trip)
+		if (instance->trip != trip_id)
 			continue;
 
 		old_target = instance->target;
@@ -132,11 +130,11 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
 		/* Activate a passive thermal instance */
 		if (old_target == THERMAL_NO_TARGET &&
 			instance->target != THERMAL_NO_TARGET)
-			update_passive_instance(tz, trip_type, 1);
+			update_passive_instance(tz, trip.type, 1);
 		/* Deactivate a passive thermal instance */
 		else if (old_target != THERMAL_NO_TARGET &&
 			instance->target == THERMAL_NO_TARGET)
-			update_passive_instance(tz, trip_type, -1);
+			update_passive_instance(tz, trip.type, -1);
 
 		instance->initialized = true;
 		mutex_lock(&instance->cdev->lock);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 06/30] thermal/of: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (4 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 07/30] thermal/of: Remove unused functions Daniel Lezcano
                   ` (23 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

The thermal OF code uses the thermal_zone_device_register_with_trips()
function. It builds the trips array and pass it to the register
function. That means the get_trip_* ops are duplicated with what does
already the core code.

Remove them.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_of.c | 36 ------------------------------------
 1 file changed, 36 deletions(-)

diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index d4b6335ace15..5cce83639085 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -71,39 +71,6 @@ of_thermal_get_trip_points(struct thermal_zone_device *tz)
 }
 EXPORT_SYMBOL_GPL(of_thermal_get_trip_points);
 
-static int of_thermal_get_trip_type(struct thermal_zone_device *tz, int trip,
-				    enum thermal_trip_type *type)
-{
-	if (trip >= tz->num_trips || trip < 0)
-		return -EDOM;
-
-	*type = tz->trips[trip].type;
-
-	return 0;
-}
-
-static int of_thermal_get_trip_temp(struct thermal_zone_device *tz, int trip,
-				    int *temp)
-{
-	if (trip >= tz->num_trips || trip < 0)
-		return -EDOM;
-
-	*temp = tz->trips[trip].temperature;
-
-	return 0;
-}
-
-static int of_thermal_get_trip_hyst(struct thermal_zone_device *tz, int trip,
-				    int *hyst)
-{
-	if (trip >= tz->num_trips || trip < 0)
-		return -EDOM;
-
-	*hyst = tz->trips[trip].hysteresis;
-
-	return 0;
-}
-
 static int of_thermal_set_trip_hyst(struct thermal_zone_device *tz, int trip,
 				    int hyst)
 {
@@ -626,9 +593,6 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor,
 		goto out_kfree_trips;
 	}
 
-	of_ops->get_trip_type = of_ops->get_trip_type ? : of_thermal_get_trip_type;
-	of_ops->get_trip_temp = of_ops->get_trip_temp ? : of_thermal_get_trip_temp;
-	of_ops->get_trip_hyst = of_ops->get_trip_hyst ? : of_thermal_get_trip_hyst;
 	of_ops->set_trip_hyst = of_ops->set_trip_hyst ? : of_thermal_set_trip_hyst;
 	of_ops->get_crit_temp = of_ops->get_crit_temp ? : of_thermal_get_crit_temp;
 	of_ops->bind = thermal_of_bind;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 07/30] thermal/of: Remove unused functions
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (5 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 06/30] thermal/of: Use generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 08/30] thermal/drivers/exynos: Use generic thermal_zone_get_trip() function Daniel Lezcano
                   ` (22 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

Remove the dead code: of_thermal_get_trip_points()

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_core.h |  7 -------
 drivers/thermal/thermal_of.c   | 17 -----------------
 2 files changed, 24 deletions(-)

diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index 879e91a48435..c5990a3fcf8a 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -141,8 +141,6 @@ thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
 #ifdef CONFIG_THERMAL_OF
 int of_thermal_get_ntrips(struct thermal_zone_device *);
 bool of_thermal_is_trip_valid(struct thermal_zone_device *, int);
-const struct thermal_trip *
-of_thermal_get_trip_points(struct thermal_zone_device *);
 #else
 static inline int of_thermal_get_ntrips(struct thermal_zone_device *tz)
 {
@@ -153,11 +151,6 @@ static inline bool of_thermal_is_trip_valid(struct thermal_zone_device *tz,
 {
 	return false;
 }
-static inline const struct thermal_trip *
-of_thermal_get_trip_points(struct thermal_zone_device *tz)
-{
-	return NULL;
-}
 #endif
 
 int thermal_zone_device_is_enabled(struct thermal_zone_device *tz);
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 5cce83639085..2f533fc94917 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -54,23 +54,6 @@ bool of_thermal_is_trip_valid(struct thermal_zone_device *tz, int trip)
 }
 EXPORT_SYMBOL_GPL(of_thermal_is_trip_valid);
 
-/**
- * of_thermal_get_trip_points - function to get access to a globally exported
- *				trip points
- *
- * @tz:	pointer to a thermal zone
- *
- * This function provides a pointer to trip points table
- *
- * Return: pointer to trip points table, NULL otherwise
- */
-const struct thermal_trip *
-of_thermal_get_trip_points(struct thermal_zone_device *tz)
-{
-	return tz->trips;
-}
-EXPORT_SYMBOL_GPL(of_thermal_get_trip_points);
-
 static int of_thermal_set_trip_hyst(struct thermal_zone_device *tz, int trip,
 				    int hyst)
 {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 08/30] thermal/drivers/exynos: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (6 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 07/30] thermal/of: Remove unused functions Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 09/30] thermal/drivers/exynos: of_thermal_get_ntrips() Daniel Lezcano
                   ` (21 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Krzysztof Kozlowski,
	Bartlomiej Zolnierkiewicz, Amit Kucheria, Alim Akhtar,
	open list:SAMSUNG THERMAL DRIVER, moderated list:ARM/SAMSUNG S3C,
	S5P AND EXYNOS ARM ARCHITECTURES

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 drivers/thermal/samsung/exynos_tmu.c | 41 +++++++++++-----------------
 1 file changed, 16 insertions(+), 25 deletions(-)

diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 51874d0a284c..0e33d32a9d2e 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -260,16 +260,8 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
 {
 	struct exynos_tmu_data *data = platform_get_drvdata(pdev);
 	struct thermal_zone_device *tzd = data->tzd;
-	const struct thermal_trip * const trips =
-		of_thermal_get_trip_points(tzd);
 	unsigned int status;
-	int ret = 0, temp, hyst;
-
-	if (!trips) {
-		dev_err(&pdev->dev,
-			"Cannot get trip points from device tree!\n");
-		return -ENODEV;
-	}
+	int ret = 0, temp;
 
 	if (data->soc != SOC_ARCH_EXYNOS5433) /* FIXME */
 		ret = tzd->ops->get_crit_temp(tzd, &temp);
@@ -303,19 +295,16 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
 
 		/* Write temperature code for rising and falling threshold */
 		for (i = 0; i < ntrips; i++) {
-			/* Write temperature code for rising threshold */
-			ret = tzd->ops->get_trip_temp(tzd, i, &temp);
-			if (ret)
-				goto err;
-			temp /= MCELSIUS;
-			data->tmu_set_trip_temp(data, i, temp);
 
-			/* Write temperature code for falling threshold */
-			ret = tzd->ops->get_trip_hyst(tzd, i, &hyst);
+			struct thermal_trip trip;
+			
+			ret = thermal_zone_get_trip(tzd, i, &trip);
 			if (ret)
 				goto err;
-			hyst /= MCELSIUS;
-			data->tmu_set_trip_hyst(data, i, temp, hyst);
+
+			data->tmu_set_trip_temp(data, i, trip.temperature / MCELSIUS);
+			data->tmu_set_trip_hyst(data, i, trip.temperature / MCELSIUS,
+						trip.hysteresis / MCELSIUS);
 		}
 
 		data->tmu_clear_irqs(data);
@@ -360,21 +349,23 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
 }
 
 static void exynos4210_tmu_set_trip_temp(struct exynos_tmu_data *data,
-					 int trip, u8 temp)
+					 int trip_id, u8 temp)
 {
-	const struct thermal_trip * const trips =
-		of_thermal_get_trip_points(data->tzd);
+	struct thermal_trip trip;
 	u8 ref, th_code;
 
-	ref = trips[0].temperature / MCELSIUS;
+	if (thermal_zone_get_trip(data->tzd, 0, &trip))
+		return;
 
-	if (trip == 0) {
+	ref = trip.temperature / MCELSIUS;
+	
+	if (trip_id == 0) {
 		th_code = temp_to_code(data, ref);
 		writeb(th_code, data->base + EXYNOS4210_TMU_REG_THRESHOLD_TEMP);
 	}
 
 	temp -= ref;
-	writeb(temp, data->base + EXYNOS4210_TMU_REG_TRIG_LEVEL0 + trip * 4);
+	writeb(temp, data->base + EXYNOS4210_TMU_REG_TRIG_LEVEL0 + trip_id * 4);
 }
 
 /* failing thresholds are not supported on Exynos4210 */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 09/30] thermal/drivers/exynos: of_thermal_get_ntrips()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (7 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 08/30] thermal/drivers/exynos: Use generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 10/30] thermal/drivers/exynos: Replace of_thermal_is_trip_valid() by thermal_zone_get_trip() Daniel Lezcano
                   ` (20 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Krzysztof Kozlowski,
	Bartlomiej Zolnierkiewicz, Amit Kucheria, Alim Akhtar,
	open list:SAMSUNG THERMAL DRIVER, moderated list:ARM/SAMSUNG S3C,
	S5P AND EXYNOS ARM ARCHITECTURES

The thermal core framework allows to get the number of thermal trips,
use it instead of visiting the thermal core structure internals.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 drivers/thermal/samsung/exynos_tmu.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 0e33d32a9d2e..91e6860b5ec4 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -260,6 +260,7 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
 {
 	struct exynos_tmu_data *data = platform_get_drvdata(pdev);
 	struct thermal_zone_device *tzd = data->tzd;
+	int num_trips = thermal_zone_get_num_trips(tzd);
 	unsigned int status;
 	int ret = 0, temp;
 
@@ -271,12 +272,12 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
 		goto out;
 	}
 
-	if (of_thermal_get_ntrips(tzd) > data->ntrip) {
+	if (num_trips > data->ntrip) {
 		dev_info(&pdev->dev,
 			 "More trip points than supported by this TMU.\n");
 		dev_info(&pdev->dev,
 			 "%d trip points should be configured in polling mode.\n",
-			 (of_thermal_get_ntrips(tzd) - data->ntrip));
+			 num_trips - data->ntrip);
 	}
 
 	mutex_lock(&data->lock);
@@ -289,7 +290,7 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
 		ret = -EBUSY;
 	} else {
 		int i, ntrips =
-			min_t(int, of_thermal_get_ntrips(tzd), data->ntrip);
+			min_t(int, num_trips, data->ntrip);
 
 		data->tmu_initialize(pdev);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 10/30] thermal/drivers/exynos: Replace of_thermal_is_trip_valid() by thermal_zone_get_trip()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (8 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 09/30] thermal/drivers/exynos: of_thermal_get_ntrips() Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 11/30] thermal/drivers/tegra: Use generic thermal_zone_get_trip() function Daniel Lezcano
                   ` (19 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Bartlomiej Zolnierkiewicz,
	Krzysztof Kozlowski, Amit Kucheria, Alim Akhtar,
	open list:SAMSUNG THERMAL DRIVER, moderated list:ARM/SAMSUNG S3C,
	S5P AND EXYNOS ARM ARCHITECTURES

The thermal_zone_get_trip() does the same check as
of_thermal_is_trip_valid(). Replace the call to
of_thermal_is_trip_valid() by thermal_zone_get_trip().

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/samsung/exynos_tmu.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 91e6860b5ec4..34b460092308 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -554,13 +554,14 @@ static void exynos4210_tmu_control(struct platform_device *pdev, bool on)
 {
 	struct exynos_tmu_data *data = platform_get_drvdata(pdev);
 	struct thermal_zone_device *tz = data->tzd;
+	struct thermal_trip trip;
 	unsigned int con, interrupt_en = 0, i;
 
 	con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL));
 
 	if (on) {
 		for (i = 0; i < data->ntrip; i++) {
-			if (!of_thermal_is_trip_valid(tz, i))
+			if (thermal_zone_get_trip(tz, i, &trip))
 				continue;
 
 			interrupt_en |=
@@ -584,13 +585,14 @@ static void exynos5433_tmu_control(struct platform_device *pdev, bool on)
 {
 	struct exynos_tmu_data *data = platform_get_drvdata(pdev);
 	struct thermal_zone_device *tz = data->tzd;
+	struct thermal_trip trip;
 	unsigned int con, interrupt_en = 0, pd_det_en, i;
 
 	con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL));
 
 	if (on) {
 		for (i = 0; i < data->ntrip; i++) {
-			if (!of_thermal_is_trip_valid(tz, i))
+			if (thermal_zone_get_trip(tz, i, &trip))
 				continue;
 
 			interrupt_en |=
@@ -615,13 +617,14 @@ static void exynos7_tmu_control(struct platform_device *pdev, bool on)
 {
 	struct exynos_tmu_data *data = platform_get_drvdata(pdev);
 	struct thermal_zone_device *tz = data->tzd;
+	struct thermal_trip trip;
 	unsigned int con, interrupt_en = 0, i;
 
 	con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL));
 
 	if (on) {
 		for (i = 0; i < data->ntrip; i++) {
-			if (!of_thermal_is_trip_valid(tz, i))
+			if (thermal_zone_get_trip(tz, i, &trip))
 				continue;
 
 			interrupt_en |=
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 11/30] thermal/drivers/tegra: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (9 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 10/30] thermal/drivers/exynos: Replace of_thermal_is_trip_valid() by thermal_zone_get_trip() Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 12/30] thermal/drivers/uniphier: " Daniel Lezcano
                   ` (18 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria, Thierry Reding,
	Jonathan Hunter, open list:TEGRA ARCHITECTURE SUPPORT

Replace a single call to thermal_zone_get_trip() to get a trip point
instead of calling the different ops->get_trip*

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/tegra/soctherm.c        | 33 +++++++++++--------------
 drivers/thermal/tegra/tegra30-tsensor.c | 17 ++++++-------
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 1efe470f31e9..96b541458ccd 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -582,23 +582,23 @@ static int tsensor_group_thermtrip_get(struct tegra_soctherm *ts, int id)
 	return temp;
 }
 
-static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip, int temp)
+static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip_id, int temp)
 {
 	struct tegra_thermctl_zone *zone = tz->devdata;
 	struct tegra_soctherm *ts = zone->ts;
+	struct thermal_trip trip;
 	const struct tegra_tsensor_group *sg = zone->sg;
 	struct device *dev = zone->dev;
-	enum thermal_trip_type type;
 	int ret;
 
 	if (!tz)
 		return -EINVAL;
 
-	ret = tz->ops->get_trip_type(tz, trip, &type);
+	ret = thermal_zone_get_trip(tz, trip_id, &trip);
 	if (ret)
 		return ret;
 
-	if (type == THERMAL_TRIP_CRITICAL) {
+	if (trip.type == THERMAL_TRIP_CRITICAL) {
 		/*
 		 * If thermtrips property is set in DT,
 		 * doesn't need to program critical type trip to HW,
@@ -609,7 +609,7 @@ static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip
 		else
 			return 0;
 
-	} else if (type == THERMAL_TRIP_HOT) {
+	} else if (trip.type == THERMAL_TRIP_HOT) {
 		int i;
 
 		for (i = 0; i < THROTTLE_SIZE; i++) {
@@ -620,7 +620,7 @@ static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip
 				continue;
 
 			cdev = ts->throt_cfgs[i].cdev;
-			if (get_thermal_instance(tz, cdev, trip))
+			if (get_thermal_instance(tz, cdev, trip_id))
 				stc = find_throttle_cfg_by_name(ts, cdev->type);
 			else
 				continue;
@@ -687,25 +687,20 @@ static const struct thermal_zone_device_ops tegra_of_thermal_ops = {
 	.set_trips = tegra_thermctl_set_trips,
 };
 
-static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
+static int get_hot_temp(struct thermal_zone_device *tz, int *trip_id, int *temp)
 {
-	int ntrips, i, ret;
-	enum thermal_trip_type type;
+	int i, ret;
+	struct thermal_trip trip;
 
-	ntrips = of_thermal_get_ntrips(tz);
-	if (ntrips <= 0)
-		return -EINVAL;
+	for (i = 0; i < thermal_zone_get_num_trips(tz); i++) {
 
-	for (i = 0; i < ntrips; i++) {
-		ret = tz->ops->get_trip_type(tz, i, &type);
+		ret = thermal_zone_get_trip(tz, i, &trip);
 		if (ret)
 			return -EINVAL;
-		if (type == THERMAL_TRIP_HOT) {
-			ret = tz->ops->get_trip_temp(tz, i, temp);
-			if (!ret)
-				*trip = i;
 
-			return ret;
+		if (trip.type == THERMAL_TRIP_HOT) {
+			*trip_id = i;
+			return 0;	
 		}
 	}
 
diff --git a/drivers/thermal/tegra/tegra30-tsensor.c b/drivers/thermal/tegra/tegra30-tsensor.c
index c34501287e96..cbaad2245f1d 100644
--- a/drivers/thermal/tegra/tegra30-tsensor.c
+++ b/drivers/thermal/tegra/tegra30-tsensor.c
@@ -316,18 +316,17 @@ static void tegra_tsensor_get_hw_channel_trips(struct thermal_zone_device *tzd,
 	*hot_trip  = 85000;
 	*crit_trip = 90000;
 
-	for (i = 0; i < tzd->num_trips; i++) {
-		enum thermal_trip_type type;
-		int trip_temp;
+	for (i = 0; i < thermal_zone_get_num_trips(tzd); i++) {
 
-		tzd->ops->get_trip_temp(tzd, i, &trip_temp);
-		tzd->ops->get_trip_type(tzd, i, &type);
+		struct thermal_trip trip;
 
-		if (type == THERMAL_TRIP_HOT)
-			*hot_trip = trip_temp;
+		thermal_zone_get_trip(tzd, i, &trip);
+		
+		if (trip.type == THERMAL_TRIP_HOT)
+			*hot_trip = trip.temperature;
 
-		if (type == THERMAL_TRIP_CRITICAL)
-			*crit_trip = trip_temp;
+		if (trip.type == THERMAL_TRIP_CRITICAL)
+			*crit_trip = trip.temperature;
 	}
 
 	/* clamp hardware trips to the calibration limits */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 12/30] thermal/drivers/uniphier: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (10 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 11/30] thermal/drivers/tegra: Use generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 13/30] thermal/drivers/hisi: " Daniel Lezcano
                   ` (17 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Kunihiko Hayashi,
	Amit Kucheria, Masami Hiramatsu,
	moderated list:ARM/UNIPHIER ARCHITECTURE

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
---
 drivers/thermal/uniphier_thermal.c | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/uniphier_thermal.c b/drivers/thermal/uniphier_thermal.c
index 4111d99ef50e..277ae300c5b1 100644
--- a/drivers/thermal/uniphier_thermal.c
+++ b/drivers/thermal/uniphier_thermal.c
@@ -248,8 +248,7 @@ static int uniphier_tm_probe(struct platform_device *pdev)
 	struct regmap *regmap;
 	struct device_node *parent;
 	struct uniphier_tm_dev *tdev;
-	const struct thermal_trip *trips;
-	int i, ret, irq, ntrips, crit_temp = INT_MAX;
+	int i, ret, irq, crit_temp = INT_MAX;
 
 	tdev = devm_kzalloc(dev, sizeof(*tdev), GFP_KERNEL);
 	if (!tdev)
@@ -296,20 +295,18 @@ static int uniphier_tm_probe(struct platform_device *pdev)
 		return PTR_ERR(tdev->tz_dev);
 	}
 
-	/* get trip points */
-	trips = of_thermal_get_trip_points(tdev->tz_dev);
-	ntrips = of_thermal_get_ntrips(tdev->tz_dev);
-	if (ntrips > ALERT_CH_NUM) {
-		dev_err(dev, "thermal zone has too many trips\n");
-		return -E2BIG;
-	}
-
 	/* set alert temperatures */
-	for (i = 0; i < ntrips; i++) {
-		if (trips[i].type == THERMAL_TRIP_CRITICAL &&
-		    trips[i].temperature < crit_temp)
-			crit_temp = trips[i].temperature;
-		uniphier_tm_set_alert(tdev, i, trips[i].temperature);
+	for (i = 0; i < thermal_zone_get_num_trips(tdev->tz_dev); i++) {
+		struct thermal_trip trip;
+
+		ret = thermal_zone_get_trip(tdev->tz_dev, i, &trip);
+		if (ret)
+			return ret;
+
+		if (trip.type == THERMAL_TRIP_CRITICAL &&
+		    trip.temperature < crit_temp)
+			crit_temp = trip.temperature;
+		uniphier_tm_set_alert(tdev, i, trip.temperature);
 		tdev->alert_en[i] = true;
 	}
 	if (crit_temp > CRITICAL_TEMP_LIMIT) {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 13/30] thermal/drivers/hisi: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (11 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 12/30] thermal/drivers/uniphier: " Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 14/30] thermal/drivers/qcom: " Daniel Lezcano
                   ` (16 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/hisi_thermal.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c
index d6974db7aaf7..45226cab466e 100644
--- a/drivers/thermal/hisi_thermal.c
+++ b/drivers/thermal/hisi_thermal.c
@@ -482,7 +482,7 @@ static int hisi_thermal_register_sensor(struct platform_device *pdev,
 					struct hisi_thermal_sensor *sensor)
 {
 	int ret, i;
-	const struct thermal_trip *trip;
+	struct thermal_trip trip;
 
 	sensor->tzd = devm_thermal_of_zone_register(&pdev->dev,
 						    sensor->id, sensor,
@@ -495,11 +495,12 @@ static int hisi_thermal_register_sensor(struct platform_device *pdev,
 		return ret;
 	}
 
-	trip = of_thermal_get_trip_points(sensor->tzd);
+	for (i = 0; i < thermal_zone_get_num_trips(sensor->tzd); i++) {
 
-	for (i = 0; i < of_thermal_get_ntrips(sensor->tzd); i++) {
-		if (trip[i].type == THERMAL_TRIP_PASSIVE) {
-			sensor->thres_temp = trip[i].temperature;
+		thermal_zone_get_trip(sensor->tzd, i, &trip);
+
+		if (trip.type == THERMAL_TRIP_PASSIVE) {
+			sensor->thres_temp = trip.temperature;
 			break;
 		}
 	}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 14/30] thermal/drivers/qcom: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (12 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 13/30] thermal/drivers/hisi: " Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 15/30] thermal/drivers/armada: " Daniel Lezcano
                   ` (15 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria, Andy Gross,
	Bjorn Andersson, Konrad Dybcio, Thara Gopinath,
	open list:ARM/QUALCOMM SUPPORT

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Amit Kucheria <amitk@kernel.org>
---
 drivers/thermal/qcom/qcom-spmi-temp-alarm.c | 39 +++++++++------------
 1 file changed, 17 insertions(+), 22 deletions(-)

diff --git a/drivers/thermal/qcom/qcom-spmi-temp-alarm.c b/drivers/thermal/qcom/qcom-spmi-temp-alarm.c
index be785ab37e53..127e8c90211c 100644
--- a/drivers/thermal/qcom/qcom-spmi-temp-alarm.c
+++ b/drivers/thermal/qcom/qcom-spmi-temp-alarm.c
@@ -263,17 +263,17 @@ static int qpnp_tm_update_critical_trip_temp(struct qpnp_tm_chip *chip,
 	return qpnp_tm_write(chip, QPNP_TM_REG_SHUTDOWN_CTRL1, reg);
 }
 
-static int qpnp_tm_set_trip_temp(struct thermal_zone_device *tz, int trip, int temp)
+static int qpnp_tm_set_trip_temp(struct thermal_zone_device *tz, int trip_id, int temp)
 {
 	struct qpnp_tm_chip *chip = tz->devdata;
-	const struct thermal_trip *trip_points;
+	struct thermal_trip trip;
 	int ret;
 
-	trip_points = of_thermal_get_trip_points(chip->tz_dev);
-	if (!trip_points)
-		return -EINVAL;
+	ret = thermal_zone_get_trip(chip->tz_dev, trip_id, &trip);
+	if (ret)
+		return ret;
 
-	if (trip_points[trip].type != THERMAL_TRIP_CRITICAL)
+	if (trip.type != THERMAL_TRIP_CRITICAL)
 		return 0;
 
 	mutex_lock(&chip->lock);
@@ -299,22 +299,17 @@ static irqreturn_t qpnp_tm_isr(int irq, void *data)
 
 static int qpnp_tm_get_critical_trip_temp(struct qpnp_tm_chip *chip)
 {
-	int ntrips;
-	const struct thermal_trip *trips;
-	int i;
-
-	ntrips = of_thermal_get_ntrips(chip->tz_dev);
-	if (ntrips <= 0)
-		return THERMAL_TEMP_INVALID;
-
-	trips = of_thermal_get_trip_points(chip->tz_dev);
-	if (!trips)
-		return THERMAL_TEMP_INVALID;
-
-	for (i = 0; i < ntrips; i++) {
-		if (of_thermal_is_trip_valid(chip->tz_dev, i) &&
-		    trips[i].type == THERMAL_TRIP_CRITICAL)
-			return trips[i].temperature;
+	struct thermal_trip trip;
+	int i, ret;
+
+	for (i = 0; i < thermal_zone_get_num_trips(chip->tz_dev); i++) {
+
+		ret = thermal_zone_get_trip(chip->tz_dev, i, &trip);
+		if (ret)
+			continue;
+
+		if (trip.type == THERMAL_TRIP_CRITICAL)
+			return trip.temperature;
 	}
 
 	return THERMAL_TEMP_INVALID;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 15/30] thermal/drivers/armada: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (13 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 14/30] thermal/drivers/qcom: " Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 16/30] thermal/drivers/rcar_gen3: Use the generic function to get the number of trips Daniel Lezcano
                   ` (14 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Miquel Raynal, Amit Kucheria

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/armada_thermal.c | 39 ++++++++++++++++----------------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
index 52d63b3997fe..9444e5a22ca0 100644
--- a/drivers/thermal/armada_thermal.c
+++ b/drivers/thermal/armada_thermal.c
@@ -785,33 +785,34 @@ static int armada_configure_overheat_int(struct armada_thermal_priv *priv,
 					 int sensor_id)
 {
 	/* Retrieve the critical trip point to enable the overheat interrupt */
-	const struct thermal_trip *trips = of_thermal_get_trip_points(tz);
+	struct thermal_trip trip;
 	int ret;
 	int i;
 
-	if (!trips)
-		return -EINVAL;
-
-	for (i = 0; i < of_thermal_get_ntrips(tz); i++)
-		if (trips[i].type == THERMAL_TRIP_CRITICAL)
-			break;
+	for (i = 0; i < thermal_zone_get_num_trips(tz); i++) {
 
-	if (i == of_thermal_get_ntrips(tz))
-		return -EINVAL;
+		ret = thermal_zone_get_trip(tz, i, &trip);
+		if (ret)
+			return ret;
+		
+		if (trip.type != THERMAL_TRIP_CRITICAL) 
+			continue;
 
-	ret = armada_select_channel(priv, sensor_id);
-	if (ret)
-		return ret;
+		ret = armada_select_channel(priv, sensor_id);
+		if (ret)
+			return ret;
+		
+		armada_set_overheat_thresholds(priv, trip.temperature,
+					       trip.hysteresis);
+		priv->overheat_sensor = tz;
+		priv->interrupt_source = sensor_id;
 
-	armada_set_overheat_thresholds(priv,
-				       trips[i].temperature,
-				       trips[i].hysteresis);
-	priv->overheat_sensor = tz;
-	priv->interrupt_source = sensor_id;
+		armada_enable_overheat_interrupt(priv);
 
-	armada_enable_overheat_interrupt(priv);
+		return 0;
+	}
 
-	return 0;
+	return -EINVAL;
 }
 
 static int armada_thermal_probe(struct platform_device *pdev)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 16/30] thermal/drivers/rcar_gen3: Use the generic function to get the number of trips
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (14 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 15/30] thermal/drivers/armada: " Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 17/30] thermal/of: Remove of_thermal_get_ntrips() Daniel Lezcano
                   ` (13 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Niklas Söderlund,
	Niklas Söderlund, Amit Kucheria,
	open list:RENESAS R-CAR THERMAL DRIVERS

The thermal core framework allows to get the number of thermal trips,
use it instead of visiting the thermal core structure internals.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/thermal/rcar_gen3_thermal.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c
index 4c1c6f89aa2f..4ef927437842 100644
--- a/drivers/thermal/rcar_gen3_thermal.c
+++ b/drivers/thermal/rcar_gen3_thermal.c
@@ -529,7 +529,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
 		if (ret)
 			goto error_unregister;
 
-		ret = of_thermal_get_ntrips(tsc->zone);
+		ret = thermal_zone_get_num_trips(tsc->zone);
 		if (ret < 0)
 			goto error_unregister;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 17/30] thermal/of: Remove of_thermal_get_ntrips()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (15 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 16/30] thermal/drivers/rcar_gen3: Use the generic function to get the number of trips Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 18/30] thermal/of: Remove of_thermal_is_trip_valid() Daniel Lezcano
                   ` (12 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal OF code uses the generic trip points to initialize the
thermal zone. Consequently thermal_zone_get_num_trips() can be used
and the of_thermal_get_ntrips() is no longer needed. Remove it.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_core.h |  5 -----
 drivers/thermal/thermal_of.c   | 16 ----------------
 2 files changed, 21 deletions(-)

diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index c5990a3fcf8a..b00fc1913734 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -139,13 +139,8 @@ thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
 
 /* device tree support */
 #ifdef CONFIG_THERMAL_OF
-int of_thermal_get_ntrips(struct thermal_zone_device *);
 bool of_thermal_is_trip_valid(struct thermal_zone_device *, int);
 #else
-static inline int of_thermal_get_ntrips(struct thermal_zone_device *tz)
-{
-	return 0;
-}
 static inline bool of_thermal_is_trip_valid(struct thermal_zone_device *tz,
 					    int trip)
 {
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 2f533fc94917..89afa59c4915 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -19,22 +19,6 @@
 
 #include "thermal_core.h"
 
-/**
- * of_thermal_get_ntrips - function to export number of available trip
- *			   points.
- * @tz: pointer to a thermal zone
- *
- * This function is a globally visible wrapper to get number of trip points
- * stored in the local struct __thermal_zone
- *
- * Return: number of available trip points, -ENODEV when data not available
- */
-int of_thermal_get_ntrips(struct thermal_zone_device *tz)
-{
-	return tz->num_trips;
-}
-EXPORT_SYMBOL_GPL(of_thermal_get_ntrips);
-
 /**
  * of_thermal_is_trip_valid - function to check if trip point is valid
  *
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 18/30] thermal/of: Remove of_thermal_is_trip_valid()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (16 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 17/30] thermal/of: Remove of_thermal_get_ntrips() Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 19/30] thermal/of: Remove of_thermal_set_trip_hyst() Daniel Lezcano
                   ` (11 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

There is no benefit with the of_thermal_is_trip_valid() function as it
does the check the thermal_zone_get_trip() is already doing for the
sake of getting the trip point.

As all the calls have been replaced by thermal_zone_get_trip(), there
is no more users of of_thermal_is_trip_valid().

Remove the function.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_core.h | 10 ----------
 drivers/thermal/thermal_of.c   | 19 -------------------
 2 files changed, 29 deletions(-)

diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index b00fc1913734..e9b3af6c2084 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -138,16 +138,6 @@ thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
 #endif /* CONFIG_THERMAL_STATISTICS */
 
 /* device tree support */
-#ifdef CONFIG_THERMAL_OF
-bool of_thermal_is_trip_valid(struct thermal_zone_device *, int);
-#else
-static inline bool of_thermal_is_trip_valid(struct thermal_zone_device *tz,
-					    int trip)
-{
-	return false;
-}
-#endif
-
 int thermal_zone_device_is_enabled(struct thermal_zone_device *tz);
 
 #endif /* __THERMAL_CORE_H__ */
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 89afa59c4915..4e54d62720dc 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -19,25 +19,6 @@
 
 #include "thermal_core.h"
 
-/**
- * of_thermal_is_trip_valid - function to check if trip point is valid
- *
- * @tz:	pointer to a thermal zone
- * @trip:	trip point to evaluate
- *
- * This function is responsible for checking if passed trip point is valid
- *
- * Return: true if trip point is valid, false otherwise
- */
-bool of_thermal_is_trip_valid(struct thermal_zone_device *tz, int trip)
-{
-	if (trip >= tz->num_trips || trip < 0)
-		return false;
-
-	return true;
-}
-EXPORT_SYMBOL_GPL(of_thermal_is_trip_valid);
-
 static int of_thermal_set_trip_hyst(struct thermal_zone_device *tz, int trip,
 				    int hyst)
 {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 19/30] thermal/of: Remove of_thermal_set_trip_hyst()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (17 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 18/30] thermal/of: Remove of_thermal_is_trip_valid() Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 20/30] thermal/of: Remove of_thermal_get_crit_temp() Daniel Lezcano
                   ` (10 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal core is providing the generic thermal_zone_set_trip()
function which does exactly what the OF ops function is doing.

It is pointless to define our own version, just remove the ops and the
thermal_zone_set_trip() will take care of it.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_of.c | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 4e54d62720dc..494e9c319541 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -19,18 +19,6 @@
 
 #include "thermal_core.h"
 
-static int of_thermal_set_trip_hyst(struct thermal_zone_device *tz, int trip,
-				    int hyst)
-{
-	if (trip >= tz->num_trips || trip < 0)
-		return -EDOM;
-
-	/* thermal framework should take care of data->mask & (1 << trip) */
-	tz->trips[trip].hysteresis = hyst;
-
-	return 0;
-}
-
 static int of_thermal_get_crit_temp(struct thermal_zone_device *tz,
 				    int *temp)
 {
@@ -541,7 +529,6 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor,
 		goto out_kfree_trips;
 	}
 
-	of_ops->set_trip_hyst = of_ops->set_trip_hyst ? : of_thermal_set_trip_hyst;
 	of_ops->get_crit_temp = of_ops->get_crit_temp ? : of_thermal_get_crit_temp;
 	of_ops->bind = thermal_of_bind;
 	of_ops->unbind = thermal_of_unbind;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 20/30] thermal/of: Remove of_thermal_get_crit_temp()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (18 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 19/30] thermal/of: Remove of_thermal_set_trip_hyst() Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 21/30] thermal/drivers/st: Use generic trip points Daniel Lezcano
                   ` (9 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The generic version of of_thermal_get_crit_temp() can be used. Let's
remove this ops which is pointless.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_of.c | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 494e9c319541..bd872183e521 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -19,20 +19,6 @@
 
 #include "thermal_core.h"
 
-static int of_thermal_get_crit_temp(struct thermal_zone_device *tz,
-				    int *temp)
-{
-	int i;
-
-	for (i = 0; i < tz->num_trips; i++)
-		if (tz->trips[i].type == THERMAL_TRIP_CRITICAL) {
-			*temp = tz->trips[i].temperature;
-			return 0;
-		}
-
-	return -EINVAL;
-}
-
 /***   functions parsing device tree nodes   ***/
 
 static int of_find_trip_id(struct device_node *np, struct device_node *trip)
@@ -529,7 +515,6 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor,
 		goto out_kfree_trips;
 	}
 
-	of_ops->get_crit_temp = of_ops->get_crit_temp ? : of_thermal_get_crit_temp;
 	of_ops->bind = thermal_of_bind;
 	of_ops->unbind = thermal_of_unbind;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 21/30] thermal/drivers/st: Use generic trip points
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (19 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 20/30] thermal/of: Remove of_thermal_get_crit_temp() Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 22/30] thermal/drivers/imx: Use generic thermal_zone_get_trip() function Daniel Lezcano
                   ` (8 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael; +Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert to the generic trip points

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/st/st_thermal.c | 47 +++++----------------------------
 1 file changed, 7 insertions(+), 40 deletions(-)

diff --git a/drivers/thermal/st/st_thermal.c b/drivers/thermal/st/st_thermal.c
index 1276b95604fe..c0d45cdd1c2f 100644
--- a/drivers/thermal/st/st_thermal.c
+++ b/drivers/thermal/st/st_thermal.c
@@ -134,48 +134,12 @@ static int st_thermal_get_temp(struct thermal_zone_device *th, int *temperature)
 	return 0;
 }
 
-static int st_thermal_get_trip_type(struct thermal_zone_device *th,
-				int trip, enum thermal_trip_type *type)
-{
-	struct st_thermal_sensor *sensor = th->devdata;
-	struct device *dev = sensor->dev;
-
-	switch (trip) {
-	case 0:
-		*type = THERMAL_TRIP_CRITICAL;
-		break;
-	default:
-		dev_err(dev, "invalid trip point\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int st_thermal_get_trip_temp(struct thermal_zone_device *th,
-				    int trip, int *temp)
-{
-	struct st_thermal_sensor *sensor = th->devdata;
-	struct device *dev = sensor->dev;
-
-	switch (trip) {
-	case 0:
-		*temp = mcelsius(sensor->cdata->crit_temp);
-		break;
-	default:
-		dev_err(dev, "Invalid trip point\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
 static struct thermal_zone_device_ops st_tz_ops = {
 	.get_temp	= st_thermal_get_temp,
-	.get_trip_type	= st_thermal_get_trip_type,
-	.get_trip_temp	= st_thermal_get_trip_temp,
 };
 
+static struct thermal_trip trip;
+
 int st_thermal_register(struct platform_device *pdev,
 			const struct of_device_id *st_thermal_of_match)
 {
@@ -238,9 +202,12 @@ int st_thermal_register(struct platform_device *pdev,
 
 	polling_delay = sensor->ops->register_enable_irq ? 0 : 1000;
 
+	trip.temperature = sensor->cdata->crit_temp;
+	trip.type = THERMAL_TRIP_CRITICAL;
+	
 	sensor->thermal_dev =
-		thermal_zone_device_register(dev_name(dev), 1, 0, sensor,
-					     &st_tz_ops, NULL, 0, polling_delay);
+		thermal_zone_device_register_with_trips(dev_name(dev), &trip, 1, 0, sensor,
+							&st_tz_ops, NULL, 0, polling_delay);
 	if (IS_ERR(sensor->thermal_dev)) {
 		dev_err(dev, "failed to register thermal zone device\n");
 		ret = PTR_ERR(sensor->thermal_dev);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 22/30] thermal/drivers/imx: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (20 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 21/30] thermal/drivers/st: Use generic trip points Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 23/30] thermal/drivers/rcar: " Daniel Lezcano
                   ` (7 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria, Shawn Guo,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	NXP Linux Team,
	moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/imx_thermal.c | 72 +++++++++++++----------------------
 1 file changed, 27 insertions(+), 45 deletions(-)

diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 16663373b682..fb0d5cab70af 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -76,7 +76,6 @@
 enum imx_thermal_trip {
 	IMX_TRIP_PASSIVE,
 	IMX_TRIP_CRITICAL,
-	IMX_TRIP_NUM,
 };
 
 #define IMX_POLLING_DELAY		2000 /* millisecond */
@@ -115,6 +114,11 @@ struct thermal_soc_data {
 	u32 low_alarm_shift;
 };
 
+static struct thermal_trip trips[] = {
+	[IMX_TRIP_PASSIVE]  = { .type = THERMAL_TRIP_PASSIVE  },
+	[IMX_TRIP_CRITICAL] = { .type = THERMAL_TRIP_CRITICAL },
+};
+
 static struct thermal_soc_data thermal_imx6q_data = {
 	.version = TEMPMON_IMX6Q,
 
@@ -201,8 +205,6 @@ struct imx_thermal_data {
 	struct thermal_cooling_device *cdev;
 	struct regmap *tempmon;
 	u32 c1, c2; /* See formula in imx_init_calib() */
-	int temp_passive;
-	int temp_critical;
 	int temp_max;
 	int alarm_temp;
 	int last_temp;
@@ -279,12 +281,12 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
 
 	/* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
 	if (data->socdata->version == TEMPMON_IMX6Q) {
-		if (data->alarm_temp == data->temp_passive &&
-			*temp >= data->temp_passive)
-			imx_set_alarm_temp(data, data->temp_critical);
-		if (data->alarm_temp == data->temp_critical &&
-			*temp < data->temp_passive) {
-			imx_set_alarm_temp(data, data->temp_passive);
+		if (data->alarm_temp == trips[IMX_TRIP_PASSIVE].temperature &&
+			*temp >= trips[IMX_TRIP_PASSIVE].temperature)
+			imx_set_alarm_temp(data, trips[IMX_TRIP_CRITICAL].temperature);
+		if (data->alarm_temp == trips[IMX_TRIP_CRITICAL].temperature &&
+			*temp < trips[IMX_TRIP_PASSIVE].temperature) {
+			imx_set_alarm_temp(data, trips[IMX_TRIP_PASSIVE].temperature);
 			dev_dbg(&tz->device, "thermal alarm off: T < %d\n",
 				data->alarm_temp / 1000);
 		}
@@ -330,29 +332,10 @@ static int imx_change_mode(struct thermal_zone_device *tz,
 	return 0;
 }
 
-static int imx_get_trip_type(struct thermal_zone_device *tz, int trip,
-			     enum thermal_trip_type *type)
-{
-	*type = (trip == IMX_TRIP_PASSIVE) ? THERMAL_TRIP_PASSIVE :
-					     THERMAL_TRIP_CRITICAL;
-	return 0;
-}
-
 static int imx_get_crit_temp(struct thermal_zone_device *tz, int *temp)
 {
-	struct imx_thermal_data *data = tz->devdata;
-
-	*temp = data->temp_critical;
-	return 0;
-}
-
-static int imx_get_trip_temp(struct thermal_zone_device *tz, int trip,
-			     int *temp)
-{
-	struct imx_thermal_data *data = tz->devdata;
+	*temp = trips[IMX_TRIP_CRITICAL].temperature;
 
-	*temp = (trip == IMX_TRIP_PASSIVE) ? data->temp_passive :
-					     data->temp_critical;
 	return 0;
 }
 
@@ -371,10 +354,10 @@ static int imx_set_trip_temp(struct thermal_zone_device *tz, int trip,
 		return -EPERM;
 
 	/* do not allow passive to be set higher than critical */
-	if (temp < 0 || temp > data->temp_critical)
+	if (temp < 0 || temp > trips[IMX_TRIP_CRITICAL].temperature)
 		return -EINVAL;
 
-	data->temp_passive = temp;
+	trips[IMX_TRIP_PASSIVE].temperature = temp;
 
 	imx_set_alarm_temp(data, temp);
 
@@ -423,8 +406,6 @@ static struct thermal_zone_device_ops imx_tz_ops = {
 	.unbind = imx_unbind,
 	.get_temp = imx_get_temp,
 	.change_mode = imx_change_mode,
-	.get_trip_type = imx_get_trip_type,
-	.get_trip_temp = imx_get_trip_temp,
 	.get_crit_temp = imx_get_crit_temp,
 	.set_trip_temp = imx_set_trip_temp,
 };
@@ -507,8 +488,8 @@ static void imx_init_temp_grade(struct platform_device *pdev, u32 ocotp_mem0)
 	 * Set the critical trip point at 5 °C under max
 	 * Set the passive trip point at 10 °C under max (changeable via sysfs)
 	 */
-	data->temp_critical = data->temp_max - (1000 * 5);
-	data->temp_passive = data->temp_max - (1000 * 10);
+	trips[IMX_TRIP_PASSIVE].temperature = data->temp_max - (1000 * 10);
+	trips[IMX_TRIP_CRITICAL].temperature = data->temp_max - (1000 * 5);
 }
 
 static int imx_init_from_tempmon_data(struct platform_device *pdev)
@@ -743,12 +724,13 @@ static int imx_thermal_probe(struct platform_device *pdev)
 		goto legacy_cleanup;
 	}
 
-	data->tz = thermal_zone_device_register("imx_thermal_zone",
-						IMX_TRIP_NUM,
-						BIT(IMX_TRIP_PASSIVE), data,
-						&imx_tz_ops, NULL,
-						IMX_PASSIVE_DELAY,
-						IMX_POLLING_DELAY);
+	data->tz = thermal_zone_device_register_with_trips("imx_thermal_zone",
+							   trips,
+							   ARRAY_SIZE(trips),
+							   BIT(IMX_TRIP_PASSIVE), data,
+							   &imx_tz_ops, NULL,
+							   IMX_PASSIVE_DELAY,
+							   IMX_POLLING_DELAY);
 	if (IS_ERR(data->tz)) {
 		ret = PTR_ERR(data->tz);
 		dev_err(&pdev->dev,
@@ -758,8 +740,8 @@ static int imx_thermal_probe(struct platform_device *pdev)
 
 	dev_info(&pdev->dev, "%s CPU temperature grade - max:%dC"
 		 " critical:%dC passive:%dC\n", data->temp_grade,
-		 data->temp_max / 1000, data->temp_critical / 1000,
-		 data->temp_passive / 1000);
+		 data->temp_max / 1000, trips[IMX_TRIP_CRITICAL].temperature / 1000,
+		 trips[IMX_TRIP_PASSIVE].temperature / 1000);
 
 	/* Enable measurements at ~ 10 Hz */
 	regmap_write(map, data->socdata->measure_freq_ctrl + REG_CLR,
@@ -767,10 +749,10 @@ static int imx_thermal_probe(struct platform_device *pdev)
 	measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
 	regmap_write(map, data->socdata->measure_freq_ctrl + REG_SET,
 		     measure_freq << data->socdata->measure_freq_shift);
-	imx_set_alarm_temp(data, data->temp_passive);
+	imx_set_alarm_temp(data, trips[IMX_TRIP_PASSIVE].temperature);
 
 	if (data->socdata->version == TEMPMON_IMX6SX)
-		imx_set_panic_temp(data, data->temp_critical);
+		imx_set_panic_temp(data, trips[IMX_TRIP_CRITICAL].temperature);
 
 	regmap_write(map, data->socdata->sensor_ctrl + REG_CLR,
 		     data->socdata->power_down_mask);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 23/30] thermal/drivers/rcar: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (21 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 22/30] thermal/drivers/imx: Use generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 24/30] thermal/drivers/broadcom: " Daniel Lezcano
                   ` (6 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Niklas Söderlund,
	Niklas Söderlund, Amit Kucheria,
	open list:RENESAS R-CAR THERMAL DRIVERS

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/thermal/rcar_thermal.c | 49 +++++-----------------------------
 1 file changed, 6 insertions(+), 43 deletions(-)

diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c
index 4df42d70d867..003457810072 100644
--- a/drivers/thermal/rcar_thermal.c
+++ b/drivers/thermal/rcar_thermal.c
@@ -278,52 +278,16 @@ static int rcar_thermal_get_temp(struct thermal_zone_device *zone, int *temp)
 	return rcar_thermal_get_current_temp(priv, temp);
 }
 
-static int rcar_thermal_get_trip_type(struct thermal_zone_device *zone,
-				      int trip, enum thermal_trip_type *type)
-{
-	struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone);
-	struct device *dev = rcar_priv_to_dev(priv);
-
-	/* see rcar_thermal_get_temp() */
-	switch (trip) {
-	case 0: /* +90 <= temp */
-		*type = THERMAL_TRIP_CRITICAL;
-		break;
-	default:
-		dev_err(dev, "rcar driver trip error\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int rcar_thermal_get_trip_temp(struct thermal_zone_device *zone,
-				      int trip, int *temp)
-{
-	struct rcar_thermal_priv *priv = rcar_zone_to_priv(zone);
-	struct device *dev = rcar_priv_to_dev(priv);
-
-	/* see rcar_thermal_get_temp() */
-	switch (trip) {
-	case 0: /* +90 <= temp */
-		*temp = MCELSIUS(90);
-		break;
-	default:
-		dev_err(dev, "rcar driver trip error\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
 static struct thermal_zone_device_ops rcar_thermal_zone_of_ops = {
 	.get_temp	= rcar_thermal_get_temp,
 };
 
 static struct thermal_zone_device_ops rcar_thermal_zone_ops = {
 	.get_temp	= rcar_thermal_get_temp,
-	.get_trip_type	= rcar_thermal_get_trip_type,
-	.get_trip_temp	= rcar_thermal_get_trip_temp,
+};
+
+static struct thermal_trip trips[] = {
+	{ .type = THERMAL_TRIP_CRITICAL, .temperature = 90000 }
 };
 
 /*
@@ -531,9 +495,8 @@ static int rcar_thermal_probe(struct platform_device *pdev)
 						dev, i, priv,
 						&rcar_thermal_zone_of_ops);
 		} else {
-			priv->zone = thermal_zone_device_register(
-						"rcar_thermal",
-						1, 0, priv,
+			priv->zone = thermal_zone_device_register_with_trips(
+				"rcar_thermal", trips, ARRAY_SIZE(trips), 0, priv,
 						&rcar_thermal_zone_ops, NULL, 0,
 						idle);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 24/30] thermal/drivers/broadcom: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (22 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 23/30] thermal/drivers/rcar: " Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:05 ` [PATCH v5 25/30] thermal/drivers/da9062: " Daniel Lezcano
                   ` (5 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Amit Kucheria,
	Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden,
	moderated list:BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE,
	moderated list:BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/broadcom/bcm2835_thermal.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/broadcom/bcm2835_thermal.c b/drivers/thermal/broadcom/bcm2835_thermal.c
index 2c67841a1115..5485e59d03a9 100644
--- a/drivers/thermal/broadcom/bcm2835_thermal.c
+++ b/drivers/thermal/broadcom/bcm2835_thermal.c
@@ -18,6 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/thermal.h>
 
+#include "../thermal_core.h"
 #include "../thermal_hwmon.h"
 
 #define BCM2835_TS_TSENSCTL			0x00
@@ -224,7 +225,8 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
 	 */
 	val = readl(data->regs + BCM2835_TS_TSENSCTL);
 	if (!(val & BCM2835_TS_TSENSCTL_RSTB)) {
-		int trip_temp, offset, slope;
+		struct thermal_trip trip;
+		int offset, slope;
 
 		slope = thermal_zone_get_slope(tz);
 		offset = thermal_zone_get_offset(tz);
@@ -232,7 +234,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
 		 * For now we deal only with critical, otherwise
 		 * would need to iterate
 		 */
-		err = tz->ops->get_trip_temp(tz, 0, &trip_temp);
+		err = thermal_zone_get_trip(tz, 0, &trip);
 		if (err < 0) {
 			dev_err(&pdev->dev,
 				"Not able to read trip_temp: %d\n",
@@ -249,7 +251,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
 		val |= (0xFE << BCM2835_TS_TSENSCTL_RSTDELAY_SHIFT);
 
 		/*  trip_adc value from info */
-		val |= bcm2835_thermal_temp2adc(trip_temp,
+		val |= bcm2835_thermal_temp2adc(trip.temperature,
 						offset,
 						slope)
 			<< BCM2835_TS_TSENSCTL_THOLD_SHIFT;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 25/30] thermal/drivers/da9062: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (23 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 24/30] thermal/drivers/broadcom: " Daniel Lezcano
@ 2022-09-26 14:05 ` Daniel Lezcano
  2022-09-26 14:06 ` [PATCH v5 26/30] thermal/drivers/ti: Remove unused macros ti_thermal_get_trip_value() / ti_thermal_trip_is_valid() Daniel Lezcano
                   ` (4 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:05 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Adam Ward, Support Opensource,
	Amit Kucheria

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Adam Ward <DLG-Adam.Ward.opensource@dm.renesas.com>
---
 drivers/thermal/da9062-thermal.c | 52 +++++---------------------------
 1 file changed, 8 insertions(+), 44 deletions(-)

diff --git a/drivers/thermal/da9062-thermal.c b/drivers/thermal/da9062-thermal.c
index 180edec34e07..1e163e90d6b6 100644
--- a/drivers/thermal/da9062-thermal.c
+++ b/drivers/thermal/da9062-thermal.c
@@ -120,44 +120,6 @@ static irqreturn_t da9062_thermal_irq_handler(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static int da9062_thermal_get_trip_type(struct thermal_zone_device *z,
-					int trip,
-					enum thermal_trip_type *type)
-{
-	struct da9062_thermal *thermal = z->devdata;
-
-	switch (trip) {
-	case 0:
-		*type = THERMAL_TRIP_HOT;
-		break;
-	default:
-		dev_err(thermal->dev,
-			"Driver does not support more than 1 trip-wire\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int da9062_thermal_get_trip_temp(struct thermal_zone_device *z,
-					int trip,
-					int *temp)
-{
-	struct da9062_thermal *thermal = z->devdata;
-
-	switch (trip) {
-	case 0:
-		*temp = DA9062_MILLI_CELSIUS(125);
-		break;
-	default:
-		dev_err(thermal->dev,
-			"Driver does not support more than 1 trip-wire\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
 static int da9062_thermal_get_temp(struct thermal_zone_device *z,
 				   int *temp)
 {
@@ -172,8 +134,10 @@ static int da9062_thermal_get_temp(struct thermal_zone_device *z,
 
 static struct thermal_zone_device_ops da9062_thermal_ops = {
 	.get_temp	= da9062_thermal_get_temp,
-	.get_trip_type	= da9062_thermal_get_trip_type,
-	.get_trip_temp	= da9062_thermal_get_trip_temp,
+};
+
+static struct thermal_trip trips[] = {
+	{ .temperature = DA9062_MILLI_CELSIUS(125), .type = THERMAL_TRIP_HOT },
 };
 
 static const struct da9062_thermal_config da9062_config = {
@@ -228,10 +192,10 @@ static int da9062_thermal_probe(struct platform_device *pdev)
 	INIT_DELAYED_WORK(&thermal->work, da9062_thermal_poll_on);
 	mutex_init(&thermal->lock);
 
-	thermal->zone = thermal_zone_device_register(thermal->config->name,
-					1, 0, thermal,
-					&da9062_thermal_ops, NULL, pp_tmp,
-					0);
+	thermal->zone = thermal_zone_device_register_with_trips(thermal->config->name,
+								trips, ARRAY_SIZE(trips), 0, thermal,
+								&da9062_thermal_ops, NULL, pp_tmp,
+								0);
 	if (IS_ERR(thermal->zone)) {
 		dev_err(&pdev->dev, "Cannot register thermal zone device\n");
 		ret = PTR_ERR(thermal->zone);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 26/30] thermal/drivers/ti: Remove unused macros ti_thermal_get_trip_value() / ti_thermal_trip_is_valid()
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (24 preceding siblings ...)
  2022-09-26 14:05 ` [PATCH v5 25/30] thermal/drivers/da9062: " Daniel Lezcano
@ 2022-09-26 14:06 ` Daniel Lezcano
  2022-09-26 14:06 ` [PATCH v5 27/30] thermal/drivers/acerhdf: Use generic thermal_zone_get_trip() function Daniel Lezcano
                   ` (3 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:06 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Eduardo Valentin, Keerthy,
	Amit Kucheria, open list:TI BANDGAP AND THERMAL DRIVER

The macros:

ti_thermal_get_trip_value()
 ti_thermal_trip_is_valid()

are unused. Remove them.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/ti-soc-thermal/ti-thermal.h | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal.h b/drivers/thermal/ti-soc-thermal/ti-thermal.h
index c388ecf31834..4fd2c20182d7 100644
--- a/drivers/thermal/ti-soc-thermal/ti-thermal.h
+++ b/drivers/thermal/ti-soc-thermal/ti-thermal.h
@@ -38,21 +38,6 @@
 /* Update rates */
 #define FAST_TEMP_MONITORING_RATE				250
 
-/* helper macros */
-/**
- * ti_thermal_get_trip_value - returns trip temperature based on index
- * @i:	trip index
- */
-#define ti_thermal_get_trip_value(i)					\
-	(OMAP_TRIP_HOT + ((i) * OMAP_TRIP_STEP))
-
-/**
- * ti_thermal_is_valid_trip - check for trip index
- * @i:	trip index
- */
-#define ti_thermal_is_valid_trip(trip)				\
-	((trip) >= 0 && (trip) < OMAP_TRIP_NUMBER)
-
 #ifdef CONFIG_TI_THERMAL
 int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id, char *domain);
 int ti_thermal_remove_sensor(struct ti_bandgap *bgp, int id);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 27/30] thermal/drivers/acerhdf: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (25 preceding siblings ...)
  2022-09-26 14:06 ` [PATCH v5 26/30] thermal/drivers/ti: Remove unused macros ti_thermal_get_trip_value() / ti_thermal_trip_is_valid() Daniel Lezcano
@ 2022-09-26 14:06 ` Daniel Lezcano
  2022-09-26 14:06 ` [PATCH v5 28/30] thermal/drivers/cxgb4: " Daniel Lezcano
                   ` (2 subsequent siblings)
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:06 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Hans de Goede,
	Peter Kästle, Mark Gross,
	open list:ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Peter Kästle <peter@piie.net>
---
 drivers/platform/x86/acerhdf.c | 73 ++++++++++++----------------------
 1 file changed, 26 insertions(+), 47 deletions(-)

diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index 3463629f8764..a7407aa032ba 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -46,6 +46,8 @@
  * measured by the on-die thermal monitor are within 0 <= Tj <= 90. So,
  * assume 89°C is critical temperature.
  */
+#define ACERHDF_DEFAULT_TEMP_FANON 60000
+#define ACERHDF_DEFAULT_TEMP_FANOFF 53000
 #define ACERHDF_TEMP_CRIT 89000
 #define ACERHDF_FAN_OFF 0
 #define ACERHDF_FAN_AUTO 1
@@ -70,8 +72,8 @@ static int kernelmode;
 #endif
 
 static unsigned int interval = 10;
-static unsigned int fanon = 60000;
-static unsigned int fanoff = 53000;
+static unsigned int fanon = ACERHDF_DEFAULT_TEMP_FANON;
+static unsigned int fanoff = ACERHDF_DEFAULT_TEMP_FANOFF;
 static unsigned int verbose;
 static unsigned int list_supported;
 static unsigned int fanstate = ACERHDF_FAN_AUTO;
@@ -137,6 +139,15 @@ struct ctrl_settings {
 	int mcmd_enable;
 };
 
+static struct thermal_trip trips[] = {
+	[0] = { .temperature = ACERHDF_DEFAULT_TEMP_FANON,
+		.hysteresis = ACERHDF_DEFAULT_TEMP_FANON - ACERHDF_DEFAULT_TEMP_FANOFF,
+		.type = THERMAL_TRIP_ACTIVE },
+
+	[1] = { .temperature = ACERHDF_TEMP_CRIT,
+		.type = THERMAL_TRIP_CRITICAL }
+};
+
 static struct ctrl_settings ctrl_cfg __read_mostly;
 
 /* Register addresses and values for different BIOS versions */
@@ -326,6 +337,15 @@ static void acerhdf_check_param(struct thermal_zone_device *thermal)
 		fanon = ACERHDF_MAX_FANON;
 	}
 
+	if (fanon < fanoff) {
+		pr_err("fanoff temperature (%d) is above fanon temperature (%d), clamping to %d\n",
+		       fanoff, fanon, fanon);
+		fanoff = fanon;
+	};
+
+	trips[0].temperature = fanon;
+	trips[0].hysteresis  = fanon - fanoff;
+
 	if (kernelmode && prev_interval != interval) {
 		if (interval > ACERHDF_MAX_INTERVAL) {
 			pr_err("interval too high, set to %d\n",
@@ -424,43 +444,6 @@ static int acerhdf_change_mode(struct thermal_zone_device *thermal,
 	return 0;
 }
 
-static int acerhdf_get_trip_type(struct thermal_zone_device *thermal, int trip,
-				 enum thermal_trip_type *type)
-{
-	if (trip == 0)
-		*type = THERMAL_TRIP_ACTIVE;
-	else if (trip == 1)
-		*type = THERMAL_TRIP_CRITICAL;
-	else
-		return -EINVAL;
-
-	return 0;
-}
-
-static int acerhdf_get_trip_hyst(struct thermal_zone_device *thermal, int trip,
-				 int *temp)
-{
-	if (trip != 0)
-		return -EINVAL;
-
-	*temp = fanon - fanoff;
-
-	return 0;
-}
-
-static int acerhdf_get_trip_temp(struct thermal_zone_device *thermal, int trip,
-				 int *temp)
-{
-	if (trip == 0)
-		*temp = fanon;
-	else if (trip == 1)
-		*temp = ACERHDF_TEMP_CRIT;
-	else
-		return -EINVAL;
-
-	return 0;
-}
-
 static int acerhdf_get_crit_temp(struct thermal_zone_device *thermal,
 				 int *temperature)
 {
@@ -474,13 +457,9 @@ static struct thermal_zone_device_ops acerhdf_dev_ops = {
 	.unbind = acerhdf_unbind,
 	.get_temp = acerhdf_get_ec_temp,
 	.change_mode = acerhdf_change_mode,
-	.get_trip_type = acerhdf_get_trip_type,
-	.get_trip_hyst = acerhdf_get_trip_hyst,
-	.get_trip_temp = acerhdf_get_trip_temp,
 	.get_crit_temp = acerhdf_get_crit_temp,
 };
 
-
 /*
  * cooling device callback functions
  * get maximal fan cooling state
@@ -710,10 +689,10 @@ static int __init acerhdf_register_thermal(void)
 	if (IS_ERR(cl_dev))
 		return -EINVAL;
 
-	thz_dev = thermal_zone_device_register("acerhdf", 2, 0, NULL,
-					      &acerhdf_dev_ops,
-					      &acerhdf_zone_params, 0,
-					      (kernelmode) ? interval*1000 : 0);
+	thz_dev = thermal_zone_device_register_with_trips("acerhdf", trips, ARRAY_SIZE(trips),
+							  0, NULL, &acerhdf_dev_ops,
+							  &acerhdf_zone_params, 0,
+							  (kernelmode) ? interval*1000 : 0);
 	if (IS_ERR(thz_dev))
 		return -EINVAL;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 28/30] thermal/drivers/cxgb4: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (26 preceding siblings ...)
  2022-09-26 14:06 ` [PATCH v5 27/30] thermal/drivers/acerhdf: Use generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 14:06 ` Daniel Lezcano
  2022-09-26 14:06 ` [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify Daniel Lezcano
  2022-09-26 14:06 ` [PATCH v5 30/30] thermal/drivers/intel: Use generic thermal_zone_get_trip() function Daniel Lezcano
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:06 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Jakub Kicinski, Raju Rangoju,
	David S. Miller, Eric Dumazet, Paolo Abeni,
	open list:CXGB4 ETHERNET DRIVER (CXGB4)

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Jakub Kicinski <kuba@kernel.org>
---
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h    |  2 -
 .../ethernet/chelsio/cxgb4/cxgb4_thermal.c    | 41 ++++---------------
 2 files changed, 8 insertions(+), 35 deletions(-)

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 5657ac8cfca0..fca9533bc011 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -1079,8 +1079,6 @@ struct mbox_list {
 #if IS_ENABLED(CONFIG_THERMAL)
 struct ch_thermal {
 	struct thermal_zone_device *tzdev;
-	int trip_temp;
-	int trip_type;
 };
 #endif
 
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c
index 9a6d65243334..1d49cfe3e2ab 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c
@@ -29,36 +29,12 @@ static int cxgb4_thermal_get_temp(struct thermal_zone_device *tzdev,
 	return 0;
 }
 
-static int cxgb4_thermal_get_trip_type(struct thermal_zone_device *tzdev,
-				       int trip, enum thermal_trip_type *type)
-{
-	struct adapter *adap = tzdev->devdata;
-
-	if (!adap->ch_thermal.trip_temp)
-		return -EINVAL;
-
-	*type = adap->ch_thermal.trip_type;
-	return 0;
-}
-
-static int cxgb4_thermal_get_trip_temp(struct thermal_zone_device *tzdev,
-				       int trip, int *temp)
-{
-	struct adapter *adap = tzdev->devdata;
-
-	if (!adap->ch_thermal.trip_temp)
-		return -EINVAL;
-
-	*temp = adap->ch_thermal.trip_temp;
-	return 0;
-}
-
 static struct thermal_zone_device_ops cxgb4_thermal_ops = {
 	.get_temp = cxgb4_thermal_get_temp,
-	.get_trip_type = cxgb4_thermal_get_trip_type,
-	.get_trip_temp = cxgb4_thermal_get_trip_temp,
 };
 
+static struct thermal_trip trip = { .type = THERMAL_TRIP_CRITICAL } ;
+
 int cxgb4_thermal_init(struct adapter *adap)
 {
 	struct ch_thermal *ch_thermal = &adap->ch_thermal;
@@ -79,15 +55,14 @@ int cxgb4_thermal_init(struct adapter *adap)
 	if (ret < 0) {
 		num_trip = 0; /* could not get trip temperature */
 	} else {
-		ch_thermal->trip_temp = val * 1000;
-		ch_thermal->trip_type = THERMAL_TRIP_CRITICAL;
+		trip.temperature = val * 1000;
 	}
-
+	
 	snprintf(ch_tz_name, sizeof(ch_tz_name), "cxgb4_%s", adap->name);
-	ch_thermal->tzdev = thermal_zone_device_register(ch_tz_name, num_trip,
-							 0, adap,
-							 &cxgb4_thermal_ops,
-							 NULL, 0, 0);
+	ch_thermal->tzdev = thermal_zone_device_register_with_trips(ch_tz_name, &trip, num_trip,
+								    0, adap,
+								    &cxgb4_thermal_ops,
+								    NULL, 0, 0);
 	if (IS_ERR(ch_thermal->tzdev)) {
 		ret = PTR_ERR(ch_thermal->tzdev);
 		dev_err(adap->pdev_dev, "Failed to register thermal zone\n");
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (27 preceding siblings ...)
  2022-09-26 14:06 ` [PATCH v5 28/30] thermal/drivers/cxgb4: " Daniel Lezcano
@ 2022-09-26 14:06 ` Daniel Lezcano
  2022-09-26 17:05   ` Nathan Chancellor
  2022-09-26 14:06 ` [PATCH v5 30/30] thermal/drivers/intel: Use generic thermal_zone_get_trip() function Daniel Lezcano
  29 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:06 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Srinivas Pandruvada,
	Amit Kucheria, Nathan Chancellor, Antoine Tenart

In the process of replacing the get_trip_* ops by the generic trip
points, the current code has an 'override' property to add another
indirection to a different ops.

Rework this approach to prevent this indirection and make the code
ready for the generic trip points conversion.

Actually the get_temp() is different regarding the platform, so it is
pointless to add a new set of ops but just create dynamically the ops
at init time.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
 .../int340x_thermal/int340x_thermal_zone.c    | 31 ++++++++-----------
 .../int340x_thermal/int340x_thermal_zone.h    |  4 +--
 .../processor_thermal_device.c                | 10 ++----
 3 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
index 62c0aa5d0783..10731b9a140a 100644
--- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
+++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
@@ -18,9 +18,6 @@ static int int340x_thermal_get_zone_temp(struct thermal_zone_device *zone,
 	unsigned long long tmp;
 	acpi_status status;
 
-	if (d->override_ops && d->override_ops->get_temp)
-		return d->override_ops->get_temp(zone, temp);
-
 	status = acpi_evaluate_integer(d->adev->handle, "_TMP", NULL, &tmp);
 	if (ACPI_FAILURE(status))
 		return -EIO;
@@ -46,9 +43,6 @@ static int int340x_thermal_get_trip_temp(struct thermal_zone_device *zone,
 	struct int34x_thermal_zone *d = zone->devdata;
 	int i;
 
-	if (d->override_ops && d->override_ops->get_trip_temp)
-		return d->override_ops->get_trip_temp(zone, trip, temp);
-
 	if (trip < d->aux_trip_nr)
 		*temp = d->aux_trips[trip];
 	else if (trip == d->crt_trip_id)
@@ -79,9 +73,6 @@ static int int340x_thermal_get_trip_type(struct thermal_zone_device *zone,
 	struct int34x_thermal_zone *d = zone->devdata;
 	int i;
 
-	if (d->override_ops && d->override_ops->get_trip_type)
-		return d->override_ops->get_trip_type(zone, trip, type);
-
 	if (trip < d->aux_trip_nr)
 		*type = THERMAL_TRIP_PASSIVE;
 	else if (trip == d->crt_trip_id)
@@ -112,9 +103,6 @@ static int int340x_thermal_set_trip_temp(struct thermal_zone_device *zone,
 	acpi_status status;
 	char name[10];
 
-	if (d->override_ops && d->override_ops->set_trip_temp)
-		return d->override_ops->set_trip_temp(zone, trip, temp);
-
 	snprintf(name, sizeof(name), "PAT%d", trip);
 	status = acpi_execute_simple_method(d->adev->handle, name,
 			millicelsius_to_deci_kelvin(temp));
@@ -134,9 +122,6 @@ static int int340x_thermal_get_trip_hyst(struct thermal_zone_device *zone,
 	acpi_status status;
 	unsigned long long hyst;
 
-	if (d->override_ops && d->override_ops->get_trip_hyst)
-		return d->override_ops->get_trip_hyst(zone, trip, temp);
-
 	status = acpi_evaluate_integer(d->adev->handle, "GTSH", NULL, &hyst);
 	if (ACPI_FAILURE(status))
 		*temp = 0;
@@ -217,7 +202,7 @@ static struct thermal_zone_params int340x_thermal_params = {
 };
 
 struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
-				struct thermal_zone_device_ops *override_ops)
+						     int (*get_temp) (struct thermal_zone_device *, int *))
 {
 	struct int34x_thermal_zone *int34x_thermal_zone;
 	acpi_status status;
@@ -231,8 +216,15 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
 		return ERR_PTR(-ENOMEM);
 
 	int34x_thermal_zone->adev = adev;
-	int34x_thermal_zone->override_ops = override_ops;
 
+	int34x_thermal_zone->ops = kmemdup(&int340x_thermal_zone_ops,
+					   sizeof(int340x_thermal_zone_ops), GFP_KERNEL);
+	if (!int34x_thermal_zone->ops)
+		goto err_ops_alloc;
+
+	if (get_temp)
+		int34x_thermal_zone->ops->get_temp = get_temp;
+	
 	status = acpi_evaluate_integer(adev->handle, "PATC", NULL, &trip_cnt);
 	if (ACPI_FAILURE(status))
 		trip_cnt = 0;
@@ -262,7 +254,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
 						acpi_device_bid(adev),
 						trip_cnt,
 						trip_mask, int34x_thermal_zone,
-						&int340x_thermal_zone_ops,
+						int34x_thermal_zone->ops,
 						&int340x_thermal_params,
 						0, 0);
 	if (IS_ERR(int34x_thermal_zone->zone)) {
@@ -281,6 +273,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
 	acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
 	kfree(int34x_thermal_zone->aux_trips);
 err_trip_alloc:
+	kfree(int34x_thermal_zone->ops);
+err_ops_alloc:
 	kfree(int34x_thermal_zone);
 	return ERR_PTR(ret);
 }
@@ -292,6 +286,7 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone
 	thermal_zone_device_unregister(int34x_thermal_zone->zone);
 	acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
 	kfree(int34x_thermal_zone->aux_trips);
+	kfree(int34x_thermal_zone->ops);
 	kfree(int34x_thermal_zone);
 }
 EXPORT_SYMBOL_GPL(int340x_thermal_zone_remove);
diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
index 3b4971df1b33..e28ab1ba5e06 100644
--- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
+++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
@@ -29,13 +29,13 @@ struct int34x_thermal_zone {
 	int hot_temp;
 	int hot_trip_id;
 	struct thermal_zone_device *zone;
-	struct thermal_zone_device_ops *override_ops;
+	struct thermal_zone_device_ops *ops;
 	void *priv_data;
 	struct acpi_lpat_conversion_table *lpat_table;
 };
 
 struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *,
-				struct thermal_zone_device_ops *override_ops);
+				int (*get_temp) (struct thermal_zone_device *, int *));
 void int340x_thermal_zone_remove(struct int34x_thermal_zone *);
 int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone);
 
diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
index a8d98f1bd6c6..317703027ce9 100644
--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
+++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
@@ -207,10 +207,6 @@ static int proc_thermal_get_zone_temp(struct thermal_zone_device *zone,
 	return ret;
 }
 
-static struct thermal_zone_device_ops proc_thermal_local_ops = {
-	.get_temp       = proc_thermal_get_zone_temp,
-};
-
 static int proc_thermal_read_ppcc(struct proc_thermal_device *proc_priv)
 {
 	int i;
@@ -285,7 +281,7 @@ int proc_thermal_add(struct device *dev, struct proc_thermal_device *proc_priv)
 	struct acpi_device *adev;
 	acpi_status status;
 	unsigned long long tmp;
-	struct thermal_zone_device_ops *ops = NULL;
+	int (*get_temp) (struct thermal_zone_device *, int *) = NULL;
 	int ret;
 
 	adev = ACPI_COMPANION(dev);
@@ -304,10 +300,10 @@ int proc_thermal_add(struct device *dev, struct proc_thermal_device *proc_priv)
 		/* there is no _TMP method, add local method */
 		stored_tjmax = get_tjmax();
 		if (stored_tjmax > 0)
-			ops = &proc_thermal_local_ops;
+			get_temp = proc_thermal_get_zone_temp;
 	}
 
-	proc_priv->int340x_zone = int340x_thermal_zone_add(adev, ops);
+	proc_priv->int340x_zone = int340x_thermal_zone_add(adev, get_temp);
 	if (IS_ERR(proc_priv->int340x_zone)) {
 		return PTR_ERR(proc_priv->int340x_zone);
 	} else
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v5 30/30] thermal/drivers/intel: Use generic thermal_zone_get_trip() function
  2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
                   ` (28 preceding siblings ...)
  2022-09-26 14:06 ` [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify Daniel Lezcano
@ 2022-09-26 14:06 ` Daniel Lezcano
  29 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 14:06 UTC (permalink / raw)
  To: daniel.lezcano, rafael
  Cc: linux-kernel, linux-pm, rui.zhang, Srinivas Pandruvada,
	Amit Kucheria, Jiang Jian

The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

Convert ops content logic into generic trip points and register them with the
thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
 drivers/thermal/intel/x86_pkg_temp_thermal.c | 120 ++++++++++---------
 1 file changed, 66 insertions(+), 54 deletions(-)

diff --git a/drivers/thermal/intel/x86_pkg_temp_thermal.c b/drivers/thermal/intel/x86_pkg_temp_thermal.c
index a0e234fce71a..e7c3b78d959c 100644
--- a/drivers/thermal/intel/x86_pkg_temp_thermal.c
+++ b/drivers/thermal/intel/x86_pkg_temp_thermal.c
@@ -53,6 +53,7 @@ struct zone_device {
 	u32				msr_pkg_therm_high;
 	struct delayed_work		work;
 	struct thermal_zone_device	*tzone;
+	struct thermal_trip		*trips;
 	struct cpumask			cpumask;
 };
 
@@ -138,40 +139,6 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
 	return -EINVAL;
 }
 
-static int sys_get_trip_temp(struct thermal_zone_device *tzd,
-			     int trip, int *temp)
-{
-	struct zone_device *zonedev = tzd->devdata;
-	unsigned long thres_reg_value;
-	u32 mask, shift, eax, edx;
-	int ret;
-
-	if (trip >= MAX_NUMBER_OF_TRIPS)
-		return -EINVAL;
-
-	if (trip) {
-		mask = THERM_MASK_THRESHOLD1;
-		shift = THERM_SHIFT_THRESHOLD1;
-	} else {
-		mask = THERM_MASK_THRESHOLD0;
-		shift = THERM_SHIFT_THRESHOLD0;
-	}
-
-	ret = rdmsr_on_cpu(zonedev->cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
-			   &eax, &edx);
-	if (ret < 0)
-		return ret;
-
-	thres_reg_value = (eax & mask) >> shift;
-	if (thres_reg_value)
-		*temp = zonedev->tj_max - thres_reg_value * 1000;
-	else
-		*temp = THERMAL_TEMP_INVALID;
-	pr_debug("sys_get_trip_temp %d\n", *temp);
-
-	return 0;
-}
-
 static int
 sys_set_trip_temp(struct thermal_zone_device *tzd, int trip, int temp)
 {
@@ -212,18 +179,9 @@ sys_set_trip_temp(struct thermal_zone_device *tzd, int trip, int temp)
 			l, h);
 }
 
-static int sys_get_trip_type(struct thermal_zone_device *thermal, int trip,
-			     enum thermal_trip_type *type)
-{
-	*type = THERMAL_TRIP_PASSIVE;
-	return 0;
-}
-
 /* Thermal zone callback registry */
 static struct thermal_zone_device_ops tzone_ops = {
 	.get_temp = sys_get_curr_temp,
-	.get_trip_temp = sys_get_trip_temp,
-	.get_trip_type = sys_get_trip_type,
 	.set_trip_temp = sys_set_trip_temp,
 };
 
@@ -328,6 +286,48 @@ static int pkg_thermal_notify(u64 msr_val)
 	return 0;
 }
 
+static struct thermal_trip *pkg_temp_thermal_trips_init(int cpu, int tj_max, int num_trips)
+{
+	struct thermal_trip *trips;
+	unsigned long thres_reg_value;
+	u32 mask, shift, eax, edx;
+	int ret, i;
+
+	trips = kzalloc(sizeof(*trips) * num_trips, GFP_KERNEL);
+	if (!trips)
+		return ERR_PTR(-ENOMEM);
+	
+	for (i = 0; i < num_trips; i++) {
+
+		if (i) {
+			mask = THERM_MASK_THRESHOLD1;
+			shift = THERM_SHIFT_THRESHOLD1;
+		} else {
+			mask = THERM_MASK_THRESHOLD0;
+			shift = THERM_SHIFT_THRESHOLD0;
+		}
+
+		ret = rdmsr_on_cpu(cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT,
+				   &eax, &edx);
+		if (ret < 0) {
+			kfree(trips);
+			return ERR_PTR(ret);
+		}
+
+		thres_reg_value = (eax & mask) >> shift;
+
+		trips[i].temperature = thres_reg_value ?
+			tj_max - thres_reg_value * 1000 : THERMAL_TEMP_INVALID;
+
+		trips[i].type = THERMAL_TRIP_PASSIVE;
+		
+		pr_debug("%s: cpu=%d, trip=%d, temp=%d\n",
+			 __func__, cpu, i, trips[i].temperature);
+	}
+
+	return trips;
+}
+
 static int pkg_temp_thermal_device_add(unsigned int cpu)
 {
 	int id = topology_logical_die_id(cpu);
@@ -353,24 +353,27 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
 	if (!zonedev)
 		return -ENOMEM;
 
+	zonedev->trips = pkg_temp_thermal_trips_init(cpu, tj_max, thres_count);
+	if (IS_ERR(zonedev->trips)) {
+		err = PTR_ERR(zonedev->trips);
+		goto out_kfree_zonedev;
+	}
+	
 	INIT_DELAYED_WORK(&zonedev->work, pkg_temp_thermal_threshold_work_fn);
 	zonedev->cpu = cpu;
 	zonedev->tj_max = tj_max;
-	zonedev->tzone = thermal_zone_device_register("x86_pkg_temp",
-			thres_count,
+	zonedev->tzone = thermal_zone_device_register_with_trips("x86_pkg_temp",
+			zonedev->trips, thres_count,
 			(thres_count == MAX_NUMBER_OF_TRIPS) ? 0x03 : 0x01,
 			zonedev, &tzone_ops, &pkg_temp_tz_params, 0, 0);
 	if (IS_ERR(zonedev->tzone)) {
 		err = PTR_ERR(zonedev->tzone);
-		kfree(zonedev);
-		return err;
+		goto out_kfree_trips;
 	}
 	err = thermal_zone_device_enable(zonedev->tzone);
-	if (err) {
-		thermal_zone_device_unregister(zonedev->tzone);
-		kfree(zonedev);
-		return err;
-	}
+	if (err)
+		goto out_unregister_tz;
+
 	/* Store MSR value for package thermal interrupt, to restore at exit */
 	rdmsr(MSR_IA32_PACKAGE_THERM_INTERRUPT, zonedev->msr_pkg_therm_low,
 	      zonedev->msr_pkg_therm_high);
@@ -379,7 +382,14 @@ static int pkg_temp_thermal_device_add(unsigned int cpu)
 	raw_spin_lock_irq(&pkg_temp_lock);
 	zones[id] = zonedev;
 	raw_spin_unlock_irq(&pkg_temp_lock);
-	return 0;
+
+out_unregister_tz:	
+	thermal_zone_device_unregister(zonedev->tzone);
+out_kfree_trips:
+	kfree(zonedev->trips);
+out_kfree_zonedev:
+	kfree(zonedev);
+	return err;
 }
 
 static int pkg_thermal_cpu_offline(unsigned int cpu)
@@ -463,8 +473,10 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
 	raw_spin_unlock_irq(&pkg_temp_lock);
 
 	/* Final cleanup if this is the last cpu */
-	if (lastcpu)
+	if (lastcpu) {
+		kfree(zonedev->trips);
 		kfree(zonedev);
+	}
 	return 0;
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify
  2022-09-26 14:06 ` [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify Daniel Lezcano
@ 2022-09-26 17:05   ` Nathan Chancellor
  2022-09-26 21:33     ` Daniel Lezcano
  0 siblings, 1 reply; 43+ messages in thread
From: Nathan Chancellor @ 2022-09-26 17:05 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: rafael, linux-kernel, linux-pm, rui.zhang, Srinivas Pandruvada,
	Amit Kucheria, Antoine Tenart

Hi Daniel,

On Mon, Sep 26, 2022 at 04:06:03PM +0200, Daniel Lezcano wrote:
> In the process of replacing the get_trip_* ops by the generic trip
> points, the current code has an 'override' property to add another
> indirection to a different ops.
> 
> Rework this approach to prevent this indirection and make the code
> ready for the generic trip points conversion.
> 
> Actually the get_temp() is different regarding the platform, so it is
> pointless to add a new set of ops but just create dynamically the ops
> at init time.
> 
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> ---
>  .../int340x_thermal/int340x_thermal_zone.c    | 31 ++++++++-----------
>  .../int340x_thermal/int340x_thermal_zone.h    |  4 +--
>  .../processor_thermal_device.c                | 10 ++----
>  3 files changed, 18 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
> index 62c0aa5d0783..10731b9a140a 100644
> --- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
> +++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
> @@ -18,9 +18,6 @@ static int int340x_thermal_get_zone_temp(struct thermal_zone_device *zone,
>  	unsigned long long tmp;
>  	acpi_status status;
>  
> -	if (d->override_ops && d->override_ops->get_temp)
> -		return d->override_ops->get_temp(zone, temp);
> -
>  	status = acpi_evaluate_integer(d->adev->handle, "_TMP", NULL, &tmp);
>  	if (ACPI_FAILURE(status))
>  		return -EIO;
> @@ -46,9 +43,6 @@ static int int340x_thermal_get_trip_temp(struct thermal_zone_device *zone,
>  	struct int34x_thermal_zone *d = zone->devdata;
>  	int i;
>  
> -	if (d->override_ops && d->override_ops->get_trip_temp)
> -		return d->override_ops->get_trip_temp(zone, trip, temp);
> -
>  	if (trip < d->aux_trip_nr)
>  		*temp = d->aux_trips[trip];
>  	else if (trip == d->crt_trip_id)
> @@ -79,9 +73,6 @@ static int int340x_thermal_get_trip_type(struct thermal_zone_device *zone,
>  	struct int34x_thermal_zone *d = zone->devdata;
>  	int i;
>  
> -	if (d->override_ops && d->override_ops->get_trip_type)
> -		return d->override_ops->get_trip_type(zone, trip, type);
> -
>  	if (trip < d->aux_trip_nr)
>  		*type = THERMAL_TRIP_PASSIVE;
>  	else if (trip == d->crt_trip_id)
> @@ -112,9 +103,6 @@ static int int340x_thermal_set_trip_temp(struct thermal_zone_device *zone,
>  	acpi_status status;
>  	char name[10];
>  
> -	if (d->override_ops && d->override_ops->set_trip_temp)
> -		return d->override_ops->set_trip_temp(zone, trip, temp);
> -
>  	snprintf(name, sizeof(name), "PAT%d", trip);
>  	status = acpi_execute_simple_method(d->adev->handle, name,
>  			millicelsius_to_deci_kelvin(temp));
> @@ -134,9 +122,6 @@ static int int340x_thermal_get_trip_hyst(struct thermal_zone_device *zone,
>  	acpi_status status;
>  	unsigned long long hyst;
>  
> -	if (d->override_ops && d->override_ops->get_trip_hyst)
> -		return d->override_ops->get_trip_hyst(zone, trip, temp);
> -
>  	status = acpi_evaluate_integer(d->adev->handle, "GTSH", NULL, &hyst);
>  	if (ACPI_FAILURE(status))
>  		*temp = 0;
> @@ -217,7 +202,7 @@ static struct thermal_zone_params int340x_thermal_params = {
>  };
>  
>  struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
> -				struct thermal_zone_device_ops *override_ops)
> +						     int (*get_temp) (struct thermal_zone_device *, int *))
>  {
>  	struct int34x_thermal_zone *int34x_thermal_zone;
>  	acpi_status status;
> @@ -231,8 +216,15 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
>  		return ERR_PTR(-ENOMEM);
>  
>  	int34x_thermal_zone->adev = adev;
> -	int34x_thermal_zone->override_ops = override_ops;
>  
> +	int34x_thermal_zone->ops = kmemdup(&int340x_thermal_zone_ops,
> +					   sizeof(int340x_thermal_zone_ops), GFP_KERNEL);
> +	if (!int34x_thermal_zone->ops)
> +		goto err_ops_alloc;

I assume I was cc'd on this change due to my fix up patch:

https://lore.kernel.org/20220923152009.1721739-1-nathan@kernel.org/

However, I don't see that applied here. I don't mind it being squashed
in to keep the build as clean as possible through bisects.

Additionally, I did a diff of v4 to v5 to apply on top of next-20220923
and I noticed there were a significant number of places where there was
whitespace added where it probably should not have been. Other than
that, v5 works on all the machines that had issues so thank you for the
quick fix!

Cheers,
Nathan

> +	if (get_temp)
> +		int34x_thermal_zone->ops->get_temp = get_temp;
> +	
>  	status = acpi_evaluate_integer(adev->handle, "PATC", NULL, &trip_cnt);
>  	if (ACPI_FAILURE(status))
>  		trip_cnt = 0;
> @@ -262,7 +254,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
>  						acpi_device_bid(adev),
>  						trip_cnt,
>  						trip_mask, int34x_thermal_zone,
> -						&int340x_thermal_zone_ops,
> +						int34x_thermal_zone->ops,
>  						&int340x_thermal_params,
>  						0, 0);
>  	if (IS_ERR(int34x_thermal_zone->zone)) {
> @@ -281,6 +273,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
>  	acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
>  	kfree(int34x_thermal_zone->aux_trips);
>  err_trip_alloc:
> +	kfree(int34x_thermal_zone->ops);
> +err_ops_alloc:
>  	kfree(int34x_thermal_zone);
>  	return ERR_PTR(ret);
>  }
> @@ -292,6 +286,7 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone
>  	thermal_zone_device_unregister(int34x_thermal_zone->zone);
>  	acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
>  	kfree(int34x_thermal_zone->aux_trips);
> +	kfree(int34x_thermal_zone->ops);
>  	kfree(int34x_thermal_zone);
>  }
>  EXPORT_SYMBOL_GPL(int340x_thermal_zone_remove);
> diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
> index 3b4971df1b33..e28ab1ba5e06 100644
> --- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
> +++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h
> @@ -29,13 +29,13 @@ struct int34x_thermal_zone {
>  	int hot_temp;
>  	int hot_trip_id;
>  	struct thermal_zone_device *zone;
> -	struct thermal_zone_device_ops *override_ops;
> +	struct thermal_zone_device_ops *ops;
>  	void *priv_data;
>  	struct acpi_lpat_conversion_table *lpat_table;
>  };
>  
>  struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *,
> -				struct thermal_zone_device_ops *override_ops);
> +				int (*get_temp) (struct thermal_zone_device *, int *));
>  void int340x_thermal_zone_remove(struct int34x_thermal_zone *);
>  int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone);
>  
> diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> index a8d98f1bd6c6..317703027ce9 100644
> --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> @@ -207,10 +207,6 @@ static int proc_thermal_get_zone_temp(struct thermal_zone_device *zone,
>  	return ret;
>  }
>  
> -static struct thermal_zone_device_ops proc_thermal_local_ops = {
> -	.get_temp       = proc_thermal_get_zone_temp,
> -};
> -
>  static int proc_thermal_read_ppcc(struct proc_thermal_device *proc_priv)
>  {
>  	int i;
> @@ -285,7 +281,7 @@ int proc_thermal_add(struct device *dev, struct proc_thermal_device *proc_priv)
>  	struct acpi_device *adev;
>  	acpi_status status;
>  	unsigned long long tmp;
> -	struct thermal_zone_device_ops *ops = NULL;
> +	int (*get_temp) (struct thermal_zone_device *, int *) = NULL;
>  	int ret;
>  
>  	adev = ACPI_COMPANION(dev);
> @@ -304,10 +300,10 @@ int proc_thermal_add(struct device *dev, struct proc_thermal_device *proc_priv)
>  		/* there is no _TMP method, add local method */
>  		stored_tjmax = get_tjmax();
>  		if (stored_tjmax > 0)
> -			ops = &proc_thermal_local_ops;
> +			get_temp = proc_thermal_get_zone_temp;
>  	}
>  
> -	proc_priv->int340x_zone = int340x_thermal_zone_add(adev, ops);
> +	proc_priv->int340x_zone = int340x_thermal_zone_add(adev, get_temp);
>  	if (IS_ERR(proc_priv->int340x_zone)) {
>  		return PTR_ERR(proc_priv->int340x_zone);
>  	} else
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function
  2022-09-26 14:05 ` [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function Daniel Lezcano
@ 2022-09-26 19:01   ` Rafael J. Wysocki
  0 siblings, 0 replies; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-26 19:01 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Amit Kucheria

On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> The thermal_zone_device_ops structure defines a set of ops family,
> get_trip_temp(), get_trip_hyst(), get_trip_type(). Each of them is
> returning a property of a trip point.
>
> The result is the code is calling the ops everywhere to get a trip
> point which is supposed to be defined in the backend driver. It is a
> non-sense as a thermal trip can be generic and used by the backend
> driver to declare its trip points.
>
> Part of the thermal framework has been changed and all the OF thermal
> drivers are using the same definition for the trip point and use a
> thermal zone registration variant to pass those trip points which are
> part of the thermal zone device structure.
>
> Consequently, we can use a generic function to get the trip points
> when they are stored in the thermal zone device structure.
>
> This approach can be generalized to all the drivers and we can get rid
> of the ops->get_trip_*. That will result to a much more simpler code
> and make possible to rework how the thermal trip are handled in the
> thermal core framework as discussed previously.
>
> This change adds a function thermal_zone_get_trip() where we get the
> thermal trip point structure which contains all the properties (type,
> temp, hyst) instead of doing multiple calls to ops->get_trip_*.
>
> That opens the door for trip point extension with more attributes. For
> instance, replacing the trip points disabled bitmask with a 'disabled'
> field in the structure.
>
> Here we replace all the calls to ops->get_trip_* in the thermal core
> code with a call to the thermal_zone_get_trip() function.
>
> While at it, add the thermal_zone_get_num_trips() to encapsulate the
> code more and reduce the grip with the thermal framework internals.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> Reviewed-by: Zhang Rui <rui.zhang@intel.com>
> ---
>  drivers/thermal/thermal_core.c    | 115 ++++++++++++++++++++++++------
>  drivers/thermal/thermal_core.h    |   2 +
>  drivers/thermal/thermal_helpers.c |  28 ++++----
>  drivers/thermal/thermal_netlink.c |  21 +++---
>  drivers/thermal/thermal_sysfs.c   |  66 +++++++----------
>  include/linux/thermal.h           |   5 ++
>  6 files changed, 148 insertions(+), 89 deletions(-)
>
> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
> index 99c0c19fa5a6..903a858df35f 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -341,35 +341,31 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
>                 tz->ops->critical(tz);
>  }
>
> -static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
> +static void handle_thermal_trip(struct thermal_zone_device *tz, int trip_id)
>  {
> -       enum thermal_trip_type type;
> -       int trip_temp, hyst = 0;
> +       struct thermal_trip trip;
>
>         /* Ignore disabled trip points */
> -       if (test_bit(trip, &tz->trips_disabled))
> +       if (test_bit(trip_id, &tz->trips_disabled))
>                 return;
>
> -       tz->ops->get_trip_temp(tz, trip, &trip_temp);
> -       tz->ops->get_trip_type(tz, trip, &type);
> -       if (tz->ops->get_trip_hyst)
> -               tz->ops->get_trip_hyst(tz, trip, &hyst);
> +       __thermal_zone_get_trip(tz, trip_id, &trip);
>
>         if (tz->last_temperature != THERMAL_TEMP_INVALID) {
> -               if (tz->last_temperature < trip_temp &&
> -                   tz->temperature >= trip_temp)
> -                       thermal_notify_tz_trip_up(tz->id, trip,
> +               if (tz->last_temperature < trip.temperature &&
> +                   tz->temperature >= trip.temperature)
> +                       thermal_notify_tz_trip_up(tz->id, trip_id,
>                                                   tz->temperature);
> -               if (tz->last_temperature >= trip_temp &&
> -                   tz->temperature < (trip_temp - hyst))
> -                       thermal_notify_tz_trip_down(tz->id, trip,
> +               if (tz->last_temperature >= trip.temperature &&
> +                   tz->temperature < (trip.temperature - trip.hysteresis))
> +                       thermal_notify_tz_trip_down(tz->id, trip_id,
>                                                     tz->temperature);
>         }
>
> -       if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
> -               handle_critical_trips(tz, trip, trip_temp, type);
> +       if (trip.type == THERMAL_TRIP_CRITICAL || trip.type == THERMAL_TRIP_HOT)
> +               handle_critical_trips(tz, trip_id, trip.temperature, trip.type);
>         else
> -               handle_non_critical_trips(tz, trip);
> +               handle_non_critical_trips(tz, trip_id);
>  }
>
>  static void update_temperature(struct thermal_zone_device *tz)
> @@ -1142,6 +1138,80 @@ static void thermal_set_delay_jiffies(unsigned long *delay_jiffies, int delay_ms
>                 *delay_jiffies = round_jiffies(*delay_jiffies);
>  }
>
> +int thermal_zone_get_num_trips(struct thermal_zone_device *tz)
> +{
> +       return tz->num_trips;
> +}
> +EXPORT_SYMBOL_GPL(thermal_zone_get_num_trips);
> +
> +int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp)
> +{
> +       int i, ret = 0;

int i, ret = -EINVAL;

> +
> +       if (tz->ops->get_crit_temp)
> +               return tz->ops->get_crit_temp(tz, temp);
> +
> +       if (!tz->trips)
> +               return -EINVAL;
> +
> +       mutex_lock(&tz->lock);
> +
> +       for (i = 0; i < tz->num_trips; i++) {
> +               if (tz->trips[i].type == THERMAL_TRIP_CRITICAL) {
> +                       *temp = tz->trips[i].temperature;
> +                       goto out;

ret = 0;
break;

instead of the goto.

> +               }
> +       }
> +
> +       ret = -EINVAL;
> +out:

And the two lines above go away.

> +       mutex_unlock(&tz->lock);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);

The rest of the patch looks fine to me.

> +
> +int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
> +                           struct thermal_trip *trip)
> +{
> +       int ret;
> +
> +       if (!tz || trip_id < 0 || trip_id >= tz->num_trips || !trip)
> +               return -EINVAL;
> +
> +       if (tz->trips) {
> +               *trip = tz->trips[trip_id];
> +               return 0;
> +       }
> +
> +       if (tz->ops->get_trip_hyst) {
> +               ret = tz->ops->get_trip_hyst(tz, trip_id, &trip->hysteresis);
> +               if (ret)
> +                       return ret;
> +       } else {
> +               trip->hysteresis = 0;
> +       }
> +
> +       ret = tz->ops->get_trip_temp(tz, trip_id, &trip->temperature);
> +       if (ret)
> +               return ret;
> +
> +       return tz->ops->get_trip_type(tz, trip_id, &trip->type);
> +}
> +
> +int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
> +                         struct thermal_trip *trip)
> +{
> +       int ret;
> +
> +       mutex_lock(&tz->lock);
> +       ret = __thermal_zone_get_trip(tz, trip_id, trip);
> +       mutex_unlock(&tz->lock);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL_GPL(thermal_zone_get_trip);
> +
>  /**
>   * thermal_zone_device_register_with_trips() - register a new thermal zone device
>   * @type:      the thermal zone device type
> @@ -1174,8 +1244,6 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
>                                         int polling_delay)
>  {
>         struct thermal_zone_device *tz;
> -       enum thermal_trip_type trip_type;
> -       int trip_temp;
>         int id;
>         int result;
>         int count;
> @@ -1202,7 +1270,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
>                 return ERR_PTR(-EINVAL);
>         }
>
> -       if (num_trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp))
> +       if (num_trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp) && !trips)
>                 return ERR_PTR(-EINVAL);
>
>         tz = kzalloc(sizeof(*tz), GFP_KERNEL);
> @@ -1252,9 +1320,10 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
>                 goto release_device;
>
>         for (count = 0; count < num_trips; count++) {
> -               if (tz->ops->get_trip_type(tz, count, &trip_type) ||
> -                   tz->ops->get_trip_temp(tz, count, &trip_temp) ||
> -                   !trip_temp)
> +               struct thermal_trip trip;
> +
> +               result = thermal_zone_get_trip(tz, count, &trip);
> +               if (result)
>                         set_bit(count, &tz->trips_disabled);
>         }
>
> diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
> index 1571917bd3c8..879e91a48435 100644
> --- a/drivers/thermal/thermal_core.h
> +++ b/drivers/thermal/thermal_core.h
> @@ -113,6 +113,8 @@ int thermal_build_list_of_policies(char *buf);
>  /* Helpers */
>  void thermal_zone_set_trips(struct thermal_zone_device *tz);
>  void __thermal_zone_set_trips(struct thermal_zone_device *tz);
> +int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
> +                           struct thermal_trip *trip);
>  int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
>
>  /* sysfs I/F */
> diff --git a/drivers/thermal/thermal_helpers.c b/drivers/thermal/thermal_helpers.c
> index c65cdce8f856..06dded36e95e 100644
> --- a/drivers/thermal/thermal_helpers.c
> +++ b/drivers/thermal/thermal_helpers.c
> @@ -69,7 +69,7 @@ int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
>         int ret = -EINVAL;
>         int count;
>         int crit_temp = INT_MAX;
> -       enum thermal_trip_type type;
> +       struct thermal_trip trip;
>
>         lockdep_assert_held(&tz->lock);
>
> @@ -80,10 +80,9 @@ int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp)
>
>         if (IS_ENABLED(CONFIG_THERMAL_EMULATION) && tz->emul_temperature) {
>                 for (count = 0; count < tz->num_trips; count++) {
> -                       ret = tz->ops->get_trip_type(tz, count, &type);
> -                       if (!ret && type == THERMAL_TRIP_CRITICAL) {
> -                               ret = tz->ops->get_trip_temp(tz, count,
> -                                               &crit_temp);
> +                       ret = __thermal_zone_get_trip(tz, count, &trip);
> +                       if (!ret && trip.type == THERMAL_TRIP_CRITICAL) {
> +                               crit_temp = trip.temperature;
>                                 break;
>                         }
>                 }
> @@ -124,29 +123,30 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_temp);
>
>  void __thermal_zone_set_trips(struct thermal_zone_device *tz)
>  {
> -       int low = -INT_MAX;
> -       int high = INT_MAX;
> -       int trip_temp, hysteresis;
> +       struct thermal_trip trip;
> +       int low = -INT_MAX, high = INT_MAX;
>         int i, ret;
>
>         lockdep_assert_held(&tz->lock);
>
> -       if (!tz->ops->set_trips || !tz->ops->get_trip_hyst)
> +       if (!tz->ops->set_trips)
>                 return;
>
>         for (i = 0; i < tz->num_trips; i++) {
>                 int trip_low;
>
> -               tz->ops->get_trip_temp(tz, i, &trip_temp);
> -               tz->ops->get_trip_hyst(tz, i, &hysteresis);
> +               ret = __thermal_zone_get_trip(tz, i , &trip);
> +               if (ret)
> +                       return;
>
> -               trip_low = trip_temp - hysteresis;
> +               trip_low = trip.temperature - trip.hysteresis;
>
>                 if (trip_low < tz->temperature && trip_low > low)
>                         low = trip_low;
>
> -               if (trip_temp > tz->temperature && trip_temp < high)
> -                       high = trip_temp;
> +               if (trip.temperature > tz->temperature &&
> +                   trip.temperature < high)
> +                       high = trip.temperature;
>         }
>
>         /* No need to change trip points */
> diff --git a/drivers/thermal/thermal_netlink.c b/drivers/thermal/thermal_netlink.c
> index 050d243a5fa1..2a3190d55358 100644
> --- a/drivers/thermal/thermal_netlink.c
> +++ b/drivers/thermal/thermal_netlink.c
> @@ -452,7 +452,8 @@ static int thermal_genl_cmd_tz_get_trip(struct param *p)
>         struct sk_buff *msg = p->msg;
>         struct thermal_zone_device *tz;
>         struct nlattr *start_trip;
> -       int i, id;
> +       struct thermal_trip trip;
> +       int ret, i, id;
>
>         if (!p->attrs[THERMAL_GENL_ATTR_TZ_ID])
>                 return -EINVAL;
> @@ -471,18 +472,14 @@ static int thermal_genl_cmd_tz_get_trip(struct param *p)
>
>         for (i = 0; i < tz->num_trips; i++) {
>
> -               enum thermal_trip_type type;
> -               int temp, hyst = 0;
> -
> -               tz->ops->get_trip_type(tz, i, &type);
> -               tz->ops->get_trip_temp(tz, i, &temp);
> -               if (tz->ops->get_trip_hyst)
> -                       tz->ops->get_trip_hyst(tz, i, &hyst);
> -
> +               ret = __thermal_zone_get_trip(tz, i, &trip);
> +               if (ret)
> +                       goto out_cancel_nest;
> +
>                 if (nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_ID, i) ||
> -                   nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TYPE, type) ||
> -                   nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TEMP, temp) ||
> -                   nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_HYST, hyst))
> +                   nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TYPE, trip.type) ||
> +                   nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_TEMP, trip.temperature) ||
> +                   nla_put_u32(msg, THERMAL_GENL_ATTR_TZ_TRIP_HYST, trip.hysteresis))
>                         goto out_cancel_nest;
>         }
>
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index 78c5841bdfae..75f6b151a58b 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -83,20 +83,17 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr,
>                      char *buf)
>  {
>         struct thermal_zone_device *tz = to_thermal_zone(dev);
> -       enum thermal_trip_type type;
> -       int trip, result;
> +       struct thermal_trip trip;
> +       int trip_id, result;
>
> -       if (!tz->ops->get_trip_type)
> -               return -EPERM;
> -
> -       if (sscanf(attr->attr.name, "trip_point_%d_type", &trip) != 1)
> +       if (sscanf(attr->attr.name, "trip_point_%d_type", &trip_id) != 1)
>                 return -EINVAL;
>
> -       result = tz->ops->get_trip_type(tz, trip, &type);
> +       result = thermal_zone_get_trip(tz, trip_id, &trip);
>         if (result)
>                 return result;
>
> -       switch (type) {
> +       switch (trip.type) {
>         case THERMAL_TRIP_CRITICAL:
>                 return sprintf(buf, "critical\n");
>         case THERMAL_TRIP_HOT:
> @@ -115,37 +112,31 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
>                       const char *buf, size_t count)
>  {
>         struct thermal_zone_device *tz = to_thermal_zone(dev);
> -       int trip, ret;
> -       int temperature, hyst = 0;
> -       enum thermal_trip_type type;
> +       struct thermal_trip trip;
> +       int trip_id, ret;
>
>         if (!tz->ops->set_trip_temp && !tz->trips)
>                 return -EPERM;
>
> -       if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip) != 1)
> +       if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
>                 return -EINVAL;
>
> -       if (kstrtoint(buf, 10, &temperature))
> +       if (kstrtoint(buf, 10, &trip.temperature))
>                 return -EINVAL;
>
> -       ret = tz->ops->set_trip_temp(tz, trip, temperature);
> +       ret = tz->ops->set_trip_temp(tz, trip_id, trip.temperature);
>         if (ret)
>                 return ret;
>
>         if (tz->trips)
> -               tz->trips[trip].temperature = temperature;
> -
> -       if (tz->ops->get_trip_hyst) {
> -               ret = tz->ops->get_trip_hyst(tz, trip, &hyst);
> -               if (ret)
> -                       return ret;
> -       }
> +               tz->trips[trip_id].temperature = trip.temperature;
>
> -       ret = tz->ops->get_trip_type(tz, trip, &type);
> +       ret = thermal_zone_get_trip(tz, trip_id, &trip);
>         if (ret)
>                 return ret;
>
> -       thermal_notify_tz_trip_change(tz->id, trip, type, temperature, hyst);
> +       thermal_notify_tz_trip_change(tz->id, trip_id, trip.type,
> +                                     trip.temperature, trip.hysteresis);
>
>         thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
>
> @@ -157,21 +148,17 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr,
>                      char *buf)
>  {
>         struct thermal_zone_device *tz = to_thermal_zone(dev);
> -       int trip, ret;
> -       int temperature;
> -
> -       if (!tz->ops->get_trip_temp)
> -               return -EPERM;
> +       struct thermal_trip trip;
> +       int trip_id, ret;
>
> -       if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip) != 1)
> +       if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
>                 return -EINVAL;
>
> -       ret = tz->ops->get_trip_temp(tz, trip, &temperature);
> -
> +       ret = thermal_zone_get_trip(tz, trip_id, &trip);
>         if (ret)
>                 return ret;
>
> -       return sprintf(buf, "%d\n", temperature);
> +       return sprintf(buf, "%d\n", trip.temperature);
>  }
>
>  static ssize_t
> @@ -209,18 +196,17 @@ trip_point_hyst_show(struct device *dev, struct device_attribute *attr,
>                      char *buf)
>  {
>         struct thermal_zone_device *tz = to_thermal_zone(dev);
> -       int trip, ret;
> -       int temperature;
> +       struct thermal_trip trip;
> +       int trip_id, ret;
>
> -       if (!tz->ops->get_trip_hyst)
> -               return -EPERM;
> -
> -       if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip) != 1)
> +       if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1)
>                 return -EINVAL;
>
> -       ret = tz->ops->get_trip_hyst(tz, trip, &temperature);
> +       ret = thermal_zone_get_trip(tz, trip_id, &trip);
> +       if (ret)
> +               return ret;
>
> -       return ret ? ret : sprintf(buf, "%d\n", temperature);
> +       return ret ? ret : sprintf(buf, "%d\n", trip.hysteresis);
>  }
>
>  static ssize_t
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index a5a18351a898..09dc09228717 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -335,6 +335,11 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev,
>  }
>  #endif
>
> +int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
> +                         struct thermal_trip *trip);
> +
> +int thermal_zone_get_num_trips(struct thermal_zone_device *tz);
> +
>  #ifdef CONFIG_THERMAL
>  struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
>                 void *, struct thermal_zone_device_ops *,
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 02/30] thermal/sysfs: Do not make get_trip_hyst optional
  2022-09-26 14:05 ` [PATCH v5 02/30] thermal/sysfs: Do not make get_trip_hyst optional Daniel Lezcano
@ 2022-09-26 19:16   ` Rafael J. Wysocki
  0 siblings, 0 replies; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-26 19:16 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Amit Kucheria

On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> The get_trip_hyst() ops is optional. It results all around the thermal
> framework code a check against the ops pointer and different action
> adding more complexity and making the code less readable and
> understandable.
>
> A zero hysteresis value is perfectly valid, so instead of adding more
> circumvolutions in the code, create unconditionnaly the hysteresis and
> use the thermal_zone_get_trip() function which returns a zero
> hysteresis if the get_trip_hyst() is not defined.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>

I would change the subject to something like "thermal/sysfs: Always
expose hysteresis attributes", because that's what the patch does
IIUC.

And in the changelog I would write something like the below:

"Instead of avoiding to expose the hysteresis attributes of a thermal
zone when its get_trip_hyst() operation is not defined, which is
confusing, expose them always and use the default
thermal_zone_get_trip() function returning 0 hysteresis when that
operation is not present.

The hysteresis of 0 is perfectly valid, so this change should not
introduce any backwards compatibility issues."

> ---
>  drivers/thermal/thermal_sysfs.c | 25 +++++++++----------------
>  1 file changed, 9 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index 75f6b151a58b..18cdd7cd0008 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -424,23 +424,20 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
>                 return -ENOMEM;
>         }
>
> -       if (tz->ops->get_trip_hyst) {
> -               tz->trip_hyst_attrs = kcalloc(tz->num_trips,
> -                                             sizeof(*tz->trip_hyst_attrs),
> -                                             GFP_KERNEL);
> -               if (!tz->trip_hyst_attrs) {
> -                       kfree(tz->trip_type_attrs);
> -                       kfree(tz->trip_temp_attrs);
> -                       return -ENOMEM;
> -               }
> +       tz->trip_hyst_attrs = kcalloc(tz->num_trips,
> +                                     sizeof(*tz->trip_hyst_attrs),
> +                                     GFP_KERNEL);
> +       if (!tz->trip_hyst_attrs) {
> +               kfree(tz->trip_type_attrs);
> +               kfree(tz->trip_temp_attrs);
> +               return -ENOMEM;
>         }
>
>         attrs = kcalloc(tz->num_trips * 3 + 1, sizeof(*attrs), GFP_KERNEL);
>         if (!attrs) {
>                 kfree(tz->trip_type_attrs);
>                 kfree(tz->trip_temp_attrs);
> -               if (tz->ops->get_trip_hyst)
> -                       kfree(tz->trip_hyst_attrs);
> +               kfree(tz->trip_hyst_attrs);
>                 return -ENOMEM;
>         }
>
> @@ -473,9 +470,6 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
>                 }
>                 attrs[indx + tz->num_trips] = &tz->trip_temp_attrs[indx].attr.attr;
>
> -               /* create Optional trip hyst attribute */
> -               if (!tz->ops->get_trip_hyst)
> -                       continue;
>                 snprintf(tz->trip_hyst_attrs[indx].name, THERMAL_NAME_LENGTH,
>                          "trip_point_%d_hyst", indx);
>
> @@ -512,8 +506,7 @@ static void destroy_trip_attrs(struct thermal_zone_device *tz)
>
>         kfree(tz->trip_type_attrs);
>         kfree(tz->trip_temp_attrs);
> -       if (tz->ops->get_trip_hyst)
> -               kfree(tz->trip_hyst_attrs);
> +       kfree(tz->trip_hyst_attrs);
>         kfree(tz->trips_attribute_group.attrs);
>  }
>
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function
  2022-09-26 14:05 ` [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function Daniel Lezcano
@ 2022-09-26 19:25   ` Rafael J. Wysocki
  2022-09-26 22:11     ` Daniel Lezcano
  0 siblings, 1 reply; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-26 19:25 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Amit Kucheria

On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> The thermal zone ops defines a set_trip callback where we can invoke
> the backend driver to set an interrupt for the next trip point
> temperature being crossed the way up or down, or setting the low level
> with the hysteresis.
>
> The ops is only called from the thermal sysfs code where the userspace
> has the ability to modify a trip point characteristic.
>
> With the effort of encapsulating the thermal framework core code,
> let's create a thermal_zone_set_trip() which is the writable side of
> the thermal_zone_get_trip() and put there all the ops encapsulation.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> ---
>  drivers/thermal/thermal_core.c  | 45 +++++++++++++++++++++++++++++++
>  drivers/thermal/thermal_sysfs.c | 48 +++++++++++----------------------
>  include/linux/thermal.h         |  3 +++
>  3 files changed, 64 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
> index 903a858df35f..9f61b0ab57b7 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -1212,6 +1212,51 @@ int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
>  }
>  EXPORT_SYMBOL_GPL(thermal_zone_get_trip);
>
> +int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id,
> +                         const struct thermal_trip *trip)
> +{
> +       struct thermal_trip t;
> +       int ret = -EINVAL;
> +
> +       mutex_lock(&tz->lock);
> +
> +       if (!tz->ops->set_trip_temp && !tz->ops->set_trip_hyst && !tz->trips)
> +               goto out;
> +
> +       ret = __thermal_zone_get_trip(tz, trip_id, &t);
> +       if (ret)
> +               goto out;
> +
> +       if ((t.temperature != trip->temperature) && tz->ops->set_trip_temp) {

The inner parens are not needed here and below.

> +

And the extra empty line is not needed here (and below) too IMO.

> +               ret = tz->ops->set_trip_temp(tz, trip_id, trip->temperature);
> +               if (ret)
> +                       goto out;
> +       }
> +
> +       if ((t.hysteresis != trip->hysteresis) && tz->ops->set_trip_hyst) {
> +
> +               ret = tz->ops->set_trip_hyst(tz, trip_id, trip->hysteresis);
> +               if (ret)
> +                       goto out;
> +       }
> +
> +       if (((t.temperature != trip->temperature) ||
> +            (t.hysteresis != trip->hysteresis)) && tz->trips)
> +               tz->trips[trip_id] = *trip;

I would write this as

if (tz->trips && (t.temperature != trip->temperature || t.hysteresis
!= trip->hysteresis))
        tz->trips[trip_id] = *trip;

But

1. Do we want to copy the trip type here too?
2. If tz->trips is set, do we still want to invoke ->set_trip_temp()
or ->set_trip_hyst() if they are present?

> +
> +out:
> +       mutex_unlock(&tz->lock);
> +
> +       if (!ret) {
> +               thermal_notify_tz_trip_change(tz->id, trip_id, trip->type,
> +                                             trip->temperature, trip->hysteresis);
> +               thermal_zone_device_update(tz, THERMAL_TRIP_CHANGED);
> +       }
> +
> +       return ret;
> +}
> +
>  /**
>   * thermal_zone_device_register_with_trips() - register a new thermal zone device
>   * @type:      the thermal zone device type
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index 18cdd7cd0008..8d7b25ab67c2 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -115,31 +115,20 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
>         struct thermal_trip trip;
>         int trip_id, ret;
>
> -       if (!tz->ops->set_trip_temp && !tz->trips)
> -               return -EPERM;
> -
>         if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
>                 return -EINVAL;
>
> -       if (kstrtoint(buf, 10, &trip.temperature))
> -               return -EINVAL;
> -
> -       ret = tz->ops->set_trip_temp(tz, trip_id, trip.temperature);
> +       ret = thermal_zone_get_trip(tz, trip_id, &trip);
>         if (ret)
>                 return ret;
>
> -       if (tz->trips)
> -               tz->trips[trip_id].temperature = trip.temperature;
> +       if (kstrtoint(buf, 10, &trip.temperature))
> +               return -EINVAL;
>
> -       ret = thermal_zone_get_trip(tz, trip_id, &trip);
> +       ret = thermal_zone_set_trip(tz, trip_id, &trip);
>         if (ret)
>                 return ret;
>
> -       thermal_notify_tz_trip_change(tz->id, trip_id, trip.type,
> -                                     trip.temperature, trip.hysteresis);
> -
> -       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
> -
>         return count;
>  }
>
> @@ -166,29 +155,24 @@ trip_point_hyst_store(struct device *dev, struct device_attribute *attr,
>                       const char *buf, size_t count)
>  {
>         struct thermal_zone_device *tz = to_thermal_zone(dev);
> -       int trip, ret;
> -       int temperature;
> -
> -       if (!tz->ops->set_trip_hyst)
> -               return -EPERM;
> +       struct thermal_trip trip;
> +       int trip_id, ret;
>
> -       if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip) != 1)
> +       if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1)
>                 return -EINVAL;
>
> -       if (kstrtoint(buf, 10, &temperature))
> -               return -EINVAL;
> +       ret = thermal_zone_get_trip(tz, trip_id, &trip);
> +       if (ret)
> +               return ret;
>
> -       /*
> -        * We are not doing any check on the 'temperature' value
> -        * here. The driver implementing 'set_trip_hyst' has to
> -        * take care of this.
> -        */
> -       ret = tz->ops->set_trip_hyst(tz, trip, temperature);
> +       if (kstrtoint(buf, 10, &trip.hysteresis))
> +               return -EINVAL;
>
> -       if (!ret)
> -               thermal_zone_set_trips(tz);
> +       ret = thermal_zone_set_trip(tz, trip_id, &trip);
> +       if (ret)
> +               return ret;
>
> -       return ret ? ret : count;
> +       return count;
>  }
>
>  static ssize_t
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index 09dc09228717..5350a437f245 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -338,6 +338,9 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev,
>  int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
>                           struct thermal_trip *trip);
>
> +int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id,
> +                         const struct thermal_trip *trip);
> +
>  int thermal_zone_get_num_trips(struct thermal_zone_device *tz);
>
>  #ifdef CONFIG_THERMAL
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 04/30] thermal/core: Add a generic thermal_zone_get_crit_temp() function
  2022-09-26 14:05 ` [PATCH v5 04/30] thermal/core: Add a generic thermal_zone_get_crit_temp() function Daniel Lezcano
@ 2022-09-26 19:27   ` Rafael J. Wysocki
  0 siblings, 0 replies; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-26 19:27 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Amit Kucheria

On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> The thermal zone ops defines a callback to retrieve the critical
> temperature. As the trip handling is being reworked, all the trip
> points will be the same whatever the driver and consequently finding
> the critical trip temperature will be just a loop to search for a
> critical trip point type.
>
> Provide such a generic function, so we encapsulate the ops
> get_crit_temp() which can be removed when all the backend drivers are
> using the generic trip points handling.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> Reviewed-by: Zhang Rui <rui.zhang@intel.com>
> ---
>  include/linux/thermal.h | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index 5350a437f245..66373f872237 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -343,6 +343,8 @@ int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id,
>
>  int thermal_zone_get_num_trips(struct thermal_zone_device *tz);
>
> +int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp);
> +

Well, this only adds a function header which by itself is not
particularly useful (and the code change doesn't match the changelog
even), so I would fold it into the patch that actually adds the
function, including its body.

>  #ifdef CONFIG_THERMAL
>  struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
>                 void *, struct thermal_zone_device_ops *,
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions
  2022-09-26 14:05 ` [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions Daniel Lezcano
@ 2022-09-26 19:34   ` Rafael J. Wysocki
  2022-09-26 22:15     ` Daniel Lezcano
  0 siblings, 1 reply; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-26 19:34 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Lukasz Luba, Amit Kucheria

On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> The governors are using the ops->get_trip_* functions, Replace these
> calls with thermal_zone_get_trip().
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> Reviewed-by: Zhang Rui <rui.zhang@intel.com>
> Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> # IPA
> ---
>  drivers/thermal/gov_bang_bang.c       | 29 ++++++++-------
>  drivers/thermal/gov_fair_share.c      | 18 ++++------
>  drivers/thermal/gov_power_allocator.c | 51 ++++++++++++---------------
>  drivers/thermal/gov_step_wise.c       | 22 ++++++------
>  4 files changed, 53 insertions(+), 67 deletions(-)
>
> diff --git a/drivers/thermal/gov_bang_bang.c b/drivers/thermal/gov_bang_bang.c
> index a08bbe33be96..f5b85e5ea707 100644
> --- a/drivers/thermal/gov_bang_bang.c
> +++ b/drivers/thermal/gov_bang_bang.c
> @@ -13,26 +13,25 @@
>
>  #include "thermal_core.h"
>
> -static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
> +static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip_id)
>  {
> -       int trip_temp, trip_hyst;
> +       struct thermal_trip trip;
>         struct thermal_instance *instance;
> +       int ret;
>
> -       tz->ops->get_trip_temp(tz, trip, &trip_temp);
> -
> -       if (!tz->ops->get_trip_hyst) {
> -               pr_warn_once("Undefined get_trip_hyst for thermal zone %s - "
> -                               "running with default hysteresis zero\n", tz->type);
> -               trip_hyst = 0;
> -       } else
> -               tz->ops->get_trip_hyst(tz, trip, &trip_hyst);
> +       ret = __thermal_zone_get_trip(tz, trip_id, &trip);
> +       if (ret)
> +               pr_warn_once("Failed to retrieve trip point %d\n", trip_id);

Does it even make sense to continue beyond this point if ret is nonzero?

All of the contents of trip can be garbage then AFAICS.

> +
> +       if (!trip.hysteresis)
> +               pr_warn_once("Zero hysteresis value for thermal zone %s\n", tz->type);

Why do you want to warn about this?  Haven't we declared already that
zero hysteresis is valid and normal?

>
>         dev_dbg(&tz->device, "Trip%d[temp=%d]:temp=%d:hyst=%d\n",
> -                               trip, trip_temp, tz->temperature,
> -                               trip_hyst);
> +                               trip_id, trip.temperature, tz->temperature,
> +                               trip.hysteresis);
>
>         list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
> -               if (instance->trip != trip)
> +               if (instance->trip != trip_id)
>                         continue;
>
>                 /* in case fan is in initial state, switch the fan off */

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify
  2022-09-26 17:05   ` Nathan Chancellor
@ 2022-09-26 21:33     ` Daniel Lezcano
  0 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 21:33 UTC (permalink / raw)
  To: Nathan Chancellor
  Cc: rafael, linux-kernel, linux-pm, rui.zhang, Srinivas Pandruvada,
	Amit Kucheria, Antoine Tenart


Hi Nathan,

On 26/09/2022 19:05, Nathan Chancellor wrote:

[ ... ]

>> +	int34x_thermal_zone->ops = kmemdup(&int340x_thermal_zone_ops,
>> +					   sizeof(int340x_thermal_zone_ops), GFP_KERNEL);
>> +	if (!int34x_thermal_zone->ops)
>> +		goto err_ops_alloc;
> 
> I assume I was cc'd on this change due to my fix up patch:

> https://lore.kernel.org/20220923152009.1721739-1-nathan@kernel.org/

Yes, right, thanks for sending the fix.

> However, I don't see that applied here. I don't mind it being squashed
> in to keep the build as clean as possible through bisects.

Ok, that makes sense, I will merge with the change it fixes

> Additionally, I did a diff of v4 to v5 to apply on top of next-20220923
> and I noticed there were a significant number of places where there was
> whitespace added where it probably should not have been. 

Yeah, my git configuration does always trim the extra whitespaces when 
applying so I usually don't pay attention to that, but thanks for 
letting me know. I've probably something wrong with my emacs indentation 
setup

> Other than
> that, v5 works on all the machines that had issues so thank you for the
> quick fix!

Thanks for testing



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

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function
  2022-09-26 19:25   ` Rafael J. Wysocki
@ 2022-09-26 22:11     ` Daniel Lezcano
  2022-09-27 10:38       ` Rafael J. Wysocki
  0 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 22:11 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Linux Kernel Mailing List, Linux PM, Zhang, Rui, Amit Kucheria

On 26/09/2022 21:25, Rafael J. Wysocki wrote:

[ ... ]

>> +       if ((t.temperature != trip->temperature) && tz->ops->set_trip_temp) {
> 
> The inner parens are not needed here and below.
> 
>> +
> 
> And the extra empty line is not needed here (and below) too IMO.
> 
>> +               ret = tz->ops->set_trip_temp(tz, trip_id, trip->temperature);
>> +               if (ret)
>> +                       goto out;
>> +       }
>

Without the parens, the following happens:


warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
  1229 |         if ((t.temperature != trip->temperature) && 
tz->ops->set_trip_temp)
       |         ^~
note: ...this statement, but the latter is misleadingly indented as if 
it were guarded by the ‘if’
  1231 |                 if (ret)
       |                 ^~


>> +       if ((t.hysteresis != trip->hysteresis) && tz->ops->set_trip_hyst) {
>> +
>> +               ret = tz->ops->set_trip_hyst(tz, trip_id, trip->hysteresis);
>> +               if (ret)
>> +                       goto out;
>> +       }
>> +
>> +       if (((t.temperature != trip->temperature) ||
>> +            (t.hysteresis != trip->hysteresis)) && tz->trips)
>> +               tz->trips[trip_id] = *trip;
> 
> I would write this as
> 
> if (tz->trips && (t.temperature != trip->temperature || t.hysteresis
> != trip->hysteresis))
>          tz->trips[trip_id] = *trip;

Ok, sure

> But
> 
> 1. Do we want to copy the trip type here too?

The function thermal_zone_set_trip() is called from thermal_sysfs.c, it 
is the unique call site. However, I think it is a good idea to check the 
type of the trip point is not changed, even if it is not possible with 
the actual code.

> 2. If tz->trips is set, do we still want to invoke ->set_trip_temp()
> or ->set_trip_hyst() if they are present?

No but there are bogus drivers setting the interrupt with these ops 
instead of using the set_trips ops (eg. [1][2][3]). So in order to keep 
those working ATM, I'm keeping them and when all the drivers will be 
changed, I'll wipe out the set_trip_* ops from everywhere.

[1] drivers/thermal/samsung/exynos_tmu.c
[2] drivers/thermal/qcom/qcom-spmi-temp-alarm.c
[3] drivers/thermal/imx_thermal.c


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

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions
  2022-09-26 19:34   ` Rafael J. Wysocki
@ 2022-09-26 22:15     ` Daniel Lezcano
  2022-09-27 11:08       ` Rafael J. Wysocki
  0 siblings, 1 reply; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-26 22:15 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Linux Kernel Mailing List, Linux PM, Zhang, Rui, Lukasz Luba,
	Amit Kucheria

On 26/09/2022 21:34, Rafael J. Wysocki wrote:
> On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
> <daniel.lezcano@linaro.org> wrote:
>>
>> The governors are using the ops->get_trip_* functions, Replace these
>> calls with thermal_zone_get_trip().
>>
>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>> Reviewed-by: Zhang Rui <rui.zhang@intel.com>
>> Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> # IPA
>> ---
>>   drivers/thermal/gov_bang_bang.c       | 29 ++++++++-------
>>   drivers/thermal/gov_fair_share.c      | 18 ++++------
>>   drivers/thermal/gov_power_allocator.c | 51 ++++++++++++---------------
>>   drivers/thermal/gov_step_wise.c       | 22 ++++++------
>>   4 files changed, 53 insertions(+), 67 deletions(-)
>>
>> diff --git a/drivers/thermal/gov_bang_bang.c b/drivers/thermal/gov_bang_bang.c
>> index a08bbe33be96..f5b85e5ea707 100644
>> --- a/drivers/thermal/gov_bang_bang.c
>> +++ b/drivers/thermal/gov_bang_bang.c
>> @@ -13,26 +13,25 @@
>>
>>   #include "thermal_core.h"
>>
>> -static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
>> +static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip_id)
>>   {
>> -       int trip_temp, trip_hyst;
>> +       struct thermal_trip trip;
>>          struct thermal_instance *instance;
>> +       int ret;
>>
>> -       tz->ops->get_trip_temp(tz, trip, &trip_temp);
>> -
>> -       if (!tz->ops->get_trip_hyst) {
>> -               pr_warn_once("Undefined get_trip_hyst for thermal zone %s - "
>> -                               "running with default hysteresis zero\n", tz->type);
>> -               trip_hyst = 0;
>> -       } else
>> -               tz->ops->get_trip_hyst(tz, trip, &trip_hyst);
>> +       ret = __thermal_zone_get_trip(tz, trip_id, &trip);
>> +       if (ret)
>> +               pr_warn_once("Failed to retrieve trip point %d\n", trip_id);
> 
> Does it even make sense to continue beyond this point if ret is nonzero?

No, I think we can bail out from here

> All of the contents of trip can be garbage then AFAICS.
> 
>> +
>> +       if (!trip.hysteresis)
>> +               pr_warn_once("Zero hysteresis value for thermal zone %s\n", tz->type);
> 
> Why do you want to warn about this?  Haven't we declared already that
> zero hysteresis is valid and normal?

Apparently the bang-bang governor is expecting a hysteresis value as the 
check is expecting:

 >> -       if (!tz->ops->get_trip_hyst) {
 >> -               pr_warn_once("Undefined get_trip_hyst for thermal 
zone %s - "
 >> -                               "running with default hysteresis 
zero\n", tz->type);
 >> -               trip_hyst = 0;

It is just to keep a warning as before.

>>
>>          dev_dbg(&tz->device, "Trip%d[temp=%d]:temp=%d:hyst=%d\n",
>> -                               trip, trip_temp, tz->temperature,
>> -                               trip_hyst);
>> +                               trip_id, trip.temperature, tz->temperature,
>> +                               trip.hysteresis);
>>
>>          list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
>> -               if (instance->trip != trip)
>> +               if (instance->trip != trip_id)
>>                          continue;
>>
>>                  /* in case fan is in initial state, switch the fan off */


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

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function
  2022-09-26 22:11     ` Daniel Lezcano
@ 2022-09-27 10:38       ` Rafael J. Wysocki
  2022-09-27 12:20         ` Daniel Lezcano
  0 siblings, 1 reply; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-27 10:38 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Amit Kucheria

On Tue, Sep 27, 2022 at 12:11 AM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> On 26/09/2022 21:25, Rafael J. Wysocki wrote:
>
> [ ... ]
>
> >> +       if ((t.temperature != trip->temperature) && tz->ops->set_trip_temp) {
> >
> > The inner parens are not needed here and below.
> >
> >> +
> >
> > And the extra empty line is not needed here (and below) too IMO.
> >
> >> +               ret = tz->ops->set_trip_temp(tz, trip_id, trip->temperature);
> >> +               if (ret)
> >> +                       goto out;
> >> +       }
> >
>
> Without the parens, the following happens:
>
>
> warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
>   1229 |         if ((t.temperature != trip->temperature) &&
> tz->ops->set_trip_temp)
>        |         ^~
> note: ...this statement, but the latter is misleadingly indented as if
> it were guarded by the ‘if’
>   1231 |                 if (ret)
>        |                 ^~

This is about indentation, though, so it looks like white space is
mangled somehow.

As a matter of correctness, the inner parens are not needed.

> >> +       if ((t.hysteresis != trip->hysteresis) && tz->ops->set_trip_hyst) {
> >> +
> >> +               ret = tz->ops->set_trip_hyst(tz, trip_id, trip->hysteresis);
> >> +               if (ret)
> >> +                       goto out;
> >> +       }
> >> +
> >> +       if (((t.temperature != trip->temperature) ||
> >> +            (t.hysteresis != trip->hysteresis)) && tz->trips)
> >> +               tz->trips[trip_id] = *trip;
> >
> > I would write this as
> >
> > if (tz->trips && (t.temperature != trip->temperature || t.hysteresis
> > != trip->hysteresis))
> >          tz->trips[trip_id] = *trip;
>
> Ok, sure
>
> > But
> >
> > 1. Do we want to copy the trip type here too?
>
> The function thermal_zone_set_trip() is called from thermal_sysfs.c, it
> is the unique call site. However, I think it is a good idea to check the
> type of the trip point is not changed, even if it is not possible with
> the actual code.
>
> > 2. If tz->trips is set, do we still want to invoke ->set_trip_temp()
> > or ->set_trip_hyst() if they are present?
>
> No but there are bogus drivers setting the interrupt with these ops
> instead of using the set_trips ops (eg. [1][2][3]). So in order to keep
> those working ATM, I'm keeping them and when all the drivers will be
> changed, I'll wipe out the set_trip_* ops from everywhere.

Do those drivers set tz->trips?  If not, the tz->trips check can go
before the ops ones.

> [1] drivers/thermal/samsung/exynos_tmu.c
> [2] drivers/thermal/qcom/qcom-spmi-temp-alarm.c
> [3] drivers/thermal/imx_thermal.c

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions
  2022-09-26 22:15     ` Daniel Lezcano
@ 2022-09-27 11:08       ` Rafael J. Wysocki
  0 siblings, 0 replies; 43+ messages in thread
From: Rafael J. Wysocki @ 2022-09-27 11:08 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J. Wysocki, Linux Kernel Mailing List, Linux PM, Zhang,
	Rui, Lukasz Luba, Amit Kucheria

On Tue, Sep 27, 2022 at 12:15 AM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> On 26/09/2022 21:34, Rafael J. Wysocki wrote:
> > On Mon, Sep 26, 2022 at 4:06 PM Daniel Lezcano
> > <daniel.lezcano@linaro.org> wrote:
> >>
> >> The governors are using the ops->get_trip_* functions, Replace these
> >> calls with thermal_zone_get_trip().
> >>
> >> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> >> Reviewed-by: Zhang Rui <rui.zhang@intel.com>
> >> Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> # IPA
> >> ---
> >>   drivers/thermal/gov_bang_bang.c       | 29 ++++++++-------
> >>   drivers/thermal/gov_fair_share.c      | 18 ++++------
> >>   drivers/thermal/gov_power_allocator.c | 51 ++++++++++++---------------
> >>   drivers/thermal/gov_step_wise.c       | 22 ++++++------
> >>   4 files changed, 53 insertions(+), 67 deletions(-)
> >>
> >> diff --git a/drivers/thermal/gov_bang_bang.c b/drivers/thermal/gov_bang_bang.c
> >> index a08bbe33be96..f5b85e5ea707 100644
> >> --- a/drivers/thermal/gov_bang_bang.c
> >> +++ b/drivers/thermal/gov_bang_bang.c
> >> @@ -13,26 +13,25 @@
> >>
> >>   #include "thermal_core.h"
> >>
> >> -static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
> >> +static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip_id)
> >>   {
> >> -       int trip_temp, trip_hyst;
> >> +       struct thermal_trip trip;
> >>          struct thermal_instance *instance;
> >> +       int ret;
> >>
> >> -       tz->ops->get_trip_temp(tz, trip, &trip_temp);
> >> -
> >> -       if (!tz->ops->get_trip_hyst) {
> >> -               pr_warn_once("Undefined get_trip_hyst for thermal zone %s - "
> >> -                               "running with default hysteresis zero\n", tz->type);
> >> -               trip_hyst = 0;
> >> -       } else
> >> -               tz->ops->get_trip_hyst(tz, trip, &trip_hyst);
> >> +       ret = __thermal_zone_get_trip(tz, trip_id, &trip);
> >> +       if (ret)
> >> +               pr_warn_once("Failed to retrieve trip point %d\n", trip_id);
> >
> > Does it even make sense to continue beyond this point if ret is nonzero?
>
> No, I think we can bail out from here
>
> > All of the contents of trip can be garbage then AFAICS.
> >
> >> +
> >> +       if (!trip.hysteresis)
> >> +               pr_warn_once("Zero hysteresis value for thermal zone %s\n", tz->type);
> >
> > Why do you want to warn about this?  Haven't we declared already that
> > zero hysteresis is valid and normal?
>
> Apparently the bang-bang governor is expecting a hysteresis value as the
> check is expecting:
>
>  >> -       if (!tz->ops->get_trip_hyst) {
>  >> -               pr_warn_once("Undefined get_trip_hyst for thermal
> zone %s - "
>  >> -                               "running with default hysteresis
> zero\n", tz->type);
>  >> -               trip_hyst = 0;
>
> It is just to keep a warning as before.

The new message will be different, though.

I think it should be per-tz and the "info" level should be sufficient,
and because thermal_zone_device is based on struct device,
dev_info_once(&tz->dev, ...) should work.

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function
  2022-09-27 10:38       ` Rafael J. Wysocki
@ 2022-09-27 12:20         ` Daniel Lezcano
  0 siblings, 0 replies; 43+ messages in thread
From: Daniel Lezcano @ 2022-09-27 12:20 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Linux Kernel Mailing List, Linux PM, Zhang, Rui, Amit Kucheria

On 27/09/2022 12:38, Rafael J. Wysocki wrote:
> On Tue, Sep 27, 2022 at 12:11 AM Daniel Lezcano
> <daniel.lezcano@linaro.org> wrote:
>>
>> On 26/09/2022 21:25, Rafael J. Wysocki wrote:
>>
>> [ ... ]
>>
>>>> +       if ((t.temperature != trip->temperature) && tz->ops->set_trip_temp) {
>>>
>>> The inner parens are not needed here and below.
>>>
>>>> +
>>>
>>> And the extra empty line is not needed here (and below) too IMO.
>>>
>>>> +               ret = tz->ops->set_trip_temp(tz, trip_id, trip->temperature);
>>>> +               if (ret)
>>>> +                       goto out;
>>>> +       }
>>>
>>
>> Without the parens, the following happens:
>>
>>
>> warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
>>    1229 |         if ((t.temperature != trip->temperature) &&
>> tz->ops->set_trip_temp)
>>         |         ^~
>> note: ...this statement, but the latter is misleadingly indented as if
>> it were guarded by the ‘if’
>>    1231 |                 if (ret)
>>         |                 ^~
> 
> This is about indentation, though, so it looks like white space is
> mangled somehow.
> 
> As a matter of correctness, the inner parens are not needed.

Oh, actually I did a confusion with the 'brackets', you meant:

(t.temperature != trip->temperature && tz->ops->set_trip_temp)

right ?

>>>> +       if ((t.hysteresis != trip->hysteresis) && tz->ops->set_trip_hyst) {
>>>> +
>>>> +               ret = tz->ops->set_trip_hyst(tz, trip_id, trip->hysteresis);
>>>> +               if (ret)
>>>> +                       goto out;
>>>> +       }
>>>> +
>>>> +       if (((t.temperature != trip->temperature) ||
>>>> +            (t.hysteresis != trip->hysteresis)) && tz->trips)
>>>> +               tz->trips[trip_id] = *trip;
>>>
>>> I would write this as
>>>
>>> if (tz->trips && (t.temperature != trip->temperature || t.hysteresis
>>> != trip->hysteresis))
>>>           tz->trips[trip_id] = *trip;
>>
>> Ok, sure
>>
>>> But
>>>
>>> 1. Do we want to copy the trip type here too?
>>
>> The function thermal_zone_set_trip() is called from thermal_sysfs.c, it
>> is the unique call site. However, I think it is a good idea to check the
>> type of the trip point is not changed, even if it is not possible with
>> the actual code.
>>
>>> 2. If tz->trips is set, do we still want to invoke ->set_trip_temp()
>>> or ->set_trip_hyst() if they are present?
>>
>> No but there are bogus drivers setting the interrupt with these ops
>> instead of using the set_trips ops (eg. [1][2][3]). So in order to keep
>> those working ATM, I'm keeping them and when all the drivers will be
>> changed, I'll wipe out the set_trip_* ops from everywhere.
> 
> Do those drivers set tz->trips?  If not, the tz->trips check can go
> before the ops ones.

Unfortunately some are doing that, like the tegra's soctherm driver


>> [1] drivers/thermal/samsung/exynos_tmu.c
>> [2] drivers/thermal/qcom/qcom-spmi-temp-alarm.c
>> [3] drivers/thermal/imx_thermal.c


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

^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2022-09-27 12:21 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-26 14:05 [PATCH v5 00/30] Rework the trip points creation Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 01/30] thermal/core: Add a generic thermal_zone_get_trip() function Daniel Lezcano
2022-09-26 19:01   ` Rafael J. Wysocki
2022-09-26 14:05 ` [PATCH v5 02/30] thermal/sysfs: Do not make get_trip_hyst optional Daniel Lezcano
2022-09-26 19:16   ` Rafael J. Wysocki
2022-09-26 14:05 ` [PATCH v5 03/30] thermal/core: Add a generic thermal_zone_set_trip() function Daniel Lezcano
2022-09-26 19:25   ` Rafael J. Wysocki
2022-09-26 22:11     ` Daniel Lezcano
2022-09-27 10:38       ` Rafael J. Wysocki
2022-09-27 12:20         ` Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 04/30] thermal/core: Add a generic thermal_zone_get_crit_temp() function Daniel Lezcano
2022-09-26 19:27   ` Rafael J. Wysocki
2022-09-26 14:05 ` [PATCH v5 05/30] thermal/core/governors: Use thermal_zone_get_trip() instead of ops functions Daniel Lezcano
2022-09-26 19:34   ` Rafael J. Wysocki
2022-09-26 22:15     ` Daniel Lezcano
2022-09-27 11:08       ` Rafael J. Wysocki
2022-09-26 14:05 ` [PATCH v5 06/30] thermal/of: Use generic thermal_zone_get_trip() function Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 07/30] thermal/of: Remove unused functions Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 08/30] thermal/drivers/exynos: Use generic thermal_zone_get_trip() function Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 09/30] thermal/drivers/exynos: of_thermal_get_ntrips() Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 10/30] thermal/drivers/exynos: Replace of_thermal_is_trip_valid() by thermal_zone_get_trip() Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 11/30] thermal/drivers/tegra: Use generic thermal_zone_get_trip() function Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 12/30] thermal/drivers/uniphier: " Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 13/30] thermal/drivers/hisi: " Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 14/30] thermal/drivers/qcom: " Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 15/30] thermal/drivers/armada: " Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 16/30] thermal/drivers/rcar_gen3: Use the generic function to get the number of trips Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 17/30] thermal/of: Remove of_thermal_get_ntrips() Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 18/30] thermal/of: Remove of_thermal_is_trip_valid() Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 19/30] thermal/of: Remove of_thermal_set_trip_hyst() Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 20/30] thermal/of: Remove of_thermal_get_crit_temp() Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 21/30] thermal/drivers/st: Use generic trip points Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 22/30] thermal/drivers/imx: Use generic thermal_zone_get_trip() function Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 23/30] thermal/drivers/rcar: " Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 24/30] thermal/drivers/broadcom: " Daniel Lezcano
2022-09-26 14:05 ` [PATCH v5 25/30] thermal/drivers/da9062: " Daniel Lezcano
2022-09-26 14:06 ` [PATCH v5 26/30] thermal/drivers/ti: Remove unused macros ti_thermal_get_trip_value() / ti_thermal_trip_is_valid() Daniel Lezcano
2022-09-26 14:06 ` [PATCH v5 27/30] thermal/drivers/acerhdf: Use generic thermal_zone_get_trip() function Daniel Lezcano
2022-09-26 14:06 ` [PATCH v5 28/30] thermal/drivers/cxgb4: " Daniel Lezcano
2022-09-26 14:06 ` [PATCH v5 29/30] thermal/intel/int340x: Replace parameter to simplify Daniel Lezcano
2022-09-26 17:05   ` Nathan Chancellor
2022-09-26 21:33     ` Daniel Lezcano
2022-09-26 14:06 ` [PATCH v5 30/30] thermal/drivers/intel: Use generic thermal_zone_get_trip() function Daniel Lezcano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).