lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251120-thermal-device-v1-6-bbdad594d57a@gmx.de>
Date: Thu, 20 Nov 2025 04:41:16 +0100
From: Armin Wolf <W_Armin@....de>
To: "Rafael J. Wysocki" <rafael@...nel.org>, 
 Daniel Lezcano <daniel.lezcano@...aro.org>, Zhang Rui <rui.zhang@...el.com>, 
 Lukasz Luba <lukasz.luba@....com>, Len Brown <lenb@...nel.org>, 
 Jonathan Corbet <corbet@....net>, Ido Schimmel <idosch@...dia.com>, 
 Petr Machata <petrm@...dia.com>
Cc: linux-pm@...r.kernel.org, linux-kernel@...r.kernel.org, 
 etnaviv@...ts.freedesktop.org, dri-devel@...ts.freedesktop.org, 
 linux-tegra@...r.kernel.org, linux-acpi@...r.kernel.org, 
 linux-doc@...r.kernel.org, netdev@...r.kernel.org, 
 linux-wireless@...r.kernel.org, ath10k@...ts.infradead.org, 
 ath11k@...ts.infradead.org, linux-arm-kernel@...ts.infradead.org, 
 linux-mediatek@...ts.infradead.org, platform-driver-x86@...r.kernel.org, 
 linux-pci@...r.kernel.org, imx@...ts.linux.dev, 
 linux-renesas-soc@...r.kernel.org
Subject: [PATCH RFC RESEND 6/8] thermal: core: Set parent device in
 thermal_cooling_device_register()

Extend thermal_cooling_device_register() to allow users to specify
the parent device of the cooling device to be created.

Signed-off-by: Armin Wolf <W_Armin@....de>
---
 Documentation/driver-api/thermal/sysfs-api.rst          | 5 ++++-
 drivers/acpi/acpi_video.c                               | 2 +-
 drivers/acpi/fan_core.c                                 | 4 ++--
 drivers/acpi/processor_thermal.c                        | 2 +-
 drivers/net/ethernet/mellanox/mlxsw/core_thermal.c      | 2 +-
 drivers/net/wireless/ath/ath10k/thermal.c               | 2 +-
 drivers/net/wireless/ath/ath11k/thermal.c               | 2 +-
 drivers/net/wireless/intel/iwlwifi/mld/thermal.c        | 4 +---
 drivers/net/wireless/intel/iwlwifi/mvm/tt.c             | 2 +-
 drivers/net/wireless/mediatek/mt76/mt7915/init.c        | 2 +-
 drivers/net/wireless/mediatek/mt76/mt7996/init.c        | 2 +-
 drivers/platform/x86/acerhdf.c                          | 2 +-
 drivers/thermal/intel/int340x_thermal/int3403_thermal.c | 4 ++--
 drivers/thermal/intel/int340x_thermal/int3406_thermal.c | 2 +-
 drivers/thermal/intel/intel_powerclamp.c                | 2 +-
 drivers/thermal/intel/intel_tcc_cooling.c               | 2 +-
 drivers/thermal/pcie_cooling.c                          | 2 +-
 drivers/thermal/thermal_core.c                          | 5 +++--
 include/linux/thermal.h                                 | 9 +++++----
 19 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/Documentation/driver-api/thermal/sysfs-api.rst b/Documentation/driver-api/thermal/sysfs-api.rst
index f73de211bdce..cf242cd16f2e 100644
--- a/Documentation/driver-api/thermal/sysfs-api.rst
+++ b/Documentation/driver-api/thermal/sysfs-api.rst
@@ -215,13 +215,16 @@ temperature) and throttle appropriate devices.
     ::
 
 	struct thermal_cooling_device
-	*thermal_cooling_device_register(char *name,
+	*thermal_cooling_device_register(struct device *parent, char *name,
 			void *devdata, struct thermal_cooling_device_ops *)
 
     This interface function adds a new thermal cooling device (fan/processor/...)
     to /sys/class/thermal/ folder as `cooling_device[0-*]`. It tries to bind itself
     to all the thermal zone devices registered at the same time.
 
+    parent:
+        parent device pointer.
+
     name:
 	the cooling device name.
     devdata:
diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
index 658e11745523..eae1ff9805b1 100644
--- a/drivers/acpi/acpi_video.c
+++ b/drivers/acpi/acpi_video.c
@@ -1759,7 +1759,7 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
 	device->backlight->props.brightness =
 			acpi_video_get_brightness(device->backlight);
 
-	device->cooling_dev = thermal_cooling_device_register("LCD", device,
+	device->cooling_dev = thermal_cooling_device_register(parent, "LCD", device,
 							      &video_cooling_ops);
 	if (IS_ERR(device->cooling_dev)) {
 		/*
diff --git a/drivers/acpi/fan_core.c b/drivers/acpi/fan_core.c
index 2ca3e347f15c..7ebf2529fbfd 100644
--- a/drivers/acpi/fan_core.c
+++ b/drivers/acpi/fan_core.c
@@ -584,8 +584,8 @@ static int acpi_fan_probe(struct platform_device *pdev)
 	else
 		name = acpi_device_bid(device);
 
-	cdev = thermal_cooling_device_register(name, device,
-						&fan_cooling_ops);
+	cdev = thermal_cooling_device_register(&pdev->dev, name, device,
+					       &fan_cooling_ops);
 	if (IS_ERR(cdev)) {
 		result = PTR_ERR(cdev);
 		goto err_end;
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
index 1ff10321eac5..a7307f5d137f 100644
--- a/drivers/acpi/processor_thermal.c
+++ b/drivers/acpi/processor_thermal.c
@@ -313,7 +313,7 @@ int acpi_processor_thermal_init(struct acpi_processor *pr,
 {
 	int result = 0;
 
-	pr->cdev = thermal_cooling_device_register("Processor", device,
+	pr->cdev = thermal_cooling_device_register(&device->dev, "Processor", device,
 						   &processor_cooling_ops);
 	if (IS_ERR(pr->cdev)) {
 		result = PTR_ERR(pr->cdev);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
index eac9a14a6058..1117d59b74fd 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
@@ -693,7 +693,7 @@ int mlxsw_thermal_init(struct mlxsw_core *core,
 			mlxsw_cdev = &thermal->cdevs[i];
 			mlxsw_cdev->thermal = thermal;
 			mlxsw_cdev->idx = i;
-			cdev = thermal_cooling_device_register("mlxsw_fan",
+			cdev = thermal_cooling_device_register(dev, "mlxsw_fan",
 							       mlxsw_cdev,
 							       &mlxsw_cooling_ops);
 			if (IS_ERR(cdev)) {
diff --git a/drivers/net/wireless/ath/ath10k/thermal.c b/drivers/net/wireless/ath/ath10k/thermal.c
index 8b15ec07b107..16eb41b928ba 100644
--- a/drivers/net/wireless/ath/ath10k/thermal.c
+++ b/drivers/net/wireless/ath/ath10k/thermal.c
@@ -161,7 +161,7 @@ int ath10k_thermal_register(struct ath10k *ar)
 	if (!test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map))
 		return 0;
 
-	cdev = thermal_cooling_device_register("ath10k_thermal", ar,
+	cdev = thermal_cooling_device_register(ar->dev, "ath10k_thermal", ar,
 					       &ath10k_thermal_ops);
 
 	if (IS_ERR(cdev)) {
diff --git a/drivers/net/wireless/ath/ath11k/thermal.c b/drivers/net/wireless/ath/ath11k/thermal.c
index 18d6eab5cce3..363697ce8641 100644
--- a/drivers/net/wireless/ath/ath11k/thermal.c
+++ b/drivers/net/wireless/ath/ath11k/thermal.c
@@ -172,7 +172,7 @@ int ath11k_thermal_register(struct ath11k_base *ab)
 		if (!ar)
 			continue;
 
-		cdev = thermal_cooling_device_register("ath11k_thermal", ar,
+		cdev = thermal_cooling_device_register(&ar->hw->wiphy->dev, "ath11k_thermal", ar,
 						       &ath11k_thermal_ops);
 
 		if (IS_ERR(cdev)) {
diff --git a/drivers/net/wireless/intel/iwlwifi/mld/thermal.c b/drivers/net/wireless/intel/iwlwifi/mld/thermal.c
index f8a8c35066be..9e56e6e80ab7 100644
--- a/drivers/net/wireless/intel/iwlwifi/mld/thermal.c
+++ b/drivers/net/wireless/intel/iwlwifi/mld/thermal.c
@@ -366,9 +366,7 @@ static void iwl_mld_cooling_device_register(struct iwl_mld *mld)
 	BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
 
 	mld->cooling_dev.cdev =
-		thermal_cooling_device_register(name,
-						mld,
-						&tcooling_ops);
+		thermal_cooling_device_register(mld->dev, name, mld, &tcooling_ops);
 
 	if (IS_ERR(mld->cooling_dev.cdev)) {
 		IWL_DEBUG_TEMP(mld,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
index 53bab21ebae2..b184f08230b9 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
@@ -744,7 +744,7 @@ static void iwl_mvm_cooling_device_register(struct iwl_mvm *mvm)
 	BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
 
 	mvm->cooling_dev.cdev =
-		thermal_cooling_device_register(name,
+		thermal_cooling_device_register(mvm->dev, name,
 						mvm,
 						&tcooling_ops);
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index 5ea8b46e092e..cb08bb36f6e2 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -200,7 +200,7 @@ static int mt7915_thermal_init(struct mt7915_phy *phy)
 	if (!name)
 		return -ENOMEM;
 
-	cdev = thermal_cooling_device_register(name, phy, &mt7915_thermal_ops);
+	cdev = thermal_cooling_device_register(&wiphy->dev, name, phy, &mt7915_thermal_ops);
 	if (!IS_ERR(cdev)) {
 		if (sysfs_create_link(&wiphy->dev.kobj, &cdev->device.kobj,
 				      "cooling_device") < 0)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index 5e95a36b42d1..bb6e55d79d0e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -249,7 +249,7 @@ static int mt7996_thermal_init(struct mt7996_phy *phy)
 
 	snprintf(cname, sizeof(cname), "cooling_device%d", phy->mt76->band_idx);
 
-	cdev = thermal_cooling_device_register(name, phy, &mt7996_thermal_ops);
+	cdev = thermal_cooling_device_register(&wiphy->dev, name, phy, &mt7996_thermal_ops);
 	if (!IS_ERR(cdev)) {
 		if (sysfs_create_link(&wiphy->dev.kobj, &cdev->device.kobj,
 				      cname) < 0)
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index 5ce5ad3efe69..c74937d475e5 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -650,7 +650,7 @@ static int __init acerhdf_register_thermal(void)
 {
 	int ret;
 
-	cl_dev = thermal_cooling_device_register("acerhdf-fan", NULL,
+	cl_dev = thermal_cooling_device_register(NULL, "acerhdf-fan", NULL,
 						 &acerhdf_cooling_ops);
 
 	if (IS_ERR(cl_dev))
diff --git a/drivers/thermal/intel/int340x_thermal/int3403_thermal.c b/drivers/thermal/intel/int340x_thermal/int3403_thermal.c
index 264c9bc8e645..08d9e91f01cb 100644
--- a/drivers/thermal/intel/int340x_thermal/int3403_thermal.c
+++ b/drivers/thermal/intel/int340x_thermal/int3403_thermal.c
@@ -178,8 +178,8 @@ static int int3403_cdev_add(struct int3403_priv *priv)
 	priv->priv = obj;
 	obj->max_state = p->package.count - 1;
 	obj->cdev =
-		thermal_cooling_device_register(acpi_device_bid(priv->adev),
-				priv, &int3403_cooling_ops);
+		thermal_cooling_device_register(&priv->adev->dev, acpi_device_bid(priv->adev),
+						priv, &int3403_cooling_ops);
 	if (IS_ERR(obj->cdev))
 		result = PTR_ERR(obj->cdev);
 
diff --git a/drivers/thermal/intel/int340x_thermal/int3406_thermal.c b/drivers/thermal/intel/int340x_thermal/int3406_thermal.c
index e21fcbccf4ba..e458add39a88 100644
--- a/drivers/thermal/intel/int340x_thermal/int3406_thermal.c
+++ b/drivers/thermal/intel/int340x_thermal/int3406_thermal.c
@@ -157,7 +157,7 @@ static int int3406_thermal_probe(struct platform_device *pdev)
 
 	int3406_thermal_get_limit(d);
 
-	d->cooling_dev = thermal_cooling_device_register(acpi_device_bid(adev),
+	d->cooling_dev = thermal_cooling_device_register(&pdev->dev, acpi_device_bid(adev),
 							 d, &video_cooling_ops);
 	if (IS_ERR(d->cooling_dev))
 		goto err;
diff --git a/drivers/thermal/intel/intel_powerclamp.c b/drivers/thermal/intel/intel_powerclamp.c
index 9a4cec000910..a8f798bf459f 100644
--- a/drivers/thermal/intel/intel_powerclamp.c
+++ b/drivers/thermal/intel/intel_powerclamp.c
@@ -779,7 +779,7 @@ static int __init powerclamp_init(void)
 	/* set default limit, maybe adjusted during runtime based on feedback */
 	window_size = 2;
 
-	cooling_dev = thermal_cooling_device_register("intel_powerclamp", NULL,
+	cooling_dev = thermal_cooling_device_register(NULL, "intel_powerclamp", NULL,
 						      &powerclamp_cooling_ops);
 	if (IS_ERR(cooling_dev))
 		return -ENODEV;
diff --git a/drivers/thermal/intel/intel_tcc_cooling.c b/drivers/thermal/intel/intel_tcc_cooling.c
index f352ecafbedf..a0ead0fb1fbe 100644
--- a/drivers/thermal/intel/intel_tcc_cooling.c
+++ b/drivers/thermal/intel/intel_tcc_cooling.c
@@ -101,7 +101,7 @@ static int __init tcc_cooling_init(void)
 	pr_info("Programmable TCC Offset detected\n");
 
 	tcc_cdev =
-	    thermal_cooling_device_register("TCC Offset", NULL,
+	    thermal_cooling_device_register(NULL, "TCC Offset", NULL,
 					    &tcc_cooling_ops);
 	if (IS_ERR(tcc_cdev)) {
 		ret = PTR_ERR(tcc_cdev);
diff --git a/drivers/thermal/pcie_cooling.c b/drivers/thermal/pcie_cooling.c
index a876d64f1582..4d37f7f9d108 100644
--- a/drivers/thermal/pcie_cooling.c
+++ b/drivers/thermal/pcie_cooling.c
@@ -61,7 +61,7 @@ struct thermal_cooling_device *pcie_cooling_device_register(struct pci_dev *port
 	if (!name)
 		return ERR_PTR(-ENOMEM);
 
-	return thermal_cooling_device_register(name, port, &pcie_cooling_ops);
+	return thermal_cooling_device_register(&port->dev, name, port, &pcie_cooling_ops);
 }
 
 void pcie_cooling_device_unregister(struct thermal_cooling_device *cdev)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 5d752e712cc0..92e51d2e4535 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -1145,6 +1145,7 @@ __thermal_cooling_device_register(struct device *parent, struct device_node *np,
 
 /**
  * thermal_cooling_device_register() - register a new thermal cooling device
+ * @parent:	parent device pointer.
  * @type:	the thermal cooling device type.
  * @devdata:	device private data.
  * @ops:		standard thermal cooling devices callbacks.
@@ -1157,10 +1158,10 @@ __thermal_cooling_device_register(struct device *parent, struct device_node *np,
  * ERR_PTR. Caller must check return value with IS_ERR*() helpers.
  */
 struct thermal_cooling_device *
-thermal_cooling_device_register(const char *type, void *devdata,
+thermal_cooling_device_register(struct device *parent, const char *type, void *devdata,
 				const struct thermal_cooling_device_ops *ops)
 {
-	return __thermal_cooling_device_register(NULL, NULL, type, devdata, ops);
+	return __thermal_cooling_device_register(parent, NULL, type, devdata, ops);
 }
 EXPORT_SYMBOL_GPL(thermal_cooling_device_register);
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index fa53d12173ce..29a608bf5f80 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -250,8 +250,9 @@ struct device *thermal_zone_device(struct thermal_zone_device *tzd);
 void thermal_zone_device_update(struct thermal_zone_device *,
 				enum thermal_notify_event);
 
-struct thermal_cooling_device *thermal_cooling_device_register(const char *,
-		void *, const struct thermal_cooling_device_ops *);
+struct thermal_cooling_device *
+thermal_cooling_device_register(struct device *parent, const char *type, void *drvdata,
+				const struct thermal_cooling_device_ops *ops);
 struct thermal_cooling_device *
 thermal_of_cooling_device_register(struct device *parent, struct device_node *np, const char *type,
 				   void *devdata, const struct thermal_cooling_device_ops *);
@@ -298,8 +299,8 @@ static inline void thermal_zone_device_update(struct thermal_zone_device *tz,
 { }
 
 static inline struct thermal_cooling_device *
-thermal_cooling_device_register(const char *type, void *devdata,
-	const struct thermal_cooling_device_ops *ops)
+thermal_cooling_device_register(struct device *parent, const char *type, void *devdata,
+				const struct thermal_cooling_device_ops *ops)
 { return ERR_PTR(-ENODEV); }
 static inline struct thermal_cooling_device *
 thermal_of_cooling_device_register(struct device *parent, struct device_node *np, const char *type,

-- 
2.39.5


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ