All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kurt Borja <kuurtb@gmail.com>
To: kuurtb@gmail.com
Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com,
	ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org,
	mario.limonciello@amd.com, platform-driver-x86@vger.kernel.org,
	w_armin@gmx.de
Subject: [RFC PATCH 08/21] alienware-wmi: Add WMI Drivers
Date: Wed,  4 Dec 2024 21:41:26 -0300	[thread overview]
Message-ID: <20241205004125.2185385-2-kuurtb@gmail.com> (raw)
In-Reply-To: <20241205002733.2183537-3-kuurtb@gmail.com>

Add WMI drivers for LEGACY and WMAX devices. On hosts that support the
AlienFX interface, the corresponding platform device will be registered
as a bundle on the WMI driver's probe and will "pass" a WMI device
pointer to the platform device as platform specific data.

Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
 drivers/platform/x86/dell/alienware-wmi.c | 115 +++++++++++++++++++++-
 1 file changed, 113 insertions(+), 2 deletions(-)

diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index e5e4a7b4e9ca..38e9cb80ae69 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,6 +411,10 @@ struct alienfx_priv {
 	u8 lighting_control_state;
 };
 
+struct alienfx_platdata {
+	struct wmi_device *wdev;
+};
+
 static struct platform_device *platform_device;
 static struct platform_profile_handler pp_handler;
 static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
@@ -1150,6 +1153,114 @@ static struct platform_driver platform_driver = {
 	.probe = alienfx_probe,
 };
 
+static int alienfx_wmi_init(struct alienfx_platdata *pdata)
+{
+	struct platform_device *pdev;
+
+	pdev = platform_create_bundle(&platform_driver, alienfx_probe, NULL, 0,
+				      pdata, sizeof(*pdata));
+
+	dev_set_drvdata(&pdata->wdev->dev, pdev);
+
+	return PTR_ERR_OR_ZERO(pdev);
+}
+
+static void alienfx_wmi_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 device
+ */
+static int legacy_wmi_probe(struct wmi_device *wdev, const void *context)
+{
+	int ret = 0;
+	struct alienfx_platdata pdata = {
+		.wdev = wdev,
+	};
+
+	if (quirks->num_zones > 0)
+		ret = alienfx_wmi_init(&pdata);
+
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static void legacy_wmi_remove(struct wmi_device *wdev)
+{
+	if (quirks->num_zones > 0)
+		alienfx_wmi_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,
+};
+
+/*
+ * WMAX WMI device
+ */
+static int wmax_wmi_probe(struct wmi_device *wdev, const void *context)
+{
+	int ret = 0;
+	struct alienfx_platdata pdata = {
+		.wdev = wdev,
+	};
+
+	if (quirks->thermal)
+		ret = create_thermal_profile();
+	else if (quirks->num_zones > 0)
+		ret = alienfx_wmi_init(&pdata);
+
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static void wmax_wmi_remove(struct wmi_device *wdev)
+{
+	if (quirks->thermal)
+		remove_thermal_profile();
+	else if (quirks->num_zones > 0)
+		alienfx_wmi_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_wmi_init(void)
 {
 	int ret;
-- 
2.47.1


  parent reply	other threads:[~2024-12-05  0:41 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-05  0:27 [RFC PATCH 00/21] alienware-wmi driver rework Kurt Borja
2024-12-05  0:38 ` [RFC PATCH 01/21] alienware-wmi: Modify parse_rgb() signature Kurt Borja
2024-12-05  0:38 ` [RFC PATCH 02/21] alienware-wmi: Move Lighting Control State Kurt Borja
2024-12-05  0:39 ` [RFC PATCH 03/21] alienware-wmi: Remove unnecessary check at module exit Kurt Borja
2024-12-05  0:39 ` [RFC PATCH 04/21] alienware-wmi: Improve sysfs groups creation Kurt Borja
2024-12-05  0:40 ` [RFC PATCH 05/21] alienware-wmi: Refactor rgb-zones sysfs group creation Kurt Borja
2024-12-05 10:17   ` Ilpo Järvinen
2024-12-05 12:48     ` Kurt Borja
2024-12-05 13:18       ` Ilpo Järvinen
2024-12-05 13:34         ` Kurt Borja
2024-12-05  0:40 ` [RFC PATCH 06/21] alienware-wmi: Add state container and alienfx_probe() Kurt Borja
2024-12-05  0:40 ` [RFC PATCH 07/21] alienware-wmi: Migrate to state container pattern Kurt Borja
2024-12-05  0:41 ` Kurt Borja [this message]
2024-12-05  0:41 ` [RFC PATCH 09/21] alienware-wmi: Initialize WMI drivers Kurt Borja
2024-12-05  0:42 ` [RFC PATCH 10/21] alienware-wmi: Add alienfx OPs to platdata Kurt Borja
2024-12-05 11:05   ` Ilpo Järvinen
2024-12-05 12:50     ` Kurt Borja
2024-12-05  0:43 ` [RFC PATCH 11/21] alienware-wmi: Refactor LED control methods Kurt Borja
2024-12-05  0:43 ` [RFC PATCH 12/21] alienware-wmi: Refactor hdmi, amplifier, deepslp Kurt Borja
2024-12-05  0:44 ` [RFC PATCH 13/21] alienware-wmi: Add a state container for AWCC Kurt Borja
2024-12-05  0:44 ` [RFC PATCH 14/21] alienware-wmi: Migrate thermal methods to wmidev Kurt Borja
2024-12-05  0:44 ` [RFC PATCH 15/21] alienware-wmi: Refactor sysfs visibility methods Kurt Borja
2024-12-05  0:45 ` [RFC PATCH 16/21] alienware-wmi: Make running control state part of platdata Kurt Borja
2024-12-05 11:32   ` Ilpo Järvinen
2024-12-05 13:10     ` Kurt Borja
2024-12-05 14:06       ` Ilpo Järvinen
2024-12-07  2:10         ` Kurt Borja
2024-12-05  0:46 ` [RFC PATCH 17/21] alienware-wmi: Drop thermal methods dependency on quirks Kurt Borja
2024-12-05 11:14   ` Ilpo Järvinen
2024-12-05 12:56     ` Kurt Borja
2024-12-05  0:46 ` [RFC PATCH 18/21] platform-x86: Add header file for alienware-wmi Kurt Borja
2024-12-05  7:49   ` kernel test robot
2024-12-05  0:47 ` [RFC PATCH 19/21] platform-x86: Rename alienare-wmi Kurt Borja
2024-12-05 11:16   ` Ilpo Järvinen
2024-12-05 12:57     ` Kurt Borja
2024-12-05  0:47 ` [RFC PATCH 20/21] platform-x86: Split the alienware-wmi module Kurt Borja
2024-12-05  0:48 ` [RFC PATCH 21/21] platform-x86: Add config entries to alienware-wmi Kurt Borja
2024-12-06 23:26 ` [RFC PATCH 00/21] alienware-wmi driver rework Armin Wolf
2024-12-07  1:59   ` Kurt Borja
2024-12-07  3:20     ` Armin Wolf
2024-12-07  3:47       ` 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=20241205004125.2185385-2-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 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.