[PATCH 1/2] hp-wmi: Modernize hp_wmi_perform_query() to use the modern API
yahia <[email protected]>
| Newsgroups | org.kernel.vger.platform-driver-x86 |
|---|---|
| Message-ID | <[email protected]> |
From: yahia ahmed <[email protected]> hp_wmi_perform_query() currently uses the deprecated GUID-based WMI interface wmi_evaluate_method(). Migrate hp-wmi to the modern bus-based WMI API by registering a struct wmi_driver and replacing wmi_evaluate_method() calls with wmidev_evaluate_method(). Suggested-by: Ilpo Järvinen <[email protected]> Signed-off-by: yahia ahmed <[email protected]> --- drivers/platform/x86/hp/hp-wmi.c | 49 ++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c index 8ba286ed8721..5845b169df39 100644 --- a/drivers/platform/x86/hp/hp-wmi.c +++ b/drivers/platform/x86/hp/hp-wmi.c @@ -14,6 +14,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/acpi.h> +#include <linux/wmi.h> #include <linux/cleanup.h> #include <linux/compiler_attributes.h> #include <linux/dmi.h> @@ -506,6 +507,14 @@ struct hp_wmi_hwmon_priv { struct delayed_work keep_alive_dwork; }; +struct wmi_device *hp_wmi_wdev; + +static const struct wmi_device_id hp_wmi_guid_table[] = { + { .guid_string = HPWMI_BIOS_GUID }, + {} +}; +MODULE_DEVICE_TABLE(wmi, hp_wmi_guid_table); + struct victus_s_fan_table_header { u8 num_fans; u8 unknown; @@ -606,7 +615,7 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, args->datasize = insize; memcpy(args->data, buffer, flex_array_size(args, data, insize)); - ret = wmi_evaluate_method(HPWMI_BIOS_GUID, 0, mid, &input, &output); + ret = wmidev_evaluate_method(hp_wmi_wdev, 0, mid, &input, &output); if (ret) goto out_free; @@ -2717,14 +2726,40 @@ static void __init setup_active_thermal_profile_params(void) } } +static int hp_wmi_probe(struct wmi_device *wdev, const void *context) +{ + hp_wmi_wdev = wdev; + return 0; +} + +static void hp_wmi_remove(struct wmi_device *wdev) +{ + hp_wmi_wdev = NULL; +} + +static struct wmi_driver hp_wmi_wdev_driver = { + .driver = { + .name = "hp-wmi-wdev", + }, + .id_table = hp_wmi_guid_table, + .probe = hp_wmi_probe, + .remove = hp_wmi_remove, +}; + + static int __init hp_wmi_init(void) { int event_capable = wmi_has_guid(HPWMI_EVENT_GUID); int bios_capable = wmi_has_guid(HPWMI_BIOS_GUID); int err, tmp = 0; + err = wmi_driver_register(&hp_wmi_wdev_driver); + if (err) + return err; - if (!bios_capable && !event_capable) - return -ENODEV; + if (!bios_capable && !event_capable) { + err = -ENODEV; + goto err_unregister_wmi; + } if (hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, HPWMI_READ, &tmp, sizeof(tmp), sizeof(tmp)) == HPWMI_RET_INVALID_PARAMETERS) @@ -2733,7 +2768,7 @@ static int __init hp_wmi_init(void) if (event_capable) { err = hp_wmi_input_setup(); if (err) - return err; + goto err_unregister_wmi; } if (bios_capable) { @@ -2771,7 +2806,8 @@ static int __init hp_wmi_init(void) err_destroy_input: if (event_capable) hp_wmi_input_destroy(); - +err_unregister_wmi: + wmi_driver_unregister(&hp_wmi_wmi_driver); return err; } module_init(hp_wmi_init); @@ -2794,5 +2830,8 @@ static void __exit hp_wmi_exit(void) platform_device_unregister(hp_wmi_platform_dev); platform_driver_unregister(&hp_wmi_driver); } + + if (hp_wmi_wdev) + wmi_driver_unregister(&hp_wmi_wdev_driver); } module_exit(hp_wmi_exit); -- 2.55.0