From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Krishna Chomal <krishna.chomal108@gmail.com>
Cc: Hans de Goede <hansg@kernel.org>,
linux@roeck-us.net, platform-driver-x86@vger.kernel.org,
linux-hwmon@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 2/2] platform/x86: hp-wmi: implement fan keep-alive
Date: Mon, 12 Jan 2026 17:14:12 +0200 (EET) [thread overview]
Message-ID: <6b2be55e-dcfe-74b7-d8ca-b78f49cedb7a@linux.intel.com> (raw)
In-Reply-To: <20251230145053.516196-3-krishna.chomal108@gmail.com>
On Tue, 30 Dec 2025, Krishna Chomal wrote:
> The firmware on some HP laptops automatically reverts the fan speed
> control to "Auto" mode after a 120 second timeout window.
>
> To ensure that the user-selected fan profile (Max/Manual) persists,
> implement a keep-alive mechanism that periodically refreshes the fan
> mode trigger before the timeout occurs.
>
> - Introduce a delayed workqueue to trigger the fan mode refresh every 90
> seconds, ensuring the system maintains the correct fan mode setting.
> - Integrate the refresh mechanism into hp_wmi_hwmon_enforce_ctx() to
> start, update or cancel the keep-alive process based on the current
> fan mode.
>
> This ensures that the driver stays in sync with the hardware.
>
> Tested on: HP Omen 16-wf1xxx (board ID 8C78)
>
> Signed-off-by: Krishna Chomal <krishna.chomal108@gmail.com>
> ---
> Changes in v2:
> - Explicitly specify time unit in KEEP_ALIVE_DELAY macro
> - Handle work rescheduling directly in switch/case
> ---
> drivers/platform/x86/hp/hp-wmi.c | 46 +++++++++++++++++++++++++++++---
> 1 file changed, 43 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> index ef419575174c..cf9327e1f40e 100644
> --- a/drivers/platform/x86/hp/hp-wmi.c
> +++ b/drivers/platform/x86/hp/hp-wmi.c
> @@ -34,6 +34,7 @@
> #include <linux/limits.h>
> #include <linux/minmax.h>
> #include <linux/compiler_attributes.h>
> +#include <linux/workqueue.h>
>
> MODULE_AUTHOR("Matthew Garrett <mjg59@srcf.ucam.org>");
> MODULE_DESCRIPTION("HP laptop WMI driver");
> @@ -368,6 +369,7 @@ struct hp_wmi_hwmon_priv {
> u8 gpu_delta;
> u8 mode;
> u8 pwm;
> + struct delayed_work keep_alive_dwork;
> };
>
> struct victus_s_fan_table_header {
> @@ -386,6 +388,12 @@ struct victus_s_fan_table {
> struct victus_s_fan_table_entry entries[];
> } __packed;
>
> +/*
> + * 90s delay to prevent the firmware from resetting fan mode after fixed
> + * 120s timeout
> + */
> +#define KEEP_ALIVE_DELAY_SECS 90
> +
> static inline u8 rpm_to_pwm(u8 rpm, struct hp_wmi_hwmon_priv *priv)
> {
> return fixp_linear_interpolate(0, 0, priv->max_rpm, U8_MAX,
> @@ -2093,6 +2101,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
> static void __exit hp_wmi_bios_remove(struct platform_device *device)
> {
> int i;
> + struct hp_wmi_hwmon_priv *ctx;
Can't we just call this priv everywhere as per the normal custom?
>
> for (i = 0; i < rfkill2_count; i++) {
> rfkill_unregister(rfkill2[i].rfkill);
> @@ -2111,6 +2120,10 @@ static void __exit hp_wmi_bios_remove(struct platform_device *device)
> rfkill_unregister(wwan_rfkill);
> rfkill_destroy(wwan_rfkill);
> }
> +
> + ctx = platform_get_drvdata(device);
> + if (ctx)
> + cancel_delayed_work_sync(&ctx->keep_alive_dwork);
> }
>
> static int hp_wmi_resume_handler(struct device *device)
> @@ -2179,12 +2192,20 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
> if (is_victus_s_thermal_profile())
> hp_wmi_get_fan_count_userdefine_trigger();
> ret = hp_wmi_fan_speed_max_set(1);
> - return ret;
> + if (ret < 0)
> + return ret;
> + schedule_delayed_work(&priv->keep_alive_dwork,
> + secs_to_jiffies(KEEP_ALIVE_DELAY_SECS));
> + return 0;
> case PWM_MODE_MANUAL:
> if (!is_victus_s_thermal_profile())
> return -EOPNOTSUPP;
> ret = hp_wmi_fan_speed_set(priv, pwm_to_rpm(priv->pwm, priv));
> - return ret;
> + if (ret < 0)
> + return ret;
> + schedule_delayed_work(&priv->keep_alive_dwork,
> + secs_to_jiffies(KEEP_ALIVE_DELAY_SECS));
> + return 0;
> case PWM_MODE_AUTO:
> if (is_victus_s_thermal_profile()) {
> hp_wmi_get_fan_count_userdefine_trigger();
> @@ -2192,7 +2213,10 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
> } else {
> ret = hp_wmi_fan_speed_max_set(0);
> }
> - return ret;
> + if (ret < 0)
> + return ret;
> + cancel_delayed_work_sync(&priv->keep_alive_dwork);
> + return 0;
> default:
> /* shouldn't happen */
> return -EINVAL;
> @@ -2337,6 +2361,20 @@ static const struct hwmon_chip_info chip_info = {
> .info = info,
> };
>
> +static void hp_wmi_hwmon_keep_alive_handler(struct work_struct *work)
> +{
> + struct delayed_work *dwork;
> + struct hp_wmi_hwmon_priv *ctx;
> +
> + dwork = to_delayed_work(work);
> + ctx = container_of(dwork, struct hp_wmi_hwmon_priv, keep_alive_dwork);
> + /*
> + * Re-apply the current hwmon context settings.
> + * NOTE: hp_wmi_apply_fan_settings will handle the re-scheduling.
> + */
> + hp_wmi_apply_fan_settings(ctx);
> +}
> +
> static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)
> {
> u8 fan_data[128] = { 0 };
> @@ -2395,6 +2433,8 @@ static int hp_wmi_hwmon_init(void)
> return PTR_ERR(hwmon);
> }
>
> + INIT_DELAYED_WORK(&priv->keep_alive_dwork, hp_wmi_hwmon_keep_alive_handler);
> + platform_set_drvdata(hp_wmi_platform_dev, priv);
> hp_wmi_apply_fan_settings(priv);
>
> return 0;
>
--
i.
next prev parent reply other threads:[~2026-01-12 15:14 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-25 14:23 [PATCH 0/2] platform/x86: hp-wmi: Add manual fan support for Victus S laptops Krishna Chomal
2025-12-25 14:23 ` [PATCH 1/2] platform/x86: hp-wmi: add manual fan control for Victus S models Krishna Chomal
2025-12-29 13:08 ` Ilpo Järvinen
2025-12-30 14:22 ` Krishna Chomal
2025-12-25 14:23 ` [PATCH 2/2] platform/x86: hp-wmi: implement fan keep-alive Krishna Chomal
2025-12-29 13:21 ` Ilpo Järvinen
2025-12-30 14:33 ` Krishna Chomal
2025-12-30 14:50 ` [PATCH v2 0/2] platform/x86: hp-wmi: Add manual fan support for Victus S laptops Krishna Chomal
2025-12-30 14:50 ` [PATCH v2 1/2] platform/x86: hp-wmi: add manual fan control for Victus S models Krishna Chomal
2026-01-12 15:13 ` Ilpo Järvinen
2026-01-12 18:03 ` Krishna Chomal
2026-01-12 18:08 ` Ilpo Järvinen
2026-01-12 18:17 ` Krishna Chomal
2025-12-30 14:50 ` [PATCH v2 2/2] platform/x86: hp-wmi: implement fan keep-alive Krishna Chomal
2026-01-12 15:14 ` Ilpo Järvinen [this message]
2026-01-12 18:07 ` Krishna Chomal
2026-01-13 12:37 ` [PATCH v3 0/3] platform/x86: hp-wmi: Add manual fan support for Victus S laptops Krishna Chomal
2026-01-13 12:37 ` [PATCH v3 1/3] platform/x86: hp-wmi: order include headers Krishna Chomal
2026-01-13 12:37 ` [PATCH v3 2/3] platform/x86: hp-wmi: add manual fan control for Victus S models Krishna Chomal
2026-01-13 12:37 ` [PATCH v3 3/3] platform/x86: hp-wmi: implement fan keep-alive Krishna Chomal
2026-01-15 13:45 ` [PATCH v3 0/3] platform/x86: hp-wmi: Add manual fan support for Victus S laptops Ilpo Järvinen
2026-01-16 14:23 ` Krishna Chomal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6b2be55e-dcfe-74b7-d8ca-b78f49cedb7a@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=hansg@kernel.org \
--cc=krishna.chomal108@gmail.com \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=platform-driver-x86@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.