From: Kurt Borja <kuurtb@gmail.com>
To: platform-driver-x86@vger.kernel.org
Cc: ilpo.jarvinen@linux.intel.com, w_armin@gmx.de,
mario.limonciello@amd.com, hdegoede@redhat.com,
Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org,
Kurt Borja <kuurtb@gmail.com>, Armin Wolf <W_Armin@gmx.de>
Subject: [PATCH v3 04/20] platform/x86: alienware-wmi: Improve hdmi_mux, amplifier and deepslp group creation
Date: Sun, 5 Jan 2025 10:30:04 -0500 [thread overview]
Message-ID: <20250105153019.19206-6-kuurtb@gmail.com> (raw)
In-Reply-To: <20250105153019.19206-2-kuurtb@gmail.com>
Devices with hdmi_mux, amplifier or deepslp quirks create a sysfs group
for each available feature. To accomplish this, helper create/remove
functions were called on module init, but they had the following
problems:
- Create helpers called remove helpers on failure, which in turn tried
to remove the sysfs group that failed to be created
- If group creation failed mid way, previous successfully created groups
were not cleaned up
- Module exit only removed hdmi_mux group
To improve this, drop all helpers and let the platform driver manage these
sysfs groups, while controlling visibility with their respective quirks.
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
drivers/platform/x86/dell/alienware-wmi.c | 114 ++++++++--------------
1 file changed, 38 insertions(+), 76 deletions(-)
diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index e54e3cc45691..16a131cc9f11 100644
--- a/drivers/platform/x86/dell/alienware-wmi.c
+++ b/drivers/platform/x86/dell/alienware-wmi.c
@@ -417,12 +417,6 @@ static struct platform_zone *zone_data;
static struct platform_profile_handler pp_handler;
static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
-static struct platform_driver platform_driver = {
- .driver = {
- .name = "alienware-wmi",
- }
-};
-
static struct attribute_group zone_attribute_group = {
.name = "rgb_zones",
};
@@ -804,6 +798,12 @@ static DEVICE_ATTR(cable, S_IRUGO, show_hdmi_cable, NULL);
static DEVICE_ATTR(source, S_IRUGO | S_IWUSR, show_hdmi_source,
toggle_hdmi_source);
+static bool hdmi_group_visible(struct kobject *kobj)
+{
+ return quirks->hdmi_mux;
+}
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi);
+
static struct attribute *hdmi_attrs[] = {
&dev_attr_cable.attr,
&dev_attr_source.attr,
@@ -812,25 +812,10 @@ static struct attribute *hdmi_attrs[] = {
static const struct attribute_group hdmi_attribute_group = {
.name = "hdmi",
+ .is_visible = SYSFS_GROUP_VISIBLE(hdmi),
.attrs = hdmi_attrs,
};
-static void remove_hdmi(struct platform_device *dev)
-{
- if (quirks->hdmi_mux > 0)
- sysfs_remove_group(&dev->dev.kobj, &hdmi_attribute_group);
-}
-
-static int create_hdmi(struct platform_device *dev)
-{
- int ret;
-
- ret = sysfs_create_group(&dev->dev.kobj, &hdmi_attribute_group);
- if (ret)
- remove_hdmi(dev);
- return ret;
-}
-
/*
* Alienware GFX amplifier support
* - Currently supports reading cable status
@@ -859,6 +844,12 @@ static ssize_t show_amplifier_status(struct device *dev,
static DEVICE_ATTR(status, S_IRUGO, show_amplifier_status, NULL);
+static bool amplifier_group_visible(struct kobject *kobj)
+{
+ return quirks->amplifier;
+}
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier);
+
static struct attribute *amplifier_attrs[] = {
&dev_attr_status.attr,
NULL,
@@ -866,25 +857,10 @@ static struct attribute *amplifier_attrs[] = {
static const struct attribute_group amplifier_attribute_group = {
.name = "amplifier",
+ .is_visible = SYSFS_GROUP_VISIBLE(amplifier),
.attrs = amplifier_attrs,
};
-static void remove_amplifier(struct platform_device *dev)
-{
- if (quirks->amplifier > 0)
- sysfs_remove_group(&dev->dev.kobj, &lifier_attribute_group);
-}
-
-static int create_amplifier(struct platform_device *dev)
-{
- int ret;
-
- ret = sysfs_create_group(&dev->dev.kobj, &lifier_attribute_group);
- if (ret)
- remove_amplifier(dev);
- return ret;
-}
-
/*
* Deep Sleep Control support
* - Modifies BIOS setting for deep sleep control allowing extra wakeup events
@@ -937,6 +913,12 @@ static ssize_t toggle_deepsleep(struct device *dev,
static DEVICE_ATTR(deepsleep, S_IRUGO | S_IWUSR, show_deepsleep_status, toggle_deepsleep);
+static bool deepsleep_group_visible(struct kobject *kobj)
+{
+ return quirks->deepslp;
+}
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep);
+
static struct attribute *deepsleep_attrs[] = {
&dev_attr_deepsleep.attr,
NULL,
@@ -944,25 +926,10 @@ static struct attribute *deepsleep_attrs[] = {
static const struct attribute_group deepsleep_attribute_group = {
.name = "deepsleep",
+ .is_visible = SYSFS_GROUP_VISIBLE(deepsleep),
.attrs = deepsleep_attrs,
};
-static void remove_deepsleep(struct platform_device *dev)
-{
- if (quirks->deepslp > 0)
- sysfs_remove_group(&dev->dev.kobj, &deepsleep_attribute_group);
-}
-
-static int create_deepsleep(struct platform_device *dev)
-{
- int ret;
-
- ret = sysfs_create_group(&dev->dev.kobj, &deepsleep_attribute_group);
- if (ret)
- remove_deepsleep(dev);
- return ret;
-}
-
/*
* Thermal Profile control
* - Provides thermal profile control through the Platform Profile API
@@ -1166,6 +1133,23 @@ static int create_thermal_profile(struct platform_device *platform_device)
return devm_platform_profile_register(&pp_handler);
}
+/*
+ * Platform Driver
+ */
+static const struct attribute_group *alienfx_groups[] = {
+ &hdmi_attribute_group,
+ &lifier_attribute_group,
+ &deepsleep_attribute_group,
+ NULL
+};
+
+static struct platform_driver platform_driver = {
+ .driver = {
+ .name = "alienware-wmi",
+ .dev_groups = alienfx_groups,
+ },
+};
+
static int __init alienware_wmi_init(void)
{
int ret;
@@ -1205,24 +1189,6 @@ static int __init alienware_wmi_init(void)
if (ret)
goto fail_platform_device2;
- if (quirks->hdmi_mux > 0) {
- ret = create_hdmi(platform_device);
- if (ret)
- goto fail_prep_hdmi;
- }
-
- if (quirks->amplifier > 0) {
- ret = create_amplifier(platform_device);
- if (ret)
- goto fail_prep_amplifier;
- }
-
- if (quirks->deepslp > 0) {
- ret = create_deepsleep(platform_device);
- if (ret)
- goto fail_prep_deepsleep;
- }
-
if (quirks->thermal) {
ret = create_thermal_profile(platform_device);
if (ret)
@@ -1238,9 +1204,6 @@ static int __init alienware_wmi_init(void)
fail_prep_zones:
alienware_zone_exit(platform_device);
fail_prep_thermal_profile:
-fail_prep_deepsleep:
-fail_prep_amplifier:
-fail_prep_hdmi:
platform_device_del(platform_device);
fail_platform_device2:
platform_device_put(platform_device);
@@ -1255,7 +1218,6 @@ module_init(alienware_wmi_init);
static void __exit alienware_wmi_exit(void)
{
alienware_zone_exit(platform_device);
- remove_hdmi(platform_device);
platform_device_unregister(platform_device);
platform_driver_unregister(&platform_driver);
}
--
2.47.1
next prev parent reply other threads:[~2025-01-05 15:31 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-05 15:30 [PATCH v3 00/20] platform/x86: alienware-wmi driver rework Kurt Borja
2025-01-05 15:30 ` [PATCH v3 01/20] platform/x86: alienware-wmi: Remove unnecessary check at module exit Kurt Borja
2025-01-05 15:30 ` [PATCH v3 02/20] platform/x86: alienware-wmi: Move Lighting Control State Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 03/20] platform/x86: alienware-wmi: Modify parse_rgb() signature Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` Kurt Borja [this message]
2025-01-05 15:30 ` [PATCH v3 05/20] platform/x86: alienware-wmi: Improve rgb-zones group creation Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 06/20] platform/x86: alienware_wmi: General cleanup of WMAX methods Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-08 12:10 ` Ilpo Järvinen
2025-01-08 13:16 ` Kurt Borja
2025-01-05 15:30 ` [PATCH v3 07/20] platform/x86: alienware-wmi: Add a state container for LED control feature Kurt Borja
2025-01-05 15:30 ` [PATCH v3 08/20] platform/x86: alienware-wmi: Add WMI Drivers Kurt Borja
2025-01-05 15:30 ` [PATCH v3 09/20] platform/x86: alienware-wmi: Add a state container for thermal control methods Kurt Borja
2025-01-05 15:30 ` [PATCH v3 10/20] platform/x86: alienware-wmi: Refactor LED " Kurt Borja
2025-01-05 15:30 ` [PATCH v3 11/20] platform/x86: alienware-wmi: Refactor hdmi, amplifier, deepslp methods Kurt Borja
2025-01-05 15:30 ` [PATCH v3 12/20] platform/x86: alienware-wmi: Refactor thermal control methods Kurt Borja
2025-01-07 21:29 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 13/20] platform/x86: alienware-wmi: Split DMI table Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 14/20] MAINTAINERS: Update ALIENWARE WMI DRIVER entry Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 15/20] platform/x86: Rename alienware-wmi.c Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 16/20] platform/x86: Add alienware-wmi.h Kurt Borja
2025-01-05 19:44 ` kernel test robot
2025-01-05 15:30 ` [PATCH v3 17/20] platform/x86: Split the alienware-wmi driver Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 18/20] platform/x86: dell: Modify Makefile alignment Kurt Borja
2025-01-07 21:29 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 19/20] platform/x86: Update alienware-wmi config entries Kurt Borja
2025-01-07 21:29 ` Mario Limonciello
2025-01-05 15:30 ` [PATCH v3 20/20] platform/x86: alienware-wmi: Update header and module information Kurt Borja
2025-01-07 21:30 ` Mario Limonciello
2025-01-07 23:55 ` Kurt Borja
2025-01-16 22:39 ` [PATCH v3 00/20] platform/x86: alienware-wmi driver rework Armin Wolf
2025-01-17 4:33 ` 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=20250105153019.19206-6-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.