From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vk1-f170.google.com (mail-vk1-f170.google.com [209.85.221.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96C371990B7; Sun, 29 Dec 2024 19:46:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501609; cv=none; b=NsGpfwGdY6ovRzDvEF2WbrWc2hWhc2gIWevZTgacjiaiVAQawEvM4LJ6MMbhzhjsugZrCB05/Rq8SH+lhXwhgxs/p/+jwbb9yP6OKqXYvdCv7Yb46xtHyYZS8rYknG0J7IgTJQlRg1ppFmVat4ZfOsBiCj2VdzcEL8KtabaBrS4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501609; c=relaxed/simple; bh=tu5SELY25ilrK87/vIE1U2/MUN8uaXfuFiyt/j5TqxY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bzbiti4fgZ8c+Kp0TTETeRkKJzuJi/4R/hmVHfd2GfEuahzcZv+eNckhq4fBIFuQEEadDGhTlkeulALBea4Qzs+/e3oSfyWpfAaCosApaTjZSSjg1eI5TQUXsT9VwswCYlQHr08haiTm49i8CRd10CxvEBfPHwnCTzajNf8D66w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JbMTVV2C; arc=none smtp.client-ip=209.85.221.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JbMTVV2C" Received: by mail-vk1-f170.google.com with SMTP id 71dfb90a1353d-5187f6f7bcaso2639187e0c.3; Sun, 29 Dec 2024 11:46:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501606; x=1736106406; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cJ8zNRmU/YdsMVlsWhh5/v5/soMK+hhezIf16qD3GZ0=; b=JbMTVV2Ce1byYP+93cAlN8O/B6c+uCq3TgbZd+8Ta7RschMVP3j91RjXTGpaBe4eEB AaWy1B6g5IbdIClouDIlcLSjwLmejdD93NY4cPulTxRqtISqWxgPO5sIlrOr3CJzsJpZ 0cRXaSfJ67CEojBVKzS9yM9OJtXkW7aH7/2f8ui/elG38zQgiPEa+MS90SIljl9x6wHE kWHNo8llfh9oIdGPMKxtfiJ4wTSpqwpOcMF0ykNa7ipfly3T97ht3shEYyORsmIVzAr0 L3MGrXhL6QjRpM34RmapqNVHNKtdL9vS5wyfO1iGse2wMHTjjJKNMvpJE6yMBoZyR56U 2RuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501606; x=1736106406; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cJ8zNRmU/YdsMVlsWhh5/v5/soMK+hhezIf16qD3GZ0=; b=fWcqxNSQgHGAQajFDkl2YIP5kyywO79kkoCIt/xE0+bi+faBBiVae7tSx5sSyLAWBf siCj21GwkYC8U5tK5/I0DsFidLMjhGDwz/PpUAgS6uLl7UftKRvREje8OVN5DFTOZLyN p33klwZf4icjQQtT1tCL275d+6KBuudHFj3dDMALXOGzJ5AabitArJk5KU4F+HsSIH/j SkVfM0nMF2Kytj6W0sxP0aBgnpsI+9qKFNF+eztc2wPmnPtaSPFyCxzB6dsFMWLBLT2y EzKjcDlkzzShghDyMLvTvpmExU60rMdQ/p207R3zX6msfLORgFwOuczT9/NSnOcucOJO TQzQ== X-Forwarded-Encrypted: i=1; AJvYcCUxQ7PkbLeZLAy3ldKc2HFO90EtRfiS9TruWTLxBbupyX0g0FzBKCtUEpvHAzKfEjRzITqkKA6srJ9U5zI=@vger.kernel.org X-Gm-Message-State: AOJu0YzFvZg+RrJUZvDdVkyo46TZFb5MEzO0aQL0OhFyWyf4wR7anR5m 9igwBN4WQIA5o7BeMtuLkO2oSX/VAR6urHQlAUivllLoh6swxm6Uh932sg== X-Gm-Gg: ASbGncuTySv89CxZu97gYN3/2plZZPA9F0cLzCZK+nRQBkb/X6NkBObGEmsUvuM003N 2JWcMFqg63CE56HFIcdQtCPiYpOVis5rtUfuaAJnhuhxaHd/jGw/Tuk2LPEMovea2pVl8xOODJV Y9Vkzii+HAvJeq1fHr9P8gq6qC15S5/zCJ35gKgSp4+aSx5vUJM6OOKZqOdOmzV+8TqhEiYNgeH 2VcaMVAqL6QW5W7Br4eteMjVIRM4XGQaKIYnQWVLcQzQW7Lnzv0OzzTCohy//ZH X-Google-Smtp-Source: AGHT+IHHRSP4gHYNha4icYITBOG6IKi/q8fMbFD7d8LSXV3BgjHm34CdL0WwQ7OowKhUTpZx7zGIvQ== X-Received: by 2002:a05:6102:50a7:b0:4b0:4d6:bff1 with SMTP id ada2fe7eead31-4b2cc387a3cmr24880441137.14.1735501606002; Sun, 29 Dec 2024 11:46:46 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.46.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:46:45 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 01/20] alienware-wmi: Remove unnecessary check at module exit Date: Sun, 29 Dec 2024 14:44:48 -0500 Message-ID: <20241229194506.8268-3-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Module initialization fails if platform device fails to register so it's always not NULL at exit. Reviewed-by: Armin Wolf Reviewed-by: Mario Limonciello Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index e95d22c7b60c..ed66720260ab 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -1257,13 +1257,11 @@ module_init(alienware_wmi_init); =20 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); - platform_driver_unregister(&platform_driver); - } + alienware_zone_exit(platform_device); + remove_hdmi(platform_device); + remove_thermal_profile(); + platform_device_unregister(platform_device); + platform_driver_unregister(&platform_driver); } =20 module_exit(alienware_wmi_exit); --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vk1-f171.google.com (mail-vk1-f171.google.com [209.85.221.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A23419A28D; Sun, 29 Dec 2024 19:46:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501611; cv=none; b=E317kFXVHvqYdfIKkQp2bv/N7lM3c0QBLceKKPCBKhihbAhIhqh0W0aD8IasXa9b/FQYPfRLt+ualB4zhJJTMBRz9ZkVyXhdmGihA/pLJJytLp6m7r1+PdgwAeX1Xkfyr8Ya1x1KTfmRm9T/vEERDh0IZz1Rk3f5zFfwLzjkNt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501611; c=relaxed/simple; bh=JfXklGaFFo7wbHLPpDz4QYgR3xVQWtszMHXl9hi0lgw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SQcUKKp29WmjeDieytjFo4cLSMeRqCK3pMBP8LHo1rlfDRJz5c0dNBSXfazKUhjQDLsHE2NKxUYbcNZWv/DtR7ZNj145/H5HbtASqZIqgG6930xfJDwGj5+ExAkxZ8YsBFhuP9uXcDqxYBp1JvtHZbHXuTheFT9QOQCgUUQQtOM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mapxKrM6; arc=none smtp.client-ip=209.85.221.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mapxKrM6" Received: by mail-vk1-f171.google.com with SMTP id 71dfb90a1353d-5187aa2c97dso2907255e0c.2; Sun, 29 Dec 2024 11:46:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501608; x=1736106408; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wHqL+vpiErSUgy/1yGnLTEPBV7j+lZJ6SlOgomo86jw=; b=mapxKrM6sPhTEYlKS9eSctZ62mEtyCLIwVN/hDAugRGXcYDnhbvW+2+EB30hIL48o5 rr67MNYWUSSJ/kpMxZ4lhZhRI84xWC+Ge7OmP+xIXTk7FCtI5dEgZQXU975E4F3Ej/d4 3gY7eKRVcTQsi5G0RzPhRKfaC+zqpyzL9dMyUZSK5G4CMn8hgfVOOW00E9NMk1m2DyCf 4fXYLqYL6Im9uwXSs0OkTzNvW5V9JQC0knhGpSzdowqniyoRybn4/yW64QZGqIUOW14a +S1cj0/QseV59PQqwIX7abEQjMh15SYQVbqJdM21PKHMWMqrlqMOKy7ZyJD2qnx9h7EY f/yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501608; x=1736106408; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wHqL+vpiErSUgy/1yGnLTEPBV7j+lZJ6SlOgomo86jw=; b=c1WO/8qOwS8r0d3S92zSOpWxLgPFZDbiaP47tFWQWIlYi28hqDP9UY9CsG3DfzfaOv keZ8KIQi6yyt7rFfQIhXPhQq6bHYmN0jFhh5JN+m9ZeqowGQLgOWFQtuMuwtSTHwQwwC 9LwpWDnlk183cC3qE+lbDulwyFKZSLVoszbfYT7OnNjvqQh/twNB7/BliXzGSlBrFH+4 aE04byLPbhL0WrstNuLLYU9YCb/I1Gq3jzMRP2j0RDi1VjdY8Df3Ei9y2unAdtAiabdb INna39C6c7m8vAzr/qmV/kMdr30mDpdltXHj70/xAnBlms+HgHH5TdBbIS2NnXWxLwYl FP2Q== X-Forwarded-Encrypted: i=1; AJvYcCXV8Bi6PYQNLvlBgj053BTjqMS8glPL6jadvy/qWWHtHuHZGDeuVnHsSm6MO5STlcJYOVkdk+RERRWOs4I=@vger.kernel.org X-Gm-Message-State: AOJu0YxXef6HcN2u6KFQ9HmiBXA7hvTd4vnMGHb9xZOH7J4S8ivJWagE M4fmchM9OZfkG+P6NYYh5mZxSW/nr3dcbvgxO2MZ24ilnv+eYurdCqIskw== X-Gm-Gg: ASbGncub1V4oZN1ImFTygYgUKHmWkmWKQVDRfmNslTHde+3657dLRu3BZ3Aw+qrKF6O V5dxLGvR4XpZrZxt7hgliBetHiTTPSXnPrvogKOjwX4wQTqFsJQjwe/Yvn/S+QMJpvypq7hr5rE tmbpu0ZnM1bj9Ys/qiJX58MN1H8b7NfxVvQmBGXvk1o02f9pCbjR9c0DoKvvv0xIDqfhOACRN4n aZzSStZleni3PKZq5E4YQeSXOXqdmJCUlzhAJl/7C/3i0i3L08fJTVcglkdEndU X-Google-Smtp-Source: AGHT+IFLazO7QN4Vx/HhHAoEo89f3TZplbh/iyIBmZR100gIU/ar7b+epW+etJOhfG450DuSyo30rg== X-Received: by 2002:a05:6102:dd1:b0:4b2:af3b:90e2 with SMTP id ada2fe7eead31-4b2cc35dd51mr27711091137.8.1735501608661; Sun, 29 Dec 2024 11:46:48 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.46.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:46:47 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 02/20] alienware-wmi: Move Lighting Control State Date: Sun, 29 Dec 2024 14:44:49 -0500 Message-ID: <20241229194506.8268-4-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Place Lighting Control State logic next to other attributes of the same sysfs group. While at it, rename: store_control_state() -> lighting_control_state_store() show_control_state() -> lighting_control_state_show() Replace DEVICE_ATTR() with DEVICE_ATTR_RW() and do a general style cleanup. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 74 ++++++++++++----------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index ed66720260ab..c5ad0f95c442 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -545,6 +545,45 @@ static ssize_t zone_set(struct device *dev, struct dev= ice_attribute *attr, return ret ? ret : count; } =20 +/* + * Lighting control state device attribute (Global) + */ +static ssize_t lighting_control_state_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + if (lighting_control_state =3D=3D LEGACY_BOOTING) + return sysfs_emit(buf, "[booting] running suspend\n"); + else if (lighting_control_state =3D=3D LEGACY_SUSPEND) + return sysfs_emit(buf, "booting running [suspend]\n"); + + return sysfs_emit(buf, "booting [running] suspend\n"); +} + +static ssize_t lighting_control_state_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u8 val; + + if (strcmp(buf, "booting\n") =3D=3D 0) + val =3D LEGACY_BOOTING; + else if (strcmp(buf, "suspend\n") =3D=3D 0) + val =3D LEGACY_SUSPEND; + else if (interface =3D=3D LEGACY) + val =3D LEGACY_RUNNING; + else + val =3D WMAX_RUNNING; + + lighting_control_state =3D val; + pr_debug("alienware-wmi: updated control state to %d\n", + lighting_control_state); + + return count; +} + +static DEVICE_ATTR_RW(lighting_control_state); + /* * LED Brightness (Global) */ @@ -589,41 +628,6 @@ static struct led_classdev global_led =3D { .name =3D "alienware::global_brightness", }; =20 -/* - * Lighting control state device attribute (Global) - */ -static ssize_t show_control_state(struct device *dev, - struct device_attribute *attr, char *buf) -{ - if (lighting_control_state =3D=3D LEGACY_BOOTING) - return sysfs_emit(buf, "[booting] running suspend\n"); - else if (lighting_control_state =3D=3D LEGACY_SUSPEND) - return sysfs_emit(buf, "booting running [suspend]\n"); - return sysfs_emit(buf, "booting [running] suspend\n"); -} - -static ssize_t store_control_state(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - long unsigned int val; - if (strcmp(buf, "booting\n") =3D=3D 0) - val =3D LEGACY_BOOTING; - else if (strcmp(buf, "suspend\n") =3D=3D 0) - val =3D LEGACY_SUSPEND; - else if (interface =3D=3D LEGACY) - val =3D LEGACY_RUNNING; - else - val =3D WMAX_RUNNING; - lighting_control_state =3D val; - pr_debug("alienware-wmi: updated control state to %d\n", - lighting_control_state); - return count; -} - -static DEVICE_ATTR(lighting_control_state, 0644, show_control_state, - store_control_state); - static int alienware_zone_init(struct platform_device *dev) { u8 zone; --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-ua1-f47.google.com (mail-ua1-f47.google.com [209.85.222.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B84D199249; Sun, 29 Dec 2024 19:46:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501617; cv=none; b=E0fqX0EGpPpiCbGVp3KySp6nyOunADUwIaULF3hpwFSHqq9vLMYbl8Y+45AFa94VzvuMxZR9v2wf1t0fo2x8fCCn9vyVI0y11dWEke3vq8vIr1ATuLEzt62YjJyuVcGSNjbgXJv1bBOL2kkdcFfN3Lp2w5a0DlfuFc72h+uWXFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501617; c=relaxed/simple; bh=GKJppKxQr9095jG4XrzfmDaQDqXnwWfs1sApouGayiA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UNkZe70KsR9pNmhPZOzyTKawoY9kKA+cig7wm+Bqd+S6yda+g6TFopW+yqVAqbIpbU6lCP77IWVtRiyXA4dKZ5Bi4BFPX2+zutKtRRQZE6VTZPNOCTGuMNKmnOUZ2DENgeHshqnHfXC/b0vlcHTpRxcYyyKUecH1OELA6dWwh+Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=B0VXXkDs; arc=none smtp.client-ip=209.85.222.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="B0VXXkDs" Received: by mail-ua1-f47.google.com with SMTP id a1e0cc1a2514c-85c662ebbc3so1276889241.0; Sun, 29 Dec 2024 11:46:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501615; x=1736106415; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=l+L4gSKrHL6ytx2INvMPs+4ZbJgOi5NCKXXDIXm5o8U=; b=B0VXXkDsObvV0er4+hJ2lSrQNbJqVgMBBjk+EkCy9SzE8cbFfu3umdb2VrWKs/oYfM u5arQP1BouNuOmO5cPHmlfV60PialWstW+SU5lkrsOwza5Uiul3gqJueA/NtcA51ITYC v1yDS4mYXWd9uhKHqVqcQD3zafmH3Uzo7iia4pZHcyP4kafFdAegPS7PbsJaKNzQUrXy hauU9e1nOwfQ2+9kzK83AcasHJZoZN+D68I6Tff+h9oJvQDf+1G9bgAjaosZMQFTujQr lZHcPUKujOj2VpXuVRBVD8WHtboGMiwn47wt/k5JU/5alGn0H6UzV1vVFGaiio0eqyN5 Z4rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501615; x=1736106415; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=l+L4gSKrHL6ytx2INvMPs+4ZbJgOi5NCKXXDIXm5o8U=; b=t3uhVODrLDJyRW1oEje8fkc4CLfIH0j8pLhuPFDz5bTRfDKOsJfy859UgNmQQuJGzH d7DEvhdxujqZvbFzazMuPMkp8T7EXCngeb4ShBROe6Rf8Zikk3oAbL22cYF8P44sRoml Lv4M9XqZiHWjzDXUcLAAUtgvs6Z8teO5RfqN4nkEAiunnfJdU9Z/lVp+QSu6PEA30WcJ gj+Trwfv0KQWIrK32FxIBzHC62P9+x+CK5wpa39jHHxKgYrGiOXlmOxHCrZ4ADvfGC5Z nxKcv3Zc+lBQL7DWjGFh/eFld/Z4bPfZm0mfkzXy1711GUVQDo5PnRFTVIPHWzAH9u9M N5hg== X-Forwarded-Encrypted: i=1; AJvYcCXo6bRGyUcxJLDQYfArZZSp3xtEPhDMF55FIBAPBzrptw6SgmK6NWmq2cbmYDGjNjgU9tFeLa29B9cRgHI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9JHuUYs5zwtkTzfcWB887XRJNjPgCuQA4LKdMpwcnrMgS02Mj +0xyyzK/+OSndQi57YYffviUFoQnFWLQtAKhnjKtEO/34Ye5+LuVxb4mcQ== X-Gm-Gg: ASbGncvozeb/SZAg5Nck3qlZo5yYD2SvjH1MyKnXB4Yw/lK5nsKcRwp4mWGXXMk9bMQ 8h2kBJWYtMsg2j8IuTEA1Q3tcTkUNV7GEP/0TBaiiiiUBuvLnMeNL+eL4z61mL99zQFVrUG7YUu r7DuVf6hAbIpVPoFMc8CLYB6WULI6Y0EAflPDyIyIv3/gK0/SRp7tkzdoyT02Ed1nyz5Yml+mev AhmB5pHlG/Bn7GpeVI5/pq436Z9cauQhWiUSh5I2rzEIsKYILJ4s7Vyb1injsc/ X-Google-Smtp-Source: AGHT+IGqSOYDAP24Ao1+lvB9o7RRXm7gMn2ij7rwVZVzNZZOabmYueaihOqrICHCgu+v51I6Y8nFzw== X-Received: by 2002:a05:6102:c02:b0:4b2:5c72:cd55 with SMTP id ada2fe7eead31-4b2cc31f256mr27577284137.5.1735501614787; Sun, 29 Dec 2024 11:46:54 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.46.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:46:53 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 03/20] alienware-wmi: Modify parse_rgb() signature Date: Sun, 29 Dec 2024 14:44:50 -0500 Message-ID: <20241229194506.8268-5-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" parse_rgb() now takes struct color_platform instead of struct platform_zone to support upcoming refactor. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index c5ad0f95c442..273ce9b10765 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -434,7 +434,7 @@ static u8 global_brightness; /* * Helpers used for zone control */ -static int parse_rgb(const char *buf, struct platform_zone *zone) +static int parse_rgb(const char *buf, struct color_platform *colors) { long unsigned int rgb; int ret; @@ -454,7 +454,7 @@ static int parse_rgb(const char *buf, struct platform_z= one *zone) repackager.package =3D rgb & 0x0f0f0f0f; pr_debug("alienware-wmi: r: %d g:%d b: %d\n", repackager.cp.red, repackager.cp.green, repackager.cp.blue); - zone->colors =3D repackager.cp; + *colors =3D repackager.cp; return 0; } =20 @@ -538,7 +538,7 @@ static ssize_t zone_set(struct device *dev, struct devi= ce_attribute *attr, pr_err("alienware-wmi: invalid target zone\n"); return 1; } - ret =3D parse_rgb(buf, target_zone); + ret =3D parse_rgb(buf, &target_zone->colors); if (ret) return ret; ret =3D alienware_update_led(target_zone); --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f51.google.com (mail-vs1-f51.google.com [209.85.217.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2FF0199E94; Sun, 29 Dec 2024 19:46:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501620; cv=none; b=nAluYc9ppMAbL8OzRtydmgyPVZYprFyYAQq5QeSDV0y2EdDg0Faa5x5kjRcWxsKkI+NAi92zOVaGN7ptAoL2Zd+ExtvnJ1J4ulwtpby6PUanBCJ27Wd9EKvJ9m+7JzUcPJGvqkc+10a2EQ2ADzjTmCQS+CkcSVKFBtm+YdTX59U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501620; c=relaxed/simple; bh=hz56ulR9GCiEn1mijKFWg4AJyHwob7fn8JNRTQECb3Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WSb2SA3mxDfHwL98wAz91np9SncC6uoJMYzxegrXycS7/+D/7z0TNqrq35j1JdbfMgQMZFyPLzpvQKGpb9H3jHmkUtsNrwsk1ZieT8BLrYi0sLMmLTm1NT/pIggRYHMjS23YnsA/+OakOcTUWBeYEQZTf+ZZaGjhQH4550qkVTI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=D9GRdOkc; arc=none smtp.client-ip=209.85.217.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D9GRdOkc" Received: by mail-vs1-f51.google.com with SMTP id ada2fe7eead31-4afdd15db60so2304010137.1; Sun, 29 Dec 2024 11:46:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501617; x=1736106417; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EmaOCvgjL7d8XqDTzyguRtqYU50/ijsXAcYicl5jjLA=; b=D9GRdOkcmNUfcHktI5qi7psXPqsoKXcsy20PMTDbPb/W5zAKl+i0QEhQN/ifuwodUr x/wywrUzRi3mdZWl1npeidtL7s3PEzQNJMHRjKneLfKI0YT4MtlrUDdGKoB4KgvVEOTw V0BELap9SfuV3WsF/Re0fgq1fhMxo0a7+BAdy8VyR0nWQvzIuG90FEOkC6icRV9Bb/UJ QoJp+tyGq9nVKB17EBS5aLafKhVhp2DfEAyot4PGMU5/mk97Qt7X2kX6roh9g/eAwTJD KeGMxfXZHaVIoL/0mSTtJI0MLuAnMOUzklrudyVMx9WEEFAdhwoPvCxbhdyDXsp3wQS0 rrSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501617; x=1736106417; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EmaOCvgjL7d8XqDTzyguRtqYU50/ijsXAcYicl5jjLA=; b=BCLTAjvOy3mi4yCVzQ17FHg4QbzFAa2rW3xmUlMZ0V7cmM6aH0EDKW6vCUJz5qzw2J HtP1rBUmQnjEPtKMYfAbkavM9fGS8vl+sKAjGJxv6Q2A1+VwZwXZcGArMijLc5UkrGpO 3rR5NLJDmQj7hnl8L77qybOkPPxm9T/P3gb7bltUwGU0jWA5qDYyg/CFSEbQveu6cEPu vD8/J4GshyXzMhgXBeOF80ALzuCzeYHXhx9Uv1ATwpzcRMP9pdYrCQM6CVVnjK429Be8 nMVGu91EoxoBDolBnMGE08sqll4nlYkIpy+WWN9iE4OA0AStnbJdaBwyOeYUw1Y+JrPJ aj7g== X-Forwarded-Encrypted: i=1; AJvYcCXvFJPj0U+tFpzmWr19bmBXoQL9FacpVR62cQ+/xtZ+YXnAel6HE+nO7bsQgKCV9SUx10G6mdimQ4DTSM4=@vger.kernel.org X-Gm-Message-State: AOJu0YwaqVvnFGM+x8TrXaG9G7KwY2sMy6cJKy0V8Ggui7Zb/IwZfN39 8FJSTpOy3ldqLcF+jIWO9vGmoDUdbcADeDchF4xS/PpS4ppTvQqZdXoiiA== X-Gm-Gg: ASbGncsepwXzgs33YsfSOC3mpCOAlOoiMdDe6mxcxHSsmdMtscsfO4pr+8aryBauWOZ brT4D054hF7MPcRY8Zons1R9wuivewQg6muQ9kQNgOJ7Ww443xz/3K9GbCxawNiCBKvv2unobsP tAWWcbsllp+g+dYuBeliQTxx+xK5Y7JKD8EHthUj/TiBwT6YP31tEpsRylL7B+1dy68NZHUVZqa tlcRNepKzTVrcVJMOfKQ5jthrP7txFCpDp/jdrOqRsQyMMHYOaWNi2arLQVxL8G X-Google-Smtp-Source: AGHT+IEGy3hZd58v3c8USuoMcnfWHmMPjXImLO5gILOIKudYhci3FzYTI/p5naSYUdiYMD2lm/JAHw== X-Received: by 2002:a05:6102:3f0f:b0:4b1:8b53:2987 with SMTP id ada2fe7eead31-4b2cc31f957mr26726816137.1.1735501617398; Sun, 29 Dec 2024 11:46:57 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.46.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:46:56 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 04/20] alienware-wmi: Improve hdmi_mux, amplifier and deepslp group creation Date: Sun, 29 Dec 2024 14:44:51 -0500 Message-ID: <20241229194506.8268-6-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Mario Limonciello Signed-off-by: Kurt Borja --- 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/x= 86/dell/alienware-wmi.c index 273ce9b10765..e010c94555e8 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]; =20 -static struct platform_driver platform_driver =3D { - .driver =3D { - .name =3D "alienware-wmi", - } -}; - static struct attribute_group zone_attribute_group =3D { .name =3D "rgb_zones", }; @@ -804,6 +798,12 @@ static DEVICE_ATTR(cable, S_IRUGO, show_hdmi_cable, NU= LL); static DEVICE_ATTR(source, S_IRUGO | S_IWUSR, show_hdmi_source, toggle_hdmi_source); =20 +static bool hdmi_group_visible(struct kobject *kobj) +{ + return quirks->hdmi_mux; +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi); + static struct attribute *hdmi_attrs[] =3D { &dev_attr_cable.attr, &dev_attr_source.attr, @@ -812,25 +812,10 @@ static struct attribute *hdmi_attrs[] =3D { =20 static const struct attribute_group hdmi_attribute_group =3D { .name =3D "hdmi", + .is_visible =3D SYSFS_GROUP_VISIBLE(hdmi), .attrs =3D hdmi_attrs, }; =20 -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 =3D 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 *de= v, =20 static DEVICE_ATTR(status, S_IRUGO, show_amplifier_status, NULL); =20 +static bool amplifier_group_visible(struct kobject *kobj) +{ + return quirks->amplifier; +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier); + static struct attribute *amplifier_attrs[] =3D { &dev_attr_status.attr, NULL, @@ -866,25 +857,10 @@ static struct attribute *amplifier_attrs[] =3D { =20 static const struct attribute_group amplifier_attribute_group =3D { .name =3D "amplifier", + .is_visible =3D SYSFS_GROUP_VISIBLE(amplifier), .attrs =3D amplifier_attrs, }; =20 -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 =3D 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 ev= ents @@ -937,6 +913,12 @@ static ssize_t toggle_deepsleep(struct device *dev, =20 static DEVICE_ATTR(deepsleep, S_IRUGO | S_IWUSR, show_deepsleep_status, to= ggle_deepsleep); =20 +static bool deepsleep_group_visible(struct kobject *kobj) +{ + return quirks->deepslp; +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep); + static struct attribute *deepsleep_attrs[] =3D { &dev_attr_deepsleep.attr, NULL, @@ -944,25 +926,10 @@ static struct attribute *deepsleep_attrs[] =3D { =20 static const struct attribute_group deepsleep_attribute_group =3D { .name =3D "deepsleep", + .is_visible =3D SYSFS_GROUP_VISIBLE(deepsleep), .attrs =3D deepsleep_attrs, }; =20 -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 =3D 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 @@ -1172,6 +1139,23 @@ static void remove_thermal_profile(void) platform_profile_remove(&pp_handler); } =20 +/* + * Platform Driver + */ +static const struct attribute_group *alienfx_groups[] =3D { + &hdmi_attribute_group, + &lifier_attribute_group, + &deepsleep_attribute_group, + NULL +}; + +static struct platform_driver platform_driver =3D { + .driver =3D { + .name =3D "alienware-wmi", + .dev_groups =3D alienfx_groups, + }, +}; + static int __init alienware_wmi_init(void) { int ret; @@ -1211,24 +1195,6 @@ static int __init alienware_wmi_init(void) if (ret) goto fail_platform_device2; =20 - if (quirks->hdmi_mux > 0) { - ret =3D create_hdmi(platform_device); - if (ret) - goto fail_prep_hdmi; - } - - if (quirks->amplifier > 0) { - ret =3D create_amplifier(platform_device); - if (ret) - goto fail_prep_amplifier; - } - - if (quirks->deepslp > 0) { - ret =3D create_deepsleep(platform_device); - if (ret) - goto fail_prep_deepsleep; - } - if (quirks->thermal) { ret =3D create_thermal_profile(platform_device); if (ret) @@ -1245,9 +1211,6 @@ static int __init alienware_wmi_init(void) alienware_zone_exit(platform_device); 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); @@ -1262,7 +1225,6 @@ module_init(alienware_wmi_init); static void __exit alienware_wmi_exit(void) { alienware_zone_exit(platform_device); - remove_hdmi(platform_device); remove_thermal_profile(); platform_device_unregister(platform_device); platform_driver_unregister(&platform_driver); --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f46.google.com (mail-vs1-f46.google.com [209.85.217.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9DA5E19C56C; Sun, 29 Dec 2024 19:47:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501623; cv=none; b=qpm996MvslXay4e6U9L9Wkk4sUNqys6+sM0Au6dR+4WTev4v1qv9StqcN041bbetcXuRl+IN3AyxWQa00lxG8+jee+tm0OzDU4hvvXKftZZGpC5CnlS+RDNTz1nphAL80MeTNeRVQuT967wht+mQ/TIkQhHySgvFGDLwEAmNaJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501623; c=relaxed/simple; bh=YPxGGxYGLmQUdJVPrF8iAyR9HVQUFEHiYx2S7aYtXzE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JTIUS9m2zwcd+zJYjKVrhXLP+yzTUu9brly3n52CEFEqH1gOu157EIOEqfdq3f7bptJnEBR6j/Mw/M+MUu7bXiFGs+5XaHT5LosDkyROln1Z+IlphBrH7XeQIBlA1TgJFneOM6v9/hJoBAH43FX2sP5Kmd+sAjdxA2zCYQ+86TY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=eorF/RcL; arc=none smtp.client-ip=209.85.217.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="eorF/RcL" Received: by mail-vs1-f46.google.com with SMTP id ada2fe7eead31-4aff31b77e8so2749307137.1; Sun, 29 Dec 2024 11:47:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501620; x=1736106420; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=J0a1ow32G2O43OWWRFNpHI/zcLjB01w85//2cAnS+EA=; b=eorF/RcL2GmdKvrR1jrvHxeK8AAUsMaWger8b9ha2tgXgIU6SmpATx/e+ZJeP8iL/7 jdzksNRHtXWe0yuq3SQtLQdL0+AvJ+3XiRa685xf0uAYjeW3yRnNGh0xBX/X4PoRAMJx otBBC2clSjcClyPbBzJCkZZUFRMOn00cWv1ibdNsCIFLeb5Q395PU1eFJ0Tw9E4mf2aK ZC+HroHYxSq02IZnQBXdzx9EzNVCCwIM2Sa466oJaqcIgZ4WxGM2/jxxDgmQIuVoA97r qAIvULWHzP4OaK+7H6KIZh0kPa9Y4pgLTKY123HgQAqnCwCjmWRa4HUR6r2CUcHjQuYp dVkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501620; x=1736106420; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=J0a1ow32G2O43OWWRFNpHI/zcLjB01w85//2cAnS+EA=; b=ZyZGqvkgW1It5xc2JXYpUKopUisQMN6M71lIH7nekc1nvk7cx/bcrySUNHT2XDYWS1 wZ9Mtrk/5k4Kzzs9B2ZncexqeH9zUikBBFm0DmxLgMlTmc3qQcX5+/0caUyT/cDtJCN7 wWLTdzbh86iG9y/lmCKDLAuFRYCueRtySx+jUV0pUh0OdBY2lLP3zDSSvCUuv87cBLTI Kzu5iAs0cmVuBVdKIlrESvy6Wd0wAd6gyko97SzO0as80i6xGFXCsG19aPiQq2Z37TWn gcNQ18hxTlLlATlzAVePF2JCyh4ImUUdjnSkdWENyC8OVK49E+PW/3Qfg+H9kcTwjZ82 paEQ== X-Forwarded-Encrypted: i=1; AJvYcCWnonI5J8ioF00wXGXxYzuMpr/s1AUcR7tH61oCQwGIu07JEBXHFEXwgSZd4SYf2jjVaNvkTXQ9FNAeTk0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+VF/7QdHdnJ/wWDCgYZ3elyV35L1qhGlRYLkjzdUxczKmf0ia 2ZP89tbhKa1x0b1ZlCN2RpnXRGHsZT9Wg/qPgdoHLDmEj2QG4rVY1EOjqg== X-Gm-Gg: ASbGnctBrSovDfPAdWfIPtNA7A7d01QXvNfyVJadPNoGEKNQkynG7YWe0oWRMLQQ6Pb NWwWv4WAB4cqw7eEoqCe8ouPmme/rci1N01JAFIdIdK5DKXmOwkLtm0U/aw34r8ahhN7jRVOJbM MoMC+FnC0YdtElBbG22zM/xd7ds6xu9nHOYN4PJWXFuYv0KVmz57qkM6cQI512Rcck6JP1eCA2u ZKNxOFeYRdOVL1rLSX2eAvBlGLSe5/P4nr+wiw6XV6i7lQu2Q6d2dG8GpPUQFR9 X-Google-Smtp-Source: AGHT+IEcPPLMwdorAltgf3274hKlsLjY0N0SQnZ6nBFDUKGhPQSX2du7M5G21b8SqO0m9BLqBj7aKw== X-Received: by 2002:a05:6102:1493:b0:4af:af20:516a with SMTP id ada2fe7eead31-4b2cc31c290mr27440509137.1.1735501619942; Sun, 29 Dec 2024 11:46:59 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.46.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:46:59 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 05/20] alienware-wmi: Improve rgb-zones group creation Date: Sun, 29 Dec 2024 14:44:52 -0500 Message-ID: <20241229194506.8268-7-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Define zone_attrs statically and initialize zone_attribute_group with platform driver's .dev_groups. Drop match_zone() and instead pass a `location` argument to previous show/store methods to access the correct `zone` LED state. On top of that rename zone_set() -> zone_store() to be more consistent with sysfs conventions. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- drivers/platform/x86/dell/alienware-wmi.c | 209 +++++++++++----------- 1 file changed, 102 insertions(+), 107 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index e010c94555e8..d97e5e15a8f2 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -376,12 +376,6 @@ struct color_platform { u8 red; } __packed; =20 -struct platform_zone { - u8 location; - struct device_attribute *attr; - struct color_platform colors; -}; - struct wmax_brightness_args { u32 led_mask; u32 percentage; @@ -411,16 +405,10 @@ struct wmax_u32_args { }; =20 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 color_platform colors[4]; static struct platform_profile_handler pp_handler; static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_= LAST]; =20 -static struct attribute_group zone_attribute_group =3D { - .name =3D "rgb_zones", -}; - static u8 interface; static u8 lighting_control_state; static u8 global_brightness; @@ -452,24 +440,10 @@ static int parse_rgb(const char *buf, struct color_pl= atform *colors) return 0; } =20 -static struct platform_zone *match_zone(struct device_attribute *attr) -{ - u8 zone; - - for (zone =3D 0; zone < quirks->num_zones; zone++) { - if ((struct device_attribute *)zone_data[zone].attr =3D=3D attr) { - pr_debug("alienware-wmi: matched zone location: %d\n", - zone_data[zone].location); - return &zone_data[zone]; - } - } - return NULL; -} - /* * Individual RGB zone control */ -static int alienware_update_led(struct platform_zone *zone) +static int alienware_update_led(u8 location) { int method_id; acpi_status status; @@ -478,8 +452,8 @@ static int alienware_update_led(struct platform_zone *z= one) struct legacy_led_args legacy_args; struct wmax_led_args wmax_basic_args; if (interface =3D=3D WMAX) { - wmax_basic_args.led_mask =3D 1 << zone->location; - wmax_basic_args.colors =3D zone->colors; + wmax_basic_args.led_mask =3D 1 << location; + wmax_basic_args.colors =3D colors[location]; wmax_basic_args.state =3D lighting_control_state; guid =3D WMAX_CONTROL_GUID; method_id =3D WMAX_METHOD_ZONE_CONTROL; @@ -487,7 +461,7 @@ static int alienware_update_led(struct platform_zone *z= one) input.length =3D sizeof(wmax_basic_args); input.pointer =3D &wmax_basic_args; } else { - legacy_args.colors =3D zone->colors; + legacy_args.colors =3D colors[location]; legacy_args.brightness =3D global_brightness; legacy_args.state =3D 0; if (lighting_control_state =3D=3D LEGACY_BOOTING || @@ -496,7 +470,7 @@ static int alienware_update_led(struct platform_zone *z= one) legacy_args.state =3D lighting_control_state; } else guid =3D LEGACY_CONTROL_GUID; - method_id =3D zone->location + 1; + method_id =3D location + 1; =20 input.length =3D sizeof(legacy_args); input.pointer =3D &legacy_args; @@ -510,35 +484,84 @@ static int alienware_update_led(struct platform_zone = *zone) } =20 static ssize_t zone_show(struct device *dev, struct device_attribute *attr, - char *buf) + char *buf, u8 location) { - struct platform_zone *target_zone; - target_zone =3D match_zone(attr); - if (target_zone =3D=3D NULL) - return sprintf(buf, "red: -1, green: -1, blue: -1\n"); return sprintf(buf, "red: %d, green: %d, blue: %d\n", - target_zone->colors.red, - target_zone->colors.green, target_zone->colors.blue); + colors[location].red, colors[location].green, + colors[location].blue); =20 } =20 -static ssize_t zone_set(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) +static ssize_t zone_store(struct device *dev, struct device_attribute *att= r, + const char *buf, size_t count, u8 location) { - struct platform_zone *target_zone; int ret; - target_zone =3D match_zone(attr); - if (target_zone =3D=3D NULL) { - pr_err("alienware-wmi: invalid target zone\n"); - return 1; - } - ret =3D parse_rgb(buf, &target_zone->colors); + + ret =3D parse_rgb(buf, &colors[location]); if (ret) return ret; - ret =3D alienware_update_led(target_zone); + + ret =3D alienware_update_led(location); + return ret ? ret : count; } =20 +static ssize_t zone00_show(struct device *dev, struct device_attribute *at= tr, + char *buf) +{ + return zone_show(dev, attr, buf, 0); +} + +static ssize_t zone00_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) +{ + return zone_store(dev, attr, buf, count, 0); +} + +DEVICE_ATTR_RW(zone00); + +static ssize_t zone01_show(struct device *dev, struct device_attribute *at= tr, + char *buf) +{ + return zone_show(dev, attr, buf, 1); +} + +static ssize_t zone01_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) +{ + return zone_store(dev, attr, buf, count, 1); +} + +DEVICE_ATTR_RW(zone01); + +static ssize_t zone02_show(struct device *dev, struct device_attribute *at= tr, + char *buf) +{ + return zone_show(dev, attr, buf, 2); +} + +static ssize_t zone02_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) +{ + return zone_store(dev, attr, buf, count, 2); +} + +DEVICE_ATTR_RW(zone02); + +static ssize_t zone03_show(struct device *dev, struct device_attribute *at= tr, + char *buf) +{ + return zone_show(dev, attr, buf, 3); +} + +static ssize_t zone03_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) +{ + return zone_store(dev, attr, buf, count, 3); +} + +DEVICE_ATTR_RW(zone03); + /* * Lighting control state device attribute (Global) */ @@ -578,6 +601,33 @@ static ssize_t lighting_control_state_store(struct dev= ice *dev, =20 static DEVICE_ATTR_RW(lighting_control_state); =20 +static umode_t zone_attr_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + return n < quirks->num_zones + 1 ? 0644 : 0; +} + +static bool zone_group_visible(struct kobject *kobj) +{ + return quirks->num_zones > 0; +} +DEFINE_SYSFS_GROUP_VISIBLE(zone); + +static struct attribute *zone_attrs[] =3D { + &dev_attr_lighting_control_state.attr, + &dev_attr_zone00.attr, + &dev_attr_zone01.attr, + &dev_attr_zone02.attr, + &dev_attr_zone03.attr, + NULL +}; + +static struct attribute_group zone_attribute_group =3D { + .name =3D "rgb_zones", + .is_visible =3D SYSFS_GROUP_VISIBLE(zone), + .attrs =3D zone_attrs, +}; + /* * LED Brightness (Global) */ @@ -606,7 +656,7 @@ static void global_led_set(struct led_classdev *led_cde= v, if (interface =3D=3D WMAX) ret =3D wmax_brightness(brightness); else - ret =3D alienware_update_led(&zone_data[0]); + ret =3D alienware_update_led(0); if (ret) pr_err("LED brightness update failed\n"); } @@ -624,9 +674,6 @@ static struct led_classdev global_led =3D { =20 static int alienware_zone_init(struct platform_device *dev) { - u8 zone; - char *name; - if (interface =3D=3D WMAX) { lighting_control_state =3D WMAX_RUNNING; } else if (interface =3D=3D LEGACY) { @@ -635,65 +682,12 @@ static int alienware_zone_init(struct platform_device= *dev) global_led.max_brightness =3D 0x0F; global_brightness =3D global_led.max_brightness; =20 - /* - * - zone_dev_attrs num_zones + 1 is for individual zones and then - * null terminated - * - zone_attrs num_zones + 2 is for all attrs in zone_dev_attrs + - * the lighting control + null terminated - * - zone_data num_zones is for the distinct zones - */ - zone_dev_attrs =3D - kcalloc(quirks->num_zones + 1, sizeof(struct device_attribute), - GFP_KERNEL); - if (!zone_dev_attrs) - return -ENOMEM; - - zone_attrs =3D - kcalloc(quirks->num_zones + 2, sizeof(struct attribute *), - GFP_KERNEL); - if (!zone_attrs) - return -ENOMEM; - - zone_data =3D - kcalloc(quirks->num_zones, sizeof(struct platform_zone), - GFP_KERNEL); - if (!zone_data) - return -ENOMEM; - - for (zone =3D 0; zone < quirks->num_zones; zone++) { - name =3D kasprintf(GFP_KERNEL, "zone%02hhX", zone); - if (name =3D=3D NULL) - return 1; - sysfs_attr_init(&zone_dev_attrs[zone].attr); - zone_dev_attrs[zone].attr.name =3D name; - zone_dev_attrs[zone].attr.mode =3D 0644; - zone_dev_attrs[zone].show =3D zone_show; - zone_dev_attrs[zone].store =3D zone_set; - zone_data[zone].location =3D zone; - zone_attrs[zone] =3D &zone_dev_attrs[zone].attr; - zone_data[zone].attr =3D &zone_dev_attrs[zone]; - } - zone_attrs[quirks->num_zones] =3D &dev_attr_lighting_control_state.attr; - zone_attribute_group.attrs =3D zone_attrs; - - led_classdev_register(&dev->dev, &global_led); - - return sysfs_create_group(&dev->dev.kobj, &zone_attribute_group); + return led_classdev_register(&dev->dev, &global_led); } =20 static void alienware_zone_exit(struct platform_device *dev) { - u8 zone; - - sysfs_remove_group(&dev->dev.kobj, &zone_attribute_group); led_classdev_unregister(&global_led); - if (zone_dev_attrs) { - for (zone =3D 0; zone < quirks->num_zones; zone++) - kfree(zone_dev_attrs[zone].attr.name); - } - kfree(zone_dev_attrs); - kfree(zone_data); - kfree(zone_attrs); } =20 static acpi_status alienware_wmax_command(void *in_args, size_t in_size, @@ -1143,6 +1137,7 @@ static void remove_thermal_profile(void) * Platform Driver */ static const struct attribute_group *alienfx_groups[] =3D { + &zone_attribute_group, &hdmi_attribute_group, &lifier_attribute_group, &deepsleep_attribute_group, --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f47.google.com (mail-vs1-f47.google.com [209.85.217.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC063199FC9; Sun, 29 Dec 2024 19:47:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501625; cv=none; b=QEAFJF12VWT88yBj3WfHBz7oh3PRYg7GFm62CWtm8m2wRW6V2zLHdW6HuIwM3uuDZQNzIg1u3dVRSq3Zw2TKPtM4JFpwrejBXVpj4GgFLAVkiRflxJI3U3ieO3vMtjt4L7pYQ5CwWdlLfCQb18rD1HQgDeSKyebvCaDznYASqmU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501625; c=relaxed/simple; bh=aWtmfYbUGt3AUntl2kId8jHcp6YGM5O7BSzUPltkV7g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TWqch3W98vzxfn1AwbclDBEtxA3aGQUQ+vMSt88GIFbXvDtdqQ2ZMAv8P8/EVdTaF1zs9PKAHMlbNjhuGfIprfGvl3nKmUZNIF6bU15k1Z3+GKzAY+WP+/F5+Z7QGNZNo3KrnDkZ0tVVfXPNaKtMYfPBtH8FkCT1/rOxD47mfDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EFMDQr26; arc=none smtp.client-ip=209.85.217.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EFMDQr26" Received: by mail-vs1-f47.google.com with SMTP id ada2fe7eead31-4aff620b232so2668634137.0; Sun, 29 Dec 2024 11:47:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501622; x=1736106422; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Wye+J3w3PBzCSEvlZi6NGIkahK5mwUxnpk9LeMxtZXc=; b=EFMDQr263KBTepliD8DFNzLF3rypqsjQncqq4MNh/hoCch9Mn47qpOWvGEqMnys8xe 1NN06/TNgns5thJsrTthT/u+F6OEI//tyYCHLrhXxIpD4tm8ixQvz3RzgwBKu55MRcfP tfAz9VsgExKZTFT1SFZudpf8Xa4o+zVYXKKLEt9yaVFjAmHRMLsWKh74jsiytp7f8vXW NFY50AjKPSGzRRY37ZTpIKSCwrkWs3Y5k0F/T8CvrmA1DuWfigBGbHyJ3K1LcrdMrZLk erK41Cd6pparuxz14OUaGDDeO73/jGiHrb/3P+2EDJrzZo8FqVmHVMA1HwvXW4hBIgDt FIEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501622; x=1736106422; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Wye+J3w3PBzCSEvlZi6NGIkahK5mwUxnpk9LeMxtZXc=; b=sxqUhhnAPlamPOM0vWA0A2iolnyhx69AXEqdZb6EJjX1vJNPK5PobL4Vl7CMpneg23 /K3+/OzW1U9OPPpLgQm4CQ/w0c30b/Llocdi5W5Y2mvbLuK5htCCH7qFO1dAft5gd2kD 4YOv4yswRlD5vwVYSXytcZMTTSztCtIOLzhQuygSCX1pxd4/FFG7pzwGfSJ6sNXuLDb/ EC05brGmAlPyv5M0xPyJgIkzVdWwVkF/VKBFOgkztoF9m2m8/QLZUhkDWkZ+KvUMWH1C REcEsGOv7WDJdPyT6XHrxbD2TiA4xXR4n40crl8TxwwnBiVzsxQsYNs7skvO4BBA8ZKf Hi0w== X-Forwarded-Encrypted: i=1; AJvYcCUomShbS3Oe5u6btsknXifKxSPGicVEFbwy/qYxvRKVDthNTiK6Q5pHmZpH5NbnFzmGP4N5A3ihgQYjLr8=@vger.kernel.org X-Gm-Message-State: AOJu0YypEcUnMQVmSenG76MieAxrT4xzOHgoZqapuS5bx2NMOXX/1C4g n19VcaynfXjQyZ4IvyDVOHiD7xKaMZgqIMcvZoxh9+lfNGAuoEZxsQ+Hiw== X-Gm-Gg: ASbGncudK2rnwcnAlty884C1C0ELqKDOUqKfO6WXwv82jklU8Mi4/5BbxQkibsl4Owd YzmRL1i1oUSnL5G1nyCMOls/AMSnuMFbjWTOy2Xe15IEWlaisb/RtnV50GFXZ9VIsQkocZqldIF 74KJKuUuw+OJk38u/ZfoTmDkk/f9NvW28nOY29FUmcZ83L3Zj+JfJu0A3KnOpsY2CBnxcVmDNB0 /nmbbLHpH05rEoCfoLLlvYhE+TCfcHoYPjnSg2UEyV14kfx8/dUNcOY7s/CCIeC X-Google-Smtp-Source: AGHT+IE8Se3XCQO8/eiW+RtTfaq0e/IGnEPbGd19/aHu7A4BghMWMcZkKftd28q37z119CfSHtoeWQ== X-Received: by 2002:a05:6102:c8c:b0:4af:de39:216a with SMTP id ada2fe7eead31-4b2cc31e717mr24043076137.6.1735501622560; Sun, 29 Dec 2024 11:47:02 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:01 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 06/20] alienware_wmi: General cleanup of WMAX methods Date: Sun, 29 Dec 2024 14:44:53 -0500 Message-ID: <20241229194506.8268-8-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Reorder variable declaration from longest to shortest. Standarize show/store method names of WMAX's sysfs groups. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- drivers/platform/x86/dell/alienware-wmi.c | 67 +++++++++++------------ 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index d97e5e15a8f2..2c17160473a6 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -722,14 +722,14 @@ static acpi_status alienware_wmax_command(void *in_ar= gs, size_t in_size, * The HDMI mux sysfs node indicates the status of the HDMI input mux. * It can toggle between standard system GPU output and HDMI input. */ -static ssize_t show_hdmi_cable(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t cable_show(struct device *dev, struct device_attribute *att= r, + char *buf) { - acpi_status status; - u32 out_data; struct wmax_basic_args in_args =3D { .arg =3D 0, }; + acpi_status status; + u32 out_data; status =3D alienware_wmax_command(&in_args, sizeof(in_args), WMAX_METHOD_HDMI_CABLE, &out_data); @@ -743,14 +743,14 @@ static ssize_t show_hdmi_cable(struct device *dev, return sysfs_emit(buf, "unconnected connected [unknown]\n"); } =20 -static ssize_t show_hdmi_source(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t source_show(struct device *dev, struct device_attribute *at= tr, + char *buf) { - acpi_status status; - u32 out_data; struct wmax_basic_args in_args =3D { .arg =3D 0, }; + acpi_status status; + u32 out_data; status =3D alienware_wmax_command(&in_args, sizeof(in_args), WMAX_METHOD_HDMI_STATUS, &out_data); @@ -765,12 +765,11 @@ static ssize_t show_hdmi_source(struct device *dev, return sysfs_emit(buf, "input gpu [unknown]\n"); } =20 -static ssize_t toggle_hdmi_source(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static ssize_t source_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) { - acpi_status status; struct wmax_basic_args args; + acpi_status status; if (strcmp(buf, "gpu\n") =3D=3D 0) args.arg =3D 1; else if (strcmp(buf, "input\n") =3D=3D 0) @@ -788,9 +787,8 @@ static ssize_t toggle_hdmi_source(struct device *dev, return count; } =20 -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 DEVICE_ATTR_RO(cable); +static DEVICE_ATTR_RW(source); =20 static bool hdmi_group_visible(struct kobject *kobj) { @@ -815,14 +813,14 @@ static const struct attribute_group hdmi_attribute_gr= oup =3D { * - Currently supports reading cable status * - Leaving expansion room to possibly support dock/undock events later */ -static ssize_t show_amplifier_status(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t status_show(struct device *dev, struct device_attribute *at= tr, + char *buf) { - acpi_status status; - u32 out_data; struct wmax_basic_args in_args =3D { .arg =3D 0, }; + acpi_status status; + u32 out_data; status =3D alienware_wmax_command(&in_args, sizeof(in_args), WMAX_METHOD_AMPLIFIER_CABLE, &out_data); @@ -836,7 +834,7 @@ static ssize_t show_amplifier_status(struct device *dev, return sysfs_emit(buf, "unconnected connected [unknown]\n"); } =20 -static DEVICE_ATTR(status, S_IRUGO, show_amplifier_status, NULL); +static DEVICE_ATTR_RO(status); =20 static bool amplifier_group_visible(struct kobject *kobj) { @@ -859,14 +857,14 @@ static const struct attribute_group amplifier_attribu= te_group =3D { * Deep Sleep Control support * - Modifies BIOS setting for deep sleep control allowing extra wakeup ev= ents */ -static ssize_t show_deepsleep_status(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t deepsleep_show(struct device *dev, struct device_attribute = *attr, + char *buf) { - acpi_status status; - u32 out_data; struct wmax_basic_args in_args =3D { .arg =3D 0, }; + acpi_status status; + u32 out_data; status =3D alienware_wmax_command(&in_args, sizeof(in_args), WMAX_METHOD_DEEP_SLEEP_STATUS, &out_data); if (ACPI_SUCCESS(status)) { @@ -881,12 +879,11 @@ static ssize_t show_deepsleep_status(struct device *d= ev, return sysfs_emit(buf, "disabled s5 s5_s4 [unknown]\n"); } =20 -static ssize_t toggle_deepsleep(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static ssize_t deepsleep_store(struct device *dev, struct device_attribute= *attr, + const char *buf, size_t count) { - acpi_status status; struct wmax_basic_args args; + acpi_status status; =20 if (strcmp(buf, "disabled\n") =3D=3D 0) args.arg =3D 0; @@ -905,7 +902,7 @@ static ssize_t toggle_deepsleep(struct device *dev, return count; } =20 -static DEVICE_ATTR(deepsleep, S_IRUGO | S_IWUSR, show_deepsleep_status, to= ggle_deepsleep); +static DEVICE_ATTR_RW(deepsleep); =20 static bool deepsleep_group_visible(struct kobject *kobj) { @@ -953,13 +950,13 @@ static bool is_wmax_thermal_code(u32 code) =20 static int wmax_thermal_information(u8 operation, u8 arg, u32 *out_data) { - acpi_status status; struct wmax_u32_args in_args =3D { .operation =3D operation, .arg1 =3D arg, .arg2 =3D 0, .arg3 =3D 0, }; + acpi_status status; =20 status =3D alienware_wmax_command(&in_args, sizeof(in_args), WMAX_METHOD_THERMAL_INFORMATION, @@ -976,13 +973,13 @@ static int wmax_thermal_information(u8 operation, u8 = arg, u32 *out_data) =20 static int wmax_thermal_control(u8 profile) { - acpi_status status; struct wmax_u32_args in_args =3D { .operation =3D WMAX_OPERATION_ACTIVATE_PROFILE, .arg1 =3D profile, .arg2 =3D 0, .arg3 =3D 0, }; + acpi_status status; u32 out_data; =20 status =3D alienware_wmax_command(&in_args, sizeof(in_args), @@ -1000,13 +997,13 @@ static int wmax_thermal_control(u8 profile) =20 static int wmax_game_shift_status(u8 operation, u32 *out_data) { - acpi_status status; struct wmax_u32_args in_args =3D { .operation =3D operation, .arg1 =3D 0, .arg2 =3D 0, .arg3 =3D 0, }; + acpi_status status; =20 status =3D alienware_wmax_command(&in_args, sizeof(in_args), WMAX_METHOD_GAME_SHIFT_STATUS, @@ -1075,11 +1072,11 @@ static int thermal_profile_set(struct platform_prof= ile_handler *pprof, =20 static int create_thermal_profile(struct platform_device *platform_device) { - u32 out_data; + enum platform_profile_option profile; + enum wmax_thermal_mode mode; u8 sys_desc[4]; u32 first_mode; - enum wmax_thermal_mode mode; - enum platform_profile_option profile; + u32 out_data; int ret; =20 ret =3D wmax_thermal_information(WMAX_OPERATION_SYS_DESCRIPTION, --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f41.google.com (mail-vs1-f41.google.com [209.85.217.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F98319CD13; Sun, 29 Dec 2024 19:47:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501628; cv=none; b=h3ptJEzsSsL2hSUFxNxhfG+jPaH0bzcSU9EM/EPcFXuTIVGtn9LT8+mehBNBUZvyCROK+yUUDERO4jLhtaOxAS9sBkespCUjRrsUKsstaF93vTMlYnG+Vd4stloD0RKZXjHBHj6ENBQTfXL+AGqRfui3lZSzcisEEvStsPvZiQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501628; c=relaxed/simple; bh=8FAziCPJLkU0QinpAknZ9D7G4QoHmGla1DA10dlYoLA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jij6w9OCiLinASCF58vq/qh31zfYH9QFQJbypqx0zMT8Sdre+CL7UsHqrrIRTEqaT+n3rdAwXqT2VG1/iKyiY4feH1/BS+gz1xARnNR7aHwqk9AqpaF87PgCZRNxyHheRj+G81wN6PpYJK+SEQvlB4lczs6I8yvM+YjJBLmg4Js= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ikwIyN6B; arc=none smtp.client-ip=209.85.217.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ikwIyN6B" Received: by mail-vs1-f41.google.com with SMTP id ada2fe7eead31-4b11a110e4eso2429418137.1; Sun, 29 Dec 2024 11:47:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501626; x=1736106426; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0Hhx93SvZhgpcRgAG1QATC59kcQxwf7HYzGHwNDNrdM=; b=ikwIyN6BHh/qG5zijup5Sw4yLBG0prc2QTsV5izb0jG2+nsW06iwMPd5mkr2W6XIML zC3lFoJOQIh3fxWASVu9LJuO8llnxJa3FOiBCRfQnxzpV4hedFz2Y2JRfikBPigjy+Wo 1s6U5V9kIjG78VFCYWrCNLcU1D/dE945q3FYbKAtYMSwSPY7CA2gutubW6TY0ZD+PKkF LwQfw8t2uJ54iyibNQrl2a70dCdB9TjSx9r3d+aGGfe1Vm0NPBXQ0vD2YcQqdedblFMB YwDznp0TlPe76SPtr6YoISw7S2+nXLDUec+PwmB7bShHyTo+kk2L7yXP7h3Uq14Mv63h slVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501626; x=1736106426; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0Hhx93SvZhgpcRgAG1QATC59kcQxwf7HYzGHwNDNrdM=; b=nwuxQZ0AZK/BPPjbqpOqp8a5vKtKtrQovpAf9K5XtPn+HVzJ2hnZKG3P9XCGTg//YS rq/pgG2fVcQfK92NZeWMNVwhqNxQULzYe9eSx0LshQyig0VST2gH9JLLF96Y8R2DqAZP 04tZNsDAPxTzXeAXlQ49W5458j7gfMfrK8NQJuLgEPxpArbbGIdGTv9v+/HR8s2KfX+G AA02a51D+uWILw2S/9sbf+jbDci2eNeV90Gcq6nnQVjD31XiW+EtdFe+mXahCc3Bl36/ 7ww0CcQAUcen1cAIJhBzkjVC73lnjJv4Vn4rGoxKpcCGucLTrOS0q952d//pIFR0bl2o kxzQ== X-Forwarded-Encrypted: i=1; AJvYcCV+4P0+i1iHNIocL/evlLM6thyBe1fl9Rqq30DHH9jwo7ApZUpmvM4/H5thYRkrj3rWgpBNZQaij5fdt2o=@vger.kernel.org X-Gm-Message-State: AOJu0YxlD/7QAsyhcBhUsD8rp3OGDeirYP8347uKKVQcvApgmSUiag2J /1JV9nAxuHcBfzq5O3Xfk7Xn3bp0V7mZWw+DPlnk0iAz941ct5GRJ3KZZA== X-Gm-Gg: ASbGncv0pjyLxGDSifvmANiTD1+9cua32VXeLi38ydJeN0lSM39pzrUhMEv8dJ7CGNu wN4OCId933QrnU47dlEnBKcdirjEfQWZjQjuJjVNBMWQTMwEOGKhVbsjM+azsSkIFNI1gaDmIcR c6Vuo+HXqH8RbeByuJmLypOXeljPf69gZlU/fseji3JrBHtVduc7OogTgUUvPs5mDOiXA1TPLFt PWdB158FFUykZbuaPNXabwPyo8uTNyfNmbGgU5ioO1Lut2Ls3JGFn3pOoB624nf X-Google-Smtp-Source: AGHT+IFjlaxXWyUFNJtM0jCSn1oDTCidamCszddcboR4w6a3h99/XQNtmYxczWsNHxs2KLFhn3MyqQ== X-Received: by 2002:a05:6102:41a3:b0:4b2:7446:fc18 with SMTP id ada2fe7eead31-4b2cc4597f3mr28325917137.17.1735501625809; Sun, 29 Dec 2024 11:47:05 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:05 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 07/20] alienware-wmi: Add a state container for LED control feature Date: Sun, 29 Dec 2024 14:44:54 -0500 Message-ID: <20241229194506.8268-9-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. 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. Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 135 +++++++++++++--------- 1 file changed, 79 insertions(+), 56 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index 2c17160473a6..88d4046ed45f 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -404,14 +404,20 @@ struct wmax_u32_args { u8 arg3; }; =20 +struct alienfx_priv { + struct platform_device *pdev; + struct quirk_entry *quirks; + 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 struct platform_profile_handler pp_handler; static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_= LAST]; =20 static u8 interface; -static u8 lighting_control_state; -static u8 global_brightness; =20 /* * Helpers used for zone control @@ -443,7 +449,7 @@ static int parse_rgb(const char *buf, struct color_plat= form *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; @@ -453,21 +459,21 @@ static int alienware_update_led(u8 location) struct wmax_led_args wmax_basic_args; if (interface =3D=3D WMAX) { wmax_basic_args.led_mask =3D 1 << location; - wmax_basic_args.colors =3D colors[location]; - wmax_basic_args.state =3D lighting_control_state; + wmax_basic_args.colors =3D priv->colors[location]; + wmax_basic_args.state =3D priv->lighting_control_state; guid =3D WMAX_CONTROL_GUID; method_id =3D WMAX_METHOD_ZONE_CONTROL; =20 input.length =3D sizeof(wmax_basic_args); input.pointer =3D &wmax_basic_args; } else { - legacy_args.colors =3D colors[location]; - legacy_args.brightness =3D global_brightness; + legacy_args.colors =3D priv->colors[location]; + legacy_args.brightness =3D priv->global_brightness; legacy_args.state =3D 0; - if (lighting_control_state =3D=3D LEGACY_BOOTING || - lighting_control_state =3D=3D LEGACY_SUSPEND) { + if (priv->lighting_control_state =3D=3D LEGACY_BOOTING || + priv->lighting_control_state =3D=3D LEGACY_SUSPEND) { guid =3D LEGACY_POWER_CONTROL_GUID; - legacy_args.state =3D lighting_control_state; + legacy_args.state =3D priv->lighting_control_state; } else guid =3D LEGACY_CONTROL_GUID; method_id =3D location + 1; @@ -486,22 +492,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 =3D dev_get_drvdata(dev); + struct color_platform *colors =3D &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); =20 } =20 static ssize_t zone_store(struct device *dev, struct device_attribute *att= r, const char *buf, size_t count, u8 location) { + struct alienfx_priv *priv =3D dev_get_drvdata(dev); + struct color_platform *colors =3D &priv->colors[location]; int ret; =20 - ret =3D parse_rgb(buf, &colors[location]); + ret =3D parse_rgb(buf, colors); if (ret) return ret; =20 - ret =3D alienware_update_led(location); + ret =3D alienware_update_led(priv, location); =20 return ret ? ret : count; } @@ -569,9 +579,11 @@ static ssize_t lighting_control_state_show(struct devi= ce *dev, struct device_attribute *attr, char *buf) { - if (lighting_control_state =3D=3D LEGACY_BOOTING) + struct alienfx_priv *priv =3D dev_get_drvdata(dev); + + if (priv->lighting_control_state =3D=3D LEGACY_BOOTING) return sysfs_emit(buf, "[booting] running suspend\n"); - else if (lighting_control_state =3D=3D LEGACY_SUSPEND) + else if (priv->lighting_control_state =3D=3D LEGACY_SUSPEND) return sysfs_emit(buf, "booting running [suspend]\n"); =20 return sysfs_emit(buf, "booting [running] suspend\n"); @@ -581,6 +593,7 @@ static ssize_t lighting_control_state_store(struct devi= ce *dev, struct device_attribute *attr, const char *buf, size_t count) { + struct alienfx_priv *priv =3D dev_get_drvdata(dev); u8 val; =20 if (strcmp(buf, "booting\n") =3D=3D 0) @@ -592,9 +605,9 @@ static ssize_t lighting_control_state_store(struct devi= ce *dev, else val =3D WMAX_RUNNING; =20 - lighting_control_state =3D val; + priv->lighting_control_state =3D val; pr_debug("alienware-wmi: updated control state to %d\n", - lighting_control_state); + priv->lighting_control_state); =20 return count; } @@ -651,43 +664,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 =3D container_of(led_cdev, struct alienfx_priv, + global_led); int ret; - global_brightness =3D brightness; + + priv->global_brightness =3D brightness; + if (interface =3D=3D WMAX) ret =3D wmax_brightness(brightness); else - ret =3D alienware_update_led(0); + ret =3D alienware_update_led(priv, 0); if (ret) pr_err("LED brightness update failed\n"); } =20 static enum led_brightness global_led_get(struct led_classdev *led_cdev) { - return global_brightness; -} - -static struct led_classdev global_led =3D { - .brightness_set =3D global_led_set, - .brightness_get =3D global_led_get, - .name =3D "alienware::global_brightness", -}; + struct alienfx_priv *priv =3D container_of(led_cdev, struct alienfx_priv, + global_led); =20 -static int alienware_zone_init(struct platform_device *dev) -{ - if (interface =3D=3D WMAX) { - lighting_control_state =3D WMAX_RUNNING; - } else if (interface =3D=3D LEGACY) { - lighting_control_state =3D LEGACY_RUNNING; - } - global_led.max_brightness =3D 0x0F; - global_brightness =3D global_led.max_brightness; - - 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; } =20 static acpi_status alienware_wmax_command(void *in_args, size_t in_size, @@ -792,7 +788,9 @@ static DEVICE_ATTR_RW(source); =20 static bool hdmi_group_visible(struct kobject *kobj) { - return quirks->hdmi_mux; + struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return priv->quirks->hdmi_mux; } DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi); =20 @@ -838,7 +836,9 @@ static DEVICE_ATTR_RO(status); =20 static bool amplifier_group_visible(struct kobject *kobj) { - return quirks->amplifier; + struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return priv->quirks->amplifier; } DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier); =20 @@ -906,7 +906,9 @@ static DEVICE_ATTR_RW(deepsleep); =20 static bool deepsleep_group_visible(struct kobject *kobj) { - return quirks->deepslp; + struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return priv->quirks->deepslp; } DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep); =20 @@ -1133,6 +1135,33 @@ static void remove_thermal_profile(void) /* * Platform Driver */ +static int alienfx_probe(struct platform_device *pdev) +{ + struct alienfx_priv *priv; + + priv =3D devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + platform_set_drvdata(pdev, priv); + priv->pdev =3D pdev; + priv->quirks =3D quirks; + + if (interface =3D=3D WMAX) + priv->lighting_control_state =3D WMAX_RUNNING; + else if (interface =3D=3D LEGACY) + priv->lighting_control_state =3D LEGACY_RUNNING; + + priv->global_led.name =3D "alienware::global_brightness"; + priv->global_led.brightness_set =3D global_led_set; + priv->global_led.brightness_get =3D global_led_get; + priv->global_led.max_brightness =3D 0x0F; + + priv->global_brightness =3D priv->global_led.max_brightness; + + return devm_led_classdev_register(&pdev->dev, &priv->global_led); +} + static const struct attribute_group *alienfx_groups[] =3D { &zone_attribute_group, &hdmi_attribute_group, @@ -1145,7 +1174,9 @@ static struct platform_driver platform_driver =3D { .driver =3D { .name =3D "alienware-wmi", .dev_groups =3D alienfx_groups, + .probe_type =3D PROBE_FORCE_SYNCHRONOUS, }, + .probe =3D alienfx_probe, }; =20 static int __init alienware_wmi_init(void) @@ -1193,15 +1224,8 @@ static int __init alienware_wmi_init(void) goto fail_prep_thermal_profile; } =20 - ret =3D alienware_zone_init(platform_device); - if (ret) - goto fail_prep_zones; - return 0; =20 -fail_prep_zones: - alienware_zone_exit(platform_device); - remove_thermal_profile(); fail_prep_thermal_profile: platform_device_del(platform_device); fail_platform_device2: @@ -1216,7 +1240,6 @@ module_init(alienware_wmi_init); =20 static void __exit alienware_wmi_exit(void) { - alienware_zone_exit(platform_device); remove_thermal_profile(); platform_device_unregister(platform_device); platform_driver_unregister(&platform_driver); --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f45.google.com (mail-vs1-f45.google.com [209.85.217.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A928219AA72; Sun, 29 Dec 2024 19:47:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501636; cv=none; b=EKxLMs2k24YJvxI2+YUnTfT9VWRPnH36c3uccwoWZgLZaVVNVfV2dp4Zy9TuiUEhxIwbrPk/osYJRzZqO9BdIPYb/xpvC6Ju4GtB1kOuIl6lChJreyFOczSC5JSBboZSXO7UWpBX9xev3YCBQH7Yz5UeJMGVhFon3oEjQdvg89o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501636; c=relaxed/simple; bh=XK4FU/QiSLhTpnFfcV4tNp8iRSCFISRCH4SI1z+NrFM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZUsZT9S6q5IcLzFcPLmXHVSdbr7mPZpFvIWtDDH0c7kDUEYUH4nCCmnaoEwOprbp4g5CRhWgQuRpp6ZS2XT6T/C9IObmUY4C1jstERbESwGyksg5YIuV1Wu3NYo4L1IGvFEfdOfM/mzr1MWmv414LL/MvdAoF/AJrMVYDg5z/38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WBn0UwVD; arc=none smtp.client-ip=209.85.217.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WBn0UwVD" Received: by mail-vs1-f45.google.com with SMTP id ada2fe7eead31-4afed12283eso5560924137.1; Sun, 29 Dec 2024 11:47:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501633; x=1736106433; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Kgw1X8HZ7pxovhoCwy/lKDtdz5ZAZhJ8DHdGiSPigVc=; b=WBn0UwVDG4quCxeRrRtTxZVevu4KnR/DJdSB11leyXEgXrnmXi9/PUVNDTZcC0a4cL k79j2nfPXHxBJgrBMJLS/6DEi5V3hddaU+gYEaD/2/7mVBZ8VB4VeZwyf77mhtNNEEbx xQVt/RlnDdTlD8zfN5f/WjL/sBtYKgM2uSc+EUg9RvyQGTvUp1wT/O4J+LhowIN8KDHy +IL5tQMlJHqPG9Xtbxsu02/UkaiLpRX94tfR/ZcJaoCEWBpqSHATYfIdOCPuYGZKRp89 J0id8hUrp7TdXh1OzgVlefEwK4vnqAdlRIEe+WIqH06lqd32jPcTP1t7vUexqiju43x6 aAlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501633; x=1736106433; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Kgw1X8HZ7pxovhoCwy/lKDtdz5ZAZhJ8DHdGiSPigVc=; b=eNbsRxAQE/1bvscCvPy17E3dun6jgzmIeeG07Sgps5hyqU7q+odvqWP9FII1TCcLmh JllQaLEqbRtI+hVq4Jxo8qI2uz+9YHaHxk8pnMK2OIa6qrr7KIrm/82v5pQsI73L4F2s 42dO4QNT/pXCq8DBY7ZI64DMcqWisNjtHHK8HoU0dzDMYi57rVPCnudn21XGstVIJ8cz NBlLaPctk7Ein1P7Db7lM0l+6bCCaKfSu20EqU1EbZ6hniYFL8xtL8Z8ZQGU9NP5sZrZ 5z2FZtydpZ43q1/4rycCoXmjHCPHr2iVwIiJlcyfkrO6x+Pf6FE6hbb7zOd8ag6wG/0T w4Bw== X-Forwarded-Encrypted: i=1; AJvYcCXk+DFlD+9BVJ8QnE30j3HZ/Kq2uKMZXTjZj6wjAdgRDDiAImcpwwRB8/Frsj/n0X0nMDNl3bGcGXfn6YQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyrOJT4PhqIeNrkJKdotyIvrGvIzb8iOb14/yKq7zaxDuDGjBe/ hnJ+Jdsnyz3uk+/gQfElmLYaJ/3R86jozK3FW5fJNWhkq3XMp9/kUvB45Q== X-Gm-Gg: ASbGncsOpPN6pMUyLR8CfUfMwJIDbyQzDvQnbJCkKDCraA07jWaEsRhEhyd97OTUdcI I2CvD0rM1BBG19uxAhxxc+H/peFiowbIX01jFMLMZRvviXu/iAfLC8HGtNGJXZbNTgwJovhe3BS 0O6iN76MxlDh/8/zb5axxkXhvG5irw1MgNOAv9w9g/xa4ID2OqaZR8n4VWFuUcFK974xj+RObcx IeQX72S+eqvq0Q6Sh7VLKDImuXPTrXiojQJpaMjL+vcp1GoM8TruAcuGSgLN63R X-Google-Smtp-Source: AGHT+IHE9b5HCbZL6PKTpha18aG096O5nthOBFTFsJOnNpHlxnLhx8r4zDZI5IvQAuCUBEkHJt55Aw== X-Received: by 2002:a05:6102:548f:b0:4b2:ae3e:3ff with SMTP id ada2fe7eead31-4b2cc48a5eemr25121040137.27.1735501632740; Sun, 29 Dec 2024 11:47:12 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:11 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 08/20] alienware-wmi: Add WMI Drivers Date: Sun, 29 Dec 2024 14:44:55 -0500 Message-ID: <20241229194506.8268-10-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add WMI drivers for LEGACY and WMAX devices. This involves moving platform driver and device registration to a helper function, which is now called from the driver's preferred WMI device driver probe. However this is only done if !quirks->thermal because newer WMAX interface doesn't support any of the features exposed by this device. Only one driver is registered on module initialization to prevent registering duplicate platform driver and device. Additionally, create_thermal_profile() now takes wmi_device * instead of platform_device *. Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 195 +++++++++++++++++----- 1 file changed, 155 insertions(+), 40 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index 88d4046ed45f..87a7997579c9 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -15,6 +15,7 @@ #include #include #include +#include =20 #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 "); MODULE_DESCRIPTION("Alienware special feature control"); MODULE_LICENSE("GPL"); -MODULE_ALIAS("wmi:" LEGACY_CONTROL_GUID); -MODULE_ALIAS("wmi:" WMAX_CONTROL_GUID); =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -413,7 +412,10 @@ struct alienfx_priv { u8 lighting_control_state; }; =20 -static struct platform_device *platform_device; +struct alienfx_platdata { + struct wmi_device *wdev; +}; + static struct platform_profile_handler pp_handler; static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_= LAST]; =20 @@ -1072,7 +1074,7 @@ static int thermal_profile_set(struct platform_profil= e_handler *pprof, return wmax_thermal_control(supported_thermal_profiles[profile]); } =20 -static int create_thermal_profile(struct platform_device *platform_device) +static int create_thermal_profile(struct wmi_device *wdev) { enum platform_profile_option profile; enum wmax_thermal_mode mode; @@ -1121,7 +1123,7 @@ static int create_thermal_profile(struct platform_dev= ice *platform_device) pp_handler.profile_get =3D thermal_profile_get; pp_handler.profile_set =3D thermal_profile_set; pp_handler.name =3D "alienware-wmi"; - pp_handler.dev =3D &platform_device->dev; + pp_handler.dev =3D &wdev->dev; =20 return platform_profile_register(&pp_handler); } @@ -1164,6 +1166,10 @@ static int alienfx_probe(struct platform_device *pde= v) =20 static const struct attribute_group *alienfx_groups[] =3D { &zone_attribute_group, + NULL +}; + +static const struct attribute_group *wmax_alienfx_groups[] =3D { &hdmi_attribute_group, &lifier_attribute_group, &deepsleep_attribute_group, @@ -1179,19 +1185,143 @@ static struct platform_driver platform_driver =3D { .probe =3D alienfx_probe, }; =20 -static int __init alienware_wmi_init(void) +static int alienware_alienfx_setup(struct alienfx_platdata *pdata) { + struct platform_device *pdev; int ret; =20 - if (wmi_has_guid(LEGACY_CONTROL_GUID)) - interface =3D LEGACY; - else if (wmi_has_guid(WMAX_CONTROL_GUID)) - interface =3D WMAX; - else { - pr_warn("alienware-wmi: No known WMI GUID found\n"); - return -ENODEV; + ret =3D platform_driver_register(&platform_driver); + if (ret < 0) + return ret; + + pdev =3D platform_device_register_data(NULL, "alienware-wmi", + PLATFORM_DEVID_NONE, pdata, + sizeof(*pdata)); + + if (IS_ERR(pdev)) { + platform_driver_unregister(&platform_driver); + return PTR_ERR(pdev); + } + + dev_set_drvdata(&pdata->wdev->dev, pdev); + + return 0; +} + +static void alienware_alienfx_exit(struct wmi_device *wdev) +{ + struct platform_device *pdev =3D dev_get_drvdata(&wdev->dev); + + platform_device_unregister(pdev); + platform_driver_unregister(&platform_driver); +} + +/* + * Legacy WMI driver + */ +static int legacy_wmi_probe(struct wmi_device *wdev, const void *context) +{ + struct alienfx_platdata pdata =3D { + .wdev =3D wdev, + }; + + return alienware_alienfx_setup(&pdata); +} + +static void legacy_wmi_remove(struct wmi_device *wdev) +{ + alienware_alienfx_exit(wdev); +} + +static struct wmi_device_id alienware_legacy_device_id_table[] =3D { + { LEGACY_CONTROL_GUID, NULL }, + { }, +}; +MODULE_DEVICE_TABLE(wmi, alienware_legacy_device_id_table); + +static struct wmi_driver alienware_legacy_wmi_driver =3D { + .driver =3D { + .name =3D "alienware-wmi-alienfx", + .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, + }, + .id_table =3D alienware_legacy_device_id_table, + .probe =3D legacy_wmi_probe, + .remove =3D legacy_wmi_remove, +}; + +static int __init alienware_legacy_wmi_init(void) +{ + return wmi_driver_register(&alienware_legacy_wmi_driver); +} + +static void __exit alienware_legacy_wmi_exit(void) +{ + wmi_driver_unregister(&alienware_legacy_wmi_driver); +} + +/* + * WMAX WMI driver + */ +static int wmax_wmi_probe(struct wmi_device *wdev, const void *context) +{ + struct alienfx_platdata pdata =3D { + .wdev =3D wdev, + }; + struct platform_device *pdev; + int ret; + + if (quirks->thermal) { + ret =3D create_thermal_profile(wdev); + } else { + ret =3D alienware_alienfx_setup(&pdata); + if (ret < 0) + return ret; + + pdev =3D dev_get_drvdata(&wdev->dev); + ret =3D device_add_groups(&pdev->dev, wmax_alienfx_groups); } =20 + return ret; +} + +static void wmax_wmi_remove(struct wmi_device *wdev) +{ + if (quirks->thermal) + remove_thermal_profile(); + else + alienware_alienfx_exit(wdev); +} + +static struct wmi_device_id alienware_wmax_device_id_table[] =3D { + { WMAX_CONTROL_GUID, NULL }, + { }, +}; +MODULE_DEVICE_TABLE(wmi, alienware_wmax_device_id_table); + +static struct wmi_driver alienware_wmax_wmi_driver =3D { + .driver =3D { + .name =3D "alienware-wmi-wmax", + .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, + }, + .id_table =3D alienware_wmax_device_id_table, + .probe =3D wmax_wmi_probe, + .remove =3D wmax_wmi_remove, +}; + +static int __init alienware_wmax_wmi_init(void) +{ + return wmi_driver_register(&alienware_wmax_wmi_driver); +} + +static void __exit alienware_wmax_wmi_exit(void) +{ + wmi_driver_unregister(&alienware_wmax_wmi_driver); +} + +static int __init alienware_wmi_init(void) +{ + int ret; + dmi_check_system(alienware_quirks); if (quirks =3D=3D NULL) quirks =3D &quirk_unknown; @@ -1206,43 +1336,28 @@ static int __init alienware_wmi_init(void) pr_warn("force_gmode requires platform profile support\n"); } =20 - ret =3D platform_driver_register(&platform_driver); - if (ret) - goto fail_platform_driver; - platform_device =3D platform_device_alloc("alienware-wmi", PLATFORM_DEVID= _NONE); - if (!platform_device) { - ret =3D -ENOMEM; - goto fail_platform_device1; + if (wmi_has_guid(WMAX_CONTROL_GUID)) { + interface =3D WMAX; + ret =3D alienware_wmax_wmi_init(); + } else { + interface =3D LEGACY; + ret =3D alienware_legacy_wmi_init(); } - ret =3D platform_device_add(platform_device); - if (ret) - goto fail_platform_device2; =20 - if (quirks->thermal) { - ret =3D create_thermal_profile(platform_device); - if (ret) - goto fail_prep_thermal_profile; - } + if (ret < 0) + return ret; =20 return 0; - -fail_prep_thermal_profile: - platform_device_del(platform_device); -fail_platform_device2: - platform_device_put(platform_device); -fail_platform_device1: - platform_driver_unregister(&platform_driver); -fail_platform_driver: - return ret; } =20 module_init(alienware_wmi_init); =20 static void __exit alienware_wmi_exit(void) { - remove_thermal_profile(); - platform_device_unregister(platform_device); - platform_driver_unregister(&platform_driver); + if (interface =3D=3D WMAX) + alienware_wmax_wmi_exit(); + else + alienware_legacy_wmi_exit(); } =20 module_exit(alienware_wmi_exit); --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-ua1-f52.google.com (mail-ua1-f52.google.com [209.85.222.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A26C19AD93; Sun, 29 Dec 2024 19:47:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501638; cv=none; b=HTzBhsfYDS6kqw0JeTjLEK98E1aWMu4h0pm9Ei2sc/5oj4f3hmnZULxOGSGHmyoCaVzKVblWEQuV+FtcTCGdpR9n3DFj/F/Ee9KhYvh1KlQNR3HYZN79LmbvapPF3XLR9gv/Rx8KtXT/2KlcMlTXGSRFnKov9YJt876BMKscWSI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501638; c=relaxed/simple; bh=F0GIOFay6841bZiLPqvW3zJBYydvfXlGW2Z4CkXr0xc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RZv2/QP5WUIgziiMrRbkmS75fXXdYr8113e6g6ueS6gNfsr8vvOskTMYVbG+CSSzQPDbeMgFKZAnhRRt8a5H6uJXKFPffMC+FoXF0fNUKDcl2xwNt28BvbM/KHFRPQ6wx2rBZfV+Hf4ePoXU3qBaGR/k/tFFKo+hgymHvFfXrSg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SmQn8Ool; arc=none smtp.client-ip=209.85.222.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SmQn8Ool" Received: by mail-ua1-f52.google.com with SMTP id a1e0cc1a2514c-85c5adbca8eso1664540241.0; Sun, 29 Dec 2024 11:47:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501635; x=1736106435; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZMdeyfMbYq2pU9M+8ipQevqF6stGUQwNAIBw3B/jK6s=; b=SmQn8OoldkJzt75kUH2sFNkff24wcrhr3qwAmhFCVGuEMYo3gpRdixEdXV6EK3oUK6 0GdPQqC75knzfT9wSNS2O+zmyjAiJr/SkVsGu54nGWf0iFY7vjQY20UnBXTrtgEHBjiq pYlJQrxhit4E6IWrlCjqewmkptlRlx6hPdRqKaQc0D1DJs+rvOwqml1Pl7XislU6kopD Z4JgS01mE2qzhn4W0molWRIJkxxt5uK/EjLw1I1k62Vp/WO5+gZ0XLFPJVJSc46d8pmZ T8h2axPY0MbjsG31YfbwFkVOXtBrIXJdkc3tVX+NT3a55xv8f/x25S+AtetZCmZ68WKf heIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501635; x=1736106435; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZMdeyfMbYq2pU9M+8ipQevqF6stGUQwNAIBw3B/jK6s=; b=gaCQQazTCkPFtQDBkUsZns8+f8MAuJn4XAJ9l0z4ymkhK9xvKRipYoU1IhQQG7SgOk il+wVomXaCdjVwKBXeuzsGY5P1GZgrnWvcM8Dc2s4l9l/bZUu4paAHDu/Mld1ARZiCFd r0/WdEn3fqUyeP0ydumvt2ywvDNnch+ROK+4lc6pP9uiJgB57c6aiHM/efRnQ1G4L/Vq ZZV+SZItcKhyoVlyHQobN13yEAMi9A1gQ5crspT8lSlX/rS7jz4OLXBRN/HAmQ1MMayS +mHXGWiF6+wcvP7kXKcg5GBkdas2N2FnxlTG1JjPu7azid+yB4erOYpp8cG+QJf5w8YP RmtQ== X-Forwarded-Encrypted: i=1; AJvYcCXwN9pf9HqD6fs/KfEnicqnVS3Lf7+ctsyLRBcF7NaINSyzvQCEKG1HxIDHZ6cIp8vV4l0NYB6YxkvE26s=@vger.kernel.org X-Gm-Message-State: AOJu0YzLkw9Wz9MbkDaOGwcacv6lqiW5SP/oPU2KzFtQXZsW8ezVbvdJ GW74oDVGHc57dfVS03kE3wLknV94dLZg+4jaV+SzGIdAqGvrrFaejDqGkw== X-Gm-Gg: ASbGncubwwXcdRsSGa8KA2oqdgOCZpRUl3qFHHaJdFidAvQvKPo6vvEPPtQ0Q+8P+PV N0846C08tFj1qgwrm043fHDEBKLlpszuqnhR89LfDhMOMnewjuaIcoJREECVipMf4uEgu+7P308 sOsT0eJiRrCFs13XmkM6WhZt4iG6D/Y2vZB05PVVSK/vgltF6T4vB+f8DOM9SnIEEjWlHYZdWE1 2WALkyo7Sc8BombmqkAQVRmvqbiWAlDZuKEOlZGhiVhFap+dElYi0dapvaNtrbo X-Google-Smtp-Source: AGHT+IFza2B111oHaEYBWKO4fh4RaC9syJ7ai5+McxBAas6h86iBKkJrD+uT4V5CEhzcolVYFqZYyQ== X-Received: by 2002:a05:6102:3909:b0:4b1:1a11:fe3 with SMTP id ada2fe7eead31-4b2cc35856emr23296125137.8.1735501635056; Sun, 29 Dec 2024 11:47:15 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:14 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 09/20] alienware-wmi: Add a state container for thermal control methods Date: Sun, 29 Dec 2024 14:44:56 -0500 Message-ID: <20241229194506.8268-11-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor all thermal control methods to use the newly defined awcc_priv state container instead of global variables. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 66 ++++++++++++++++------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index 87a7997579c9..512384635c4c 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -403,6 +403,12 @@ struct wmax_u32_args { u8 arg3; }; =20 +struct awcc_priv { + struct wmi_device *wdev; + struct platform_profile_handler pp_handler; + enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; +}; + struct alienfx_priv { struct platform_device *pdev; struct quirk_entry *quirks; @@ -416,9 +422,6 @@ struct alienfx_platdata { struct wmi_device *wdev; }; =20 -static struct platform_profile_handler pp_handler; -static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_= LAST]; - static u8 interface; =20 /* @@ -1051,6 +1054,8 @@ static int thermal_profile_get(struct platform_profil= e_handler *pprof, static int thermal_profile_set(struct platform_profile_handler *pprof, enum platform_profile_option profile) { + struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); + if (quirks->gmode) { u32 gmode_status; int ret; @@ -1071,11 +1076,12 @@ static int thermal_profile_set(struct platform_prof= ile_handler *pprof, } } =20 - return wmax_thermal_control(supported_thermal_profiles[profile]); + return wmax_thermal_control(priv->supported_thermal_profiles[profile]); } =20 static int create_thermal_profile(struct wmi_device *wdev) { + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); enum platform_profile_option profile; enum wmax_thermal_mode mode; u8 sys_desc[4]; @@ -1105,33 +1111,55 @@ static int create_thermal_profile(struct wmi_device= *wdev) =20 mode =3D out_data & WMAX_THERMAL_MODE_MASK; profile =3D wmax_mode_to_platform_profile[mode]; - supported_thermal_profiles[profile] =3D out_data; + priv->supported_thermal_profiles[profile] =3D out_data; =20 - set_bit(profile, pp_handler.choices); + set_bit(profile, priv->pp_handler.choices); } =20 - if (bitmap_empty(pp_handler.choices, PLATFORM_PROFILE_LAST)) + if (bitmap_empty(priv->pp_handler.choices, PLATFORM_PROFILE_LAST)) return -ENODEV; =20 if (quirks->gmode) { - supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D + priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D WMAX_THERMAL_MODE_GMODE; =20 - set_bit(PLATFORM_PROFILE_PERFORMANCE, pp_handler.choices); + set_bit(PLATFORM_PROFILE_PERFORMANCE, priv->pp_handler.choices); } =20 - pp_handler.profile_get =3D thermal_profile_get; - pp_handler.profile_set =3D thermal_profile_set; - pp_handler.name =3D "alienware-wmi"; - pp_handler.dev =3D &wdev->dev; + priv->pp_handler.profile_get =3D thermal_profile_get; + priv->pp_handler.profile_set =3D thermal_profile_set; + priv->pp_handler.name =3D "alienware-wmi"; + priv->pp_handler.dev =3D &wdev->dev; =20 - return platform_profile_register(&pp_handler); + return platform_profile_register(&priv->pp_handler); } =20 -static void remove_thermal_profile(void) +static int alienware_awcc_setup(struct wmi_device *wdev) { - if (quirks->thermal) - platform_profile_remove(&pp_handler); + struct awcc_priv *priv; + int ret; + + priv =3D devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + dev_set_drvdata(&wdev->dev, priv); + priv->wdev =3D wdev; + + ret =3D create_thermal_profile(wdev); + if (ret < 0) + return ret; + + return 0; +} + +static void alienware_awcc_exit(struct wmi_device *wdev) +{ + struct awcc_priv *priv; + + priv =3D dev_get_drvdata(&wdev->dev); + + platform_profile_remove(&priv->pp_handler); } =20 /* @@ -1271,7 +1299,7 @@ static int wmax_wmi_probe(struct wmi_device *wdev, co= nst void *context) int ret; =20 if (quirks->thermal) { - ret =3D create_thermal_profile(wdev); + ret =3D alienware_awcc_setup(wdev); } else { ret =3D alienware_alienfx_setup(&pdata); if (ret < 0) @@ -1287,7 +1315,7 @@ static int wmax_wmi_probe(struct wmi_device *wdev, co= nst void *context) static void wmax_wmi_remove(struct wmi_device *wdev) { if (quirks->thermal) - remove_thermal_profile(); + alienware_awcc_exit(wdev); else alienware_alienfx_exit(wdev); } --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f49.google.com (mail-vs1-f49.google.com [209.85.217.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D587419D8BC; Sun, 29 Dec 2024 19:47:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501640; cv=none; b=U7nfMW1QCrHcjHQ/svXXOqikmjlZ3iHSJgIT9lmaG4ZL+EjXs8aDnJDnbOX6wqK/38vGBjLNJyYSmlNJIn8AXo01cBlKL0rfue5UKwZtdfGZdPEWe7t+9BQFKYXnugfpW7Eme1l/Ud0K3cObOCNSRVWnSWcwhEF+egE2laiP5K0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501640; c=relaxed/simple; bh=vNFev5S2G19JKqQqAkG+2Io7Z2WHZ+HQKwUvrJM60ts=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VBK4j2wEqoso7Is9kTcto/Nwqp6vO1iKGOe2nYgh57Eif+BkEID3rCwg1aFfZ9yEiWfYEpG3joN0nXZfDxTKHEvXKzrqLv8tDqnrM4BiScbFzDbEcNoPPwHeAqdIVRSO4a3+oSByfFkaQL42N854DFlALx6bsc+SmlGK66WEGf8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hw0tNgSe; arc=none smtp.client-ip=209.85.217.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hw0tNgSe" Received: by mail-vs1-f49.google.com with SMTP id ada2fe7eead31-4afefc876c6so2654282137.2; Sun, 29 Dec 2024 11:47:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501637; x=1736106437; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8pVW7fGOpFgG5dQIbVa/SdAqGlxBCa7eYWjlROIiHGE=; b=hw0tNgSeme0gtd8oFvwxEXZuWrOfAL851cspgcKJmHfMo3vCu8v/IQ67mr9Us4rkag uATPwSzEz79tbGFPY8MFveI7TUqPAJO76OAUpbCScMlHVSv0Wg4A8i9nbvTJP5M/JfRG ihWTdchgV0yCZWTAzD6AXf/vNjn6H8/u4VpdZ8nm2o4wbYQU0/lMiz8sRw6/W/YGi+o0 m2x6Liycxz01RMnfudmigT3MmFZjZgsW21BqEgSZiCpQrSmQypNAi4klI67UUMd/idIY 8PuqcUlPkB02Ut/ewrLg5oIrRL6Rblea2CQJ2XDYyqHIj7Y9ebPEVPtKzYANcGY+MIUu XlqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501637; x=1736106437; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8pVW7fGOpFgG5dQIbVa/SdAqGlxBCa7eYWjlROIiHGE=; b=nqiIqGEBCmNtwF1xd2n2a6t5i4j0Yq39xeGiqd/WMVms63HCC4T3rbxS+JDEKDmL+Y fhuKw0rlK7AWiNrFeZAKePkqTvFP3WDbTDHm1P4CGnazjNt+tqBOQmnsovAzDQ/Atr9W y3z03uVp1aeZ0wRjNHNC8dbaZ558qgoIh9dq72q8mA6NXaEtrhkQffwVtehnj70QNSdr xxoGD9ebCFWLPiTBZdVrVDEarOFz1zE8eOQfj/o92qYV8pD0mx51nk51qN9xKqMFlrDn mCr/CLRy+5xQ4dTB5iTY3Lrt+vOovwLdIvndLfsJ1aynJYoatOOrd0SmuVglKZEE3fmd dLhQ== X-Forwarded-Encrypted: i=1; AJvYcCVkCiuSG+MwoFWv+uq/bLiROQHymn7gtEkXfbcozz+5CtymooBJcIh5Xop4XIee3Q2jxhypfoLZ4SnfH/c=@vger.kernel.org X-Gm-Message-State: AOJu0YyPP+qxWH7KaTurg05RfsWbG1wySNYblwsTOtwcwoKD6pmQsiIp j0bZQOHxf0w8V/lLvK6WSpjCZe83YES4KwyVTxXmoTJ8xnCNeUTPMxZtBQ== X-Gm-Gg: ASbGncux7BenUzeTcpTt9qqSXifO213p5f2HXirjmmVViiZSlcox2Lf9jCTeep5jO8k axFxf50etvQg1vsJ+ZkKPzbvfU1o9EN6fXuqSLFmRlovYHSTyobSUugc2bjyZ0cNtMqfDMp34Ds 88yE6vyXaddaiWNDwRMFBACNyGmELbKGrR+6+qY+ojrGHo0GAEf99ctqd9PBhIoJD2ZxKFOv79o u3EinhSOX84cUB8h/KHyUTxfJ1mal3DpzCo8SyRU9KrBMUN9UC+PmsheFRfGd9j X-Google-Smtp-Source: AGHT+IFqq4Y5Wxzsds1hu1mYQFvI0DWCp221eW6sW35KgL6Hl4PgVsb/ytd+P+tEoaXB8q4IxNfTpQ== X-Received: by 2002:a05:6102:2c83:b0:4af:eccf:e3b2 with SMTP id ada2fe7eead31-4b2cc493590mr26251017137.25.1735501637566; Sun, 29 Dec 2024 11:47:17 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:16 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 10/20] alienware-wmi: Refactor LED control methods Date: Sun, 29 Dec 2024 14:44:57 -0500 Message-ID: <20241229194506.8268-12-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 non-deprecated WMI methods, let the WMI drivers define upd_led and upd_brightness operations, which completely replace alienware_update_led() and wmax_brightness(). 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. Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 164 ++++++++++++++-------- 1 file changed, 102 insertions(+), 62 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index 512384635c4c..494a3772065c 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -418,12 +418,42 @@ struct alienfx_priv { u8 lighting_control_state; }; =20 +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; }; =20 static u8 interface; =20 +static int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, + void *in_args, size_t in_size, u32 *out_data) +{ + struct acpi_buffer out =3D {ACPI_ALLOCATE_BUFFER, NULL}; + struct acpi_buffer in =3D {in_size, in_args}; + union acpi_object *obj; + acpi_status ret; + + ret =3D wmidev_evaluate_method(wdev, 0, method_id, &in, out_data ? &out := NULL); + if (ACPI_FAILURE(ret)) + return -EIO; + + obj =3D out.pointer; + + if (obj && obj->type =3D=3D ACPI_TYPE_INTEGER) { + *out_data =3D (u32)obj->integer.value; + kfree(out.pointer); + } + + return 0; +} + /* * Helpers used for zone control */ @@ -454,46 +484,6 @@ static int parse_rgb(const char *buf, struct color_pla= tform *colors) /* * Individual RGB zone control */ -static int alienware_update_led(struct alienfx_priv *priv, u8 location) -{ - int method_id; - acpi_status status; - char *guid; - struct acpi_buffer input; - struct legacy_led_args legacy_args; - struct wmax_led_args wmax_basic_args; - if (interface =3D=3D WMAX) { - wmax_basic_args.led_mask =3D 1 << location; - wmax_basic_args.colors =3D priv->colors[location]; - wmax_basic_args.state =3D priv->lighting_control_state; - guid =3D WMAX_CONTROL_GUID; - method_id =3D WMAX_METHOD_ZONE_CONTROL; - - input.length =3D sizeof(wmax_basic_args); - input.pointer =3D &wmax_basic_args; - } else { - legacy_args.colors =3D priv->colors[location]; - legacy_args.brightness =3D priv->global_brightness; - legacy_args.state =3D 0; - if (priv->lighting_control_state =3D=3D LEGACY_BOOTING || - priv->lighting_control_state =3D=3D LEGACY_SUSPEND) { - guid =3D LEGACY_POWER_CONTROL_GUID; - legacy_args.state =3D priv->lighting_control_state; - } else - guid =3D LEGACY_CONTROL_GUID; - method_id =3D location + 1; - - input.length =3D sizeof(legacy_args); - input.pointer =3D &legacy_args; - } - pr_debug("alienware-wmi: guid %s method %d\n", guid, method_id); - - status =3D wmi_evaluate_method(guid, 0, method_id, &input, NULL); - if (ACPI_FAILURE(status)) - pr_err("alienware-wmi: zone set failure: %u\n", status); - return ACPI_FAILURE(status); -} - static ssize_t zone_show(struct device *dev, struct device_attribute *attr, char *buf, u8 location) { @@ -510,13 +500,14 @@ static ssize_t zone_store(struct device *dev, struct = device_attribute *attr, { struct alienfx_priv *priv =3D dev_get_drvdata(dev); struct color_platform *colors =3D &priv->colors[location]; + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); int ret; =20 ret =3D parse_rgb(buf, colors); if (ret) return ret; =20 - ret =3D alienware_update_led(priv, location); + ret =3D pdata->ops.upd_led(priv, pdata->wdev, location); =20 return ret ? ret : count; } @@ -649,36 +640,17 @@ static struct attribute_group zone_attribute_group = =3D { /* * LED Brightness (Global) */ -static int wmax_brightness(int brightness) -{ - acpi_status status; - struct acpi_buffer input; - struct wmax_brightness_args args =3D { - .led_mask =3D 0xFF, - .percentage =3D brightness, - }; - input.length =3D sizeof(args); - input.pointer =3D &args; - status =3D wmi_evaluate_method(WMAX_CONTROL_GUID, 0, - WMAX_METHOD_BRIGHTNESS, &input, NULL); - if (ACPI_FAILURE(status)) - pr_err("alienware-wmi: brightness set failure: %u\n", status); - return ACPI_FAILURE(status); -} - static void global_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) { struct alienfx_priv *priv =3D container_of(led_cdev, struct alienfx_priv, global_led); + struct alienfx_platdata *pdata =3D dev_get_platdata(&priv->pdev->dev); int ret; =20 priv->global_brightness =3D brightness; =20 - if (interface =3D=3D WMAX) - ret =3D wmax_brightness(brightness); - else - ret =3D alienware_update_led(priv, 0); + ret =3D pdata->ops.upd_brightness(priv, pdata->wdev, brightness); if (ret) pr_err("LED brightness update failed\n"); } @@ -1247,10 +1219,49 @@ static void alienware_alienfx_exit(struct wmi_devic= e *wdev) /* * Legacy WMI driver */ +static int legacy_wmi_update_led(struct alienfx_priv *priv, + struct wmi_device *wdev, u8 location) +{ + struct legacy_led_args legacy_args =3D { + .colors =3D priv->colors[location], + .brightness =3D priv->global_brightness, + .state =3D 0, + }; + struct acpi_buffer input; + acpi_status status; + + if (legacy_args.state !=3D LEGACY_RUNNING) { + legacy_args.state =3D priv->lighting_control_state; + + input.length =3D sizeof(legacy_args); + input.pointer =3D &legacy_args; + + status =3D wmi_evaluate_method(LEGACY_POWER_CONTROL_GUID, 0, + location + 1, &input, NULL); + if (ACPI_FAILURE(status)) + return -EIO; + + return 0; + } + + return alienware_wmi_command(wdev, location + 1, &legacy_args, + sizeof(legacy_args), NULL); +} + +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) { struct alienfx_platdata pdata =3D { .wdev =3D wdev, + .ops =3D { + .upd_led =3D legacy_wmi_update_led, + .upd_brightness =3D legacy_wmi_update_brightness, + }, }; =20 return alienware_alienfx_setup(&pdata); @@ -1290,10 +1301,39 @@ static void __exit alienware_legacy_wmi_exit(void) /* * WMAX WMI driver */ +static int wmax_wmi_update_led(struct alienfx_priv *priv, + struct wmi_device *wdev, u8 location) +{ + struct wmax_led_args in_args =3D { + .led_mask =3D 1 << location, + .colors =3D priv->colors[location], + .state =3D priv->lighting_control_state, + }; + + return alienware_wmi_command(wdev, WMAX_METHOD_ZONE_CONTROL, &in_args, + sizeof(in_args), NULL); +} + +static int wmax_wmi_update_brightness(struct alienfx_priv *priv, + struct wmi_device *wdev, u8 brightness) +{ + struct wmax_brightness_args in_args =3D { + .led_mask =3D 0xFF, + .percentage =3D brightness, + }; + + return alienware_wmi_command(wdev, WMAX_METHOD_BRIGHTNESS, &in_args, + sizeof(in_args), NULL); +} + static int wmax_wmi_probe(struct wmi_device *wdev, const void *context) { struct alienfx_platdata pdata =3D { .wdev =3D wdev, + .ops =3D { + .upd_led =3D wmax_wmi_update_led, + .upd_brightness =3D wmax_wmi_update_brightness, + }, }; struct platform_device *pdev; int ret; --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f46.google.com (mail-vs1-f46.google.com [209.85.217.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F3BB51991CA; Sun, 29 Dec 2024 19:47:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501643; cv=none; b=Bhk3Y2bV0ndRMZ3vGTsiKI0YvA3Wi+220gZ/xnSoMKgvAbatG4/jsDscvVVPFPzDVLkhj2uJvGbtCJJnb5KUtGkEDOOXiaztRq3tXSZwqiqHW9E/YMJGHQRKXfgunaBzmr5H7hJfSKxmjyLrH8kcZk96kXnZ7NnltGqwo+L4m6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501643; c=relaxed/simple; bh=Fo/reKXQaWFod91NVa6ySLLULPChx1Z5jaBt1CdcDbk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sgSL/x5YMa75l6Vcn3sXMc8kJjOr0idu+lAXslCiDd2Ext6YNK8CGqQvVHTvYNXVVpXJ7t3Rcw+I/c7ugVQumMf1DJ/U6BDEkx3RgkKYS50sJ5A8tWkYRrvSgAbBMe/LLmdA7h7rio33fWUN9QZiYOODhs+NvWL6WaqKPt2KZng= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bGdQttle; arc=none smtp.client-ip=209.85.217.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bGdQttle" Received: by mail-vs1-f46.google.com with SMTP id ada2fe7eead31-4afdfefc6c1so2710640137.0; Sun, 29 Dec 2024 11:47:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501640; x=1736106440; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=26zRb9SO4oyO1l/IKWE69oOuzufFPeKoUfwe5RGXw+c=; b=bGdQttlePwgx0L50qE6n3F2bPlAqKVwYIR+ZJ0sSgMq+3bbqV5rfIMDNxYhb6nfDmk NvpSgFTzG/mfJsai+E9wlX3uAMp4/DGs0Vdav9MviinoULXZB2ZFmWS9bFEkl9Oi7t2Q FshMn9m3oXjn9HdeB650HfxYkiIxwacmBRuJwA5mN7fKJOkS12ux2W6sLXLOcIW0KkcX 3P8o3l78mQpMkivYXyxGPXdA5ZotYpXLGzAxZ/zMBtCob8W0/hyYG55bVM8a1FwchJ9v RbhSJsi0kvyujRmg0m+eCCL4okDumefXyLNoR5ubL0Z0AlyP/TF7j3ssGX0DvC8uJKk2 MHyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501640; x=1736106440; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=26zRb9SO4oyO1l/IKWE69oOuzufFPeKoUfwe5RGXw+c=; b=pS4Cey2n4VDsnccxzeCrSiuquJSkf/rhFcR1JqejPeKLVfqDWWLQdRiCS2BPHvI0DV INzewezgsMfLP7ORjX3VCrlzHFSF1w6eH6wKgH5A7NlB+M2MhaKeCpE+SYDqOysCEAhN pUFyzw1EkBijbKQ+mwVqhF2HzMS+VmpeyEZd8tmusYxRhdybYDMieN0AfJ8gY3qFZESd mjguJQxuiMt6Hcu+34py5PTx18z19+Y3iDYBZ7ulj4ueMVie0x/+5/K2aY6Z0MioB4ga q60AY9aZHQPOJB/DBszBidswmdNLor/M+m6f29C+nTO9CgOTvvwGvbDiVCCkAm0sfLJk MzXw== X-Forwarded-Encrypted: i=1; AJvYcCXHOrxNY6coOmNUH9Za5UcygD2eX8aWrE+IlSQwCrK9PoNwDU5FdMym7oexxGOKj/sMOUDR+jrkEf/mWNU=@vger.kernel.org X-Gm-Message-State: AOJu0YworbGfi4PCHtXcZTUPNIHm0KIU7Gt50eaRFocO22VRCQGlg5QR LOhv+PfkG76IMCwhKxXZjtbY7JHuhDzWP8H9b85LBTOTATWYOltYsWKpsg== X-Gm-Gg: ASbGncv9EdnUlFsG5MldiQ4491ZcsD5e0bb9Gci7kztyDlnHdXeMGCzUXLbqU9rc2Gy aQXKQwS7MzowTs9dPW8FIDMh3YUjWsWWkYgeE3V+jOKp0pQSUgin1pc5nweWmpYcVyGfkxQSqnB g6q4BKPOMhKM8mlmEBSs+BCjccjG7rasXeOAc+GcPtP0dEe4OuyGIO5Pm6no73u3bpgaNAM+sKn /D5aht/VoanG1SVQL4adlrMAZo4nyQsuTIGNTOQgpvgiFXZN55e6XOy5O1shrLv X-Google-Smtp-Source: AGHT+IGsM4O1ZX3d6DnQ3WrM03OEO1Rt7EAi3m7bqHsSS0cInrEVIOI4yDmKfnnKOpcXIGgrYw2YbA== X-Received: by 2002:a05:6102:26cd:b0:4b1:2010:5cd7 with SMTP id ada2fe7eead31-4b2cc3511eemr27023871137.8.1735501640224; Sun, 29 Dec 2024 11:47:20 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:19 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 11/20] alienware-wmi: Refactor hdmi, amplifier, deepslp methods Date: Sun, 29 Dec 2024 14:44:58 -0500 Message-ID: <20241229194506.8268-13-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor show/store methods for hdmi, amplifier, deepslp sysfs groups to use alienware_wmi_command() instead of alienware_wmax_command() which uses deprecated WMI methods. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 85 +++++++++++++---------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index 494a3772065c..ea276d32cf14 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -698,51 +698,58 @@ static acpi_status alienware_wmax_command(void *in_ar= gs, size_t in_size, static ssize_t cable_show(struct device *dev, struct device_attribute *att= r, char *buf) { + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); struct wmax_basic_args in_args =3D { .arg =3D 0, }; - acpi_status status; u32 out_data; - status =3D - alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_HDMI_CABLE, &out_data); - if (ACPI_SUCCESS(status)) { + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_CABLE, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[unconnected] connected unknown\n"); else if (out_data =3D=3D 1) return sysfs_emit(buf, "unconnected [connected] unknown\n"); } - pr_err("alienware-wmi: unknown HDMI cable status: %d\n", status); + + pr_err("alienware-wmi: unknown HDMI cable status: %d\n", ret); return sysfs_emit(buf, "unconnected connected [unknown]\n"); } =20 static ssize_t source_show(struct device *dev, struct device_attribute *at= tr, char *buf) { + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); struct wmax_basic_args in_args =3D { .arg =3D 0, }; - acpi_status status; u32 out_data; - status =3D - alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_HDMI_STATUS, &out_data); + int ret; =20 - if (ACPI_SUCCESS(status)) { + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_STATUS, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { if (out_data =3D=3D 1) return sysfs_emit(buf, "[input] gpu unknown\n"); else if (out_data =3D=3D 2) return sysfs_emit(buf, "input [gpu] unknown\n"); } - pr_err("alienware-wmi: unknown HDMI source status: %u\n", status); + + pr_err("alienware-wmi: unknown HDMI source status: %u\n", ret); return sysfs_emit(buf, "input gpu [unknown]\n"); } =20 static ssize_t source_store(struct device *dev, struct device_attribute *a= ttr, const char *buf, size_t count) { + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); struct wmax_basic_args args; - acpi_status status; + int ret; + if (strcmp(buf, "gpu\n") =3D=3D 0) args.arg =3D 1; else if (strcmp(buf, "input\n") =3D=3D 0) @@ -751,12 +758,12 @@ static ssize_t source_store(struct device *dev, struc= t device_attribute *attr, args.arg =3D 3; pr_debug("alienware-wmi: setting hdmi to %d : %s", args.arg, buf); =20 - status =3D alienware_wmax_command(&args, sizeof(args), - WMAX_METHOD_HDMI_SOURCE, NULL); + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_SOURCE, &args, + sizeof(args), NULL); + + if (ret < 0) + pr_err("alienware-wmi: HDMI toggle failed: results: %u\n", ret); =20 - if (ACPI_FAILURE(status)) - pr_err("alienware-wmi: HDMI toggle failed: results: %u\n", - status); return count; } =20 @@ -791,21 +798,24 @@ static const struct attribute_group hdmi_attribute_gr= oup =3D { static ssize_t status_show(struct device *dev, struct device_attribute *at= tr, char *buf) { + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); struct wmax_basic_args in_args =3D { .arg =3D 0, }; - acpi_status status; u32 out_data; - status =3D - alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_AMPLIFIER_CABLE, &out_data); - if (ACPI_SUCCESS(status)) { + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_AMPLIFIER_CABLE, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[unconnected] connected unknown\n"); else if (out_data =3D=3D 1) return sysfs_emit(buf, "unconnected [connected] unknown\n"); } - pr_err("alienware-wmi: unknown amplifier cable status: %d\n", status); + + pr_err("alienware-wmi: unknown amplifier cable status: %d\n", ret); return sysfs_emit(buf, "unconnected connected [unknown]\n"); } =20 @@ -837,14 +847,17 @@ static const struct attribute_group amplifier_attribu= te_group =3D { static ssize_t deepsleep_show(struct device *dev, struct device_attribute = *attr, char *buf) { + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); struct wmax_basic_args in_args =3D { .arg =3D 0, }; - acpi_status status; u32 out_data; - status =3D alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_DEEP_SLEEP_STATUS, &out_data); - if (ACPI_SUCCESS(status)) { + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_DEEP_SLEEP_STATUS, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[disabled] s5 s5_s4\n"); else if (out_data =3D=3D 1) @@ -852,15 +865,17 @@ static ssize_t deepsleep_show(struct device *dev, str= uct device_attribute *attr, else if (out_data =3D=3D 2) return sysfs_emit(buf, "disabled s5 [s5_s4]\n"); } - pr_err("alienware-wmi: unknown deep sleep status: %d\n", status); + + pr_err("alienware-wmi: unknown deep sleep status: %d\n", ret); return sysfs_emit(buf, "disabled s5 s5_s4 [unknown]\n"); } =20 static ssize_t deepsleep_store(struct device *dev, struct device_attribute= *attr, const char *buf, size_t count) { + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); struct wmax_basic_args args; - acpi_status status; + int ret; =20 if (strcmp(buf, "disabled\n") =3D=3D 0) args.arg =3D 0; @@ -870,12 +885,12 @@ static ssize_t deepsleep_store(struct device *dev, st= ruct device_attribute *attr args.arg =3D 2; pr_debug("alienware-wmi: setting deep sleep to %d : %s", args.arg, buf); =20 - status =3D alienware_wmax_command(&args, sizeof(args), - WMAX_METHOD_DEEP_SLEEP_CONTROL, NULL); + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_DEEP_SLEEP_CONTROL, + &args, sizeof(args), NULL); + + if (!ret) + pr_err("alienware-wmi: deep sleep control failed: results: %u\n", ret); =20 - if (ACPI_FAILURE(status)) - pr_err("alienware-wmi: deep sleep control failed: results: %u\n", - status); return count; } =20 --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vk1-f171.google.com (mail-vk1-f171.google.com [209.85.221.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C82A19E833; Sun, 29 Dec 2024 19:47:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501645; cv=none; b=FwFLlF8XspU10ZW4DsawzUamqhs1QZ6BxLm/VwclGodfxkjbdPcgAu5Fkp4H5GG72sPPmRH93HV+RmT1JlwEAS5UFeNxBqfsjn25x+sgHpi0MmeL1nwpO7ZUSaVJDbrPtXFpXeIs4Kq76O9v7VCD46D1Vnb94nTV3D3Eio+NzSY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501645; c=relaxed/simple; bh=V99hW2bIJnjfPrm30/SWGyzuc7CgIWz2rkhYEhTuJF8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cKeghRzvQDOizqh432wsMXtwEbO+Y5Zc0b9w2GIGmvbEY/QYLyqVuWiS/8M85tpBTw7dY56uw406Vw2vLZ3Mh6ZW54u+EIEUGVNtO7gbiAtrQhfF7URXFL+xFfDH5nKBxAvaWbUS9mdJv9Wh9YLTaTPEy+FngW7QbniU2QL0bFs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dLSVsnkZ; arc=none smtp.client-ip=209.85.221.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dLSVsnkZ" Received: by mail-vk1-f171.google.com with SMTP id 71dfb90a1353d-51882748165so2848487e0c.3; Sun, 29 Dec 2024 11:47:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501643; x=1736106443; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TskFiLQdik3rOnbUibyKIbU6ybNOrpaOQ7Wsart79hQ=; b=dLSVsnkZTeoDmJjFZNk0QbV3mMRzt0eX+jOltbFmSxiwbxGubXOYgtgx7VhONvzsdQ g0Ms8h6R2BBUsDAP1a2TX+EsJc/J/+P0/U3YQCARlYk88Wxv+1QnyZqKmhx1sMDwSG5y jpcPmkkhrflZqJHIJ3wofiA8B4Pp3w+D4Cpw/oHSrOvz2mWFC7nIdiklUGJY9yjVqTjA WAMckX9imn5ERmHWZK7louupbOwSF6L0AebB6rDSqgyO1YOnj+ereEfGx8I2H8CQD34T QecVy75HEs67YbGVzljmba6B+nH/LgTrPiWDw7idj5jA91Q/e4B9HMyiZFuMcWu4njvn LhWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501643; x=1736106443; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TskFiLQdik3rOnbUibyKIbU6ybNOrpaOQ7Wsart79hQ=; b=Wc0P9Fi+ebUvU2YogOootZD7QnZF31amd3NqASYHX7hXW+K1CSyz6YJZfRnt6HGQfd 0cb+8fRAqPnE37//qHa7I0V1eafNwB/MAhMEtlj4qiVRrIQLD+O0NKWkXTrv/5dp916v UtoxTMsEOEoixSGDJBbqkt+OqZxrYmrVV32lWErV1DWnPkO4CLgLENzaD5TS+ImW0cG1 UqqGHLptmlqdr38LSYmcvaPH2CMFSrRVesOZ9lKLPXsUacFTKqpvi4VQOaCZrU/QQBoG ujj7jM35zmJwEqCRrS5NkHlEzyuJRyYAHvIaD0KeVjKWf+obFje19o7bJSYTyd7nFR9P nobQ== X-Forwarded-Encrypted: i=1; AJvYcCVewFIh8JO6HTiaxcFtNTCHF6Fp6JVyAnZDprWJI+BOWwge6qbPRcoSey4shNL1W2zD0oFUZ9kTM5t1Rgg=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/g0VEuZfVFb4aTyieXZqOsTqgqxkvUGNUO8r9f3QU6rarl6Du JxHksBfBqpIOXHvY/VvzAOwx9LP1EKl7hhcgIJqx9ELKLso/Wzz7YK77uA== X-Gm-Gg: ASbGncsH3dPwiXhPGSSXW4AwLWJH2FtRvFWHi6lups+OKQIX+zlY4MmVD96FoOTNLG4 H3fhoOTdW5WweUblfCee+EqPI9LGnAKxaRy9O1iwfO232CDUG1YO4dtOqfbuA139jO2iA3sfKGI SCLQoeCFWLSCKmGovOeIOLmBbXygfYOjUNVMgbTc07v5cKZGNIVEu8XbnVSATaKHp+cUko/wIHH QHBi86cJNybl6k0fD4vG8Z7SA0+tY965ok/1iByhbkov6TiTL+Epu9AeYumOEfc X-Google-Smtp-Source: AGHT+IFa3EHMZhsyTd0ZQsmXp7GofIg07IVPO7aN/D31RVhEa7jKRMgl/gM+Pwe88iWaXbVQNiE1eQ== X-Received: by 2002:a05:6102:3ed4:b0:4af:a98a:bd67 with SMTP id ada2fe7eead31-4b2cc313aaamr29436864137.3.1735501642828; Sun, 29 Dec 2024 11:47:22 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:22 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 12/20] alienware-wmi: Refactor thermal control methods Date: Sun, 29 Dec 2024 14:44:59 -0500 Message-ID: <20241229194506.8268-14-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor thermal control methods to use alienware_wmi_command() instead of alienware_wmax_command(). Drop alienware_wmax_command() as there is no more users left. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 98 ++++++++--------------- 1 file changed, 32 insertions(+), 66 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index ea276d32cf14..f80e7d488b9d 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -663,34 +663,6 @@ static enum led_brightness global_led_get(struct led_c= lassdev *led_cdev) return priv->global_brightness; } =20 -static acpi_status alienware_wmax_command(void *in_args, size_t in_size, - u32 command, u32 *out_data) -{ - acpi_status status; - union acpi_object *obj; - struct acpi_buffer input; - struct acpi_buffer output; - - input.length =3D in_size; - input.pointer =3D in_args; - if (out_data) { - output.length =3D ACPI_ALLOCATE_BUFFER; - output.pointer =3D NULL; - status =3D wmi_evaluate_method(WMAX_CONTROL_GUID, 0, - command, &input, &output); - if (ACPI_SUCCESS(status)) { - obj =3D (union acpi_object *)output.pointer; - if (obj && obj->type =3D=3D ACPI_TYPE_INTEGER) - *out_data =3D (u32)obj->integer.value; - } - kfree(output.pointer); - } else { - status =3D wmi_evaluate_method(WMAX_CONTROL_GUID, 0, - command, &input, NULL); - } - return status; -} - /* * The HDMI mux sysfs node indicates the status of the HDMI input mux. * It can toggle between standard system GPU output and HDMI input. @@ -942,7 +914,8 @@ static bool is_wmax_thermal_code(u32 code) return false; } =20 -static int wmax_thermal_information(u8 operation, u8 arg, u32 *out_data) +static int wmax_thermal_information(struct wmi_device *wdev, u8 operation, + u8 arg, u32 *out_data) { struct wmax_u32_args in_args =3D { .operation =3D operation, @@ -950,14 +923,12 @@ static int wmax_thermal_information(u8 operation, u8 = arg, u32 *out_data) .arg2 =3D 0, .arg3 =3D 0, }; - acpi_status status; - - status =3D alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_THERMAL_INFORMATION, - out_data); + int ret; =20 - if (ACPI_FAILURE(status)) - return -EIO; + ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_INFORMATION, + &in_args, sizeof(in_args), out_data); + if (ret < 0) + return ret; =20 if (*out_data =3D=3D WMAX_FAILURE_CODE) return -EBADRQC; @@ -965,7 +936,7 @@ static int wmax_thermal_information(u8 operation, u8 ar= g, u32 *out_data) return 0; } =20 -static int wmax_thermal_control(u8 profile) +static int wmax_thermal_control(struct wmi_device *wdev, u8 profile) { struct wmax_u32_args in_args =3D { .operation =3D WMAX_OPERATION_ACTIVATE_PROFILE, @@ -973,15 +944,13 @@ static int wmax_thermal_control(u8 profile) .arg2 =3D 0, .arg3 =3D 0, }; - acpi_status status; u32 out_data; + int ret; =20 - status =3D alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_THERMAL_CONTROL, - &out_data); - - if (ACPI_FAILURE(status)) - return -EIO; + ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_CONTROL, + &in_args, sizeof(in_args), &out_data); + if (ret) + return ret; =20 if (out_data =3D=3D WMAX_FAILURE_CODE) return -EBADRQC; @@ -989,7 +958,8 @@ static int wmax_thermal_control(u8 profile) return 0; } =20 -static int wmax_game_shift_status(u8 operation, u32 *out_data) +static int wmax_game_shift_status(struct wmi_device *wdev, u8 operation, + u32 *out_data) { struct wmax_u32_args in_args =3D { .operation =3D operation, @@ -997,14 +967,13 @@ static int wmax_game_shift_status(u8 operation, u32 *= out_data) .arg2 =3D 0, .arg3 =3D 0, }; - acpi_status status; + int ret; =20 - status =3D alienware_wmax_command(&in_args, sizeof(in_args), - WMAX_METHOD_GAME_SHIFT_STATUS, - out_data); + ret =3D alienware_wmi_command(wdev, WMAX_METHOD_GAME_SHIFT_STATUS, + &in_args, sizeof(in_args), out_data); =20 - if (ACPI_FAILURE(status)) - return -EIO; + if (ret < 0) + return ret; =20 if (*out_data =3D=3D WMAX_FAILURE_CODE) return -EOPNOTSUPP; @@ -1015,10 +984,11 @@ static int wmax_game_shift_status(u8 operation, u32 = *out_data) static int thermal_profile_get(struct platform_profile_handler *pprof, enum platform_profile_option *profile) { + struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); u32 out_data; int ret; =20 - ret =3D wmax_thermal_information(WMAX_OPERATION_CURRENT_PROFILE, + ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_CURRENT_PROFI= LE, 0, &out_data); =20 if (ret < 0) @@ -1047,7 +1017,8 @@ static int thermal_profile_set(struct platform_profil= e_handler *pprof, u32 gmode_status; int ret; =20 - ret =3D wmax_game_shift_status(WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + ret =3D wmax_game_shift_status(priv->wdev, + WMAX_OPERATION_GET_GAME_SHIFT_STATUS, &gmode_status); =20 if (ret < 0) @@ -1055,7 +1026,8 @@ static int thermal_profile_set(struct platform_profil= e_handler *pprof, =20 if ((profile =3D=3D PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || (profile !=3D PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { - ret =3D wmax_game_shift_status(WMAX_OPERATION_TOGGLE_GAME_SHIFT, + ret =3D wmax_game_shift_status(priv->wdev, + WMAX_OPERATION_TOGGLE_GAME_SHIFT, &gmode_status); =20 if (ret < 0) @@ -1063,7 +1035,8 @@ static int thermal_profile_set(struct platform_profil= e_handler *pprof, } } =20 - return wmax_thermal_control(priv->supported_thermal_profiles[profile]); + return wmax_thermal_control(priv->wdev, + priv->supported_thermal_profiles[profile]); } =20 static int create_thermal_profile(struct wmi_device *wdev) @@ -1076,7 +1049,7 @@ static int create_thermal_profile(struct wmi_device *= wdev) u32 out_data; int ret; =20 - ret =3D wmax_thermal_information(WMAX_OPERATION_SYS_DESCRIPTION, + ret =3D wmax_thermal_information(wdev, WMAX_OPERATION_SYS_DESCRIPTION, 0, (u32 *) &sys_desc); if (ret < 0) return ret; @@ -1084,7 +1057,7 @@ static int create_thermal_profile(struct wmi_device *= wdev) first_mode =3D sys_desc[0] + sys_desc[1]; =20 for (u32 i =3D 0; i < sys_desc[3]; i++) { - ret =3D wmax_thermal_information(WMAX_OPERATION_LIST_IDS, + ret =3D wmax_thermal_information(wdev, WMAX_OPERATION_LIST_IDS, i + first_mode, &out_data); =20 if (ret =3D=3D -EIO) @@ -1124,7 +1097,6 @@ static int create_thermal_profile(struct wmi_device *= wdev) static int alienware_awcc_setup(struct wmi_device *wdev) { struct awcc_priv *priv; - int ret; =20 priv =3D devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) @@ -1133,18 +1105,12 @@ static int alienware_awcc_setup(struct wmi_device *= wdev) dev_set_drvdata(&wdev->dev, priv); priv->wdev =3D wdev; =20 - ret =3D create_thermal_profile(wdev); - if (ret < 0) - return ret; - - return 0; + return create_thermal_profile(wdev); } =20 static void alienware_awcc_exit(struct wmi_device *wdev) { - struct awcc_priv *priv; - - priv =3D dev_get_drvdata(&wdev->dev); + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); =20 platform_profile_remove(&priv->pp_handler); } --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f43.google.com (mail-vs1-f43.google.com [209.85.217.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9FE419E99A; Sun, 29 Dec 2024 19:47:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501649; cv=none; b=GvJd8vVxUbRRgNLjxdP3IBPNBjuLXLZHgiybF5wf8gzntXOy28OEYN8JrJ9DMZEkc7bKfhJhBIvfjYWlwK9esezJHt1MjbMhsKrx/lt/0SudTlj3QEb3d06K0mAJbA7X1T63zOpcwynU/fXifuYg8Ecyxt6sj6r2Esm/+6vUnaM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501649; c=relaxed/simple; bh=isbCBWsER+/P8/JGRxSV7TeNn/5DPpTS/sBZWC8Ctzw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L19Nd/Wp5F9nT/aJedu8XIxTVcmP1OCSO9WrgoipGWwMqRJZCEXi8SGUasQ9FL18mH143PYdsjf8QmVgEevvuXZLgF6IIQle9nbj65kviiLLcpOmObLHjXL54USKztYoQHZS5VXaGfCi0VVJrGP8PL7nhknR7+N7Pv+rKNVjVVA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JLll3G/c; arc=none smtp.client-ip=209.85.217.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JLll3G/c" Received: by mail-vs1-f43.google.com with SMTP id ada2fe7eead31-4aff5b3845eso3039942137.2; Sun, 29 Dec 2024 11:47:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501645; x=1736106445; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=N9i+jhh7wTuhTUeqzzh8ME3rhMPtSRPIGx41BiGVKyI=; b=JLll3G/cRtQn4IvOU9fzREZe9g5SAzhd/jSg7rDHFxGmIkoiObV0x1MHoQcQDBCqtK RjCu5Kjn17ZBarMJoHtMbiBhF//nGsVyiqhkXFO0TVfsmyf+Jivsc88S/lOQSRtYaL/d kHFoWHxYXcCAxVXUB4V62ciLFuFL56zZ6pPYb7i/45y6vFPMAGcjbsrHKJmCm2mv7wIX Sye8Zm/KM8D277E7U3KDxsWrp6veHKXR7paWnnvCQ713UvrMp+4EsGGjdIiRaAnk6Zkr w0MXe0OPRRgstsAjnFbrzlAyUgrGkgfF2pNEYmKrs/J9SymSIIu6vwNTQ59KKwUMjGV2 dj9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501645; x=1736106445; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=N9i+jhh7wTuhTUeqzzh8ME3rhMPtSRPIGx41BiGVKyI=; b=oCXgnyZxuZwqMW0zA7z4YuW/xMjIhU14n/Nf85zc4wibmwTbaluV2bmqCnU2TAMkX0 JeSHH4BHGqHxDfVfWdKImWKe5W+NKWBoMI4m23zqECUugyt29okWdgiS6PRK4ir3DUWt /IZTsjB3U6qGQn1YTInFkIJckJYPnHxSG9BMgmX6PF/RBZpp1F6s15tBJv2Vd5k7bTTN Gx5DIto2A6XH8AzHFUf/YG3RV2j678MokGGQ//wcMtIGIUh1+XX8IJG16h1zDRwUIllr WtVozOhxA++a0vIa3UdeD0OF5Wedwxc+0oVVzOkyg8uB3pm9ip5NtexWWAfJeackACaS 7Tyw== X-Forwarded-Encrypted: i=1; AJvYcCXm26cX4ClHc88O8aWuVl6fRc/U38faWmbYWw2Pbv1k1Ju0Ov9AH4ZqkCIbQROG3TTLlEh1Y/+AL124v5I=@vger.kernel.org X-Gm-Message-State: AOJu0YzMKNI1iWZIzQJcsmMXASDRuGil7UQYw81RuyQK1BeBVpWOalBZ ZpuhpZhrGBwnPZ4wD+IsGkQC8JObyDV4jy+8gUS/UcPiBjlWKGY8yfbCjw== X-Gm-Gg: ASbGncve9nGUOqVrWiFq4G7Gi7pFGEDWi4GITMvApQYeVtR1mmuF4yjg2mAKw1R9zCc gnzXrE27pPmbXolAA6aOH7TF+yg54HbYKYp9X6NXRj+kBo7xpb4C62ESoAoMbo+rGojQ8nvNFiB obYwtI+FnIZ5dPWX2mPTlBI0Fy3oU4uGv3xw7AQpLQPnmLGqzzGu93lj1CtArMfczkPNy1rh5ze LEQW1VSS09Vv/vgWpUY9OcN0nVnqD0LAmzjwhLHLOecKFai+L0+ThMzndii4rI6 X-Google-Smtp-Source: AGHT+IEDWHtxqbzdyTgwJgL47maMweBUEnSeYdiz1HStJOVWDr8TsNNMzo84kiMyOOkYDmRjKg+Hsg== X-Received: by 2002:a05:6102:3751:b0:4b2:73f7:5adf with SMTP id ada2fe7eead31-4b2cc351714mr26181888137.9.1735501645417; Sun, 29 Dec 2024 11:47:25 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:24 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 13/20] alienware-wmi: Split DMI table Date: Sun, 29 Dec 2024 14:45:00 -0500 Message-ID: <20241229194506.8268-15-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Split thermal features into a new DMI table to support upcoming file split. While at it rename quirk_entry -> alienfx_features and change hdmi_mux, amplifier and deepslp types to bool, because they are already being implicitly used as bools. Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi.c | 319 ++++++++++------------ 1 file changed, 147 insertions(+), 172 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index f80e7d488b9d..b9daf22efdbe 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -113,97 +113,63 @@ static const enum platform_profile_option wmax_mode_t= o_platform_profile[THERMAL_ [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, }; =20 -struct quirk_entry { +struct alienfx_quirks { u8 num_zones; - u8 hdmi_mux; - u8 amplifier; - u8 deepslp; - bool thermal; - bool gmode; + bool hdmi_mux; + bool amplifier; + bool deepslp; }; =20 -static struct quirk_entry *quirks; +static struct alienfx_quirks *quirks; =20 =20 -static struct quirk_entry quirk_inspiron5675 =3D { +static struct alienfx_quirks quirk_inspiron5675 =3D { .num_zones =3D 2, - .hdmi_mux =3D 0, - .amplifier =3D 0, - .deepslp =3D 0, - .thermal =3D false, - .gmode =3D false, + .hdmi_mux =3D false, + .amplifier =3D false, + .deepslp =3D false, }; =20 -static struct quirk_entry quirk_unknown =3D { +static struct alienfx_quirks quirk_unknown =3D { .num_zones =3D 2, - .hdmi_mux =3D 0, - .amplifier =3D 0, - .deepslp =3D 0, - .thermal =3D false, - .gmode =3D false, + .hdmi_mux =3D false, + .amplifier =3D false, + .deepslp =3D false, }; =20 -static struct quirk_entry quirk_x51_r1_r2 =3D { +static struct alienfx_quirks quirk_x51_r1_r2 =3D { .num_zones =3D 3, - .hdmi_mux =3D 0, - .amplifier =3D 0, - .deepslp =3D 0, - .thermal =3D false, - .gmode =3D false, + .hdmi_mux =3D false, + .amplifier =3D false, + .deepslp =3D false, }; =20 -static struct quirk_entry quirk_x51_r3 =3D { +static struct alienfx_quirks quirk_x51_r3 =3D { .num_zones =3D 4, - .hdmi_mux =3D 0, - .amplifier =3D 1, - .deepslp =3D 0, - .thermal =3D false, - .gmode =3D false, -}; - -static struct quirk_entry quirk_asm100 =3D { - .num_zones =3D 2, - .hdmi_mux =3D 1, - .amplifier =3D 0, - .deepslp =3D 0, - .thermal =3D false, - .gmode =3D false, -}; - -static struct quirk_entry quirk_asm200 =3D { - .num_zones =3D 2, - .hdmi_mux =3D 1, - .amplifier =3D 0, - .deepslp =3D 1, - .thermal =3D false, - .gmode =3D false, + .hdmi_mux =3D false, + .amplifier =3D true, + .deepslp =3D false, }; =20 -static struct quirk_entry quirk_asm201 =3D { +static struct alienfx_quirks quirk_asm100 =3D { .num_zones =3D 2, - .hdmi_mux =3D 1, - .amplifier =3D 1, - .deepslp =3D 1, - .thermal =3D false, - .gmode =3D false, + .hdmi_mux =3D true, + .amplifier =3D false, + .deepslp =3D false, }; =20 -static struct quirk_entry quirk_g_series =3D { +static struct alienfx_quirks quirk_asm200 =3D { .num_zones =3D 2, - .hdmi_mux =3D 0, - .amplifier =3D 0, - .deepslp =3D 0, - .thermal =3D true, - .gmode =3D true, + .hdmi_mux =3D true, + .amplifier =3D false, + .deepslp =3D true, }; =20 -static struct quirk_entry quirk_x_series =3D { +static struct alienfx_quirks quirk_asm201 =3D { .num_zones =3D 2, - .hdmi_mux =3D 0, - .amplifier =3D 0, - .deepslp =3D 0, - .thermal =3D true, - .gmode =3D false, + .hdmi_mux =3D true, + .amplifier =3D true, + .deepslp =3D true, }; =20 static int __init dmi_matched(const struct dmi_system_id *dmi) @@ -240,42 +206,6 @@ static const struct dmi_system_id alienware_quirks[] _= _initconst =3D { }, .driver_data =3D &quirk_asm201, }, - { - .callback =3D dmi_matched, - .ident =3D "Alienware m17 R5", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), - }, - .driver_data =3D &quirk_x_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Alienware m18 R2", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18 R2"), - }, - .driver_data =3D &quirk_x_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Alienware x15 R1", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15 R1"), - }, - .driver_data =3D &quirk_x_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Alienware x17 R2", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x17 R2"), - }, - .driver_data =3D &quirk_x_series, - }, { .callback =3D dmi_matched, .ident =3D "Alienware X51 R1", @@ -303,60 +233,6 @@ static const struct dmi_system_id alienware_quirks[] _= _initconst =3D { }, .driver_data =3D &quirk_x51_r3, }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. G15 5510", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5510"), - }, - .driver_data =3D &quirk_g_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. G15 5511", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5511"), - }, - .driver_data =3D &quirk_g_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. G15 5515", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"), - }, - .driver_data =3D &quirk_g_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. G3 3500", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "G3 3500"), - }, - .driver_data =3D &quirk_g_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. G3 3590", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "G3 3590"), - }, - .driver_data =3D &quirk_g_series, - }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. G5 5500", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "G5 5500"), - }, - .driver_data =3D &quirk_g_series, - }, { .callback =3D dmi_matched, .ident =3D "Dell Inc. Inspiron 5675", @@ -411,7 +287,7 @@ struct awcc_priv { =20 struct alienfx_priv { struct platform_device *pdev; - struct quirk_entry *quirks; + struct alienfx_quirks *quirks; struct led_classdev global_led; struct color_platform colors[4]; u8 global_brightness; @@ -432,6 +308,103 @@ struct alienfx_platdata { =20 static u8 interface; =20 +struct awcc_quirks { + bool gmode; +}; + +static struct awcc_quirks g_series_features =3D { + .gmode =3D true, +}; + +static struct awcc_quirks x_series_features =3D { + .gmode =3D false, +}; + +static const struct dmi_system_id awcc_dmi_table[] __initconst =3D { + { + .ident =3D "Alienware m17 R5", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Alienware m18 R2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18 R2"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Alienware x15 R1", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15 R1"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Alienware x17 R2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x17 R2"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Dell Inc. G15 5510", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5510"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G15 5511", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5511"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G15 5515", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G3 3500", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "G3 3500"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G3 3590", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "G3 3590"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G5 5500", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "G5 5500"), + }, + .driver_data =3D &g_series_features, + }, +}; + +struct awcc_quirks *awcc; + static int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, void *in_args, size_t in_size, u32 *out_data) { @@ -1013,7 +986,7 @@ static int thermal_profile_set(struct platform_profile= _handler *pprof, { struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); =20 - if (quirks->gmode) { + if (awcc->gmode) { u32 gmode_status; int ret; =20 @@ -1079,7 +1052,7 @@ static int create_thermal_profile(struct wmi_device *= wdev) if (bitmap_empty(priv->pp_handler.choices, PLATFORM_PROFILE_LAST)) return -ENODEV; =20 - if (quirks->gmode) { + if (awcc->gmode) { priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D WMAX_THERMAL_MODE_GMODE; =20 @@ -1319,7 +1292,7 @@ static int wmax_wmi_probe(struct wmi_device *wdev, co= nst void *context) struct platform_device *pdev; int ret; =20 - if (quirks->thermal) { + if (awcc) { ret =3D alienware_awcc_setup(wdev); } else { ret =3D alienware_alienfx_setup(&pdata); @@ -1335,7 +1308,7 @@ static int wmax_wmi_probe(struct wmi_device *wdev, co= nst void *context) =20 static void wmax_wmi_remove(struct wmi_device *wdev) { - if (quirks->thermal) + if (awcc) alienware_awcc_exit(wdev); else alienware_alienfx_exit(wdev); @@ -1359,6 +1332,18 @@ static struct wmi_driver alienware_wmax_wmi_driver = =3D { =20 static int __init alienware_wmax_wmi_init(void) { + const struct dmi_system_id *id; + + id =3D dmi_first_match(awcc_dmi_table); + if (id) + awcc =3D id->driver_data; + + if (force_platform_profile) + awcc =3D &x_series_features; + + if (force_gmode) + awcc =3D &g_series_features; + return wmi_driver_register(&alienware_wmax_wmi_driver); } =20 @@ -1375,16 +1360,6 @@ static int __init alienware_wmi_init(void) if (quirks =3D=3D NULL) quirks =3D &quirk_unknown; =20 - if (force_platform_profile) - quirks->thermal =3D true; - - if (force_gmode) { - if (quirks->thermal) - quirks->gmode =3D true; - else - pr_warn("force_gmode requires platform profile support\n"); - } - if (wmi_has_guid(WMAX_CONTROL_GUID)) { interface =3D WMAX; ret =3D alienware_wmax_wmi_init(); --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vk1-f170.google.com (mail-vk1-f170.google.com [209.85.221.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF1F619F128; Sun, 29 Dec 2024 19:47:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501651; cv=none; b=JZ/RRiBMoQZdnKroRBC2hFzhQWy9yZdbZ2grYu+nEOdc0yT1K1rRogaNOL7Z1/wysrSc2gb/cGJT4H+dwZCCn/0fEEvjHwrc5F2L3xxKH9yO59YgBkHzokfEhitC1/eyAX/zuSnMMRg002ugmNCkic679sPaVFyzXCqJym/kCHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501651; c=relaxed/simple; bh=gs3uRmNNhDg+gom3qBYm5eDMcpi0sYKqEyaPYfgbx6s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YWuP29PKCnEDdRNyM3jcStiMyxN+wcf2s7QBPa3jQoI//sOqP4kVbQoo51zxV2C+2jI1YYj/GArJjlIZ/TTJkVXFwdfwq+eVUs5V435wRHhcwt3y5lS7Yniz+zWwZVh+lwioUqKpxqR5YsISb26jhbnbI24GXoYjCYnymHjTDjk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=g+4oBPuW; arc=none smtp.client-ip=209.85.221.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="g+4oBPuW" Received: by mail-vk1-f170.google.com with SMTP id 71dfb90a1353d-51882748165so2848504e0c.3; Sun, 29 Dec 2024 11:47:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501648; x=1736106448; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PNFvJ3UKrXcroCkRZ1MUjweZC2rJBHE/2U7k9KVQxGs=; b=g+4oBPuWTu8QTu4lefqXSRSxS1gKl7xDp4Rdte1cfpN/hB1D6QAcP4T2ZLGKxYqAUV yovhy1J06RwCyO8zH36YkXoftvYRn7kkD/pIc/lEXvIh7A3mywfX/gS6cDCXK37qSFkJ IrvXHfhI+khdby7VdKKJtmjd11dTTUgNOyb/Q0e/2qXB+xpHISiPkMW6L6QkZOG+Xx1X g7A9I/jQLTUOc21tsgoJk9BGiWWHgigdjQGafb403//YRgU1Ai+3e/S+sRCWnnvvINdY Nrlz06QRGaniNmzJ0u/hoMg81bDuwziQW1QhVnnCspAETWqmmrbbSAAcBH3EWy274pfX 24kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501648; x=1736106448; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PNFvJ3UKrXcroCkRZ1MUjweZC2rJBHE/2U7k9KVQxGs=; b=tLS/Vz+k2gDcGyO1VkBP4qq/BRUAaDODevc4bB+MkN6NBiHah21QUYVwfhTfO6Nilj jraV5BqMwfsHmfJ8nn+xppgRBZ4jSw02I0rZxTVz88naglCSjR1sLiIZhqlBxSi+8vHk BErcF7yMOxU57ueqF/folamyOnUmLsVJy9oMsMcl3aGOf5y3N56A1ngypTUA9jC1h4zi QzUXu1/DhgDqe9E9vafVmKV7ivnr3tfHbal4svfqqY7/xnEVxjPUq1gvPbkWFGwliQAb hdHqVZLRsNC3JpTXGt+O2bKzeNgfahHQfCV6U0+V/Ov+N3O4+txPqzq+XOwb6igZvcux qVyg== X-Forwarded-Encrypted: i=1; AJvYcCVp59BOamLikUnnFCnKZMaXFIYn4ULAy+/lje/6VsaAeSRscZDIouLuI7Pf5vPHYlZdhwoFAEf8HUQgN40=@vger.kernel.org X-Gm-Message-State: AOJu0YzSM5K+RLy+Vji6DAP0j85iiYEMbUajAGFHECJuYCezscenWeTk 10XwDU31Y2mnw6PcanE7mcbviDa9NoM/g4rznjwXRXYRyT4Ou8DaxxbmnQ== X-Gm-Gg: ASbGncvKvgxtUnOEq10YZBqd/YlW5sznobAZZrG0PBlW9EZrgQETV6GkfHSIX5jpVdB pleMCnmsVnnE5QWNO+nXvyD42zeXwaU/xDOXMmWpTOvjIaPlXyHkAKlGBaHHe8UPKqy2zCaAnIW 5WRP99MxHmY836cv9s9M6jFIhKp3hyPgm69Lz0jPOXAmDIgWdGf8ajIJbKv0lKAmfMLFCvZy7sn hCrrmVh1rhAw8YSr9WT9r/16e4vroxxAj3oen+CpCuwvB7OiMrsbKPiZsd/M+3Z X-Google-Smtp-Source: AGHT+IFJG8oTiDtVjcoYMdVjEnohOEoLd6CQpLFpKKyKk8ictJRgOqKT7qQB5IR9+Wkw67vSutwU2w== X-Received: by 2002:a05:6102:c8c:b0:4b2:5d65:6f0 with SMTP id ada2fe7eead31-4b2cc45f831mr23175583137.19.1735501648215; Sun, 29 Dec 2024 11:47:28 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:27 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 14/20] MAINTAINERS: Update ALIENWARE WMI DRIVER entry Date: Sun, 29 Dec 2024 14:45:01 -0500 Message-ID: <20241229194506.8268-16-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Dell has been inactive in its maintainership role of this driver since around 2021. Due to this, add myself as a maintainer and update path to support upcoming changes. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- MAINTAINERS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 3809931b9240..596c6a46478c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -784,10 +784,12 @@ F: Documentation/admin-guide/perf/alibaba_pmu.rst F: drivers/perf/alibaba_uncore_drw_pmu.c =20 ALIENWARE WMI DRIVER +M: Kurt Borja +L: platform-driver-x86@vger.kernel.org L: Dell.Client.Kernel@dell.com S: Maintained F: Documentation/wmi/devices/alienware-wmi.rst -F: drivers/platform/x86/dell/alienware-wmi.c +F: drivers/platform/x86/dell/alienware-wmi* =20 ALLEGRO DVT VIDEO IP CORE DRIVER M: Michael Tretter --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vk1-f180.google.com (mail-vk1-f180.google.com [209.85.221.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 527C4199EAF; Sun, 29 Dec 2024 19:47:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501653; cv=none; b=nMglZxqdYqx1nklYuKSUUimfZ7D8Ewdxk7KQXwUn5DaE7wrlJ/F6jN0RnHgR8VPeSuBBXGdlfMrYoc+ihRVMb061aIr8wW6zplShbaQwl2B68TZE5jB+quXll1mno2VFBpm5QVoXKm7Pir+/RX+4rKE/VgrqbsfLrCPZ2BzyBPM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501653; c=relaxed/simple; bh=bzPSssBgJt5ZBR3brnXSotTbVAswx/v9sJIVpn56sHA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GTd+Dj7M8znnFxMl+Nk8q4voB7yULOIzBNIbfU4e/3TobKlBYRS4RODC7hqooRheZttEtvFknB+nc3ubi6xVPjO29sJXptJiJMxrPwA18Mih0W0QY97441g4RAo1DPY5tgAnlDy5GYjT8c8XUN+vdpX9+0jib+vnvEwbzBExiMU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=K1huCcBZ; arc=none smtp.client-ip=209.85.221.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="K1huCcBZ" Received: by mail-vk1-f180.google.com with SMTP id 71dfb90a1353d-51878d9511bso2463256e0c.0; Sun, 29 Dec 2024 11:47:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501651; x=1736106451; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lYgATb3bLFskMZWLb+u6o18+64rxGqDmIoLI0qmB+ZE=; b=K1huCcBZKVILaK0uIg4VvrUtJ+LdNXWz72krlCJ78Cn9MjQlOogLDollz/maWvepZ3 avVLQlVy8S8X8Z7EqLDzXDSteW/4w5MYXaGR71e/bBAjjcjFYhuqc4kmTNbXL5jaOWg4 yDtIGh+gSniuleOQvP1xHJg72+j+fKGCc2nTNIIYylj/ZrbauLM7HzYYJ45T28S0+Pi7 uxlZX2W/GNODDzcnIrUFDrQ6JE7D9LjlTjk2WpyVBTX9JpX5wV8Kcz3D2TdyZ+GAQ33a 3PlvV8nXJR1LrBOgeBnPcOgyq7ihwDjRqSb9GZ2EA2h/sq/FOJoO8YlfiacST3+IJmj3 dksw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501651; x=1736106451; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lYgATb3bLFskMZWLb+u6o18+64rxGqDmIoLI0qmB+ZE=; b=XwfPOJ10MahKrgfIDLlRkdBIJ57R4Dsc33GiTthHM26vLcVH6/QjOCx+kVHXC5PYsS qPI5aEdtP6auauwt3lmueFngve65L5TgXogZIULkSzXv4Qh/RsEft7uSpWozn7+ll7Ut dnhxG+qApJ9VK7JPOhBCMU7yeYejCLwv7MuccIjkoQpJInTJEBqikiTqcsjrGifZ6E3z Ce1+RzUzMcYN5kNEfaJisSFRZ9CZn5p9OQdZPISwTZ3AfYYnXtGAsB/7F/Onah16vTrh PK6SwDWnrdan23DlmuXdcZBkubp9m8JuI1rrn1YG0lmOGXeIw+WYfSUUK5i8a07eGuUz 5DVQ== X-Forwarded-Encrypted: i=1; AJvYcCWCyU9Z9W6MyoobWbmJLQfM80JfqNlkZVVZAp6abpWNFGAR+BsZNYDf5LXx7hCBRVH0QlZrQtoCSXPHf7I=@vger.kernel.org X-Gm-Message-State: AOJu0YwN2rB3kCV0cM4OgL4nDoHr3nWUEztLYOmF8BUbrMjEwRKK82Ke sA2Hg/PitW7uc5GwZC4zPLTIb7wEGXpEWCskwPOtdeRa/eKco2BERVyWaw== X-Gm-Gg: ASbGncsIVf/zrHuchYXXx3RY0I2Mc5+WS5BO7dMzdvl9YGihirrJ5wPRVRTovecuG1L 5YmGR8oMh9xsgLP3hbE51Ha/VsDKSH6fHGg+wtc2WduZPD8nSWTfatzH7JnWo9cWAAUJC0LiG2M CO40EcWsqT/WlVtF43lH3ptqubWLR3g8qS2nDMDmwg12FZHdU4DlQPPLq4Xfflwy0NJdXD9leM8 z6I3+37xhjv6fg5ZWM/UgUv5OcsKzR5JaeKvO1UjuOYyfe0fLWnFPdCv3mKockh X-Google-Smtp-Source: AGHT+IH4aPz4dAyE+ZbMlJR/EkzF/sTCXDojky89QfjxVg3NOFOhiWUej/H6MZ1xbJnmVx0cb2HMeg== X-Received: by 2002:a05:6102:9d7:b0:4af:4ae0:2320 with SMTP id ada2fe7eead31-4b2cc49d92amr30886900137.26.1735501650867; Sun, 29 Dec 2024 11:47:30 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:30 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 15/20] platform/x86: Rename alienware-wmi.c Date: Sun, 29 Dec 2024 14:45:02 -0500 Message-ID: <20241229194506.8268-17-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename alienware-wmi to support upcoming split. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/Makefile | 1 + .../platform/x86/dell/{alienware-wmi.c =3D> alienware-wmi-base.c} | 0 2 files changed, 1 insertion(+) rename drivers/platform/x86/dell/{alienware-wmi.c =3D> alienware-wmi-base.= c} (100%) diff --git a/drivers/platform/x86/dell/Makefile b/drivers/platform/x86/dell= /Makefile index bb3cbd470a46..f8aec8502c2f 100644 --- a/drivers/platform/x86/dell/Makefile +++ b/drivers/platform/x86/dell/Makefile @@ -5,6 +5,7 @@ # =20 obj-$(CONFIG_ALIENWARE_WMI) +=3D alienware-wmi.o +alienware-wmi-objs :=3D alienware-wmi-base.o obj-$(CONFIG_DCDBAS) +=3D dcdbas.o obj-$(CONFIG_DELL_LAPTOP) +=3D dell-laptop.o obj-$(CONFIG_DELL_RBTN) +=3D dell-rbtn.o diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi-base.c similarity index 100% rename from drivers/platform/x86/dell/alienware-wmi.c rename to drivers/platform/x86/dell/alienware-wmi-base.c --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f54.google.com (mail-vs1-f54.google.com [209.85.217.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A750919C556; Sun, 29 Dec 2024 19:47:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501656; cv=none; b=nLstxJQBi6OdYtwTT7mkp0r0ydO1bZqm79pG/PP+u3y/jz/GmjQ4StK7tAmTxpymEEpP2qs8+tizGLZjRaL5dzOLQOQOp4d/ZsCbk5qLe/qImLEGO1Jx9oLXEAXbLdc3MVnYbRY1PCN3W/wgHzXOecxKEKVnWJ1aQ96G1XLc31M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501656; c=relaxed/simple; bh=w0KS1bbq1IZPyD9oY1Zi0nfCDeMz/7f/rn7WiH0DL6A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cf2DsRsXazHJL+IPfmqhMtV42eSt7lAf0G9o/O8IFNtXbs1YC4fzQ/0n090VSy91bv6PFBAzbs0/kvP8qpRba7RAobV2YIToE5lZqgjskh4twFLPZnTxlUevZuLkA/ADikHj3PJxWMqeLSlKR5HTbht6qLFsfbE43H3p+I07diM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C2VGyuly; arc=none smtp.client-ip=209.85.217.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C2VGyuly" Received: by mail-vs1-f54.google.com with SMTP id ada2fe7eead31-4afdf8520c2so2487024137.2; Sun, 29 Dec 2024 11:47:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501653; x=1736106453; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VY2GiTDOVaSMYpHbfoKZ3MET/i1nAgd2toxnTSmI1JU=; b=C2VGyulycDMASvwMObyrAVq1ZQaLOK+QprVjZQgp+dQzYBJpEwouqudh1DE90Fru97 KTqMLb9gaPu9WkmVi0rX7oTr31lUBG/Dxw/nDpxyi/NDME6fdbBbJZ2mcvFUdZqKp6Og uiuPLTJD92VMJvyDHDEGaPa6jTolmQWiXN31RSIQicJiHIBL7HbJPz63Mlc3aH5kOEW9 nPl8fSBjtTcaK2CRKjTaD3UjR92iZsbPlR1O5hxr17KtQM0RfNCZP0Wa+pr+i1npXVB1 hNs+lSO/AS3D3NGTtMcKtuOboblsIuDfWVqd646IIzQyQ/hpWrN4P03CGF30Pwdd64xQ dXbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501653; x=1736106453; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VY2GiTDOVaSMYpHbfoKZ3MET/i1nAgd2toxnTSmI1JU=; b=GPgL8+8X1ldUDZ9N6e07Po8Kyb2dGEnT7nWPICetQkKsmDPVy9c9nOA4KC/IbPBZy1 detQW8Tgdnicjm+kXBYNT0Q1SOpkYV+IQgUe2VdXb36cVsi2cB9vpCMv/axfrTTBoV86 mybIFTjIwfECVegqQdEdC0WvZ36J3NmmYLcI+F1nQHv562UxCetT4om9c6k2Xb139swf 7kP4uN0Ii6yrisZGkr0nldlkS3asmkGBaggzLgEFlnEbJ1xefDibNoUYuSln3clxJxBP uEENtjSLNWXgazn7Z6du6wh3xgX0GRROnhTWIz7jNb+bX8qKUVKCj+9XPo5bOGfBHVK7 jSQA== X-Forwarded-Encrypted: i=1; AJvYcCURVQ6/04SHBtl0PNcYJJ9CCoeF9mqQGImujejmXpOLO5NoPh5s9uO/uRMDG6qsJ+adLBsk1DamvbpNQ2o=@vger.kernel.org X-Gm-Message-State: AOJu0YxCxjeyQU5VtC6wsVU5VWqYvy6m3dsqBDb4t9Y4OEXtorkH+P6V 9egsoT/Gscqg8BpgEyDKPjvYVLmK/Pr75HNxNacPjIcQwZIa7sX00lL69A== X-Gm-Gg: ASbGnctPd/dKhRUG8VW7bZTdk2QYaJ1mmn2JwSTpQ+tVoTnSEug91dZIUmQj2k9xlFV yKyZtC3x4SD0Gk7c6Shwnl4yfQt0qsKw4bwRL5E65eTydkoREUKA0ZOhw6j+y0J1c0ttW4c1GBW SXuBkYUT7CnE8MmSev6A1/7NNo0nd/Pvs2oSnN8Zx1T67iryplsUccBKQ9Brz5GTb7GKwBYvdB+ m0EE6ViTihEQDeHkWvsPy46BxWVQ1Jblj5TAq7YgVtF+akrLxot2G05LRE1afSj X-Google-Smtp-Source: AGHT+IFMduLPqTCSj2w0jvXLIUApn+FcW3Es8Dj3pJkyroQF4gkmj4+wJPNDpJzO92fBicS6jXZwzg== X-Received: by 2002:a05:6102:f0f:b0:4b2:48af:bc84 with SMTP id ada2fe7eead31-4b2cc359f9amr27293282137.7.1735501653352; Sun, 29 Dec 2024 11:47:33 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:32 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 16/20] platform/x86: Add alienware-wmi.h Date: Sun, 29 Dec 2024 14:45:03 -0500 Message-ID: <20241229194506.8268-18-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a header file for alienware-wmi with shared resources to support the upcoming file split. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- .../platform/x86/dell/alienware-wmi-base.c | 68 +++------------- drivers/platform/x86/dell/alienware-wmi.h | 78 +++++++++++++++++++ 2 files changed, 87 insertions(+), 59 deletions(-) create mode 100644 drivers/platform/x86/dell/alienware-wmi.h diff --git a/drivers/platform/x86/dell/alienware-wmi-base.c b/drivers/platf= orm/x86/dell/alienware-wmi-base.c index b9daf22efdbe..a268193ad2a1 100644 --- a/drivers/platform/x86/dell/alienware-wmi-base.c +++ b/drivers/platform/x86/dell/alienware-wmi-base.c @@ -16,10 +16,7 @@ #include #include #include - -#define LEGACY_CONTROL_GUID "A90597CE-A997-11DA-B012-B622A1EF5492" -#define LEGACY_POWER_CONTROL_GUID "A80593CE-A997-11DA-B012-B622A1EF5492" -#define WMAX_CONTROL_GUID "A70591CE-A997-11DA-B012-B622A1EF5492" +#include "alienware-wmi.h" =20 #define WMAX_METHOD_HDMI_SOURCE 0x1 #define WMAX_METHOD_HDMI_STATUS 0x2 @@ -54,18 +51,6 @@ enum INTERFACE_FLAGS { WMAX, }; =20 -enum LEGACY_CONTROL_STATES { - LEGACY_RUNNING =3D 1, - LEGACY_BOOTING =3D 0, - LEGACY_SUSPEND =3D 3, -}; - -enum WMAX_CONTROL_STATES { - WMAX_RUNNING =3D 0xFF, - WMAX_BOOTING =3D 0, - WMAX_SUSPEND =3D 3, -}; - enum WMAX_THERMAL_INFORMATION_OPERATIONS { WMAX_OPERATION_SYS_DESCRIPTION =3D 0x02, WMAX_OPERATION_LIST_IDS =3D 0x03, @@ -113,16 +98,8 @@ static const enum platform_profile_option wmax_mode_to_= platform_profile[THERMAL_ [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, }; =20 -struct alienfx_quirks { - u8 num_zones; - bool hdmi_mux; - bool amplifier; - bool deepslp; -}; - static struct alienfx_quirks *quirks; =20 - static struct alienfx_quirks quirk_inspiron5675 =3D { .num_zones =3D 2, .hdmi_mux =3D false, @@ -245,12 +222,6 @@ static const struct dmi_system_id alienware_quirks[] _= _initconst =3D { {} }; =20 -struct color_platform { - u8 blue; - u8 green; - u8 red; -} __packed; - struct wmax_brightness_args { u32 led_mask; u32 percentage; @@ -285,27 +256,6 @@ struct awcc_priv { enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; }; =20 -struct alienfx_priv { - struct platform_device *pdev; - struct alienfx_quirks *quirks; - struct led_classdev global_led; - struct color_platform colors[4]; - u8 global_brightness; - 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 u8 interface; =20 struct awcc_quirks { @@ -405,8 +355,8 @@ static const struct dmi_system_id awcc_dmi_table[] __in= itconst =3D { =20 struct awcc_quirks *awcc; =20 -static int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, - void *in_args, size_t in_size, u32 *out_data) +int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, + void *in_args, size_t in_size, u32 *out_data) { struct acpi_buffer out =3D {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer in =3D {in_size, in_args}; @@ -1139,7 +1089,7 @@ static struct platform_driver platform_driver =3D { .probe =3D alienfx_probe, }; =20 -static int alienware_alienfx_setup(struct alienfx_platdata *pdata) +int alienware_alienfx_setup(struct alienfx_platdata *pdata) { struct platform_device *pdev; int ret; @@ -1162,7 +1112,7 @@ static int alienware_alienfx_setup(struct alienfx_pla= tdata *pdata) return 0; } =20 -static void alienware_alienfx_exit(struct wmi_device *wdev) +void alienware_alienfx_exit(struct wmi_device *wdev) { struct platform_device *pdev =3D dev_get_drvdata(&wdev->dev); =20 @@ -1242,12 +1192,12 @@ static struct wmi_driver alienware_legacy_wmi_drive= r =3D { .remove =3D legacy_wmi_remove, }; =20 -static int __init alienware_legacy_wmi_init(void) +int __init alienware_legacy_wmi_init(void) { return wmi_driver_register(&alienware_legacy_wmi_driver); } =20 -static void __exit alienware_legacy_wmi_exit(void) +void __exit alienware_legacy_wmi_exit(void) { wmi_driver_unregister(&alienware_legacy_wmi_driver); } @@ -1330,7 +1280,7 @@ static struct wmi_driver alienware_wmax_wmi_driver = =3D { .remove =3D wmax_wmi_remove, }; =20 -static int __init alienware_wmax_wmi_init(void) +int __init alienware_wmax_wmi_init(void) { const struct dmi_system_id *id; =20 @@ -1347,7 +1297,7 @@ static int __init alienware_wmax_wmi_init(void) return wmi_driver_register(&alienware_wmax_wmi_driver); } =20 -static void __exit alienware_wmax_wmi_exit(void) +void __exit alienware_wmax_wmi_exit(void) { wmi_driver_unregister(&alienware_wmax_wmi_driver); } diff --git a/drivers/platform/x86/dell/alienware-wmi.h b/drivers/platform/x= 86/dell/alienware-wmi.h new file mode 100644 index 000000000000..dccbf4f95da0 --- /dev/null +++ b/drivers/platform/x86/dell/alienware-wmi.h @@ -0,0 +1,78 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Alienware WMI special features driver + * + * Copyright (C) 2014 Dell Inc + * Copyright (C) 2024 Kurt Borja + */ + +#ifndef _ALIENWARE_WMI_H_ +#define _ALIENWARE_WMI_H_ + +#include +#include +#include + +#define LEGACY_CONTROL_GUID "A90597CE-A997-11DA-B012-B622A1EF5492" +#define LEGACY_POWER_CONTROL_GUID "A80593CE-A997-11DA-B012-B622A1EF5492" +#define WMAX_CONTROL_GUID "A70591CE-A997-11DA-B012-B622A1EF5492" + +enum LEGACY_CONTROL_STATES { + LEGACY_RUNNING =3D 1, + LEGACY_BOOTING =3D 0, + LEGACY_SUSPEND =3D 3, +}; + +enum WMAX_CONTROL_STATES { + WMAX_RUNNING =3D 0xFF, + WMAX_BOOTING =3D 0, + WMAX_SUSPEND =3D 3, +}; + +struct alienfx_quirks { + u8 num_zones; + bool hdmi_mux; + bool amplifier; + bool deepslp; +}; + +struct color_platform { + u8 blue; + u8 green; + u8 red; +} __packed; + +struct alienfx_priv { + struct platform_device *pdev; + struct alienfx_quirks *quirks; + struct led_classdev global_led; + struct color_platform colors[4]; + u8 global_brightness; + 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; +}; + +int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, + void *in_args, size_t in_size, u32 *out_data); + +int alienware_alienfx_setup(struct alienfx_platdata *pdata); +void alienware_alienfx_exit(struct wmi_device *wdev); + +int __init alienware_legacy_wmi_init(void); +void __exit alienware_legacy_wmi_exit(void); + +int __init alienware_wmax_wmi_init(void); +void __exit alienware_wmax_wmi_exit(void); + +#endif --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vk1-f182.google.com (mail-vk1-f182.google.com [209.85.221.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25B081A08AF; Sun, 29 Dec 2024 19:47:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501661; cv=none; b=pgN1w5gsUbYhPzDVHMyzhzhZk5xC3DghiE5HeWZonT8Qsylz7GNhiwxR+84iUtssZDW2RO0k15CnSQ3AKAHBDs00qn9qq7H/SEv/YbDRq1GMtdNaXgy/CFJOdDBcJ6cWWPD6wKwWBk63e2lG2Oq6URN261stj58BvkpbOvniGFk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501661; c=relaxed/simple; bh=DLcTKz77W30ZjKF71DnuOFU2QW5kz6PStnwA9H/YpmA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CP/3ofM0rR3HMR9YSIXuRsg0ErtuxgxAWo8tAcR87bvkNTIc6krdrrMcOVTY6zUnyBEf5O7E9AzACVDhk0YxeUhezdimndhx/6k8IWt5Tl9GY27d5OdNNez3z6xbxR9CkkFHXSD4yQ//45W0c1PQt3E2VyHXoyFQYmhUDkVg1Yw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SLtuprbq; arc=none smtp.client-ip=209.85.221.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SLtuprbq" Received: by mail-vk1-f182.google.com with SMTP id 71dfb90a1353d-518c46cc6e4so2821981e0c.3; Sun, 29 Dec 2024 11:47:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501657; x=1736106457; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=J+ptfvtKNTcyQfqpaTCzsQphD8kZIyqID9rX1g95AwQ=; b=SLtuprbqe/5F+tWVIEW4DgublreWG0ffcK0b+Vqkwu1z1xelSmOytHwpiHypxbeeuZ 1PZhePj7Q5Aejyi01tWNZVF/nFtQ6kKqKE/PWjY/O/P0QzTDWaldBK6LmEpW1CEjj3+a MReiV0w2CaW4VzA2bYjyY1/ApDuJ/S4+qm+36pHtPb5UP19mak2ziNvjjTYkozvioksh bt4Lik9vaHJnPDps1tjlEAAXXFXWq8vQ8IpCIzQr60Q7hW2lkEYZg1ro7Op4FVZO6Ujr IhpE3XAF04xR7eI0TyAaR3YfJXtWjAVmlFEH35MIoSxeytUiCjtjML4hxqeT0/FwXeoE Eq/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501657; x=1736106457; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=J+ptfvtKNTcyQfqpaTCzsQphD8kZIyqID9rX1g95AwQ=; b=UXQXQciBTupYMp60brYb/aWEH+pzl/fcArc1E/x35a58O9sUoiWc0R9A3EyeS+cs86 ZyDz1m/O1771PMeeHvMK1DpDN3l9wOHeuHLEzoN8NKkgIrlBll1fcclOKCizi7AtvEhp P9UEGrAqgWjyMHkiJb028x48H8hjnBI6t5n87Kjbi87o9RbDyuA+VgOxQQFL9SPNkgp4 Pu4PRRyxC/E77GbVNfd95jpeNw89IC2VlkCg/TdzJwPzQFtvN0BLEt7EeVwcxVPNsnyS 6/i5dqBqvK4oT459Nn0dpMOVyegApAoknlNUI/iJxlX5EUMVhBCyIFyqWTln3P1q7bpX miuQ== X-Forwarded-Encrypted: i=1; AJvYcCV6iprQq8yagCo7PsOPlSORPq9/I+4Wi29gCO1Z0sT6cdMbVi0xFLRhcgA2XCBYCI2yK/BfT5+oE6Kt8io=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2atexje+AIN7zTHEV+bfHQsS/GOdLXPYDs0CFBHkWyJf4H01S 1LmFxhVxXY8R83BYOBdkLY9Iko4sg4cO8LCHdSlormm6nkrceDbipVMfaw== X-Gm-Gg: ASbGncubBoaf3SqSUfUGk0Q5ZQrDnSpB1CE1HyGP+GS3kpmm36UKDz+VTrUOU/Al140 TH0RrygBU3Ql0+yfvBsaDl/IENYqtvj/pirRZnu2nsSy1SUrcN/ftG1dJkSST3+pS+2rAwgJWpL GOLNl9d2+Oz8x085bzqMO5IhJxi4ztCcWbq4NGsPzPL3U1oY7DjmYgygEWjtqfLj76a671wJBWl h9kN0Z0pgfGLii3IK+XuwEeLCIYE4LQ2Z+UkSdVbUub/BDaF2eVBYk93xw//PNr X-Google-Smtp-Source: AGHT+IGm784i9xnNTrRHBcOLfrhaOevBvSpxHd95JedLyxrc7BX7v66vFmquk2VYGIPmAuIaYGFfzg== X-Received: by 2002:a05:6102:6e88:b0:4b2:cc92:169d with SMTP id ada2fe7eead31-4b2cc921785mr20287549137.4.1735501656495; Sun, 29 Dec 2024 11:47:36 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:35 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 17/20] platform-x86: Split the alienware-wmi driver Date: Sun, 29 Dec 2024 14:45:04 -0500 Message-ID: <20241229194506.8268-19-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Split alienware-wmi WMI drivers into different files. This is done seamlessly by copying and pasting, however some blocks are reordered. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/Makefile | 2 + .../platform/x86/dell/alienware-wmi-base.c | 849 +----------------- .../platform/x86/dell/alienware-wmi-legacy.c | 98 ++ .../platform/x86/dell/alienware-wmi-wmax.c | 775 ++++++++++++++++ 4 files changed, 876 insertions(+), 848 deletions(-) create mode 100644 drivers/platform/x86/dell/alienware-wmi-legacy.c create mode 100644 drivers/platform/x86/dell/alienware-wmi-wmax.c diff --git a/drivers/platform/x86/dell/Makefile b/drivers/platform/x86/dell= /Makefile index f8aec8502c2f..03ba459f3d31 100644 --- a/drivers/platform/x86/dell/Makefile +++ b/drivers/platform/x86/dell/Makefile @@ -6,6 +6,8 @@ =20 obj-$(CONFIG_ALIENWARE_WMI) +=3D alienware-wmi.o alienware-wmi-objs :=3D alienware-wmi-base.o +alienware-wmi-y +=3D alienware-wmi-legacy.o +alienware-wmi-y +=3D alienware-wmi-wmax.o obj-$(CONFIG_DCDBAS) +=3D dcdbas.o obj-$(CONFIG_DELL_LAPTOP) +=3D dell-laptop.o obj-$(CONFIG_DELL_RBTN) +=3D dell-rbtn.o diff --git a/drivers/platform/x86/dell/alienware-wmi-base.c b/drivers/platf= orm/x86/dell/alienware-wmi-base.c index a268193ad2a1..fd73c3881dc0 100644 --- a/drivers/platform/x86/dell/alienware-wmi-base.c +++ b/drivers/platform/x86/dell/alienware-wmi-base.c @@ -8,96 +8,21 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include -#include -#include #include #include -#include #include #include -#include #include "alienware-wmi.h" =20 -#define WMAX_METHOD_HDMI_SOURCE 0x1 -#define WMAX_METHOD_HDMI_STATUS 0x2 -#define WMAX_METHOD_BRIGHTNESS 0x3 -#define WMAX_METHOD_ZONE_CONTROL 0x4 -#define WMAX_METHOD_HDMI_CABLE 0x5 -#define WMAX_METHOD_AMPLIFIER_CABLE 0x6 -#define WMAX_METHOD_DEEP_SLEEP_CONTROL 0x0B -#define WMAX_METHOD_DEEP_SLEEP_STATUS 0x0C -#define WMAX_METHOD_THERMAL_INFORMATION 0x14 -#define WMAX_METHOD_THERMAL_CONTROL 0x15 -#define WMAX_METHOD_GAME_SHIFT_STATUS 0x25 - -#define WMAX_THERMAL_MODE_GMODE 0xAB - -#define WMAX_FAILURE_CODE 0xFFFFFFFF - MODULE_AUTHOR("Mario Limonciello "); MODULE_DESCRIPTION("Alienware special feature control"); MODULE_LICENSE("GPL"); =20 -static bool force_platform_profile; -module_param_unsafe(force_platform_profile, bool, 0); -MODULE_PARM_DESC(force_platform_profile, "Forces auto-detecting thermal pr= ofiles without checking if WMI thermal backend is available"); - -static bool force_gmode; -module_param_unsafe(force_gmode, bool, 0); -MODULE_PARM_DESC(force_gmode, "Forces G-Mode when performance profile is s= elected"); - enum INTERFACE_FLAGS { LEGACY, WMAX, }; =20 -enum WMAX_THERMAL_INFORMATION_OPERATIONS { - WMAX_OPERATION_SYS_DESCRIPTION =3D 0x02, - WMAX_OPERATION_LIST_IDS =3D 0x03, - WMAX_OPERATION_CURRENT_PROFILE =3D 0x0B, -}; - -enum WMAX_THERMAL_CONTROL_OPERATIONS { - WMAX_OPERATION_ACTIVATE_PROFILE =3D 0x01, -}; - -enum WMAX_GAME_SHIFT_STATUS_OPERATIONS { - WMAX_OPERATION_TOGGLE_GAME_SHIFT =3D 0x01, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS =3D 0x02, -}; - -enum WMAX_THERMAL_TABLES { - WMAX_THERMAL_TABLE_BASIC =3D 0x90, - WMAX_THERMAL_TABLE_USTT =3D 0xA0, -}; - -enum wmax_thermal_mode { - THERMAL_MODE_USTT_BALANCED, - THERMAL_MODE_USTT_BALANCED_PERFORMANCE, - THERMAL_MODE_USTT_COOL, - THERMAL_MODE_USTT_QUIET, - THERMAL_MODE_USTT_PERFORMANCE, - THERMAL_MODE_USTT_LOW_POWER, - THERMAL_MODE_BASIC_QUIET, - THERMAL_MODE_BASIC_BALANCED, - THERMAL_MODE_BASIC_BALANCED_PERFORMANCE, - THERMAL_MODE_BASIC_PERFORMANCE, - THERMAL_MODE_LAST, -}; - -static const enum platform_profile_option wmax_mode_to_platform_profile[TH= ERMAL_MODE_LAST] =3D { - [THERMAL_MODE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, - [THERMAL_MODE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, - [THERMAL_MODE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, - [THERMAL_MODE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, - [THERMAL_MODE_BASIC_QUIET] =3D PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_BASIC_BALANCED] =3D PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_BASIC_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_P= ERFORMANCE, - [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, -}; - static struct alienfx_quirks *quirks; =20 static struct alienfx_quirks quirk_inspiron5675 =3D { @@ -222,138 +147,7 @@ static const struct dmi_system_id alienware_quirks[] = __initconst =3D { {} }; =20 -struct wmax_brightness_args { - u32 led_mask; - u32 percentage; -}; - -struct wmax_basic_args { - u8 arg; -}; - -struct legacy_led_args { - struct color_platform colors; - u8 brightness; - u8 state; -} __packed; - -struct wmax_led_args { - u32 led_mask; - struct color_platform colors; - u8 state; -} __packed; - -struct wmax_u32_args { - u8 operation; - u8 arg1; - u8 arg2; - u8 arg3; -}; - -struct awcc_priv { - struct wmi_device *wdev; - struct platform_profile_handler pp_handler; - enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; -}; - -static u8 interface; - -struct awcc_quirks { - bool gmode; -}; - -static struct awcc_quirks g_series_features =3D { - .gmode =3D true, -}; - -static struct awcc_quirks x_series_features =3D { - .gmode =3D false, -}; - -static const struct dmi_system_id awcc_dmi_table[] __initconst =3D { - { - .ident =3D "Alienware m17 R5", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), - }, - .driver_data =3D &x_series_features, - }, - { - .ident =3D "Alienware m18 R2", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18 R2"), - }, - .driver_data =3D &x_series_features, - }, - { - .ident =3D "Alienware x15 R1", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15 R1"), - }, - .driver_data =3D &x_series_features, - }, - { - .ident =3D "Alienware x17 R2", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x17 R2"), - }, - .driver_data =3D &x_series_features, - }, - { - .ident =3D "Dell Inc. G15 5510", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5510"), - }, - .driver_data =3D &g_series_features, - }, - { - .ident =3D "Dell Inc. G15 5511", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5511"), - }, - .driver_data =3D &g_series_features, - }, - { - .ident =3D "Dell Inc. G15 5515", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"), - }, - .driver_data =3D &g_series_features, - }, - { - .ident =3D "Dell Inc. G3 3500", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "G3 3500"), - }, - .driver_data =3D &g_series_features, - }, - { - .ident =3D "Dell Inc. G3 3590", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "G3 3590"), - }, - .driver_data =3D &g_series_features, - }, - { - .ident =3D "Dell Inc. G5 5500", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "G5 5500"), - }, - .driver_data =3D &g_series_features, - }, -}; - -struct awcc_quirks *awcc; +u8 interface; =20 int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, void *in_args, size_t in_size, u32 *out_data) @@ -586,458 +380,6 @@ static enum led_brightness global_led_get(struct led_= classdev *led_cdev) return priv->global_brightness; } =20 -/* - * The HDMI mux sysfs node indicates the status of the HDMI input mux. - * It can toggle between standard system GPU output and HDMI input. - */ -static ssize_t cable_show(struct device *dev, struct device_attribute *att= r, - char *buf) -{ - struct alienfx_platdata *pdata =3D dev_get_platdata(dev); - struct wmax_basic_args in_args =3D { - .arg =3D 0, - }; - u32 out_data; - int ret; - - ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_CABLE, - &in_args, sizeof(in_args), &out_data); - - if (!ret) { - if (out_data =3D=3D 0) - return sysfs_emit(buf, "[unconnected] connected unknown\n"); - else if (out_data =3D=3D 1) - return sysfs_emit(buf, "unconnected [connected] unknown\n"); - } - - pr_err("alienware-wmi: unknown HDMI cable status: %d\n", ret); - return sysfs_emit(buf, "unconnected connected [unknown]\n"); -} - -static ssize_t source_show(struct device *dev, struct device_attribute *at= tr, - char *buf) -{ - struct alienfx_platdata *pdata =3D dev_get_platdata(dev); - struct wmax_basic_args in_args =3D { - .arg =3D 0, - }; - u32 out_data; - int ret; - - ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_STATUS, - &in_args, sizeof(in_args), &out_data); - - if (!ret) { - if (out_data =3D=3D 1) - return sysfs_emit(buf, "[input] gpu unknown\n"); - else if (out_data =3D=3D 2) - return sysfs_emit(buf, "input [gpu] unknown\n"); - } - - pr_err("alienware-wmi: unknown HDMI source status: %u\n", ret); - return sysfs_emit(buf, "input gpu [unknown]\n"); -} - -static ssize_t source_store(struct device *dev, struct device_attribute *a= ttr, - const char *buf, size_t count) -{ - struct alienfx_platdata *pdata =3D dev_get_platdata(dev); - struct wmax_basic_args args; - int ret; - - if (strcmp(buf, "gpu\n") =3D=3D 0) - args.arg =3D 1; - else if (strcmp(buf, "input\n") =3D=3D 0) - args.arg =3D 2; - else - args.arg =3D 3; - pr_debug("alienware-wmi: setting hdmi to %d : %s", args.arg, buf); - - ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_SOURCE, &args, - sizeof(args), NULL); - - if (ret < 0) - pr_err("alienware-wmi: HDMI toggle failed: results: %u\n", ret); - - return count; -} - -static DEVICE_ATTR_RO(cable); -static DEVICE_ATTR_RW(source); - -static bool hdmi_group_visible(struct kobject *kobj) -{ - struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); - - return priv->quirks->hdmi_mux; -} -DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi); - -static struct attribute *hdmi_attrs[] =3D { - &dev_attr_cable.attr, - &dev_attr_source.attr, - NULL, -}; - -static const struct attribute_group hdmi_attribute_group =3D { - .name =3D "hdmi", - .is_visible =3D SYSFS_GROUP_VISIBLE(hdmi), - .attrs =3D hdmi_attrs, -}; - -/* - * Alienware GFX amplifier support - * - Currently supports reading cable status - * - Leaving expansion room to possibly support dock/undock events later - */ -static ssize_t status_show(struct device *dev, struct device_attribute *at= tr, - char *buf) -{ - struct alienfx_platdata *pdata =3D dev_get_platdata(dev); - struct wmax_basic_args in_args =3D { - .arg =3D 0, - }; - u32 out_data; - int ret; - - ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_AMPLIFIER_CABLE, - &in_args, sizeof(in_args), &out_data); - - if (!ret) { - if (out_data =3D=3D 0) - return sysfs_emit(buf, "[unconnected] connected unknown\n"); - else if (out_data =3D=3D 1) - return sysfs_emit(buf, "unconnected [connected] unknown\n"); - } - - pr_err("alienware-wmi: unknown amplifier cable status: %d\n", ret); - return sysfs_emit(buf, "unconnected connected [unknown]\n"); -} - -static DEVICE_ATTR_RO(status); - -static bool amplifier_group_visible(struct kobject *kobj) -{ - struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); - - return priv->quirks->amplifier; -} -DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier); - -static struct attribute *amplifier_attrs[] =3D { - &dev_attr_status.attr, - NULL, -}; - -static const struct attribute_group amplifier_attribute_group =3D { - .name =3D "amplifier", - .is_visible =3D SYSFS_GROUP_VISIBLE(amplifier), - .attrs =3D amplifier_attrs, -}; - -/* - * Deep Sleep Control support - * - Modifies BIOS setting for deep sleep control allowing extra wakeup ev= ents - */ -static ssize_t deepsleep_show(struct device *dev, struct device_attribute = *attr, - char *buf) -{ - struct alienfx_platdata *pdata =3D dev_get_platdata(dev); - struct wmax_basic_args in_args =3D { - .arg =3D 0, - }; - u32 out_data; - int ret; - - ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_DEEP_SLEEP_STATUS, - &in_args, sizeof(in_args), &out_data); - - if (!ret) { - if (out_data =3D=3D 0) - return sysfs_emit(buf, "[disabled] s5 s5_s4\n"); - else if (out_data =3D=3D 1) - return sysfs_emit(buf, "disabled [s5] s5_s4\n"); - else if (out_data =3D=3D 2) - return sysfs_emit(buf, "disabled s5 [s5_s4]\n"); - } - - pr_err("alienware-wmi: unknown deep sleep status: %d\n", ret); - return sysfs_emit(buf, "disabled s5 s5_s4 [unknown]\n"); -} - -static ssize_t deepsleep_store(struct device *dev, struct device_attribute= *attr, - const char *buf, size_t count) -{ - struct alienfx_platdata *pdata =3D dev_get_platdata(dev); - struct wmax_basic_args args; - int ret; - - if (strcmp(buf, "disabled\n") =3D=3D 0) - args.arg =3D 0; - else if (strcmp(buf, "s5\n") =3D=3D 0) - args.arg =3D 1; - else - args.arg =3D 2; - pr_debug("alienware-wmi: setting deep sleep to %d : %s", args.arg, buf); - - ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_DEEP_SLEEP_CONTROL, - &args, sizeof(args), NULL); - - if (!ret) - pr_err("alienware-wmi: deep sleep control failed: results: %u\n", ret); - - return count; -} - -static DEVICE_ATTR_RW(deepsleep); - -static bool deepsleep_group_visible(struct kobject *kobj) -{ - struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); - - return priv->quirks->deepslp; -} -DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep); - -static struct attribute *deepsleep_attrs[] =3D { - &dev_attr_deepsleep.attr, - NULL, -}; - -static const struct attribute_group deepsleep_attribute_group =3D { - .name =3D "deepsleep", - .is_visible =3D SYSFS_GROUP_VISIBLE(deepsleep), - .attrs =3D deepsleep_attrs, -}; - -/* - * Thermal Profile control - * - Provides thermal profile control through the Platform Profile API - */ -#define WMAX_THERMAL_TABLE_MASK GENMASK(7, 4) -#define WMAX_THERMAL_MODE_MASK GENMASK(3, 0) -#define WMAX_SENSOR_ID_MASK BIT(8) - -static bool is_wmax_thermal_code(u32 code) -{ - if (code & WMAX_SENSOR_ID_MASK) - return false; - - if ((code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_LAST) - return false; - - if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_BASIC && - (code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_BASIC_QUIET) - return true; - - if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_USTT && - (code & WMAX_THERMAL_MODE_MASK) <=3D THERMAL_MODE_USTT_LOW_POWER) - return true; - - return false; -} - -static int wmax_thermal_information(struct wmi_device *wdev, u8 operation, - u8 arg, u32 *out_data) -{ - struct wmax_u32_args in_args =3D { - .operation =3D operation, - .arg1 =3D arg, - .arg2 =3D 0, - .arg3 =3D 0, - }; - int ret; - - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_INFORMATION, - &in_args, sizeof(in_args), out_data); - if (ret < 0) - return ret; - - if (*out_data =3D=3D WMAX_FAILURE_CODE) - return -EBADRQC; - - return 0; -} - -static int wmax_thermal_control(struct wmi_device *wdev, u8 profile) -{ - struct wmax_u32_args in_args =3D { - .operation =3D WMAX_OPERATION_ACTIVATE_PROFILE, - .arg1 =3D profile, - .arg2 =3D 0, - .arg3 =3D 0, - }; - u32 out_data; - int ret; - - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_CONTROL, - &in_args, sizeof(in_args), &out_data); - if (ret) - return ret; - - if (out_data =3D=3D WMAX_FAILURE_CODE) - return -EBADRQC; - - return 0; -} - -static int wmax_game_shift_status(struct wmi_device *wdev, u8 operation, - u32 *out_data) -{ - struct wmax_u32_args in_args =3D { - .operation =3D operation, - .arg1 =3D 0, - .arg2 =3D 0, - .arg3 =3D 0, - }; - int ret; - - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_GAME_SHIFT_STATUS, - &in_args, sizeof(in_args), out_data); - - if (ret < 0) - return ret; - - if (*out_data =3D=3D WMAX_FAILURE_CODE) - return -EOPNOTSUPP; - - return 0; -} - -static int thermal_profile_get(struct platform_profile_handler *pprof, - enum platform_profile_option *profile) -{ - struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); - u32 out_data; - int ret; - - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_CURRENT_PROFI= LE, - 0, &out_data); - - if (ret < 0) - return ret; - - if (out_data =3D=3D WMAX_THERMAL_MODE_GMODE) { - *profile =3D PLATFORM_PROFILE_PERFORMANCE; - return 0; - } - - if (!is_wmax_thermal_code(out_data)) - return -ENODATA; - - out_data &=3D WMAX_THERMAL_MODE_MASK; - *profile =3D wmax_mode_to_platform_profile[out_data]; - - return 0; -} - -static int thermal_profile_set(struct platform_profile_handler *pprof, - enum platform_profile_option profile) -{ - struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); - - if (awcc->gmode) { - u32 gmode_status; - int ret; - - ret =3D wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS, - &gmode_status); - - if (ret < 0) - return ret; - - if ((profile =3D=3D PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || - (profile !=3D PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { - ret =3D wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_TOGGLE_GAME_SHIFT, - &gmode_status); - - if (ret < 0) - return ret; - } - } - - return wmax_thermal_control(priv->wdev, - priv->supported_thermal_profiles[profile]); -} - -static int create_thermal_profile(struct wmi_device *wdev) -{ - struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); - enum platform_profile_option profile; - enum wmax_thermal_mode mode; - u8 sys_desc[4]; - u32 first_mode; - u32 out_data; - int ret; - - ret =3D wmax_thermal_information(wdev, WMAX_OPERATION_SYS_DESCRIPTION, - 0, (u32 *) &sys_desc); - if (ret < 0) - return ret; - - first_mode =3D sys_desc[0] + sys_desc[1]; - - for (u32 i =3D 0; i < sys_desc[3]; i++) { - ret =3D wmax_thermal_information(wdev, WMAX_OPERATION_LIST_IDS, - i + first_mode, &out_data); - - if (ret =3D=3D -EIO) - return ret; - - if (ret =3D=3D -EBADRQC) - break; - - if (!is_wmax_thermal_code(out_data)) - continue; - - mode =3D out_data & WMAX_THERMAL_MODE_MASK; - profile =3D wmax_mode_to_platform_profile[mode]; - priv->supported_thermal_profiles[profile] =3D out_data; - - set_bit(profile, priv->pp_handler.choices); - } - - if (bitmap_empty(priv->pp_handler.choices, PLATFORM_PROFILE_LAST)) - return -ENODEV; - - if (awcc->gmode) { - priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D - WMAX_THERMAL_MODE_GMODE; - - set_bit(PLATFORM_PROFILE_PERFORMANCE, priv->pp_handler.choices); - } - - priv->pp_handler.profile_get =3D thermal_profile_get; - priv->pp_handler.profile_set =3D thermal_profile_set; - priv->pp_handler.name =3D "alienware-wmi"; - priv->pp_handler.dev =3D &wdev->dev; - - return platform_profile_register(&priv->pp_handler); -} - -static int alienware_awcc_setup(struct wmi_device *wdev) -{ - struct awcc_priv *priv; - - priv =3D devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - dev_set_drvdata(&wdev->dev, priv); - priv->wdev =3D wdev; - - return create_thermal_profile(wdev); -} - -static void alienware_awcc_exit(struct wmi_device *wdev) -{ - struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); - - platform_profile_remove(&priv->pp_handler); -} - /* * Platform Driver */ @@ -1073,13 +415,6 @@ static const struct attribute_group *alienfx_groups[]= =3D { NULL }; =20 -static const struct attribute_group *wmax_alienfx_groups[] =3D { - &hdmi_attribute_group, - &lifier_attribute_group, - &deepsleep_attribute_group, - NULL -}; - static struct platform_driver platform_driver =3D { .driver =3D { .name =3D "alienware-wmi", @@ -1120,188 +455,6 @@ void alienware_alienfx_exit(struct wmi_device *wdev) platform_driver_unregister(&platform_driver); } =20 -/* - * Legacy WMI driver - */ -static int legacy_wmi_update_led(struct alienfx_priv *priv, - struct wmi_device *wdev, u8 location) -{ - struct legacy_led_args legacy_args =3D { - .colors =3D priv->colors[location], - .brightness =3D priv->global_brightness, - .state =3D 0, - }; - struct acpi_buffer input; - acpi_status status; - - if (legacy_args.state !=3D LEGACY_RUNNING) { - legacy_args.state =3D priv->lighting_control_state; - - input.length =3D sizeof(legacy_args); - input.pointer =3D &legacy_args; - - status =3D wmi_evaluate_method(LEGACY_POWER_CONTROL_GUID, 0, - location + 1, &input, NULL); - if (ACPI_FAILURE(status)) - return -EIO; - - return 0; - } - - return alienware_wmi_command(wdev, location + 1, &legacy_args, - sizeof(legacy_args), NULL); -} - -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) -{ - struct alienfx_platdata pdata =3D { - .wdev =3D wdev, - .ops =3D { - .upd_led =3D legacy_wmi_update_led, - .upd_brightness =3D legacy_wmi_update_brightness, - }, - }; - - return alienware_alienfx_setup(&pdata); -} - -static void legacy_wmi_remove(struct wmi_device *wdev) -{ - alienware_alienfx_exit(wdev); -} - -static struct wmi_device_id alienware_legacy_device_id_table[] =3D { - { LEGACY_CONTROL_GUID, NULL }, - { }, -}; -MODULE_DEVICE_TABLE(wmi, alienware_legacy_device_id_table); - -static struct wmi_driver alienware_legacy_wmi_driver =3D { - .driver =3D { - .name =3D "alienware-wmi-alienfx", - .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, - }, - .id_table =3D alienware_legacy_device_id_table, - .probe =3D legacy_wmi_probe, - .remove =3D legacy_wmi_remove, -}; - -int __init alienware_legacy_wmi_init(void) -{ - return wmi_driver_register(&alienware_legacy_wmi_driver); -} - -void __exit alienware_legacy_wmi_exit(void) -{ - wmi_driver_unregister(&alienware_legacy_wmi_driver); -} - -/* - * WMAX WMI driver - */ -static int wmax_wmi_update_led(struct alienfx_priv *priv, - struct wmi_device *wdev, u8 location) -{ - struct wmax_led_args in_args =3D { - .led_mask =3D 1 << location, - .colors =3D priv->colors[location], - .state =3D priv->lighting_control_state, - }; - - return alienware_wmi_command(wdev, WMAX_METHOD_ZONE_CONTROL, &in_args, - sizeof(in_args), NULL); -} - -static int wmax_wmi_update_brightness(struct alienfx_priv *priv, - struct wmi_device *wdev, u8 brightness) -{ - struct wmax_brightness_args in_args =3D { - .led_mask =3D 0xFF, - .percentage =3D brightness, - }; - - return alienware_wmi_command(wdev, WMAX_METHOD_BRIGHTNESS, &in_args, - sizeof(in_args), NULL); -} - -static int wmax_wmi_probe(struct wmi_device *wdev, const void *context) -{ - struct alienfx_platdata pdata =3D { - .wdev =3D wdev, - .ops =3D { - .upd_led =3D wmax_wmi_update_led, - .upd_brightness =3D wmax_wmi_update_brightness, - }, - }; - struct platform_device *pdev; - int ret; - - if (awcc) { - ret =3D alienware_awcc_setup(wdev); - } else { - ret =3D alienware_alienfx_setup(&pdata); - if (ret < 0) - return ret; - - pdev =3D dev_get_drvdata(&wdev->dev); - ret =3D device_add_groups(&pdev->dev, wmax_alienfx_groups); - } - - return ret; -} - -static void wmax_wmi_remove(struct wmi_device *wdev) -{ - if (awcc) - alienware_awcc_exit(wdev); - else - alienware_alienfx_exit(wdev); -} - -static struct wmi_device_id alienware_wmax_device_id_table[] =3D { - { WMAX_CONTROL_GUID, NULL }, - { }, -}; -MODULE_DEVICE_TABLE(wmi, alienware_wmax_device_id_table); - -static struct wmi_driver alienware_wmax_wmi_driver =3D { - .driver =3D { - .name =3D "alienware-wmi-wmax", - .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, - }, - .id_table =3D alienware_wmax_device_id_table, - .probe =3D wmax_wmi_probe, - .remove =3D wmax_wmi_remove, -}; - -int __init alienware_wmax_wmi_init(void) -{ - const struct dmi_system_id *id; - - id =3D dmi_first_match(awcc_dmi_table); - if (id) - awcc =3D id->driver_data; - - if (force_platform_profile) - awcc =3D &x_series_features; - - if (force_gmode) - awcc =3D &g_series_features; - - return wmi_driver_register(&alienware_wmax_wmi_driver); -} - -void __exit alienware_wmax_wmi_exit(void) -{ - wmi_driver_unregister(&alienware_wmax_wmi_driver); -} - static int __init alienware_wmi_init(void) { int ret; diff --git a/drivers/platform/x86/dell/alienware-wmi-legacy.c b/drivers/pla= tform/x86/dell/alienware-wmi-legacy.c new file mode 100644 index 000000000000..b53a931f97b5 --- /dev/null +++ b/drivers/platform/x86/dell/alienware-wmi-legacy.c @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Alienware LEGACY WMI device driver + * + * Copyright (C) 2024 Kurt Borja + */ + +#include +#include "alienware-wmi.h" + +struct legacy_led_args { + struct color_platform colors; + u8 brightness; + u8 state; +} __packed; + + +/* + * Legacy WMI driver + */ +static int legacy_wmi_update_led(struct alienfx_priv *priv, + struct wmi_device *wdev, u8 location) +{ + struct legacy_led_args legacy_args =3D { + .colors =3D priv->colors[location], + .brightness =3D priv->global_brightness, + .state =3D 0, + }; + struct acpi_buffer input; + acpi_status status; + + if (legacy_args.state !=3D LEGACY_RUNNING) { + legacy_args.state =3D priv->lighting_control_state; + + input.length =3D sizeof(legacy_args); + input.pointer =3D &legacy_args; + + status =3D wmi_evaluate_method(LEGACY_POWER_CONTROL_GUID, 0, + location + 1, &input, NULL); + if (ACPI_FAILURE(status)) + return -EIO; + + return 0; + } + + return alienware_wmi_command(wdev, location + 1, &legacy_args, + sizeof(legacy_args), NULL); +} + +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) +{ + struct alienfx_platdata pdata =3D { + .wdev =3D wdev, + .ops =3D { + .upd_led =3D legacy_wmi_update_led, + .upd_brightness =3D legacy_wmi_update_brightness, + }, + }; + + return alienware_alienfx_setup(&pdata); +} + +static void legacy_wmi_remove(struct wmi_device *wdev) +{ + alienware_alienfx_exit(wdev); +} + +static struct wmi_device_id alienware_legacy_device_id_table[] =3D { + { LEGACY_CONTROL_GUID, NULL }, + { }, +}; +MODULE_DEVICE_TABLE(wmi, alienware_legacy_device_id_table); + +static struct wmi_driver alienware_legacy_wmi_driver =3D { + .driver =3D { + .name =3D "alienware-wmi-alienfx", + .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, + }, + .id_table =3D alienware_legacy_device_id_table, + .probe =3D legacy_wmi_probe, + .remove =3D legacy_wmi_remove, +}; + +int __init alienware_legacy_wmi_init(void) +{ + return wmi_driver_register(&alienware_legacy_wmi_driver); +} + +void __exit alienware_legacy_wmi_exit(void) +{ + wmi_driver_unregister(&alienware_legacy_wmi_driver); +} diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c new file mode 100644 index 000000000000..597be9e6d19c --- /dev/null +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -0,0 +1,775 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Alienware WMAX WMI device driver + * + * Copyright (C) 2024 Kurt Borja + */ + +#include +#include +#include +#include +#include +#include +#include "alienware-wmi.h" + +#define WMAX_METHOD_HDMI_SOURCE 0x1 +#define WMAX_METHOD_HDMI_STATUS 0x2 +#define WMAX_METHOD_HDMI_CABLE 0x5 +#define WMAX_METHOD_AMPLIFIER_CABLE 0x6 +#define WMAX_METHOD_DEEP_SLEEP_CONTROL 0x0B +#define WMAX_METHOD_DEEP_SLEEP_STATUS 0x0C +#define WMAX_METHOD_BRIGHTNESS 0x3 +#define WMAX_METHOD_ZONE_CONTROL 0x4 +#define WMAX_METHOD_THERMAL_INFORMATION 0x14 +#define WMAX_METHOD_THERMAL_CONTROL 0x15 +#define WMAX_METHOD_GAME_SHIFT_STATUS 0x25 + +#define WMAX_THERMAL_MODE_GMODE 0xAB + +#define WMAX_FAILURE_CODE 0xFFFFFFFF +#define WMAX_THERMAL_TABLE_MASK GENMASK(7, 4) +#define WMAX_THERMAL_MODE_MASK GENMASK(3, 0) +#define WMAX_SENSOR_ID_MASK BIT(8) + +static bool force_platform_profile; +module_param_unsafe(force_platform_profile, bool, 0); +MODULE_PARM_DESC(force_platform_profile, "Forces auto-detecting thermal pr= ofiles without checking if WMI thermal backend is available"); + +static bool force_gmode; +module_param_unsafe(force_gmode, bool, 0); +MODULE_PARM_DESC(force_gmode, "Forces G-Mode when performance profile is s= elected"); + +struct awcc_quirks { + bool gmode; +}; + +static struct awcc_quirks g_series_features =3D { + .gmode =3D true, +}; + +static struct awcc_quirks x_series_features =3D { + .gmode =3D false, +}; + +static const struct dmi_system_id awcc_dmi_table[] __initconst =3D { + { + .ident =3D "Alienware m17 R5", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Alienware m18 R2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18 R2"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Alienware x15 R1", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15 R1"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Alienware x17 R2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x17 R2"), + }, + .driver_data =3D &x_series_features, + }, + { + .ident =3D "Dell Inc. G15 5510", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5510"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G15 5511", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5511"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G15 5515", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G3 3500", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "G3 3500"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G3 3590", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "G3 3590"), + }, + .driver_data =3D &g_series_features, + }, + { + .ident =3D "Dell Inc. G5 5500", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "G5 5500"), + }, + .driver_data =3D &g_series_features, + }, +}; + +enum WMAX_THERMAL_INFORMATION_OPERATIONS { + WMAX_OPERATION_SYS_DESCRIPTION =3D 0x02, + WMAX_OPERATION_LIST_IDS =3D 0x03, + WMAX_OPERATION_CURRENT_PROFILE =3D 0x0B, +}; + +enum WMAX_THERMAL_CONTROL_OPERATIONS { + WMAX_OPERATION_ACTIVATE_PROFILE =3D 0x01, +}; + +enum WMAX_GAME_SHIFT_STATUS_OPERATIONS { + WMAX_OPERATION_TOGGLE_GAME_SHIFT =3D 0x01, + WMAX_OPERATION_GET_GAME_SHIFT_STATUS =3D 0x02, +}; + +enum WMAX_THERMAL_TABLES { + WMAX_THERMAL_TABLE_BASIC =3D 0x90, + WMAX_THERMAL_TABLE_USTT =3D 0xA0, +}; + +enum wmax_thermal_mode { + THERMAL_MODE_USTT_BALANCED, + THERMAL_MODE_USTT_BALANCED_PERFORMANCE, + THERMAL_MODE_USTT_COOL, + THERMAL_MODE_USTT_QUIET, + THERMAL_MODE_USTT_PERFORMANCE, + THERMAL_MODE_USTT_LOW_POWER, + THERMAL_MODE_BASIC_QUIET, + THERMAL_MODE_BASIC_BALANCED, + THERMAL_MODE_BASIC_BALANCED_PERFORMANCE, + THERMAL_MODE_BASIC_PERFORMANCE, + THERMAL_MODE_LAST, +}; + +struct wmax_led_args { + u32 led_mask; + struct color_platform colors; + u8 state; +} __packed; + +struct wmax_brightness_args { + u32 led_mask; + u32 percentage; +}; + +struct wmax_basic_args { + u8 arg; +}; + +struct wmax_u32_args { + u8 operation; + u8 arg1; + u8 arg2; + u8 arg3; +}; + +struct awcc_priv { + struct wmi_device *wdev; + struct platform_profile_handler pp_handler; + enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; +}; + +static const enum platform_profile_option wmax_mode_to_platform_profile[TH= ERMAL_MODE_LAST] =3D { + [THERMAL_MODE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [THERMAL_MODE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, + [THERMAL_MODE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, + [THERMAL_MODE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, + [THERMAL_MODE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, + [THERMAL_MODE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, + [THERMAL_MODE_BASIC_QUIET] =3D PLATFORM_PROFILE_QUIET, + [THERMAL_MODE_BASIC_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [THERMAL_MODE_BASIC_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_P= ERFORMANCE, + [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, +}; + +struct awcc_quirks *awcc; + +/* + * The HDMI mux sysfs node indicates the status of the HDMI input mux. + * It can toggle between standard system GPU output and HDMI input. + */ +static ssize_t cable_show(struct device *dev, struct device_attribute *att= r, + char *buf) +{ + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); + struct wmax_basic_args in_args =3D { + .arg =3D 0, + }; + u32 out_data; + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_CABLE, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { + if (out_data =3D=3D 0) + return sysfs_emit(buf, "[unconnected] connected unknown\n"); + else if (out_data =3D=3D 1) + return sysfs_emit(buf, "unconnected [connected] unknown\n"); + } + + pr_err("alienware-wmi: unknown HDMI cable status: %d\n", ret); + return sysfs_emit(buf, "unconnected connected [unknown]\n"); +} + +static ssize_t source_show(struct device *dev, struct device_attribute *at= tr, + char *buf) +{ + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); + struct wmax_basic_args in_args =3D { + .arg =3D 0, + }; + u32 out_data; + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_STATUS, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { + if (out_data =3D=3D 1) + return sysfs_emit(buf, "[input] gpu unknown\n"); + else if (out_data =3D=3D 2) + return sysfs_emit(buf, "input [gpu] unknown\n"); + } + + pr_err("alienware-wmi: unknown HDMI source status: %u\n", ret); + return sysfs_emit(buf, "input gpu [unknown]\n"); +} + +static ssize_t source_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) +{ + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); + struct wmax_basic_args args; + int ret; + + if (strcmp(buf, "gpu\n") =3D=3D 0) + args.arg =3D 1; + else if (strcmp(buf, "input\n") =3D=3D 0) + args.arg =3D 2; + else + args.arg =3D 3; + pr_debug("alienware-wmi: setting hdmi to %d : %s", args.arg, buf); + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_HDMI_SOURCE, &args, + sizeof(args), NULL); + + if (ret < 0) + pr_err("alienware-wmi: HDMI toggle failed: results: %u\n", ret); + + return count; +} + +static DEVICE_ATTR_RO(cable); +static DEVICE_ATTR_RW(source); + +static bool hdmi_group_visible(struct kobject *kobj) +{ + struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return priv->quirks->hdmi_mux; +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(hdmi); + +static struct attribute *hdmi_attrs[] =3D { + &dev_attr_cable.attr, + &dev_attr_source.attr, + NULL, +}; + +static const struct attribute_group hdmi_attribute_group =3D { + .name =3D "hdmi", + .is_visible =3D SYSFS_GROUP_VISIBLE(hdmi), + .attrs =3D hdmi_attrs, +}; + +/* + * Alienware GFX amplifier support + * - Currently supports reading cable status + * - Leaving expansion room to possibly support dock/undock events later + */ +static ssize_t status_show(struct device *dev, struct device_attribute *at= tr, + char *buf) +{ + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); + struct wmax_basic_args in_args =3D { + .arg =3D 0, + }; + u32 out_data; + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_AMPLIFIER_CABLE, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { + if (out_data =3D=3D 0) + return sysfs_emit(buf, "[unconnected] connected unknown\n"); + else if (out_data =3D=3D 1) + return sysfs_emit(buf, "unconnected [connected] unknown\n"); + } + + pr_err("alienware-wmi: unknown amplifier cable status: %d\n", ret); + return sysfs_emit(buf, "unconnected connected [unknown]\n"); +} + +static DEVICE_ATTR_RO(status); + +static bool amplifier_group_visible(struct kobject *kobj) +{ + struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return priv->quirks->amplifier; +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(amplifier); + +static struct attribute *amplifier_attrs[] =3D { + &dev_attr_status.attr, + NULL, +}; + +static const struct attribute_group amplifier_attribute_group =3D { + .name =3D "amplifier", + .is_visible =3D SYSFS_GROUP_VISIBLE(amplifier), + .attrs =3D amplifier_attrs, +}; + +/* + * Deep Sleep Control support + * - Modifies BIOS setting for deep sleep control allowing extra wakeup ev= ents + */ +static ssize_t deepsleep_show(struct device *dev, struct device_attribute = *attr, + char *buf) +{ + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); + struct wmax_basic_args in_args =3D { + .arg =3D 0, + }; + u32 out_data; + int ret; + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_DEEP_SLEEP_STATUS, + &in_args, sizeof(in_args), &out_data); + + if (!ret) { + if (out_data =3D=3D 0) + return sysfs_emit(buf, "[disabled] s5 s5_s4\n"); + else if (out_data =3D=3D 1) + return sysfs_emit(buf, "disabled [s5] s5_s4\n"); + else if (out_data =3D=3D 2) + return sysfs_emit(buf, "disabled s5 [s5_s4]\n"); + } + + pr_err("alienware-wmi: unknown deep sleep status: %d\n", ret); + return sysfs_emit(buf, "disabled s5 s5_s4 [unknown]\n"); +} + +static ssize_t deepsleep_store(struct device *dev, struct device_attribute= *attr, + const char *buf, size_t count) +{ + struct alienfx_platdata *pdata =3D dev_get_platdata(dev); + struct wmax_basic_args args; + int ret; + + if (strcmp(buf, "disabled\n") =3D=3D 0) + args.arg =3D 0; + else if (strcmp(buf, "s5\n") =3D=3D 0) + args.arg =3D 1; + else + args.arg =3D 2; + pr_debug("alienware-wmi: setting deep sleep to %d : %s", args.arg, buf); + + ret =3D alienware_wmi_command(pdata->wdev, WMAX_METHOD_DEEP_SLEEP_CONTROL, + &args, sizeof(args), NULL); + + if (!ret) + pr_err("alienware-wmi: deep sleep control failed: results: %u\n", ret); + + return count; +} + +static DEVICE_ATTR_RW(deepsleep); + +static bool deepsleep_group_visible(struct kobject *kobj) +{ + struct alienfx_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return priv->quirks->deepslp; +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(deepsleep); + +static struct attribute *deepsleep_attrs[] =3D { + &dev_attr_deepsleep.attr, + NULL, +}; + +static const struct attribute_group deepsleep_attribute_group =3D { + .name =3D "deepsleep", + .is_visible =3D SYSFS_GROUP_VISIBLE(deepsleep), + .attrs =3D deepsleep_attrs, +}; + +static const struct attribute_group *wmax_alienfx_groups[] =3D { + &hdmi_attribute_group, + &lifier_attribute_group, + &deepsleep_attribute_group, + NULL +}; + +/* + * Thermal Profile control + * - Provides thermal profile control through the Platform Profile API + */ +static bool is_wmax_thermal_code(u32 code) +{ + if (code & WMAX_SENSOR_ID_MASK) + return false; + + if ((code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_LAST) + return false; + + if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_BASIC && + (code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_BASIC_QUIET) + return true; + + if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_USTT && + (code & WMAX_THERMAL_MODE_MASK) <=3D THERMAL_MODE_USTT_LOW_POWER) + return true; + + return false; +} + +static int wmax_thermal_information(struct wmi_device *wdev, u8 operation, + u8 arg, u32 *out_data) +{ + struct wmax_u32_args in_args =3D { + .operation =3D operation, + .arg1 =3D arg, + .arg2 =3D 0, + .arg3 =3D 0, + }; + int ret; + + ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_INFORMATION, + &in_args, sizeof(in_args), out_data); + if (ret < 0) + return ret; + + if (*out_data =3D=3D WMAX_FAILURE_CODE) + return -EBADRQC; + + return 0; +} + +static int wmax_thermal_control(struct wmi_device *wdev, u8 profile) +{ + struct wmax_u32_args in_args =3D { + .operation =3D WMAX_OPERATION_ACTIVATE_PROFILE, + .arg1 =3D profile, + .arg2 =3D 0, + .arg3 =3D 0, + }; + u32 out_data; + int ret; + + ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_CONTROL, + &in_args, sizeof(in_args), &out_data); + if (ret) + return ret; + + if (out_data =3D=3D WMAX_FAILURE_CODE) + return -EBADRQC; + + return 0; +} + +static int wmax_game_shift_status(struct wmi_device *wdev, u8 operation, + u32 *out_data) +{ + struct wmax_u32_args in_args =3D { + .operation =3D operation, + .arg1 =3D 0, + .arg2 =3D 0, + .arg3 =3D 0, + }; + int ret; + + ret =3D alienware_wmi_command(wdev, WMAX_METHOD_GAME_SHIFT_STATUS, + &in_args, sizeof(in_args), out_data); + + if (ret < 0) + return ret; + + if (*out_data =3D=3D WMAX_FAILURE_CODE) + return -EOPNOTSUPP; + + return 0; +} + +static int thermal_profile_get(struct platform_profile_handler *pprof, + enum platform_profile_option *profile) +{ + struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); + u32 out_data; + int ret; + + ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_CURRENT_PROFI= LE, + 0, &out_data); + + if (ret < 0) + return ret; + + if (out_data =3D=3D WMAX_THERMAL_MODE_GMODE) { + *profile =3D PLATFORM_PROFILE_PERFORMANCE; + return 0; + } + + if (!is_wmax_thermal_code(out_data)) + return -ENODATA; + + out_data &=3D WMAX_THERMAL_MODE_MASK; + *profile =3D wmax_mode_to_platform_profile[out_data]; + + return 0; +} + +static int thermal_profile_set(struct platform_profile_handler *pprof, + enum platform_profile_option profile) +{ + struct awcc_priv *priv =3D container_of(pprof, struct awcc_priv, pp_handl= er); + + if (awcc->gmode) { + u32 gmode_status; + int ret; + + ret =3D wmax_game_shift_status(priv->wdev, + WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + &gmode_status); + + if (ret < 0) + return ret; + + if ((profile =3D=3D PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || + (profile !=3D PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { + ret =3D wmax_game_shift_status(priv->wdev, + WMAX_OPERATION_TOGGLE_GAME_SHIFT, + &gmode_status); + + if (ret < 0) + return ret; + } + } + + return wmax_thermal_control(priv->wdev, + priv->supported_thermal_profiles[profile]); +} + +static int create_thermal_profile(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + enum platform_profile_option profile; + enum wmax_thermal_mode mode; + u8 sys_desc[4]; + u32 first_mode; + u32 out_data; + int ret; + + ret =3D wmax_thermal_information(wdev, WMAX_OPERATION_SYS_DESCRIPTION, + 0, (u32 *) &sys_desc); + if (ret < 0) + return ret; + + first_mode =3D sys_desc[0] + sys_desc[1]; + + for (u32 i =3D 0; i < sys_desc[3]; i++) { + ret =3D wmax_thermal_information(wdev, WMAX_OPERATION_LIST_IDS, + i + first_mode, &out_data); + + if (ret =3D=3D -EIO) + return ret; + + if (ret =3D=3D -EBADRQC) + break; + + if (!is_wmax_thermal_code(out_data)) + continue; + + mode =3D out_data & WMAX_THERMAL_MODE_MASK; + profile =3D wmax_mode_to_platform_profile[mode]; + priv->supported_thermal_profiles[profile] =3D out_data; + + set_bit(profile, priv->pp_handler.choices); + } + + if (bitmap_empty(priv->pp_handler.choices, PLATFORM_PROFILE_LAST)) + return -ENODEV; + + if (awcc->gmode) { + priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D + WMAX_THERMAL_MODE_GMODE; + + set_bit(PLATFORM_PROFILE_PERFORMANCE, priv->pp_handler.choices); + } + + priv->pp_handler.profile_get =3D thermal_profile_get; + priv->pp_handler.profile_set =3D thermal_profile_set; + priv->pp_handler.name =3D "alienware-wmi"; + priv->pp_handler.dev =3D &wdev->dev; + + return platform_profile_register(&priv->pp_handler); +} + +static int alienware_awcc_setup(struct wmi_device *wdev) +{ + struct awcc_priv *priv; + int ret; + + priv =3D devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + dev_set_drvdata(&wdev->dev, priv); + priv->wdev =3D wdev; + + ret =3D create_thermal_profile(wdev); + if (ret < 0) + return ret; + + return 0; +} + +static void alienware_awcc_exit(struct wmi_device *wdev) +{ + struct awcc_priv *priv; + + priv =3D dev_get_drvdata(&wdev->dev); + + platform_profile_remove(&priv->pp_handler); +} + +/* + * WMAX WMI driver + */ +static int wmax_wmi_update_led(struct alienfx_priv *priv, + struct wmi_device *wdev, u8 location) +{ + struct wmax_led_args in_args =3D { + .led_mask =3D 1 << location, + .colors =3D priv->colors[location], + .state =3D priv->lighting_control_state, + }; + + return alienware_wmi_command(wdev, WMAX_METHOD_ZONE_CONTROL, &in_args, + sizeof(in_args), NULL); +} + +static int wmax_wmi_update_brightness(struct alienfx_priv *priv, + struct wmi_device *wdev, u8 brightness) +{ + struct wmax_brightness_args in_args =3D { + .led_mask =3D 0xFF, + .percentage =3D brightness, + }; + + return alienware_wmi_command(wdev, WMAX_METHOD_BRIGHTNESS, &in_args, + sizeof(in_args), NULL); +} + +static int wmax_wmi_probe(struct wmi_device *wdev, const void *context) +{ + struct alienfx_platdata pdata =3D { + .wdev =3D wdev, + .ops =3D { + .upd_led =3D wmax_wmi_update_led, + .upd_brightness =3D wmax_wmi_update_brightness, + }, + }; + struct platform_device *pdev; + int ret =3D 0; + + if (awcc) { + ret =3D alienware_awcc_setup(wdev); + } else { + ret =3D alienware_alienfx_setup(&pdata); + if (ret < 0) + return ret; + + pdev =3D dev_get_drvdata(&wdev->dev); + ret =3D device_add_groups(&pdev->dev, wmax_alienfx_groups); + } + + return ret; +} + +static void wmax_wmi_remove(struct wmi_device *wdev) +{ + if (awcc) + alienware_awcc_exit(wdev); + else + alienware_alienfx_exit(wdev); +} + +static struct wmi_device_id alienware_wmax_device_id_table[] =3D { + { WMAX_CONTROL_GUID, NULL }, + { }, +}; +MODULE_DEVICE_TABLE(wmi, alienware_wmax_device_id_table); + +static struct wmi_driver alienware_wmax_wmi_driver =3D { + .driver =3D { + .name =3D "alienware-wmi-wmax", + .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, + }, + .id_table =3D alienware_wmax_device_id_table, + .probe =3D wmax_wmi_probe, + .remove =3D wmax_wmi_remove, +}; + +int __init alienware_wmax_wmi_init(void) +{ + const struct dmi_system_id *id; + + id =3D dmi_first_match(awcc_dmi_table); + if (id) + awcc =3D id->driver_data; + + if (force_platform_profile) + awcc =3D &x_series_features; + + if (force_gmode) + awcc =3D &g_series_features; + + return wmi_driver_register(&alienware_wmax_wmi_driver); +} + +void __exit alienware_wmax_wmi_exit(void) +{ + wmi_driver_unregister(&alienware_wmax_wmi_driver); +} --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f50.google.com (mail-vs1-f50.google.com [209.85.217.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB32C1A0AF1; Sun, 29 Dec 2024 19:47:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501662; cv=none; b=UwLYNEbKhvXtIS+zt5qjMQSvQcjXVQmdCfOIDgDylackLtgBZ6ndPJsi4WslqHaWophHW0lYhFcdnGOgL5UlrCJ6FTMl5RsOq+3wH0xpoPPp16eg1G2yGxpBblnde3WTtpN+ea2HMOkgjaEIBC84wWHkplXSLhumEfy4VCCmxhw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501662; c=relaxed/simple; bh=fYOgJwgKTd4DHoTXBUjVryZrq6+FTwe5bLkfajCUcZw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A5jIJT6651/RJBEhaYJFtJtlz+QUVbqENkylcJZzBoJB9YOC0nP5sVmzcnD94P8YKogsnFt3ZcIKBx0SpyE7548Ev/Ai/z4mOlZg55RhqkaNuOGrgJswwjV+HVdeP52KT4I8VRXAnEf6sGEwFyotvxYw+zFwtyxo4lrFexsAXJw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mkqHIM/P; arc=none smtp.client-ip=209.85.217.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mkqHIM/P" Received: by mail-vs1-f50.google.com with SMTP id ada2fe7eead31-4affab62589so2159125137.1; Sun, 29 Dec 2024 11:47:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501659; x=1736106459; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wzql+0NbG6E8T/ZwGnUcjMqpNG9BOV0R9Dxh4H3SXlM=; b=mkqHIM/PDcEZEHYgzncZvboGDBhk6e8BgIw1PeYEv7F99KkvGn7M1t7Li5yykMbM2u TDoZQnsxl/6wXWePPSP9YkZg79p8NFB1Dr6yCAPyqEEeV0E5/I1Wi8vuFP+qHZZ44sgU KHEbhWMCqgeCCdHVO9kmNssgSufROUrkC2EzRfQ2BPa+l/XqAni1qDtZeKSJ/Is7R/of CLm0I4uOOQoi1sINsquaU2uDjCG1gkEnTy4HBHVRSZqviEHYb2RewFiTm7cP7Lh9WMyK 8Ba/10/Ton2u3CEYLL4NgbcKwyjsLhrECG35HzKMMFlxdqHIXryt+XD49KlM0V0Dnwys gGXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501659; x=1736106459; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wzql+0NbG6E8T/ZwGnUcjMqpNG9BOV0R9Dxh4H3SXlM=; b=IYYcrBmrAJ4rIt/w8z454PSVe68ZgzBdZagv7PMLISw6MErTy/KHCoxEZe0gn9+a1O m3iLedj1WzIBAg5hQd23M0RP+4d8m7e8OMFwZfvshzQ6WaCkt5BC8PeTktA2u8/EKy9h Uz9fMJUzk5g0pD0r8AGAf4ywQrwX+Sc2DdVO4cw6E/fBKitVkCsyQ3D/Fr5CUcM5dKh1 +Lxh3XRWhROvdCNzkqBkl7cpQUtkglb0cCrUv7cMrtPD64mZZk0fy/wjuR/EoxoCJpqA G1LeenJeLB+DV6zy4Bx+JpLy25fcqx/VDpyWhU7EvDzBzbF28iuYCAJGA1YthUdiSMX5 dpAA== X-Forwarded-Encrypted: i=1; AJvYcCX32258WfKUGmL6VxM79GkzOItv/R7VqQFdBXCWaj1LrIJrGiFz1b6VwPqgl1ZstpFbaaLOgabPKDQTszw=@vger.kernel.org X-Gm-Message-State: AOJu0YyzQ/i3OyzOsRSARzs2wiYWVLqR6HFdnzgEilK4H+RT3S23BVQd WNd1cTZ7kvH7bU99haHelR7YQ/q0eCmmDZRufV841zpZyKhmkixVQpt1OQ== X-Gm-Gg: ASbGncv4qyh+fS0ApJO3/izNTcQo2/Jd6zRblFHPWcOcMrjc1NBdqHBgug9VzXhEXQ3 hGa5Q/onz0TvrQS/uPtv/gGU/UQEWz7mkCY6D6qdm6KNF8REvzmewSBUZy2G3uY7Ss+fjAGdtcf sGp+DjKQiJS/7EISps69lxgth3TmBdPqler3hLATEJcNQbMHYZ+QP1drKUHX0H439LwvdtIRj2G 6Pue681IQA2pGFtIqnIofB5604PAkQrz3ZMDxm1fYeooZY9+i0+N/8HIiB2mmQM X-Google-Smtp-Source: AGHT+IGA6IViA5xdPlyOTns4/34lWCP4dO1hh+fWmrtBPqFsdmDlbsZ0dK/TOFwFqfzPq3GIxH/SFA== X-Received: by 2002:a05:6102:15a4:b0:4b1:1a3b:a62a with SMTP id ada2fe7eead31-4b2cc499d76mr29776273137.26.1735501659050; Sun, 29 Dec 2024 11:47:39 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:38 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 18/20] platform/x86: dell: Modify Makefile alignment Date: Sun, 29 Dec 2024 14:45:05 -0500 Message-ID: <20241229194506.8268-20-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add one more TAB to each line to support upcoming changes. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/Makefile | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/drivers/platform/x86/dell/Makefile b/drivers/platform/x86/dell= /Makefile index 03ba459f3d31..d5718ef34c48 100644 --- a/drivers/platform/x86/dell/Makefile +++ b/drivers/platform/x86/dell/Makefile @@ -4,27 +4,27 @@ # Dell x86 Platform-Specific Drivers # =20 -obj-$(CONFIG_ALIENWARE_WMI) +=3D alienware-wmi.o -alienware-wmi-objs :=3D alienware-wmi-base.o -alienware-wmi-y +=3D alienware-wmi-legacy.o -alienware-wmi-y +=3D alienware-wmi-wmax.o -obj-$(CONFIG_DCDBAS) +=3D dcdbas.o -obj-$(CONFIG_DELL_LAPTOP) +=3D dell-laptop.o -obj-$(CONFIG_DELL_RBTN) +=3D dell-rbtn.o -obj-$(CONFIG_DELL_RBU) +=3D dell_rbu.o -obj-$(CONFIG_DELL_PC) +=3D dell-pc.o -obj-$(CONFIG_DELL_SMBIOS) +=3D dell-smbios.o -dell-smbios-objs :=3D dell-smbios-base.o -dell-smbios-$(CONFIG_DELL_SMBIOS_WMI) +=3D dell-smbios-wmi.o -dell-smbios-$(CONFIG_DELL_SMBIOS_SMM) +=3D dell-smbios-smm.o -obj-$(CONFIG_DELL_SMO8800) +=3D dell-smo8800.o -obj-$(CONFIG_DELL_SMO8800) +=3D dell-lis3lv02d.o -obj-$(CONFIG_DELL_UART_BACKLIGHT) +=3D dell-uart-backlight.o -obj-$(CONFIG_DELL_WMI) +=3D dell-wmi.o -dell-wmi-objs :=3D dell-wmi-base.o -dell-wmi-$(CONFIG_DELL_WMI_PRIVACY) +=3D dell-wmi-privacy.o -obj-$(CONFIG_DELL_WMI_AIO) +=3D dell-wmi-aio.o -obj-$(CONFIG_DELL_WMI_DESCRIPTOR) +=3D dell-wmi-descriptor.o -obj-$(CONFIG_DELL_WMI_DDV) +=3D dell-wmi-ddv.o -obj-$(CONFIG_DELL_WMI_LED) +=3D dell-wmi-led.o -obj-$(CONFIG_DELL_WMI_SYSMAN) +=3D dell-wmi-sysman/ +obj-$(CONFIG_ALIENWARE_WMI) +=3D alienware-wmi.o +alienware-wmi-objs :=3D alienware-wmi-base.o +alienware-wmi-y +=3D alienware-wmi-legacy.o +alienware-wmi-y +=3D alienware-wmi-wmax.o +obj-$(CONFIG_DCDBAS) +=3D dcdbas.o +obj-$(CONFIG_DELL_LAPTOP) +=3D dell-laptop.o +obj-$(CONFIG_DELL_RBTN) +=3D dell-rbtn.o +obj-$(CONFIG_DELL_RBU) +=3D dell_rbu.o +obj-$(CONFIG_DELL_PC) +=3D dell-pc.o +obj-$(CONFIG_DELL_SMBIOS) +=3D dell-smbios.o +dell-smbios-objs :=3D dell-smbios-base.o +dell-smbios-$(CONFIG_DELL_SMBIOS_WMI) +=3D dell-smbios-wmi.o +dell-smbios-$(CONFIG_DELL_SMBIOS_SMM) +=3D dell-smbios-smm.o +obj-$(CONFIG_DELL_SMO8800) +=3D dell-smo8800.o +obj-$(CONFIG_DELL_SMO8800) +=3D dell-lis3lv02d.o +obj-$(CONFIG_DELL_UART_BACKLIGHT) +=3D dell-uart-backlight.o +obj-$(CONFIG_DELL_WMI) +=3D dell-wmi.o +dell-wmi-objs :=3D dell-wmi-base.o +dell-wmi-$(CONFIG_DELL_WMI_PRIVACY) +=3D dell-wmi-privacy.o +obj-$(CONFIG_DELL_WMI_AIO) +=3D dell-wmi-aio.o +obj-$(CONFIG_DELL_WMI_DESCRIPTOR) +=3D dell-wmi-descriptor.o +obj-$(CONFIG_DELL_WMI_DDV) +=3D dell-wmi-ddv.o +obj-$(CONFIG_DELL_WMI_LED) +=3D dell-wmi-led.o +obj-$(CONFIG_DELL_WMI_SYSMAN) +=3D dell-wmi-sysman/ --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-ua1-f52.google.com (mail-ua1-f52.google.com [209.85.222.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8D4819CC08; Sun, 29 Dec 2024 19:47:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501664; cv=none; b=u08wINVIzX0PhogH7O3C22IKUFTahKJ6XpjNvE3V7BG4FmqtzLYrMLIeTbuRS5HXtO3kbniZSPKT20RngVgRaoNaeEAjQ/8NPKxlZjoqBK95dcrscATPuJ9LuOJ8G/XA5xY2PKEU6lTYHUB2+PjIlT4wvhhb5qWnYygbfWN9BP8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501664; c=relaxed/simple; bh=HzbGEIclIlEM9XemoHD9vKHRyM0aBa+zNp/SqhhWF/8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eq1GLAtL5x8z5LlVEj+WXPcDUL5GB4kGti8xBE5TiNcgDTq0B0zCDktBb/CF9iEggBwKqj5foOmeLdpJjKVri+mLIH5IPBQ4SUSow8YP+zZKkBPuxFR9DVsTvEt0c+zQ7P+qxDNP5vUjZJB5wgE1taGEn+HfBzO/rCazCu6TmZ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RLw3su6H; arc=none smtp.client-ip=209.85.222.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RLw3su6H" Received: by mail-ua1-f52.google.com with SMTP id a1e0cc1a2514c-85b88a685e6so3577323241.2; Sun, 29 Dec 2024 11:47:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501661; x=1736106461; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=B6ajtEr9BoQ+Z2rv8v7sYGFTSjGW6Mt5CIO3J5hN+R4=; b=RLw3su6HKAhBzndaqTG6edWCTLZ+vNxoEQEeRp3pQXM3MfGFrf0mLmVeg8s1R+EQKY VjujUzxC21xR/FbxUKjiJ5fm6OszE5jCUh2wUFXDHb9q2djMBmrPHZiNY7BPSf83+Mgd 81OyO8cEDIm6+Wtx/AwJQXdDduPg7gY6PeCYAT8CGRfAKgJcnbZTN/eDuh2diifhskJq wYd6HnmOmH7MVbEW5WhsINZ5kynYSnL9HvB4ll1XfCG0EzEo8RFhdCXMTD/zDeZHY5Oh rbChjPt5PLtdWLrsJJL/zSBlwbSRWUjuDG86eX6JBls+k2xRCcblyw1x815nJ5NReMXQ NGGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501661; x=1736106461; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B6ajtEr9BoQ+Z2rv8v7sYGFTSjGW6Mt5CIO3J5hN+R4=; b=n5JYehLabkYUyAD5whLZP36Q8/S8vzJ43bmzf2GmOeJWQTZaH4AwGROfVSR8rPR9oc TRaCfqDdzQN+s6avDsfMcvv0e4SrLagFc/xqarQXH4uKEs523cg4boI4Kj9KOJCwiFhs MeUgzRCTOFGMwgQJo4FwAM96VRjcQBiH8nHy0dlUQ9v/ppLHaYCXt+oJIOpUcsoAAuji g7ECQ2wAvZjdrTQcsSMFXEQZf3arvyrMIjUofpDevINMNzRGpSyfVQGsu9PUlf+uLs11 Wr+t+hIlJ+PUYsWtS4gbdfeyYJYfGWlCjbBZtUwOv1MPz59rTZT3IqgeN3WHeWsjMv+p Nusw== X-Forwarded-Encrypted: i=1; AJvYcCXZbSkyUDtS5fAYaXa36sl78+JkL6kX+Ir9wZxqaVGGXsGhJwnkY93Em8h3+lIFo2cxfIxv0GNJH7HQ4Fc=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9OShO0uqN5YwzzjjEKyYTYedj2Z+9gT6jD4DyUEGCr4iltOft Bt4b39CxQ22Ea4kPV1ifAqKrqL4oDIhxVszjsaUrhVoto+PQUq/UooB6wA== X-Gm-Gg: ASbGncsYsi/ToJ+UOJEdy8y2r6v2MKhiKmlYCtTtmGNdCTniQNt/qGS2IFKPh2hZbmz +6IClTidgx3BnLwXqbPhbEeVEfhsuIsDbI+hF50Fey4wnV970fwnjJreaolJaGKlpF+Cbyjh/JF HUUjJMg18GI/QAc/wxIrMTEZmkUmE9qTwadLoHsclUXQ8gHR+MUzWHOb2kwHYv2u9/TtjA2hgB5 fEJu/wiInSc2hlb7Ueje0cW3IRBI1Br9s/3RWYdLGp5TvBMo8Pd+9zwnajyKdyl X-Google-Smtp-Source: AGHT+IG5EvukNEKmTyZ7U2mTigQEn4ga4xN6nDKYWRYiYf+i4+/dHh9XvrkX3fBUriL4t1E+LlzQ3Q== X-Received: by 2002:a05:6102:5689:b0:4af:b94a:3c3e with SMTP id ada2fe7eead31-4b2cc322226mr25267446137.5.1735501661558; Sun, 29 Dec 2024 11:47:41 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:40 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja Subject: [PATCH v2 19/20] platform/x86: Update alienware-wmi config entries Date: Sun, 29 Dec 2024 14:45:06 -0500 Message-ID: <20241229194506.8268-21-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add config entries for each WMI driver managed by the alienware-wmi module to be able to conditionally compile them. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- drivers/platform/x86/dell/Kconfig | 30 +++++++++++++++++++---- drivers/platform/x86/dell/Makefile | 4 +-- drivers/platform/x86/dell/alienware-wmi.h | 23 +++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/= Kconfig index d09060aedd3f..f8a0dffcaab7 100644 --- a/drivers/platform/x86/dell/Kconfig +++ b/drivers/platform/x86/dell/Kconfig @@ -18,15 +18,35 @@ config ALIENWARE_WMI tristate "Alienware Special feature control" default m depends on ACPI + depends on ACPI_WMI + depends on DMI depends on LEDS_CLASS depends on NEW_LEDS - depends on ACPI_WMI + help + This is a driver for controlling Alienware WMI driven features. + + On legacy devices, it exposes an interface for controlling the AlienFX + zones on Alienware machines that don't contain a dedicated + AlienFX USB MCU such as the X51 and X51-R2. + + On newer devices, it exposes the AWCC thermal control interface through + known Kernel APIs. + +config ALIENWARE_WMI_LEGACY + bool "Alienware Legacy WMI device driver" + default y + depends on ALIENWARE_WMI + help + Legacy Alienware WMI driver with AlienFX LED control capabilities. + +config ALIENWARE_WMI_WMAX + bool "Alienware WMAX WMI device driver" + default y + depends on ALIENWARE_WMI select ACPI_PLATFORM_PROFILE help - This is a driver for controlling Alienware BIOS driven - features. It exposes an interface for controlling the AlienFX - zones on Alienware machines that don't contain a dedicated AlienFX - USB MCU such as the X51 and X51-R2. + Alienware WMI driver with AlienFX LED, HDMI, amplifier, deep sleep and + AWCC thermal control capabilities. =20 config DCDBAS tristate "Dell Systems Management Base Driver" diff --git a/drivers/platform/x86/dell/Makefile b/drivers/platform/x86/dell= /Makefile index d5718ef34c48..8ac9a933c770 100644 --- a/drivers/platform/x86/dell/Makefile +++ b/drivers/platform/x86/dell/Makefile @@ -6,8 +6,8 @@ =20 obj-$(CONFIG_ALIENWARE_WMI) +=3D alienware-wmi.o alienware-wmi-objs :=3D alienware-wmi-base.o -alienware-wmi-y +=3D alienware-wmi-legacy.o -alienware-wmi-y +=3D alienware-wmi-wmax.o +alienware-wmi-$(CONFIG_ALIENWARE_WMI_LEGACY) +=3D alienware-wmi-legacy.o +alienware-wmi-$(CONFIG_ALIENWARE_WMI_WMAX) +=3D alienware-wmi-wmax.o obj-$(CONFIG_DCDBAS) +=3D dcdbas.o obj-$(CONFIG_DELL_LAPTOP) +=3D dell-laptop.o obj-$(CONFIG_DELL_RBTN) +=3D dell-rbtn.o diff --git a/drivers/platform/x86/dell/alienware-wmi.h b/drivers/platform/x= 86/dell/alienware-wmi.h index dccbf4f95da0..ae3731f2fef2 100644 --- a/drivers/platform/x86/dell/alienware-wmi.h +++ b/drivers/platform/x86/dell/alienware-wmi.h @@ -69,10 +69,33 @@ int alienware_wmi_command(struct wmi_device *wdev, u32 = method_id, int alienware_alienfx_setup(struct alienfx_platdata *pdata); void alienware_alienfx_exit(struct wmi_device *wdev); =20 +#if IS_ENABLED(CONFIG_ALIENWARE_WMI_LEGACY) int __init alienware_legacy_wmi_init(void); void __exit alienware_legacy_wmi_exit(void); +#else +static inline int alienware_legacy_wmi_init(void) +{ + return -ENODEV; +} =20 +static inline void alienware_legacy_wmi_exit(void) +{ +} +#endif + +#if IS_ENABLED(CONFIG_ALIENWARE_WMI_WMAX) int __init alienware_wmax_wmi_init(void); void __exit alienware_wmax_wmi_exit(void); +#else +static inline int alienware_wmax_wmi_init(void) +{ + return -ENODEV; +} + + +static inline void alienware_wmax_wmi_exit(void) +{ +} +#endif =20 #endif --=20 2.47.1 From nobody Thu Dec 18 20:22:24 2025 Received: from mail-vs1-f52.google.com (mail-vs1-f52.google.com [209.85.217.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B9E01A2383; Sun, 29 Dec 2024 19:47:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501666; cv=none; b=JkSGRGJo/bHvKhp0KW2V7jfLxKJ5wxjQcU1yX1EtGe8LXeE6pDCQpWRir4qlXHDKxmfM9bnvy8B+DssO8jkK1nzuWrqSBpygRkdYdUgPzSp8xBAcIcOPEJItNU+1Gwa3DCvvk+yz60UcpQ2PFR52Me2SBVN8A0Bp8oQRGMjjj04= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735501666; c=relaxed/simple; bh=+/CgyxykexRh3PP7SRibIHI10jg7SBL4oJjC2v0Awas=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P06LTCdbTICeCDlKyNsUMjla6NC6dRQBYReVvg+KcUATBekTXXAEeEhTheg/BDEjAh7VRddX8zKvwHrhnhJjrqToDwj2JaL4jLcwBd5U8Maod3AqRK+iBCHtFKDF1nxw2TiiTONhDHro4kW22nt6TvwDxDAmXt2OxHIXkmHx3cA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NeATIwaR; arc=none smtp.client-ip=209.85.217.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NeATIwaR" Received: by mail-vs1-f52.google.com with SMTP id ada2fe7eead31-4afed12283eso5561064137.1; Sun, 29 Dec 2024 11:47:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735501664; x=1736106464; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QxrKCZPmm5GuMIFPmXBrX3vhTmGZIQgXcL2LOAKZvIc=; b=NeATIwaRJDYsp9SeP6fvCM0c9kjtZuahmAwCrD6AMJndLzTN8KdTFtX4u5RxauR2Tm VBHSahPLmvNfpX2iZMowBSDFA7sZaky6fCs0QuNdE8Poe1WgX2LqyXPBPIs9RUprhueZ JD8MbZxGgVITuiBiIDKA6o8Qhvzgkdd5O3I3qYTkoVd9kEjsG+NqGZ33syt67V1q2mxt 4IV9tWFIi0qPagkRXxepXj9xDts8fpdNXlIwcYJpTod9RIpuUDq2Q9s88t7a9VNIdoYy EPO1HUMNFbs9kRvk9OiS4fnRnJjD96Mwf2HKpJC/iH4S9BRcyeaDWRAU3Lr+5q0J2UP0 5K0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735501664; x=1736106464; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QxrKCZPmm5GuMIFPmXBrX3vhTmGZIQgXcL2LOAKZvIc=; b=THpbABELaCTe61oqKZdjjGtZ5CLlvJLoNqLseNNiHQqWIp3XVSeKT4LsG5MPzQrZqg 6YAaaxFCCsqczvMQZJert8XXZ3UU/GNU5gChes7lzzVaANcWsBQjF7loOQO08TSo2d2h J5gS3cc4kPn/uaSfKC5IcsMKMbFt7mwkj1R+6gOiXp2MJT3eghL+CcW4LWrwVt0vU/Bz 8horLU+uTa9znFzowJ+0Y2oqD7ZyFz+PWOlvxL/t8VXLQw6QQZi5QUHBPGlOIJnPJDzL gZQFCNgOgVhFct/6wzon7/lA/mgARcH4ssZ2VTuXH5CRUtPqxNZYLaUnc1w+xTEnrWdu o6gw== X-Forwarded-Encrypted: i=1; AJvYcCW7eD2/Ywq+8f57oda7rG90E7pSXQZR6gh+W0pdW2o46fR4VRPLOeFR9qkUN8ofTh8XCRZbequVZrKvMx8=@vger.kernel.org X-Gm-Message-State: AOJu0YzW/WOCPgM7Jj1O5Nq23j4Avsqim28D8pTc00ebE4D7FJ4aUDah eEaoSJwDVuLOphJ+3AaU15n3QHIfhxQmTWN3yHfQSW/ONBuz6bCVYkrzRw== X-Gm-Gg: ASbGncvxYn7bRDB761CU4BCaCgYGfj5TZfpG1VVOCXvW7/WE+vFtdqNehmL+iPT8uV9 wQzVQMF65v9bB0YxqO5xas0n9GxG/4xaRetLSTKWoupOSKYY2WqTs5zWYo0VtPIY/hGC3KXZd8k xEXcb+Uc5Pk13etsYKyTXn+XfAS91AGVlIxABHmStKQqSyNvHUnnU7tDN043cDr1QcTdFR7WGuW oMz8FtVSCQ4BJnbqIhf9eyQpfunHgSK4sg5Ww5qfgMt0o8mmY8DPBcySltASbou X-Google-Smtp-Source: AGHT+IH9zDT3AvTXQLiA6abbVDnUnVa23F7Ma+zA416TaN24oNAgw5NTOzd/kfgwMsTrhl5Sebq98g== X-Received: by 2002:a05:6102:3050:b0:4b2:ad50:ac27 with SMTP id ada2fe7eead31-4b2cc361299mr26853285137.9.1735501664099; Sun, 29 Dec 2024 11:47:44 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:1159:1ea9:11b1:7af9:1277]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b2bf98ce0fsm3753555137.3.2024.12.29.11.47.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Dec 2024 11:47:43 -0800 (PST) From: Kurt Borja To: platform-driver-x86@vger.kernel.org Cc: Dell.Client.Kernel@dell.com, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, mario.limonciello@amd.com, w_armin@gmx.de, Kurt Borja , Armin Wolf Subject: [PATCH v2 20/20] alienware-wmi: Update header and module information Date: Sun, 29 Dec 2024 14:45:07 -0500 Message-ID: <20241229194506.8268-22-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241229194506.8268-2-kuurtb@gmail.com> References: <20241229194506.8268-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Update module header and description. Additionally add myself as a module author. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-base.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-base.c b/drivers/platf= orm/x86/dell/alienware-wmi-base.c index fd73c3881dc0..bf0f37363998 100644 --- a/drivers/platform/x86/dell/alienware-wmi-base.c +++ b/drivers/platform/x86/dell/alienware-wmi-base.c @@ -1,8 +1,9 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Alienware AlienFX control + * Alienware special feature control * * Copyright (C) 2014 Dell Inc + * Copyright (C) 2024 Kurt Borja */ =20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -15,6 +16,7 @@ #include "alienware-wmi.h" =20 MODULE_AUTHOR("Mario Limonciello "); +MODULE_AUTHOR("Kurt Borja "); MODULE_DESCRIPTION("Alienware special feature control"); MODULE_LICENSE("GPL"); =20 --=20 2.47.1