FAILED: patch "[PATCH] ACPI: fan: Use platform device for devres-related actions" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x d91a1d129b63614fa4c2e45e60918409ce36db7e
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025110248-reflex-facebook-1ab2@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From d91a1d129b63614fa4c2e45e60918409ce36db7e Mon Sep 17 00:00:00 2001
From: Armin Wolf <[email protected]>
Date: Wed, 8 Oct 2025 01:41:46 +0200
Subject: [PATCH] ACPI: fan: Use platform device for devres-related actions
Device-managed resources are cleaned up when the driver unbinds from the underlying device. In our case this is the platform device as this driver is a platform driver. Registering device-managed resources on the associated ACPI device will thus result in a resource leak when this driver unbinds.
Ensure that any device-managed resources are only registered on the platform device to ensure that they are cleaned up during removal.
drivers/acpi/fan.h +2 -2
@@ -65,9 +65,9 @@ int acpi_fan_create_attributes(struct acpi_device *device);void acpi_fan_delete_attributes (struct acpi_device *device);#if IS_REACHABLE (CONFIG_HWMON ) -int devm_acpi_fan_create_hwmon (struct acpi_device *device); +int devm_acpi_fan_create_hwmon (struct device *dev);#else -static inline int devm_acpi_fan_create_hwmon (struct acpi_device *device) {return 0 ; }; +static inline int devm_acpi_fan_create_hwmon (struct device *dev) {return 0 ; };#endif #endif
drivers/acpi/fan_core.c +1 -1
@@ -347,7 +347,7 @@ static int acpi_fan_probe(struct platform_device *pdev) }if (fan->has_fst) { - result =devm_acpi_fan_create_hwmon (device); + result =devm_acpi_fan_create_hwmon (&pdev->dev);if (result)return result;
drivers/acpi/fan_hwmon.c +4 -4
@@ -166,12 +166,12 @@ static const struct hwmon_chip_info acpi_fan_hwmon_chip_info = { .info = acpi_fan_hwmon_info, }; -int devm_acpi_fan_create_hwmon (struct acpi_device *device) +int devm_acpi_fan_create_hwmon (struct device *dev) { -struct acpi_fan *fan =acpi_driver_data (device); +struct acpi_fan *fan =dev_get_drvdata (dev);struct device *hdev; - hdev =devm_hwmon_device_register_with_info (&device->dev,"acpi_fan" , fan, - &acpi_fan_hwmon_chip_info,NULL ); + hdev =devm_hwmon_device_register_with_info (dev,"acpi_fan" , fan, &acpi_fan_hwmon_chip_info, +NULL );return PTR_ERR_OR_ZERO (hdev); }
Sasha Levin
maintainerPATCH 1/2 ACPI: fan: Add fan speed reporting for fans with only _FST
From: Joshua Grisham <[email protected]>
[ Upstream commit 6c00f29f74cb2c063b6f31a0b6d73f9db132b9ac ]
Add support for ACPI fans with _FST to report their speed even if they do not support fan control.
As suggested by Armin Wolf [1] and per the Windows Thermal Management Design Guide [2], Samsung Galaxy Book series devices (and possibly many more devices where the Windows guide was strictly followed) only implement the _FST method and do not support ACPI-based fan control.
Currently, these fans are not supported by the kernel driver but this patch will make some very small adjustments to allow them to be supported.
This patch is tested and working for me on a Samsung Galaxy Book2 Pro whose DSDT (and several other Samsung Galaxy Book series notebooks which currently have the same issue) can be found at [3].
Stable-dep-of: d91a1d129b63 ("ACPI: fan: Use platform device for devres-related actions")
--- drivers/acpi/fan.h | 1 + drivers/acpi/fan_attr.c | 37 ++++++++++++++++++++++--------------- drivers/acpi/fan_core.c | 25 ++++++++++++++++++------- drivers/acpi/fan_hwmon.c | 8 ++++++++ 4 files changed, 49 insertions(+), 22 deletions(-)
drivers/acpi/fan.h +1 -0
@@ -48,6 +48,7 @@ struct acpi_fan_fst {struct acpi_fan {bool acpi4; +bool has_fst;struct acpi_fan_fif fif;struct acpi_fan_fps *fps;int fps_count;
drivers/acpi/fan_attr.c +22 -15
@@ -75,15 +75,6 @@ int acpi_fan_create_attributes(struct acpi_device *device)struct acpi_fan *fan =acpi_driver_data (device);int i, status; -sysfs_attr_init (&fan->fine_grain_control.attr); - fan->fine_grain_control.show = show_fine_grain_control; - fan->fine_grain_control.store =NULL ; - fan->fine_grain_control.attr.name ="fine_grain_control" ; - fan->fine_grain_control.attr.mode =0444 ; - status =sysfs_create_file (&device->dev.kobj, &fan->fine_grain_control.attr); -if (status) -return status; -/* _FST is present if we are here */ sysfs_attr_init (&fan->fst_speed.attr); fan->fst_speed.show = show_fan_speed;
@@ -92,7 +83,19 @@ int acpi_fan_create_attributes(struct acpi_device *device) fan->fst_speed.attr.mode =0444 ; status =sysfs_create_file (&device->dev.kobj, &fan->fst_speed.attr);if (status) - goto rem_fine_grain_attr; +return status; + +if (!fan->acpi4) +return 0 ; + +sysfs_attr_init (&fan->fine_grain_control.attr); + fan->fine_grain_control.show = show_fine_grain_control; + fan->fine_grain_control.store =NULL ; + fan->fine_grain_control.attr.name ="fine_grain_control" ; + fan->fine_grain_control.attr.mode =0444 ; + status =sysfs_create_file (&device->dev.kobj, &fan->fine_grain_control.attr); +if (status) + goto rem_fst_attr;for (i =0 ; i < fan->fps_count; ++i) {struct acpi_fan_fps *fps = &fan->fps[i];
@@ -109,18 +112,18 @@ int acpi_fan_create_attributes(struct acpi_device *device)for (j =0 ; j < i; ++j)sysfs_remove_file (&device->dev.kobj, &fan->fps[j].dev_attr.attr); - goto rem_fst_attr; + goto rem_fine_grain_attr; } }return 0 ; -rem_fst_attr: -sysfs_remove_file (&device->dev.kobj, &fan->fst_speed.attr); - rem_fine_grain_attr:sysfs_remove_file (&device->dev.kobj, &fan->fine_grain_control.attr); +rem_fst_attr: +sysfs_remove_file (&device->dev.kobj, &fan->fst_speed.attr); +return status; }
@@ -129,9 +132,13 @@ void acpi_fan_delete_attributes(struct acpi_device *device)struct acpi_fan *fan =acpi_driver_data (device);int i; +sysfs_remove_file (&device->dev.kobj, &fan->fst_speed.attr); + +if (!fan->acpi4) +return ; +for (i =0 ; i < fan->fps_count; ++i)sysfs_remove_file (&device->dev.kobj, &fan->fps[i].dev_attr.attr); -sysfs_remove_file (&device->dev.kobj, &fan->fst_speed.attr);sysfs_remove_file (&device->dev.kobj, &fan->fine_grain_control.attr); }
drivers/acpi/fan_core.c +18 -7
@@ -203,12 +203,16 @@ static const struct thermal_cooling_device_ops fan_cooling_ops = {* -------------------------------------------------------------------------- */ +static bool acpi_fan_has_fst (struct acpi_device *device) +{ +return acpi_has_method (device->handle,"_FST" ); +} +static bool acpi_fan_is_acpi4 (struct acpi_device *device) {return acpi_has_method (device->handle,"_FIF" ) &&acpi_has_method (device->handle,"_FPS" ) && -acpi_has_method (device->handle,"_FSL" ) && -acpi_has_method (device->handle,"_FST" ); +acpi_has_method (device->handle,"_FSL" ); }static int acpi_fan_get_fif (struct acpi_device *device)
@@ -327,7 +331,12 @@ static int acpi_fan_probe(struct platform_device *pdev) device->driver_data = fan;platform_set_drvdata (pdev, fan); -if (acpi_fan_is_acpi4 (device)) { +if (acpi_fan_has_fst (device)) { + fan->has_fst = true; + fan->acpi4 =acpi_fan_is_acpi4 (device); + } + +if (fan->acpi4) { result =acpi_fan_get_fif (device);if (result)return result;
@@ -335,7 +344,9 @@ static int acpi_fan_probe(struct platform_device *pdev) result =acpi_fan_get_fps (device);if (result)return result; + } +if (fan->has_fst) { result =devm_acpi_fan_create_hwmon (device);if (result)return result;
@@ -343,9 +354,9 @@ static int acpi_fan_probe(struct platform_device *pdev) result =acpi_fan_create_attributes (device);if (result)return result; + } - fan->acpi4 = true; - }else { +if (!fan->acpi4) { result =acpi_device_update_power (device,NULL );if (result) {dev_err (&device->dev,"Failed to set initial power state\n" );
@@ -391,7 +402,7 @@ static int acpi_fan_probe(struct platform_device *pdev) err_unregister:thermal_cooling_device_unregister (cdev); err_end: -if (fan->acpi4) +if (fan->has_fst)acpi_fan_delete_attributes (device);return result;
@@ -401,7 +412,7 @@ static void acpi_fan_remove(struct platform_device *pdev) {struct acpi_fan *fan =platform_get_drvdata (pdev); -if (fan->acpi4) { +if (fan->has_fst) {struct acpi_device *device =ACPI_COMPANION (&pdev->dev);acpi_fan_delete_attributes (device);
drivers/acpi/fan_hwmon.c +8 -0
@@ -43,6 +43,10 @@ static umode_t acpi_fan_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_case hwmon_fan_input:return 0444 ;case hwmon_fan_target: +/* Only acpi4 fans support fan control. */ +if (!fan->acpi4) +return 0 ; +/* * When in fine grain control mode, not every fan control value * has an associated fan performance state.
@@ -57,6 +61,10 @@ static umode_t acpi_fan_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_case hwmon_power:switch (attr) {case hwmon_power_input: +/* Only acpi4 fans support fan control. */ +if (!fan->acpi4) +return 0 ; +/* * When in fine grain control mode, not every fan control value * has an associated fan performance state.
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/2 ACPI: fan: Use platform device for devres-related actions
From: Armin Wolf <[email protected]>
[ Upstream commit d91a1d129b63614fa4c2e45e60918409ce36db7e ]
Device-managed resources are cleaned up when the driver unbinds from the underlying device. In our case this is the platform device as this driver is a platform driver. Registering device-managed resources on the associated ACPI device will thus result in a resource leak when this driver unbinds.
Ensure that any device-managed resources are only registered on the platform device to ensure that they are cleaned up during removal.
--- drivers/acpi/fan.h | 4 ++-- drivers/acpi/fan_core.c | 2 +- drivers/acpi/fan_hwmon.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-)
drivers/acpi/fan.h +2 -2
@@ -62,9 +62,9 @@ int acpi_fan_create_attributes(struct acpi_device *device);void acpi_fan_delete_attributes (struct acpi_device *device);#if IS_REACHABLE (CONFIG_HWMON ) -int devm_acpi_fan_create_hwmon (struct acpi_device *device); +int devm_acpi_fan_create_hwmon (struct device *dev);#else -static inline int devm_acpi_fan_create_hwmon (struct acpi_device *device) {return 0 ; }; +static inline int devm_acpi_fan_create_hwmon (struct device *dev) {return 0 ; };#endif #endif
drivers/acpi/fan_core.c +1 -1
@@ -347,7 +347,7 @@ static int acpi_fan_probe(struct platform_device *pdev) }if (fan->has_fst) { - result =devm_acpi_fan_create_hwmon (device); + result =devm_acpi_fan_create_hwmon (&pdev->dev);if (result)return result;
drivers/acpi/fan_hwmon.c +4 -4
@@ -167,12 +167,12 @@ static const struct hwmon_chip_info acpi_fan_hwmon_chip_info = { .info = acpi_fan_hwmon_info, }; -int devm_acpi_fan_create_hwmon (struct acpi_device *device) +int devm_acpi_fan_create_hwmon (struct device *dev) { -struct acpi_fan *fan =acpi_driver_data (device); +struct acpi_fan *fan =dev_get_drvdata (dev);struct device *hdev; - hdev =devm_hwmon_device_register_with_info (&device->dev,"acpi_fan" , fan, - &acpi_fan_hwmon_chip_info,NULL ); + hdev =devm_hwmon_device_register_with_info (dev,"acpi_fan" , fan, &acpi_fan_hwmon_chip_info, +NULL );return PTR_ERR_OR_ZERO (hdev); }
Signature · 1 line
2.51.0
Re: [PATCH 6.12.y 2/2] ACPI: fan: Use platform device for devres-related actions
Am 02.11.25 um 15:35 schrieb Sasha Levin:
Quoted 4 lines
From: Armin Wolf <[email protected]>
[ Upstream commit
d91a1d129b63614fa4c2e45e60918409ce36db7e]
Quoted 8 lines
Device-managed resources are cleaned up when the driver unbinds from the underlying device. In our case this is the platform device as this driver is a platform driver. Registering device-managed resources on the associated ACPI device will thus result in a resource leak when this driver unbinds.
Ensure that any device-managed resources are only registered on the platform device to ensure that they are cleaned up during removal.
Please note that this patch depends on "ACPI: fan: Use ACPI handle when retrieving _FST", otherwise the ACPI fan driver will panic when probing.
Thanks,
Armin Wolf
Quoted 62 lines
Fixes 35c50d853adc ("ACPI: fan: Add hwmon support")Signed-off-by Armin Wolf <[email protected]>Cc 6.11+ <[email protected]> # 6.11+Signed-off-by Rafael J. Wysocki <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/acpi/fan.h | 4 ++-- drivers/acpi/fan_core.c | 2 +- drivers/acpi/fan_hwmon.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-)drivers/acpi/fan.h +2
-2@@ -62,9 +62,9 @@ int acpi_fan_create_attributes(struct acpi_device *device);void acpi_fan_delete_attributes (struct acpi_device *device);#if IS_REACHABLE (CONFIG_HWMON ) -int devm_acpi_fan_create_hwmon (struct acpi_device *device); +int devm_acpi_fan_create_hwmon (struct device *dev);#else -static inline int devm_acpi_fan_create_hwmon (struct acpi_device *device) {return 0 ; }; +static inline int devm_acpi_fan_create_hwmon (struct device *dev) {return 0 ; };#endif #endif drivers/acpi/fan_core.c +1
-1@@ -347,7 +347,7 @@ static int acpi_fan_probe(struct platform_device *pdev) }if (fan->has_fst) { - result =devm_acpi_fan_create_hwmon (device); + result =devm_acpi_fan_create_hwmon (&pdev->dev);if (result)return result;drivers/acpi/fan_hwmon.c +4
-4@@ -167,12 +167,12 @@ static const struct hwmon_chip_info acpi_fan_hwmon_chip_info = { .info = acpi_fan_hwmon_info, }; -int devm_acpi_fan_create_hwmon (struct acpi_device *device) +int devm_acpi_fan_create_hwmon (struct device *dev) { -struct acpi_fan *fan =acpi_driver_data (device); +struct acpi_fan *fan =dev_get_drvdata (dev);struct device *hdev; - hdev =devm_hwmon_device_register_with_info (&device->dev,"acpi_fan" , fan, - &acpi_fan_hwmon_chip_info,NULL ); + hdev =devm_hwmon_device_register_with_info (dev,"acpi_fan" , fan, &acpi_fan_hwmon_chip_info, +NULL );return PTR_ERR_OR_ZERO (hdev); }