From: Kurt Borja <kuurtb@gmail.com>
To: platform-driver-x86@vger.kernel.org
Cc: ilpo.jarvinen@linux.intel.com, mario.limonciello@amd.com,
w_armin@gmx.de, hdegoede@redhat.com,
linux-kernel@vger.kernel.org, Dell.Client.Kernel@dell.com,
Kurt Borja <kuurtb@gmail.com>
Subject: [PATCH 08/20] alienware-wmi: Add WMI Drivers
Date: Sat, 21 Dec 2024 00:59:05 -0500 [thread overview]
Message-ID: <20241221055917.10555-9-kuurtb@gmail.com> (raw)
In-Reply-To: <20241221055917.10555-1-kuurtb@gmail.com>
Add WMI drivers for LEGACY and WMAX devices.
This involves moving platform driver and device registration to a helper
function, which is now called from the driver's preferred WMI device
driver probe. However this is only done if !quirks->thermal because
newer WMAX interface doesn't support any of the features exposed by this
device.
Only one driver is registered on module initialization to prevent
registering duplicate platform driver and device.
Aditionally, create_thermal_profile() now takes wmi_device * instead of
platform_device *.
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
drivers/platform/x86/dell/alienware-wmi.c | 186 +++++++++++++++++-----
1 file changed, 146 insertions(+), 40 deletions(-)
diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index 4b68d64bd742..f2f6842e27e6 100644
--- a/drivers/platform/x86/dell/alienware-wmi.c
+++ b/drivers/platform/x86/dell/alienware-wmi.c
@@ -15,6 +15,7 @@
#include <linux/platform_profile.h>
#include <linux/dmi.h>
#include <linux/leds.h>
+#include <linux/wmi.h>
#define LEGACY_CONTROL_GUID "A90597CE-A997-11DA-B012-B622A1EF5492"
#define LEGACY_POWER_CONTROL_GUID "A80593CE-A997-11DA-B012-B622A1EF5492"
@@ -39,8 +40,6 @@
MODULE_AUTHOR("Mario Limonciello <mario.limonciello@outlook.com>");
MODULE_DESCRIPTION("Alienware special feature control");
MODULE_LICENSE("GPL");
-MODULE_ALIAS("wmi:" LEGACY_CONTROL_GUID);
-MODULE_ALIAS("wmi:" WMAX_CONTROL_GUID);
static bool force_platform_profile;
module_param_unsafe(force_platform_profile, bool, 0);
@@ -412,7 +411,10 @@ struct alienfx_priv {
u8 lighting_control_state;
};
-static struct platform_device *platform_device;
+struct alienfx_platdata {
+ struct wmi_device *wdev;
+};
+
static struct platform_profile_handler pp_handler;
static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
@@ -1048,7 +1050,7 @@ static int thermal_profile_set(struct platform_profile_handler *pprof,
return wmax_thermal_control(supported_thermal_profiles[profile]);
}
-static int create_thermal_profile(struct platform_device *platform_device)
+static int create_thermal_profile(struct wmi_device *wdev)
{
enum platform_profile_option profile;
enum wmax_thermal_mode mode;
@@ -1097,7 +1099,7 @@ static int create_thermal_profile(struct platform_device *platform_device)
pp_handler.profile_get = thermal_profile_get;
pp_handler.profile_set = thermal_profile_set;
pp_handler.name = "alienware-wmi";
- pp_handler.dev = &platform_device->dev;
+ pp_handler.dev = &wdev->dev;
return platform_profile_register(&pp_handler);
}
@@ -1153,19 +1155,138 @@ static struct platform_driver platform_driver = {
.probe = alienfx_probe,
};
-static int __init alienware_wmi_init(void)
+static int alienware_alienfx_setup(struct alienfx_platdata *pdata)
{
+ struct platform_device *pdev;
int ret;
- if (wmi_has_guid(LEGACY_CONTROL_GUID))
- interface = LEGACY;
- else if (wmi_has_guid(WMAX_CONTROL_GUID))
- interface = WMAX;
- else {
- pr_warn("alienware-wmi: No known WMI GUID found\n");
- return -ENODEV;
+ ret = platform_driver_register(&platform_driver);
+ if (ret < 0)
+ return ret;
+
+ pdev = platform_device_register_data(NULL, "alienware-wmi",
+ PLATFORM_DEVID_NONE, pdata,
+ sizeof(*pdata));
+
+ if (IS_ERR(pdev)) {
+ platform_driver_unregister(&platform_driver);
+ return PTR_ERR(pdev);
}
+ dev_set_drvdata(&pdata->wdev->dev, pdev);
+
+ return 0;
+}
+
+static void alienware_alienfx_exit(struct wmi_device *wdev)
+{
+ struct platform_device *pdev;
+
+ pdev = dev_get_drvdata(&wdev->dev);
+
+ platform_device_unregister(pdev);
+ platform_driver_unregister(&platform_driver);
+}
+
+/*
+ * Legacy WMI driver
+ */
+static int legacy_wmi_probe(struct wmi_device *wdev, const void *context)
+{
+ struct alienfx_platdata pdata = {
+ .wdev = wdev,
+ };
+
+ return alienware_alienfx_setup(&pdata);
+}
+
+static void legacy_wmi_remove(struct wmi_device *wdev)
+{
+ alienware_alienfx_exit(wdev);
+}
+
+static struct wmi_device_id alienware_legacy_device_id_table[] = {
+ { LEGACY_CONTROL_GUID, NULL },
+ { },
+};
+MODULE_DEVICE_TABLE(wmi, alienware_legacy_device_id_table);
+
+static struct wmi_driver alienware_legacy_wmi_driver = {
+ .driver = {
+ .name = "alienware-wmi-alienfx",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
+ },
+ .id_table = alienware_legacy_device_id_table,
+ .probe = legacy_wmi_probe,
+ .remove = legacy_wmi_remove,
+};
+
+static int __init alienware_legacy_wmi_init(void)
+{
+ return wmi_driver_register(&alienware_legacy_wmi_driver);
+}
+
+static void __exit alienware_legacy_wmi_exit(void)
+{
+ wmi_driver_unregister(&alienware_legacy_wmi_driver);
+}
+
+/*
+ * WMAX WMI driver
+ */
+static int wmax_wmi_probe(struct wmi_device *wdev, const void *context)
+{
+ struct alienfx_platdata pdata = {
+ .wdev = wdev,
+ };
+ int ret = 0;
+
+ if (quirks->thermal)
+ ret = create_thermal_profile(wdev);
+ else
+ ret = alienware_alienfx_setup(&pdata);
+
+ return ret;
+}
+
+static void wmax_wmi_remove(struct wmi_device *wdev)
+{
+ if (quirks->thermal)
+ remove_thermal_profile();
+ else
+ alienware_alienfx_exit(wdev);
+}
+
+static struct wmi_device_id alienware_wmax_device_id_table[] = {
+ { WMAX_CONTROL_GUID, NULL },
+ { },
+};
+MODULE_DEVICE_TABLE(wmi, alienware_wmax_device_id_table);
+
+static struct wmi_driver alienware_wmax_wmi_driver = {
+ .driver = {
+ .name = "alienware-wmi-wmax",
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
+ },
+ .id_table = alienware_wmax_device_id_table,
+ .probe = wmax_wmi_probe,
+ .remove = wmax_wmi_remove,
+};
+
+static int __init alienware_wmax_wmi_init(void)
+{
+ return wmi_driver_register(&alienware_wmax_wmi_driver);
+}
+
+static void __exit alienware_wmax_wmi_exit(void)
+{
+ wmi_driver_unregister(&alienware_wmax_wmi_driver);
+}
+
+static int __init alienware_wmi_init(void)
+{
+ int ret;
+
dmi_check_system(alienware_quirks);
if (quirks == NULL)
quirks = &quirk_unknown;
@@ -1180,43 +1301,28 @@ static int __init alienware_wmi_init(void)
pr_warn("force_gmode requires platform profile support\n");
}
- ret = platform_driver_register(&platform_driver);
- if (ret)
- goto fail_platform_driver;
- platform_device = platform_device_alloc("alienware-wmi", PLATFORM_DEVID_NONE);
- if (!platform_device) {
- ret = -ENOMEM;
- goto fail_platform_device1;
+ if (wmi_has_guid(WMAX_CONTROL_GUID)) {
+ interface = WMAX;
+ ret = alienware_wmax_wmi_init();
+ } else {
+ interface = LEGACY;
+ ret = alienware_legacy_wmi_init();
}
- ret = platform_device_add(platform_device);
- if (ret)
- goto fail_platform_device2;
- if (quirks->thermal) {
- ret = create_thermal_profile(platform_device);
- if (ret)
- goto fail_prep_thermal_profile;
- }
+ if (ret < 0)
+ return ret;
return 0;
-
-fail_prep_thermal_profile:
- platform_device_del(platform_device);
-fail_platform_device2:
- platform_device_put(platform_device);
-fail_platform_device1:
- platform_driver_unregister(&platform_driver);
-fail_platform_driver:
- return ret;
}
module_init(alienware_wmi_init);
static void __exit alienware_wmi_exit(void)
{
- remove_thermal_profile();
- platform_device_unregister(platform_device);
- platform_driver_unregister(&platform_driver);
+ if (interface == WMAX)
+ alienware_wmax_wmi_exit();
+ else
+ alienware_legacy_wmi_exit();
}
module_exit(alienware_wmi_exit);
--
2.47.1
next prev parent reply other threads:[~2024-12-21 6:00 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-21 5:58 [PATCH 00/20] alienware-wmi driver rework Kurt Borja
2024-12-21 5:58 ` [PATCH 01/20] alienware-wmi: Remove unnecessary check at module exit Kurt Borja
2024-12-27 0:32 ` Armin Wolf
2024-12-21 5:58 ` [PATCH 02/20] alienware-wmi: Move Lighting Control State Kurt Borja
2024-12-27 0:35 ` Armin Wolf
2024-12-27 4:32 ` Kurt Borja
2024-12-21 5:59 ` [PATCH 03/20] alienware-wmi: Modify parse_rgb() signature Kurt Borja
2024-12-27 0:36 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 04/20] alienware-wmi: Improve hdmi_mux, amplifier and deepslp group creation Kurt Borja
2024-12-27 0:44 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 05/20] alienware-wmi: Improve rgb-zones " Kurt Borja
2024-12-27 1:04 ` Armin Wolf
2024-12-27 4:37 ` Kurt Borja
2024-12-29 0:17 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 06/20] alienware_wmi: Clean variable declaration in thermal methods Kurt Borja
2024-12-27 1:06 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 07/20] alienware-wmi: Add a state container for LED control feature Kurt Borja
2024-12-27 1:32 ` Armin Wolf
2024-12-27 4:39 ` Kurt Borja
2024-12-21 5:59 ` Kurt Borja [this message]
2024-12-27 3:21 ` [PATCH 08/20] alienware-wmi: Add WMI Drivers Armin Wolf
2024-12-27 4:44 ` Kurt Borja
2024-12-27 4:48 ` Kurt Borja
2024-12-29 0:26 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 09/20] alienware-wmi: Add a state container for thermal control methods Kurt Borja
2024-12-27 3:26 ` Armin Wolf
2024-12-27 4:50 ` Kurt Borja
2024-12-21 5:59 ` [PATCH 10/20] alienware-wmi: Refactor LED " Kurt Borja
2024-12-27 3:41 ` Armin Wolf
2024-12-27 4:52 ` Kurt Borja
2024-12-21 5:59 ` [PATCH 11/20] alienware-wmi: Refactor hdmi, amplifier, deepslp methods Kurt Borja
2024-12-27 3:43 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 12/20] alienware-wmi: Refactor thermal control methods Kurt Borja
2024-12-27 3:45 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 13/20] alienware-wmi: Split DMI table Kurt Borja
2024-12-27 3:55 ` Armin Wolf
2024-12-27 4:55 ` Kurt Borja
2024-12-29 0:30 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 14/20] MAINTAINERS: Update ALIENWARE WMI DRIVER entry Kurt Borja
2024-12-27 3:56 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 15/20] platform/x86: Rename alienware-wmi.c Kurt Borja
2024-12-27 3:57 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 16/20] platform/x86: Add alienware-wmi.h Kurt Borja
2024-12-27 4:02 ` Armin Wolf
2024-12-27 4:56 ` Kurt Borja
2024-12-21 5:59 ` [PATCH 17/20] platform-x86: Split the alienware-wmi driver Kurt Borja
2024-12-27 4:04 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 18/20] platform/x86: dell: Modify Makefile alignment Kurt Borja
2024-12-27 4:05 ` Armin Wolf
2024-12-27 4:57 ` Kurt Borja
2024-12-29 0:31 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 19/20] platform/x86: Update alienware-wmi config entries Kurt Borja
2024-12-27 4:08 ` Armin Wolf
2024-12-27 4:59 ` Kurt Borja
2024-12-29 0:32 ` Armin Wolf
2024-12-21 5:59 ` [PATCH 20/20] alienware-wmi: Update header and module information Kurt Borja
2024-12-27 4:08 ` Armin Wolf
2024-12-27 5:01 ` Kurt Borja
2024-12-22 23:06 ` [PATCH 00/20] alienware-wmi driver rework Armin Wolf
2024-12-25 20:25 ` Armin Wolf
2024-12-25 20:36 ` Kurt Borja
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=20241221055917.10555-9-kuurtb@gmail.com \
--to=kuurtb@gmail.com \
--cc=Dell.Client.Kernel@dell.com \
--cc=hdegoede@redhat.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=w_armin@gmx.de \
/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 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).