public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] alienware-wmi: Improvements
@ 2024-11-20 16:38 Kurt Borja
  2024-11-20 16:41 ` [PATCH v2 1/4] alienware-wmi: Migrate to device managed resources Kurt Borja
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Kurt Borja @ 2024-11-20 16:38 UTC (permalink / raw)
  To: kuurtb
  Cc: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	mario.limonciello, platform-driver-x86, w_armin

Hi!

I want to migrate this driver to the new WMI interface. These are some
improvements I figured I should send beforehand.

I made everything on top of pdx86/for-next because I think they are not
fixes, just improvements. Check individual patches for more details.

Regards,
Kurt

---
v2:
 - Dropped patch 4/5 bacause it's empty after changes
 - Changed patch order:
    1 -> 3
    2 -> 4
    3 -> 1
    5 -> 2
---
Kurt Borja (4):
  alienware-wmi: Migrate to device managed resources
  alienware-wmi: Improves sysfs groups creation
  alienware-wmi: Simplify platform device creation
  alienware-wmi: Remove unnecessary check at module exit

 drivers/platform/x86/dell/alienware-wmi.c | 186 ++++++++--------------
 1 file changed, 62 insertions(+), 124 deletions(-)

-- 
2.47.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/4] alienware-wmi: Migrate to device managed resources
  2024-11-20 16:38 [PATCH v2 0/4] alienware-wmi: Improvements Kurt Borja
@ 2024-11-20 16:41 ` Kurt Borja
  2024-11-20 16:43 ` [PATCH v2 2/4] alienware-wmi: Improves sysfs groups creation Kurt Borja
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Kurt Borja @ 2024-11-20 16:41 UTC (permalink / raw)
  To: kuurtb
  Cc: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	mario.limonciello, platform-driver-x86, w_armin

These resources are tied to the platform device lifetime thus make them
make them device managed. Also propagate devm_led_classdev_register() in
case of failure.

This indirectly improves module exit error handling, as potentially not
registered led class or sysfs groups are unregistered.

Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
v2:
 - led_classdev_register() is now device managed
 - sysfs_create_group() is now device managed
 - Removed alienware_zone_exit() because it's empty now
---

It seems even if the led class is not registered, led_classdev_unregister
fails safely. Same for the sysfs group. If I'm wrong and this is
actually a fix please point it out.

---
 drivers/platform/x86/dell/alienware-wmi.c | 51 ++++++++---------------
 1 file changed, 17 insertions(+), 34 deletions(-)

diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index 77465ed9b449..6760c7627f62 100644
--- a/drivers/platform/x86/dell/alienware-wmi.c
+++ b/drivers/platform/x86/dell/alienware-wmi.c
@@ -411,8 +411,6 @@ struct wmax_u32_args {
 };
 
 static struct platform_device *platform_device;
-static struct device_attribute *zone_dev_attrs;
-static struct attribute **zone_attrs;
 static struct platform_zone *zone_data;
 static struct platform_profile_handler pp_handler;
 static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
@@ -624,10 +622,13 @@ static ssize_t store_control_state(struct device *dev,
 static DEVICE_ATTR(lighting_control_state, 0644, show_control_state,
 		   store_control_state);
 
-static int alienware_zone_init(struct platform_device *dev)
+static int alienware_zone_init(struct platform_device *pdev)
 {
 	u8 zone;
 	char *name;
+	struct device_attribute *zone_dev_attrs;
+	struct attribute **zone_attrs;
+	int ret;
 
 	if (interface == WMAX) {
 		lighting_control_state = WMAX_RUNNING;
@@ -644,28 +645,25 @@ static int alienware_zone_init(struct platform_device *dev)
 	 *        the lighting control + null terminated
 	 *      - zone_data num_zones is for the distinct zones
 	 */
-	zone_dev_attrs =
-	    kcalloc(quirks->num_zones + 1, sizeof(struct device_attribute),
-		    GFP_KERNEL);
+	zone_dev_attrs = devm_kcalloc(&pdev->dev, quirks->num_zones + 1,
+				      sizeof(struct device_attribute), GFP_KERNEL);
 	if (!zone_dev_attrs)
 		return -ENOMEM;
 
-	zone_attrs =
-	    kcalloc(quirks->num_zones + 2, sizeof(struct attribute *),
-		    GFP_KERNEL);
+	zone_attrs = devm_kcalloc(&pdev->dev, quirks->num_zones + 2,
+				  sizeof(struct attribute *), GFP_KERNEL);
 	if (!zone_attrs)
 		return -ENOMEM;
 
-	zone_data =
-	    kcalloc(quirks->num_zones, sizeof(struct platform_zone),
-		    GFP_KERNEL);
+	zone_data = devm_kcalloc(&pdev->dev, quirks->num_zones,
+				 sizeof(struct platform_zone), GFP_KERNEL);
 	if (!zone_data)
 		return -ENOMEM;
 
 	for (zone = 0; zone < quirks->num_zones; zone++) {
-		name = kasprintf(GFP_KERNEL, "zone%02hhX", zone);
-		if (name == NULL)
-			return 1;
+		name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "zone%02hhX", zone);
+		if (!name)
+			return -ENOMEM;
 		sysfs_attr_init(&zone_dev_attrs[zone].attr);
 		zone_dev_attrs[zone].attr.name = name;
 		zone_dev_attrs[zone].attr.mode = 0644;
@@ -678,24 +676,11 @@ static int alienware_zone_init(struct platform_device *dev)
 	zone_attrs[quirks->num_zones] = &dev_attr_lighting_control_state.attr;
 	zone_attribute_group.attrs = zone_attrs;
 
-	led_classdev_register(&dev->dev, &global_led);
-
-	return sysfs_create_group(&dev->dev.kobj, &zone_attribute_group);
-}
-
-static void alienware_zone_exit(struct platform_device *dev)
-{
-	u8 zone;
+	ret = devm_led_classdev_register(&pdev->dev, &global_led);
+	if (ret < 0)
+		return ret;
 
-	sysfs_remove_group(&dev->dev.kobj, &zone_attribute_group);
-	led_classdev_unregister(&global_led);
-	if (zone_dev_attrs) {
-		for (zone = 0; zone < quirks->num_zones; zone++)
-			kfree(zone_dev_attrs[zone].attr.name);
-	}
-	kfree(zone_dev_attrs);
-	kfree(zone_data);
-	kfree(zone_attrs);
+	return devm_device_add_group(&pdev->dev, &zone_attribute_group);
 }
 
 static acpi_status alienware_wmax_command(void *in_args, size_t in_size,
@@ -1236,7 +1221,6 @@ static int __init alienware_wmi_init(void)
 	return 0;
 
 fail_prep_zones:
-	alienware_zone_exit(platform_device);
 	remove_thermal_profile();
 fail_prep_thermal_profile:
 fail_prep_deepsleep:
@@ -1256,7 +1240,6 @@ module_init(alienware_wmi_init);
 static void __exit alienware_wmi_exit(void)
 {
 	if (platform_device) {
-		alienware_zone_exit(platform_device);
 		remove_hdmi(platform_device);
 		remove_thermal_profile();
 		platform_device_unregister(platform_device);
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/4] alienware-wmi: Improves sysfs groups creation
  2024-11-20 16:38 [PATCH v2 0/4] alienware-wmi: Improvements Kurt Borja
  2024-11-20 16:41 ` [PATCH v2 1/4] alienware-wmi: Migrate to device managed resources Kurt Borja
@ 2024-11-20 16:43 ` Kurt Borja
  2024-11-21 15:37   ` Kurt Borja
  2024-11-20 16:43 ` [PATCH v2 3/4] alienware-wmi: Simplify platform device creation Kurt Borja
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 7+ messages in thread
From: Kurt Borja @ 2024-11-20 16:43 UTC (permalink / raw)
  To: kuurtb
  Cc: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	mario.limonciello, platform-driver-x86, w_armin

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.

Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
v2:
 - Drop the helpers approach in favor of letting the driver manage the
   wmax sysfs groups
---

Again I think not cleaning up created sysfs group is not actually a bug
so this is only an improvement.

---
 drivers/platform/x86/dell/alienware-wmi.c | 112 +++++++---------------
 1 file changed, 36 insertions(+), 76 deletions(-)

diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index 6760c7627f62..ecab14d90b27 100644
--- a/drivers/platform/x86/dell/alienware-wmi.c
+++ b/drivers/platform/x86/dell/alienware-wmi.c
@@ -410,17 +410,12 @@ struct wmax_u32_args {
 	u8 arg3;
 };
 
+
 static struct platform_device *platform_device;
 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",
 };
@@ -781,6 +776,12 @@ static ssize_t toggle_hdmi_source(struct device *dev,
 	return count;
 }
 
+static bool hdmi_group_visible(struct kobject *kobj)
+{
+	return quirks->hdmi_mux;
+}
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi);
+
 static DEVICE_ATTR(cable, S_IRUGO, show_hdmi_cable, NULL);
 static DEVICE_ATTR(source, S_IRUGO | S_IWUSR, show_hdmi_source,
 		   toggle_hdmi_source);
@@ -793,25 +794,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
@@ -838,6 +824,12 @@ static ssize_t show_amplifier_status(struct device *dev,
 	return sysfs_emit(buf, "unconnected connected [unknown]\n");
 }
 
+static bool amplifier_group_visible(struct kobject *kobj)
+{
+	return quirks->amplifier;
+}
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier);
+
 static DEVICE_ATTR(status, S_IRUGO, show_amplifier_status, NULL);
 
 static struct attribute *amplifier_attrs[] = {
@@ -847,25 +839,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, &amplifier_attribute_group);
-}
-
-static int create_amplifier(struct platform_device *dev)
-{
-	int ret;
-
-	ret = sysfs_create_group(&dev->dev.kobj, &amplifier_attribute_group);
-	if (ret)
-		remove_amplifier(dev);
-	return ret;
-}
-
 /*
  * Deep Sleep Control support
  * - Modifies BIOS setting for deep sleep control allowing extra wakeup events
@@ -916,6 +893,12 @@ static ssize_t toggle_deepsleep(struct device *dev,
 	return count;
 }
 
+static bool deepsleep_group_visible(struct kobject *kobj)
+{
+	return quirks->deepslp;
+}
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep);
+
 static DEVICE_ATTR(deepsleep, S_IRUGO | S_IWUSR, show_deepsleep_status, toggle_deepsleep);
 
 static struct attribute *deepsleep_attrs[] = {
@@ -925,25 +908,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
@@ -1151,6 +1119,20 @@ static void remove_thermal_profile(void)
 		platform_profile_remove();
 }
 
+const struct attribute_group *wmax_groups[] = {
+	&hdmi_attribute_group,
+	&amplifier_attribute_group,
+	&deepsleep_attribute_group,
+	NULL
+};
+
+static struct platform_driver platform_driver = {
+	.driver = {
+		.name = "alienware-wmi",
+		.dev_groups = wmax_groups,
+	}
+};
+
 static int __init alienware_wmi_init(void)
 {
 	int ret;
@@ -1190,24 +1172,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();
 		if (ret)
@@ -1223,9 +1187,6 @@ static int __init alienware_wmi_init(void)
 fail_prep_zones:
 	remove_thermal_profile();
 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);
@@ -1240,7 +1201,6 @@ module_init(alienware_wmi_init);
 static void __exit alienware_wmi_exit(void)
 {
 	if (platform_device) {
-		remove_hdmi(platform_device);
 		remove_thermal_profile();
 		platform_device_unregister(platform_device);
 		platform_driver_unregister(&platform_driver);
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/4] alienware-wmi: Simplify platform device creation
  2024-11-20 16:38 [PATCH v2 0/4] alienware-wmi: Improvements Kurt Borja
  2024-11-20 16:41 ` [PATCH v2 1/4] alienware-wmi: Migrate to device managed resources Kurt Borja
  2024-11-20 16:43 ` [PATCH v2 2/4] alienware-wmi: Improves sysfs groups creation Kurt Borja
@ 2024-11-20 16:43 ` Kurt Borja
  2024-11-20 16:44 ` [PATCH v2 4/4] alienware-wmi: Remove unnecessary check at module exit Kurt Borja
  2024-11-20 18:08 ` [PATCH v2 0/4] alienware-wmi: Improvements Mario Limonciello
  4 siblings, 0 replies; 7+ messages in thread
From: Kurt Borja @ 2024-11-20 16:43 UTC (permalink / raw)
  To: kuurtb
  Cc: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	mario.limonciello, platform-driver-x86, w_armin

Simplify platform device creation by using
platform_device_register_simple().

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
v2:
 - Unchanged
---
 drivers/platform/x86/dell/alienware-wmi.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index ecab14d90b27..512f6b22585c 100644
--- a/drivers/platform/x86/dell/alienware-wmi.c
+++ b/drivers/platform/x86/dell/alienware-wmi.c
@@ -1163,14 +1163,13 @@ static int __init alienware_wmi_init(void)
 	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;
+
+	platform_device = platform_device_register_simple("alienware-wmi",
+							  PLATFORM_DEVID_NONE, NULL, 0);
+	if (IS_ERR(platform_device)) {
+		ret = PTR_ERR(platform_device);
 		goto fail_platform_device1;
 	}
-	ret = platform_device_add(platform_device);
-	if (ret)
-		goto fail_platform_device2;
 
 	if (quirks->thermal) {
 		ret = create_thermal_profile();
@@ -1187,9 +1186,7 @@ static int __init alienware_wmi_init(void)
 fail_prep_zones:
 	remove_thermal_profile();
 fail_prep_thermal_profile:
-	platform_device_del(platform_device);
-fail_platform_device2:
-	platform_device_put(platform_device);
+	platform_device_unregister(platform_device);
 fail_platform_device1:
 	platform_driver_unregister(&platform_driver);
 fail_platform_driver:
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 4/4] alienware-wmi: Remove unnecessary check at module exit
  2024-11-20 16:38 [PATCH v2 0/4] alienware-wmi: Improvements Kurt Borja
                   ` (2 preceding siblings ...)
  2024-11-20 16:43 ` [PATCH v2 3/4] alienware-wmi: Simplify platform device creation Kurt Borja
@ 2024-11-20 16:44 ` Kurt Borja
  2024-11-20 18:08 ` [PATCH v2 0/4] alienware-wmi: Improvements Mario Limonciello
  4 siblings, 0 replies; 7+ messages in thread
From: Kurt Borja @ 2024-11-20 16:44 UTC (permalink / raw)
  To: kuurtb
  Cc: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	mario.limonciello, platform-driver-x86, w_armin

Module initialization fails if platform device fails to register so it's
always not NULL at exit.

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

diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
index 512f6b22585c..5e0acaf35952 100644
--- a/drivers/platform/x86/dell/alienware-wmi.c
+++ b/drivers/platform/x86/dell/alienware-wmi.c
@@ -1197,11 +1197,9 @@ module_init(alienware_wmi_init);
 
 static void __exit alienware_wmi_exit(void)
 {
-	if (platform_device) {
-		remove_thermal_profile();
-		platform_device_unregister(platform_device);
-		platform_driver_unregister(&platform_driver);
-	}
+	remove_thermal_profile();
+	platform_device_unregister(platform_device);
+	platform_driver_unregister(&platform_driver);
 }
 
 module_exit(alienware_wmi_exit);
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] alienware-wmi: Improvements
  2024-11-20 16:38 [PATCH v2 0/4] alienware-wmi: Improvements Kurt Borja
                   ` (3 preceding siblings ...)
  2024-11-20 16:44 ` [PATCH v2 4/4] alienware-wmi: Remove unnecessary check at module exit Kurt Borja
@ 2024-11-20 18:08 ` Mario Limonciello
  4 siblings, 0 replies; 7+ messages in thread
From: Mario Limonciello @ 2024-11-20 18:08 UTC (permalink / raw)
  To: Kurt Borja
  Cc: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	platform-driver-x86, w_armin

On 11/20/2024 10:38, Kurt Borja wrote:
> Hi!
> 
> I want to migrate this driver to the new WMI interface. These are some
> improvements I figured I should send beforehand.
> 
> I made everything on top of pdx86/for-next because I think they are not
> fixes, just improvements. Check individual patches for more details.
> 
> Regards,
> Kurt
> 
> ---
> v2:
>   - Dropped patch 4/5 bacause it's empty after changes
>   - Changed patch order:
>      1 -> 3
>      2 -> 4
>      3 -> 1
>      5 -> 2
> ---
> Kurt Borja (4):
>    alienware-wmi: Migrate to device managed resources
>    alienware-wmi: Improves sysfs groups creation
>    alienware-wmi: Simplify platform device creation
>    alienware-wmi: Remove unnecessary check at module exit
> 
>   drivers/platform/x86/dell/alienware-wmi.c | 186 ++++++++--------------
>   1 file changed, 62 insertions(+), 124 deletions(-)
> 

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/4] alienware-wmi: Improves sysfs groups creation
  2024-11-20 16:43 ` [PATCH v2 2/4] alienware-wmi: Improves sysfs groups creation Kurt Borja
@ 2024-11-21 15:37   ` Kurt Borja
  0 siblings, 0 replies; 7+ messages in thread
From: Kurt Borja @ 2024-11-21 15:37 UTC (permalink / raw)
  To: Dell.Client.Kernel, hdegoede, ilpo.jarvinen, linux-kernel,
	mario.limonciello, platform-driver-x86, w_armin

On Wed, Nov 20, 2024 at 01:43:15PM -0300, Kurt Borja wrote:
> 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.
> 
> Signed-off-by: Kurt Borja <kuurtb@gmail.com>
> ---
> v2:
>  - Drop the helpers approach in favor of letting the driver manage the
>    wmax sysfs groups
> ---
> 
> Again I think not cleaning up created sysfs group is not actually a bug
> so this is only an improvement.
> 
> ---
>  drivers/platform/x86/dell/alienware-wmi.c | 112 +++++++---------------
>  1 file changed, 36 insertions(+), 76 deletions(-)
> 
> diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
> index 6760c7627f62..ecab14d90b27 100644
> --- a/drivers/platform/x86/dell/alienware-wmi.c
> +++ b/drivers/platform/x86/dell/alienware-wmi.c
> @@ -410,17 +410,12 @@ struct wmax_u32_args {
>  	u8 arg3;
>  };
>  
> +

Just realized the extra line here.

>  static struct platform_device *platform_device;
>  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",
>  };
> @@ -781,6 +776,12 @@ static ssize_t toggle_hdmi_source(struct device *dev,
>  	return count;
>  }
>  
> +static bool hdmi_group_visible(struct kobject *kobj)
> +{
> +	return quirks->hdmi_mux;
> +}
> +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi);
> +
>  static DEVICE_ATTR(cable, S_IRUGO, show_hdmi_cable, NULL);
>  static DEVICE_ATTR(source, S_IRUGO | S_IWUSR, show_hdmi_source,
>  		   toggle_hdmi_source);
> @@ -793,25 +794,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
> @@ -838,6 +824,12 @@ static ssize_t show_amplifier_status(struct device *dev,
>  	return sysfs_emit(buf, "unconnected connected [unknown]\n");
>  }
>  
> +static bool amplifier_group_visible(struct kobject *kobj)
> +{
> +	return quirks->amplifier;
> +}
> +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier);
> +
>  static DEVICE_ATTR(status, S_IRUGO, show_amplifier_status, NULL);
>  
>  static struct attribute *amplifier_attrs[] = {
> @@ -847,25 +839,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, &amplifier_attribute_group);
> -}
> -
> -static int create_amplifier(struct platform_device *dev)
> -{
> -	int ret;
> -
> -	ret = sysfs_create_group(&dev->dev.kobj, &amplifier_attribute_group);
> -	if (ret)
> -		remove_amplifier(dev);
> -	return ret;
> -}
> -
>  /*
>   * Deep Sleep Control support
>   * - Modifies BIOS setting for deep sleep control allowing extra wakeup events
> @@ -916,6 +893,12 @@ static ssize_t toggle_deepsleep(struct device *dev,
>  	return count;
>  }
>  
> +static bool deepsleep_group_visible(struct kobject *kobj)
> +{
> +	return quirks->deepslp;
> +}
> +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep);
> +
>  static DEVICE_ATTR(deepsleep, S_IRUGO | S_IWUSR, show_deepsleep_status, toggle_deepsleep);
>  
>  static struct attribute *deepsleep_attrs[] = {
> @@ -925,25 +908,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
> @@ -1151,6 +1119,20 @@ static void remove_thermal_profile(void)
>  		platform_profile_remove();
>  }
>  
> +const struct attribute_group *wmax_groups[] = {
> +	&hdmi_attribute_group,
> +	&amplifier_attribute_group,
> +	&deepsleep_attribute_group,
> +	NULL
> +};

And this is not static.

I'll fix it.

> [...]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-11-21 15:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-20 16:38 [PATCH v2 0/4] alienware-wmi: Improvements Kurt Borja
2024-11-20 16:41 ` [PATCH v2 1/4] alienware-wmi: Migrate to device managed resources Kurt Borja
2024-11-20 16:43 ` [PATCH v2 2/4] alienware-wmi: Improves sysfs groups creation Kurt Borja
2024-11-21 15:37   ` Kurt Borja
2024-11-20 16:43 ` [PATCH v2 3/4] alienware-wmi: Simplify platform device creation Kurt Borja
2024-11-20 16:44 ` [PATCH v2 4/4] alienware-wmi: Remove unnecessary check at module exit Kurt Borja
2024-11-20 18:08 ` [PATCH v2 0/4] alienware-wmi: Improvements Mario Limonciello

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox