From: Armin Wolf <W_Armin@gmx.de>
To: Kurt Borja <kuurtb@gmail.com>, platform-driver-x86@vger.kernel.org
Cc: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Mario Limonciello" <mario.limonciello@amd.com>,
"Hans de Goede" <hdegoede@redhat.com>,
Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 01/14] platform/x86: alienware-wmi: Add a state container for LED control feature
Date: Sun, 19 Jan 2025 00:34:02 +0100 [thread overview]
Message-ID: <e9efe9ea-10d2-4bdc-99b7-c9379aaeb8ec@gmx.de> (raw)
In-Reply-To: <20250117081347.8573-2-kuurtb@gmail.com>
Am 17.01.25 um 09:13 schrieb Kurt Borja:
> Add a state container for the "alienware-wmi" platform device and
> initialize it on the new alienfx_probe(). Migrate all LED control functions
> to use this state container, as well as hdmi, amplifier, deepslp group
> visibility methods, to support upcoming file split.
Where does this patch touch the visibility methods of the attribute groups?
>
> Additionally move the led_classdev registration to the platform driver
> probe and make it device managed.
>
> Drop alienware_zone_init() and alienware_zone_exit() because they are no
> longer needed.
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
> Signed-off-by: Kurt Borja <kuurtb@gmail.com>
> ---
> drivers/platform/x86/dell/alienware-wmi.c | 117 ++++++++++++----------
> 1 file changed, 65 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
> index 63cf016bc912..5779b025761b 100644
> --- a/drivers/platform/x86/dell/alienware-wmi.c
> +++ b/drivers/platform/x86/dell/alienware-wmi.c
> @@ -404,13 +404,18 @@ struct wmax_u32_args {
> u8 arg3;
> };
>
> +struct alienfx_priv {
> + struct platform_device *pdev;
> + struct led_classdev global_led;
> + struct color_platform colors[4];
> + u8 global_brightness;
> + u8 lighting_control_state;
> +};
> +
> static struct platform_device *platform_device;
> -static struct color_platform colors[4];
> static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
>
> static u8 interface;
> -static u8 lighting_control_state;
> -static u8 global_brightness;
>
> /*
> * Helpers used for zone control
> @@ -442,7 +447,7 @@ static int parse_rgb(const char *buf, struct color_platform *colors)
> /*
> * Individual RGB zone control
> */
> -static int alienware_update_led(u8 location)
> +static int alienware_update_led(struct alienfx_priv *priv, u8 location)
> {
> int method_id;
> acpi_status status;
> @@ -452,21 +457,21 @@ static int alienware_update_led(u8 location)
> struct wmax_led_args wmax_basic_args;
> if (interface == WMAX) {
> wmax_basic_args.led_mask = 1 << location;
> - wmax_basic_args.colors = colors[location];
> - wmax_basic_args.state = lighting_control_state;
> + wmax_basic_args.colors = priv->colors[location];
> + wmax_basic_args.state = priv->lighting_control_state;
> guid = WMAX_CONTROL_GUID;
> method_id = WMAX_METHOD_ZONE_CONTROL;
>
> input.length = sizeof(wmax_basic_args);
> input.pointer = &wmax_basic_args;
> } else {
> - legacy_args.colors = colors[location];
> - legacy_args.brightness = global_brightness;
> + legacy_args.colors = priv->colors[location];
> + legacy_args.brightness = priv->global_brightness;
> legacy_args.state = 0;
> - if (lighting_control_state == LEGACY_BOOTING ||
> - lighting_control_state == LEGACY_SUSPEND) {
> + if (priv->lighting_control_state == LEGACY_BOOTING ||
> + priv->lighting_control_state == LEGACY_SUSPEND) {
> guid = LEGACY_POWER_CONTROL_GUID;
> - legacy_args.state = lighting_control_state;
> + legacy_args.state = priv->lighting_control_state;
> } else
> guid = LEGACY_CONTROL_GUID;
> method_id = location + 1;
> @@ -485,22 +490,26 @@ static int alienware_update_led(u8 location)
> static ssize_t zone_show(struct device *dev, struct device_attribute *attr,
> char *buf, u8 location)
> {
> + struct alienfx_priv *priv = dev_get_drvdata(dev);
> + struct color_platform *colors = &priv->colors[location];
> +
> return sprintf(buf, "red: %d, green: %d, blue: %d\n",
> - colors[location].red, colors[location].green,
> - colors[location].blue);
> + colors->red, colors->green, colors->blue);
>
> }
>
> static ssize_t zone_store(struct device *dev, struct device_attribute *attr,
> const char *buf, size_t count, u8 location)
> {
> + struct alienfx_priv *priv = dev_get_drvdata(dev);
> + struct color_platform *colors = &priv->colors[location];
> int ret;
>
> - ret = parse_rgb(buf, &colors[location]);
> + ret = parse_rgb(buf, colors);
> if (ret)
> return ret;
>
> - ret = alienware_update_led(location);
> + ret = alienware_update_led(priv, location);
>
> return ret ? ret : count;
> }
> @@ -568,9 +577,11 @@ static ssize_t lighting_control_state_show(struct device *dev,
> struct device_attribute *attr,
> char *buf)
> {
> - if (lighting_control_state == LEGACY_BOOTING)
> + struct alienfx_priv *priv = dev_get_drvdata(dev);
> +
> + if (priv->lighting_control_state == LEGACY_BOOTING)
> return sysfs_emit(buf, "[booting] running suspend\n");
> - else if (lighting_control_state == LEGACY_SUSPEND)
> + else if (priv->lighting_control_state == LEGACY_SUSPEND)
> return sysfs_emit(buf, "booting running [suspend]\n");
>
> return sysfs_emit(buf, "booting [running] suspend\n");
> @@ -580,6 +591,7 @@ static ssize_t lighting_control_state_store(struct device *dev,
> struct device_attribute *attr,
> const char *buf, size_t count)
> {
> + struct alienfx_priv *priv = dev_get_drvdata(dev);
> u8 val;
>
> if (strcmp(buf, "booting\n") == 0)
> @@ -591,9 +603,9 @@ static ssize_t lighting_control_state_store(struct device *dev,
> else
> val = WMAX_RUNNING;
>
> - lighting_control_state = val;
> + priv->lighting_control_state = val;
> pr_debug("alienware-wmi: updated control state to %d\n",
> - lighting_control_state);
> + priv->lighting_control_state);
>
> return count;
> }
> @@ -653,43 +665,26 @@ static int wmax_brightness(int brightness)
> static void global_led_set(struct led_classdev *led_cdev,
> enum led_brightness brightness)
> {
> + struct alienfx_priv *priv = container_of(led_cdev, struct alienfx_priv,
> + global_led);
> int ret;
> - global_brightness = brightness;
> +
> + priv->global_brightness = brightness;
> +
> if (interface == WMAX)
> ret = wmax_brightness(brightness);
> else
> - ret = alienware_update_led(0);
> + ret = alienware_update_led(priv, 0);
> if (ret)
> pr_err("LED brightness update failed\n");
> }
>
> static enum led_brightness global_led_get(struct led_classdev *led_cdev)
> {
> - return global_brightness;
> -}
> -
> -static struct led_classdev global_led = {
> - .brightness_set = global_led_set,
> - .brightness_get = global_led_get,
> - .name = "alienware::global_brightness",
> -};
> -
> -static int alienware_zone_init(struct platform_device *dev)
> -{
> - if (interface == WMAX) {
> - lighting_control_state = WMAX_RUNNING;
> - } else if (interface == LEGACY) {
> - lighting_control_state = LEGACY_RUNNING;
> - }
> - global_led.max_brightness = 0x0F;
> - global_brightness = global_led.max_brightness;
> + struct alienfx_priv *priv = container_of(led_cdev, struct alienfx_priv,
> + global_led);
>
> - return led_classdev_register(&dev->dev, &global_led);
> -}
> -
> -static void alienware_zone_exit(struct platform_device *dev)
> -{
> - led_classdev_unregister(&global_led);
> + return priv->global_brightness;
> }
>
> static acpi_status alienware_wmax_command(void *in_args, size_t in_size,
> @@ -1145,6 +1140,30 @@ static int create_thermal_profile(struct platform_device *platform_device)
> /*
> * Platform Driver
> */
> +static int alienfx_probe(struct platform_device *pdev)
> +{
> + struct alienfx_priv *priv;
> +
> + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + if (interface == WMAX)
> + priv->lighting_control_state = WMAX_RUNNING;
> + else
> + priv->lighting_control_state = LEGACY_RUNNING;
> +
> + priv->pdev = pdev;
> + priv->global_led.name = "alienware::global_brightness";
> + priv->global_led.brightness_set = global_led_set;
> + priv->global_led.brightness_get = global_led_get;
> + priv->global_led.max_brightness = 0x0F;
> + priv->global_brightness = priv->global_led.max_brightness;
> + platform_set_drvdata(pdev, priv);
> +
> + return devm_led_classdev_register(&pdev->dev, &priv->global_led);
> +}
> +
> static const struct attribute_group *alienfx_groups[] = {
> &zone_attribute_group,
> &hdmi_attribute_group,
> @@ -1158,6 +1177,7 @@ static struct platform_driver platform_driver = {
> .name = "alienware-wmi",
> .dev_groups = alienfx_groups,
> },
> + .probe = alienfx_probe,
> };
>
> static int __init alienware_wmi_init(void)
> @@ -1205,14 +1225,8 @@ static int __init alienware_wmi_init(void)
> goto fail_prep_thermal_profile;
> }
>
> - ret = alienware_zone_init(platform_device);
> - if (ret)
> - goto fail_prep_zones;
> -
> return 0;
>
> -fail_prep_zones:
> - alienware_zone_exit(platform_device);
> fail_prep_thermal_profile:
> platform_device_del(platform_device);
> fail_platform_device2:
> @@ -1227,7 +1241,6 @@ module_init(alienware_wmi_init);
>
> static void __exit alienware_wmi_exit(void)
> {
> - alienware_zone_exit(platform_device);
> platform_device_unregister(platform_device);
> platform_driver_unregister(&platform_driver);
> }
next prev parent reply other threads:[~2025-01-18 23:34 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-17 8:13 [PATCH v4 00/14] platform/x86: alienware-wmi driver rework Kurt Borja
2025-01-17 8:13 ` [PATCH v4 01/14] platform/x86: alienware-wmi: Add a state container for LED control feature Kurt Borja
2025-01-18 23:34 ` Armin Wolf [this message]
2025-01-17 8:13 ` [PATCH v4 02/14] platform/x86: alienware-wmi: Add WMI Drivers Kurt Borja
2025-01-18 23:48 ` Armin Wolf
2025-01-19 16:47 ` Kurt Borja
2025-01-17 8:13 ` [PATCH v4 03/14] platform/x86: alienware-wmi: Add a state container for thermal control methods Kurt Borja
2025-01-17 8:13 ` [PATCH v4 04/14] platform/x86: alienware-wmi: Refactor LED " Kurt Borja
2025-01-18 23:58 ` Armin Wolf
2025-01-19 16:50 ` Kurt Borja
2025-01-17 8:13 ` [PATCH v4 05/14] platform/x86: alienware-wmi: Refactor hdmi, amplifier, deepslp methods Kurt Borja
2025-01-17 8:13 ` [PATCH v4 06/14] platform/x86: alienware-wmi: Refactor thermal control methods Kurt Borja
2025-01-17 8:13 ` [PATCH v4 07/14] platform/x86: alienware-wmi: Split DMI table Kurt Borja
2025-01-17 17:15 ` Kurt Borja
2025-01-19 0:03 ` Armin Wolf
2025-01-17 8:13 ` [PATCH v4 08/14] MAINTAINERS: Update ALIENWARE WMI DRIVER entry Kurt Borja
2025-01-17 8:13 ` [PATCH v4 09/14] platform/x86: Rename alienware-wmi.c Kurt Borja
2025-01-17 8:13 ` [PATCH v4 10/14] platform/x86: Add alienware-wmi.h Kurt Borja
2025-01-17 8:13 ` [PATCH v4 11/14] platform/x86: Split the alienware-wmi driver Kurt Borja
2025-01-17 8:13 ` [PATCH v4 12/14] platform/x86: dell: Modify Makefile alignment Kurt Borja
2025-01-17 8:13 ` [PATCH v4 13/14] platform/x86: Update alienware-wmi config entries Kurt Borja
2025-01-17 8:13 ` [PATCH v4 14/14] platform/x86: alienware-wmi: Update header and module information Kurt Borja
2025-01-19 0:09 ` [PATCH v4 00/14] platform/x86: alienware-wmi driver rework Armin Wolf
2025-01-19 16:53 ` 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=e9efe9ea-10d2-4bdc-99b7-c9379aaeb8ec@gmx.de \
--to=w_armin@gmx.de \
--cc=Dell.Client.Kernel@dell.com \
--cc=hdegoede@redhat.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=kuurtb@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=platform-driver-x86@vger.kernel.org \
/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
all inboxes | Powered by JetHome®