public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Kurt Borja <kuurtb@gmail.com>
Cc: Dell.Client.Kernel@dell.com, Hans de Goede <hdegoede@redhat.com>,
	 LKML <linux-kernel@vger.kernel.org>,
	mario.limonciello@amd.com,  platform-driver-x86@vger.kernel.org,
	w_armin@gmx.de
Subject: Re: [RFC PATCH 10/21] alienware-wmi: Add alienfx OPs to platdata
Date: Thu, 5 Dec 2024 13:05:50 +0200 (EET)	[thread overview]
Message-ID: <b6875a98-6fce-435d-7061-9da7e907b69b@linux.intel.com> (raw)
In-Reply-To: <20241205004225.2185672-2-kuurtb@gmail.com>

On Wed, 4 Dec 2024, Kurt Borja wrote:

> Both WMI devices handled by this module specify a distinct interface for
> LED control. Previously this module handled this by dynamically adapting
> arguments passed to wmi_evaluate_method() based on the `interface`
> global variable.
> 
> To avoid the use of global variables, and enable the migration to
> wmidev_* methods, let the WMI drivers present a single interface through
> this "alienfx operations".
> 
> Also define alienware_wmi_command(), which serves as a wrapper for
> wmidev_evaluate_method(). This new method is very similar to
> alienware_wmax_command() but is WMI device agnostic and makes use of
> non-deprecated WMI methods.
> 
> Signed-off-by: Kurt Borja <kuurtb@gmail.com>
> ---
>  drivers/platform/x86/dell/alienware-wmi.c | 110 ++++++++++++++++++++++
>  1 file changed, 110 insertions(+)
> 
> diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c
> index 34fb59a14bc0..043cde40de9a 100644
> --- a/drivers/platform/x86/dell/alienware-wmi.c
> +++ b/drivers/platform/x86/dell/alienware-wmi.c
> @@ -411,8 +411,16 @@ struct alienfx_priv {
>  	u8 lighting_control_state;
>  };
>  
> +struct alienfx_ops {
> +	int (*upd_led)(struct alienfx_priv *priv, struct wmi_device *wdev,
> +		       u8 location);
> +	int (*upd_brightness)(struct alienfx_priv *priv, struct wmi_device *wdev,
> +			      u8 brightness);
> +};
> +
>  struct alienfx_platdata {
>  	struct wmi_device *wdev;
> +	struct alienfx_ops ops;
>  };
>  
>  static struct platform_profile_handler pp_handler;
> @@ -421,6 +429,32 @@ static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST];
>  static u8 interface;
>  static struct wmi_driver *preferred_wmi_driver;
>  
> +static acpi_status alienware_wmi_command(struct wmi_device *wdev, u32 method_id,
> +					 void *in_args, size_t in_size, u32 *out_data)
> +{
> +	acpi_status ret;
> +	union acpi_object *obj;

> +	struct acpi_buffer in = { in_size,  in_args };
> +	struct acpi_buffer out = {  ACPI_ALLOCATE_BUFFER, NULL };

Extra whitespace on both lines.

> +
> +	if (out_data) {
> +		ret = wmidev_evaluate_method(wdev, 0, method_id, &in, &out);
> +		if (ACPI_FAILURE(ret))
> +			goto out_free_ptr;
> +
> +		obj = (union acpi_object *) out.pointer;

The usual style for casts is without space but not an end of the world if 
you want to have the space there (in any case, it's not explicitly stated 
in coding style).

> +
> +		if (obj && obj->type == ACPI_TYPE_INTEGER)
> +			*out_data = (u32) obj->integer.value;
> +	} else {
> +		ret = wmidev_evaluate_method(wdev, 0, method_id, &in, NULL);
> +	}
> +
> +out_free_ptr:
> +	kfree(out.pointer);
> +	return ret;
> +}
> +
>  /*
>   * Helpers used for zone control
>   */
> @@ -1178,11 +1212,48 @@ static void alienfx_wmi_exit(struct wmi_device *wdev)
>  /*
>   * Legacy WMI device
>   */
> +static int legacy_wmi_update_led(struct alienfx_priv *priv,
> +				 struct wmi_device *wdev, u8 location)
> +{
> +	acpi_status status;
> +	struct acpi_buffer input;
> +	struct legacy_led_args legacy_args;

Mostly try to abide the reverse xmas tree order (but if there's 
dependency, feel free to violate it where it makes sense).

-- 
 i.

> +	legacy_args.colors = priv->colors[location];
> +	legacy_args.brightness = priv->global_brightness;
> +	legacy_args.state = priv->lighting_control_state;
> +
> +	input.length = sizeof(legacy_args);
> +	input.pointer = &legacy_args;
> +
> +	if (legacy_args.state == LEGACY_RUNNING)
> +		status = alienware_wmi_command(wdev, location + 1, &legacy_args,
> +					       sizeof(legacy_args), NULL);
> +	else
> +		status = wmi_evaluate_method(LEGACY_POWER_CONTROL_GUID, 0,
> +					     location + 1, &input, NULL);
> +
> +	if (ACPI_FAILURE(status))
> +		return -EIO;
> +
> +	return 0;
> +}
> +
> +static int legacy_wmi_update_brightness(struct alienfx_priv *priv,
> +					struct wmi_device *wdev, u8 brightness)
> +{
> +	return legacy_wmi_update_led(priv, wdev, 0);
> +}
> +
>  static int legacy_wmi_probe(struct wmi_device *wdev, const void *context)
>  {
>  	int ret = 0;
>  	struct alienfx_platdata pdata = {
>  		.wdev = wdev,
> +		.ops = {
> +			.upd_led = legacy_wmi_update_led,
> +			.upd_brightness = legacy_wmi_update_brightness,
> +		},
>  	};
>  
>  	if (quirks->num_zones > 0)
> @@ -1219,11 +1290,50 @@ static struct wmi_driver alienware_legacy_wmi_driver = {
>  /*
>   * WMAX WMI device
>   */
> +static int wmax_wmi_update_led(struct alienfx_priv *priv,
> +			       struct wmi_device *wdev, u8 location)
> +{
> +	acpi_status status;
> +	struct wmax_led_args in_args = {
> +		.led_mask = 1 << location,
> +		.colors = priv->colors[location],
> +		.state = priv->lighting_control_state,
> +	};
> +
> +	status = alienware_wmi_command(wdev, WMAX_METHOD_ZONE_CONTROL,
> +				       &in_args, sizeof(in_args), NULL);
> +	if (ACPI_FAILURE(status))
> +		return -EIO;
> +
> +	return 0;
> +}
> +
> +static int wmax_wmi_update_brightness(struct alienfx_priv *priv,
> +				      struct wmi_device *wdev, u8 brightness)
> +{
> +	acpi_status status;
> +	struct wmax_brightness_args in_args = {
> +		.led_mask = 0xFF,
> +		.percentage = brightness,
> +	};
> +
> +	status = alienware_wmi_command(wdev, WMAX_METHOD_BRIGHTNESS, &in_args,
> +				       sizeof(in_args), NULL);
> +	if (ACPI_FAILURE(status))
> +		return -EIO;
> +
> +	return 0;
> +}
> +
>  static int wmax_wmi_probe(struct wmi_device *wdev, const void *context)
>  {
>  	int ret = 0;
>  	struct alienfx_platdata pdata = {
>  		.wdev = wdev,
> +		.ops = {
> +			.upd_led = wmax_wmi_update_led,
> +			.upd_brightness = wmax_wmi_update_brightness,
> +		},
>  	};
>  
>  	if (quirks->thermal)
> 

  reply	other threads:[~2024-12-05 11:05 UTC|newest]

Thread overview: 40+ 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 ` [RFC PATCH 08/21] alienware-wmi: Add WMI Drivers Kurt Borja
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 [this message]
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  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=b6875a98-6fce-435d-7061-9da7e907b69b@linux.intel.com \
    --to=ilpo.jarvinen@linux.intel.com \
    --cc=Dell.Client.Kernel@dell.com \
    --cc=hdegoede@redhat.com \
    --cc=kuurtb@gmail.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