From nobody Mon Sep 28 23:07:03 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 92F8241D23B for ; Sat, 15 Aug 2026 13:26:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800377; cv=none; b=VIqA241pNEb9e8k8gEMsdvAD2g4p1JqLy2LbXAag30uJxYr/F3XvqdzxM0C0esLxTSUxNdxuWIzurphdFdSr9sMAyvoYPDjyqGDCcGYYWx8fNwbClK5ghovYpqnc/m6kKy1lT+iim/qPGobSBSWuZPgTXwdT+GVuS9KrlcsLXd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800377; c=relaxed/simple; bh=QY5aebFr1evE8tRE7OmTPb6tag7jx6XNKxf+rMRmOXQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F2a8xhz/kC1QkFfdiHO/rfdC3gimC15FU4DvHwCe4INN4cWF/p8UOmb+vr0NVnhXn3l0I+NEexHS8FBWcIQm79NAMk7ozhFdheaXVAlr9UCPRRj7ZGU8WHHgvv5cpU+UM/gFLzOxHXDCTXOf2MG6VlKHzgbrF8MD8NzxjP1gddc= 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=jxTOGfqa; arc=none smtp.client-ip=209.85.214.177 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="jxTOGfqa" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2ceaf8a1265so28879055ad.2 for ; Sat, 15 Aug 2026 06:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786800376; x=1787405176; 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:content-type; bh=A3guaqxr7NyyvixOm12MKeegXbSzy/kPgiJ95xUExEc=; b=jxTOGfqa7YPkgGNk9fL+yWewh56gjq0ffZwRsXT/1EoNj5Sfnu6NPEM8WgmaB7cCyI dhvCbTGjE8v9i5bQSZY3EQ5NFH7YG7dK4LwW5rIY8ofIisHWiX/DW7uBJ6Ew9l8tT+BD lxuKKNxAySlQkXvyxe7kcINUOS+61WC6RApdNl7Qv4BZcr4Gj5dkFsBWnOCKi14Q8BGx xshQyJs2bm5/0i+L8TzNHwSs3y7qPpH6sDsugoXA9GzAM1CRthXlexTjmqEhl8C45YnX U4gHzk58/N2Elhd08FFLGNOWVwkFkLILrsAH3dCO6KA8AoK05kVsCrnK2yJAXnlOSP0l MrhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786800376; x=1787405176; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=A3guaqxr7NyyvixOm12MKeegXbSzy/kPgiJ95xUExEc=; b=MmNVhMe0YajN1TyXfJDixxAnSsDCt8vEsavDjil+v1NqwSEu0Gyuzpeu81XNAQUzrT PSZbFPCSka8Qu5AWdOmH/bqRg5YGgdzG3Z1kdlDVuvyr0R7uVWgqPaJ+Z7fdfBvT/m3C KoX0xudzAIeNkXr9XiUCmSSuiX/IzyIYr1wnEcD38XJyEuYdMY8wXkp22iduxolXpzNx bcoNf27QDUKCViRajm/qa4bBBrSoyK50CExLTV4Yl4F2ivLHz3qCCBLU6cayGTolRalC LOC/ozc5zFZuIL1dUq9AppSMLH/MEp+Uncx/erhGKelKfOaO90/yE8A10l8jo5bwxKhv TAVA== X-Forwarded-Encrypted: i=1; AHgh+RqQuA2uNOJk8ncU2gAoDw5LfR/u+FktHQWsTGsAYBT9WI7YiHJb2wl/Kkj3U6BfG4KrWY/QDXjrzV1UGHI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2u34DO55uJ31GIqmjptakaH3ojPM3fllPMZDdpIOLs5HDruhx e+CAwIVYQ/NfrciZ+JwJHK9P7EINE57HQIg+Dd+dt+4+vFMJ9C6OHQkPaB6ILw== X-Gm-Gg: AR+sD13frZ7zl6/2yj2ELLze4Ly+oX/tRpfyTOOr0hUFHObkITOElZL8CwUcCvzwu4Y dus5pjT0Ogj9Abq/9I1Xwh0VJ7fzZfsGkYU6clsOY43vYQjaHn/dtNqx6AHF+6Ugie27uXRFijx wQx96WKjJREzPfj93c1PKoxQMoq8nMwu1L0lDdZ8nn/sqZ9mkBEErvaQ2ZXeqjc3q7mCUQKHNzt 8n4QyggJCzLdjv6PigH0HE8BGXUjEqJ3pom00sTDP6JzYqShCa1Rm9R4zKBGdRrYcfi9xPmkH/r +dAk2c3s6ATpuo3PArk7oS85pKtNmIaVhWKpBORQMjvSPfmY5nwzIU+yhAZxRGcBhAtKr5/9Xrd Wmvp+AM1TfyM3Fj4bVcqjFjqc6m4Ik1HciJjPGdjrzhAW1+rsoiUwBlaEBZ6wWXfHcI/TiJzpiC hZZF/KO098X5xV+ZPEyngEOIZVob1Y7RNETPg= X-Received: by 2002:a17:902:f64d:b0:2ca:619f:9733 with SMTP id d9443c01a7336-2d3b0c88987mr170712065ad.17.1786800376008; Sat, 15 Aug 2026 06:26:16 -0700 (PDT) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d3aebc81a6sm19433245ad.72.2026.08.15.06.26.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 06:26:15 -0700 (PDT) From: Mingyou Chen To: qby140326@gmail.com Cc: W_Armin@gmx.de, foxido@foxido.dev, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, nika@nikableh.moe, platform-driver-x86@vger.kernel.org, vlku.milos.fun@gmail.com, i@rsplwe.com, wolf109909@outlook.com Subject: [PATCH v3 1/6] MAINTAINERS: Add maintainer entry of bitland-mifs-wmi driver Date: Sat, 15 Aug 2026 21:25:42 +0800 Message-ID: <20260815132547.29022-2-qby140326@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260815132547.29022-1-qby140326@gmail.com> References: <20260815132547.29022-1-qby140326@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 new maintainer entry for the bitland-mifs-wmi platform driver. Signed-off-by: Mingyou Chen --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index f37a81950e25..af86b1df1a94 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22774,6 +22774,13 @@ L: platform-driver-x86@vger.kernel.org S: Maintained F: drivers/platform/x86/redmi-wmi.c =20 +BITLAND LAPTOP DRIVER +M: Mingyou Chen +M: Gladyshev Ilya +L: platform-driver-x86@vger.kernel.org +S: Maintained +F: drivers/platform/x86/bitland-mifs-wmi.c + REDPINE WIRELESS DRIVER L: linux-wireless@vger.kernel.org S: Orphan --=20 2.55.0 From nobody Mon Sep 28 23:07:03 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 20A9A341AC7 for ; Sat, 15 Aug 2026 13:26:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800382; cv=none; b=bNhCtAjwUzUZrWvrt2VWtRVu2cqSHyqcNZOVnJDdXZxAfaJA1kW12yfZ+sbfU+XOfDU3zsKYmPm5LSoq+EiTV7zLxEdBduLJgHSUNedI3m3KbHX6Q0+9sLcXpDI8Jt0aanoJ8/VhNjWWE1/cmHJNntfERKeu7fov16s93gGtRs4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800382; c=relaxed/simple; bh=eLsdfm+/wmYRrA7XL56lSHdnvxCg9FQMB6J7mrec6oI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BpT5QBI4TXuZvlVd1zNZZIrjCOnVrM+H9xcyzLx0Jfy2kvGKLYzzd5RKUH7llzi+AJyHZmzjzSFb/JNoC/ZgIp7rD5jkOWU4CupOxQrgdykJoZhERybDYNv4K2vWPdmtEaIYGJqJh1vkOKayVybNCuYZUNJ16qexXYgwhxeTeL0= 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=QGO8Os8d; arc=none smtp.client-ip=209.85.214.177 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="QGO8Os8d" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2ceab75934dso23798185ad.2 for ; Sat, 15 Aug 2026 06:26:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786800380; x=1787405180; 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:content-type; bh=J4z7oI4LaMfxfiL1B4zg4QF0Fah33NLbini+xhHxRRU=; b=QGO8Os8doYbRCZUq5K8oyIsj//z/OFzZTjphQeD6n+F+n4JHZvlWzVZpEUyqU8DfdZ 0sMFD6KSlit061uDlyVC8cgnekQf9tGHRzQj1h5u/e9T7/w4coLAnXCJ9DZPRFkTOWMI MLoPK/rJUDHkT/d7qILk9LAgkzaKAsNTW7ZEmW8PgG707IRiXuueGsnLjRJVuDN8aPnc 8kIX2EvVZJPkgOBDA4nFYbT8MzAjPY4OOCCr+C9Gb3swBVmpGoiA7qNX0MJygzB3DPtW KG6MGXlnGU8yWIAqOzou+RANTpKs4C635LCZ3JwhLpQm5ZCkX2QmxzJVIppKmOU/uKP3 iapQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786800380; x=1787405180; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=J4z7oI4LaMfxfiL1B4zg4QF0Fah33NLbini+xhHxRRU=; b=UibAnM+1r04roHyR9I44Zyt9W+Q+ZPVi2gyT3dTNGhqB+zTE9yBwVDyIiTGhgig0P5 8skcB7R1ZeT4Xy8bTLaMgUPnMC+i1GuthTEzFEcr2d6ZthdTWiQ0fkqwjPZdA0wR6kOo 6vZNMzmkuWAZSFM3/94G1KyJVhFoeA8mAOsYcDFiBYHHO2L6Itdl3KPAi0f6Iqon8vaY 4BRxbQu0lhKP1a5dkNlvjvEcH3wfe9Ocp6IWCKQIX8fiVPYmYLCu6tPJMrCU8sujEUTF nHQUA1174reRDpp+JTNqw1JmBQkPUj4r+jsViMi759HTLkGb255lgsvG2D/DBN5waLTa fc/Q== X-Forwarded-Encrypted: i=1; AHgh+Ro0p8ZUJLhrJtBH4TKCIA3O+Lb6wrKKW5KPRgu0HycnoaIWwBYrLZQEqXZRBq4BxxglmkY6P+NQgxQLdBE=@vger.kernel.org X-Gm-Message-State: AOJu0YyYhtzxz8XuI4kmfek16MoUe84Tp6t3zfQCL8L//K+MbA3LaHZp BiZwY94s7zsj2saAhLt5D7Oeqz9fKFJxraHsGGyf5uq5r7jzY83tCvfN X-Gm-Gg: AR+sD12fswYYJtoYw9TExqAfPkC4cHTwZGHpDwDrUB9Lp8Hn62aIOY5W7dOdV7kmdx3 7c/5tjV+mBz54akGVphBk3izKGP/yZYqxwPfOR+uOWFSAVYJKZQ2UwAyGKHyva8SXbvl/zpJYGx BaAy1grb7ZaAUbznvYnrCCvl/e509KTcNIFe5jgLaJM9d3+/oLvospjqwt392DcypgTNqlbb2U+ NOfh0jhLrxI7ZoEp/+tomEmKu7pw22ktOLifmCrbPLVXlPCInv9fgt/P4500jYTfpHHdd5fdK56 +o1QSajs2oBNljXNQQZcjOZng/3b8z9CaK/TARPm8mLLoQYPzgtauVTDq4FgoHwZ/okQ1Xn1K6k bzpk168TqdlKE666tP0Sw6B3gZVyJeAaqBTONqBk+F/vClhzGdWKks6g3X3pL++Tdt9HWjhRN7l eLRCsZ+W4E5dxygoxuDMJLkH2bBwXIMa3P53M= X-Received: by 2002:a17:903:1250:b0:2ca:62e:cc4f with SMTP id d9443c01a7336-2d3b0f6e3a0mr140360815ad.23.1786800380308; Sat, 15 Aug 2026 06:26:20 -0700 (PDT) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d3aebc81a6sm19433245ad.72.2026.08.15.06.26.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 06:26:19 -0700 (PDT) From: Mingyou Chen To: qby140326@gmail.com Cc: W_Armin@gmx.de, foxido@foxido.dev, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, nika@nikableh.moe, platform-driver-x86@vger.kernel.org, vlku.milos.fun@gmail.com, i@rsplwe.com, wolf109909@outlook.com Subject: [PATCH v3 2/6] platform/x86: bitland-mifs-wmi: Merge the function of redmi-wmi into the bitland driver Date: Sat, 15 Aug 2026 21:25:43 +0800 Message-ID: <20260815132547.29022-3-qby140326@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260815132547.29022-1-qby140326@gmail.com> References: <20260815132547.29022-1-qby140326@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" The bitland-mifs-wmi and legacy redmi-wmi drivers both attempt to bind to the same WMI GUID (46C93E13-EE9B-4262-8488-563BCA757FEF). This overlap causes a device registration conflict, preventing one of the drivers from loading properly depending on the module initialization order. Merge the event handling logic from redmi-wmi into bitland-mifs-wmi. By handling both device layouts within a single driver, we eliminate the GUID ownership conflict. Tested-by: Nika Krasnova Signed-off-by: Mingyou Chen --- drivers/platform/x86/bitland-mifs-wmi.c | 141 ++++++++++++++++-------- 1 file changed, 97 insertions(+), 44 deletions(-) diff --git a/drivers/platform/x86/bitland-mifs-wmi.c b/drivers/platform/x86= /bitland-mifs-wmi.c index b0d06a80e89e..677e08430473 100644 --- a/drivers/platform/x86/bitland-mifs-wmi.c +++ b/drivers/platform/x86/bitland-mifs-wmi.c @@ -34,6 +34,11 @@ #include #include =20 +#define BI_HOTKEY_CODE(id, low, high) \ + (((u32)(high) << 24) | ((u32)(low) << 16) | ((u32)(id) << 8) | WMI_EVENT_= TYPE_HOTKEY) + +#define AI_KEY_VALUE_MASK BIT(8) + #define DRV_NAME "bitland-mifs-wmi" #define BITLAND_MIFS_GUID "B60BFB48-3E5B-49E4-A0E9-8CFFE1B3434B" #define BITLAND_EVENT_GUID "46C93E13-EE9B-4262-8488-563BCA757FEF" @@ -601,18 +606,59 @@ static const struct attribute *const laptop_attrs[] = =3D { ATTRIBUTE_GROUPS(laptop); =20 static const struct key_entry bitland_mifs_wmi_keymap[] =3D { - { KE_KEY, WMI_EVENT_OPEN_APP, { KEY_PROG1 } }, - { KE_KEY, WMI_EVENT_CALCULATOR_START, { KEY_CALC } }, - { KE_KEY, WMI_EVENT_BROWSER_START, { KEY_WWW } }, - { KE_IGNORE, WMI_EVENT_FN_J, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_F, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_0, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_1, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_2, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_3, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_4, { KEY_RESERVED } }, - { KE_IGNORE, WMI_EVENT_FN_5, { KEY_RESERVED } }, - { KE_END, 0 } + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_OPEN_APP, 1, 0), { KEY_PROG1 } }, + + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_CALCULATOR_START, 1, 0), { KEY_CALC } = }, + + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_BROWSER_START, 1, 0), { KEY_WWW } }, + + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_J, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_F, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_0, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_1, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_2, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_3, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_4, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FN_5, 0, 0), {} }, + + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_RESERVED_2, 0, 0), { KEY_SELECTIVE_SCR= EENSHOT } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_RESERVED_3, 0, 0), { KEY_ALL_APPLICATI= ONS } }, + { KE_KEY, BI_HOTKEY_CODE(0x1b, 0, 0), { KEY_CONFIG } }, + { KE_KEY, BI_HOTKEY_CODE(0x1b, 1, 0), { KEY_CONFIG } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_RESERVED_1, 1, 0), { KEY_SWITCHVIDEOMO= DE } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_REFRESH_RATE, 0, 0), { KEY_REFRESH_RAT= E_TOGGLE } }, + + /* AI button has code for each position */ + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_5, 1, 0), { KEY_ASSISTANT } }, + + { KE_KEY, BI_HOTKEY_CODE(0x19, 1, 0), { KEY_ASSISTANT } }, + + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0, 0x80), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 5, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0x0a, 0), {} }, + + /* Xiaomi G Command Center */ + { KE_KEY, BI_HOTKEY_CODE(0x0a, 1, 0), { KEY_VENDOR } }, + + /* OEM preset power mode */ + { KE_IGNORE, BI_HOTKEY_CODE(0x16, 1, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(0x16, 2, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(0x16, 3, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(0x16, 4, 0), {} }, + + /* Fn Lock state */ + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FNLOCK_STATE, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FNLOCK_STATE, 1, 0), {} }, + + /* Fn+`/1/2/3/4 */ + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_F, 1, 0), { KEY_F13 } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_0, 1, 0), { KEY_F14 } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_1, 1, 0), { KEY_F15 } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_2, 1, 0), { KEY_F16 } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_3, 1, 0), { KEY_F17 } }, + + { KE_END } }; =20 static void bitland_notifier_unregister(void *data) @@ -730,12 +776,35 @@ static int bitland_mifs_wmi_probe(struct wmi_device *= wdev, const void *context) &drv_data->notifier); } =20 +static void bitland_mifs_wmi_report_key(struct wmi_device *wdev, u32 paylo= ad) +{ + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(&wdev->dev); + struct key_entry *entry; + bool autorelease =3D true; + int value =3D 1; + + entry =3D sparse_keymap_entry_from_scancode(data->input_dev, payload); + if (!entry) { + dev_dbg(&wdev->dev, "Unknown WMI hotkey with payload 0x%08x\n", payload); + return; + } + + /* AI key quirk */ + if (entry->keycode =3D=3D KEY_ASSISTANT) { + value =3D !(payload & AI_KEY_VALUE_MASK); + autorelease =3D false; + } + + guard(mutex)(&data->lock); + sparse_keymap_report_entry(data->input_dev, entry, value, autorelease); +} + static void bitland_mifs_wmi_notify(struct wmi_device *wdev, const struct wmi_buffer *buffer) { - struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(&wdev->dev); const struct bitland_mifs_event *event =3D buffer->data; struct bitland_fan_notify_data fan_data; + u32 payload; u8 brightness; =20 /* Validate event type */ @@ -752,31 +821,28 @@ static void bitland_mifs_wmi_notify(struct wmi_device= *wdev, blocking_notifier_call_chain(&bitland_notifier_list, BITLAND_NOTIFY_KBD_BRIGHTNESS, &brightness); - break; + return; =20 case WMI_EVENT_PERFORMANCE_PLAN: blocking_notifier_call_chain(&bitland_notifier_list, BITLAND_NOTIFY_PLATFORM_PROFILE, NULL); - break; - - case WMI_EVENT_OPEN_APP: - case WMI_EVENT_CALCULATOR_START: - case WMI_EVENT_BROWSER_START: { - guard(mutex)(&data->lock); - if (!sparse_keymap_report_event(data->input_dev, - event->event_id, 1, true)) - dev_warn(&wdev->dev, "Unknown key pressed: 0x%02x\n", - event->event_id); - break; - } - + return; +=20 /* * The device has 3 fans (CPU, GPU, SYS), * but there are only the CPU and GPU fan has events */ case WMI_EVENT_CPU_FAN_SPEED: case WMI_EVENT_GPU_FAN_SPEED: + /* Redmi refresh rate toggle quirk */ + if (event->event_id =3D=3D WMI_EVENT_CPU_FAN_SPEED && + event->value_low =3D=3D 0 && event->value_high =3D=3D 0) { + payload =3D BI_HOTKEY_CODE(WMI_EVENT_REFRESH_RATE, 0, 0); + bitland_mifs_wmi_report_key(wdev, payload); + return; + } + if (event->event_id =3D=3D WMI_EVENT_CPU_FAN_SPEED) fan_data.channel =3D 0; else @@ -787,27 +853,14 @@ static void bitland_mifs_wmi_notify(struct wmi_device= *wdev, blocking_notifier_call_chain(&bitland_notifier_list, BITLAND_NOTIFY_HWMON, &fan_data); - break; - - case WMI_EVENT_AIRPLANE_MODE: - case WMI_EVENT_TOUCHPAD_STATE: - case WMI_EVENT_FNLOCK_STATE: - case WMI_EVENT_KBD_MODE: - case WMI_EVENT_CAPSLOCK_STATE: - case WMI_EVENT_NUMLOCK_STATE: - case WMI_EVENT_SCROLLLOCK_STATE: - case WMI_EVENT_REFRESH_RATE: - case WMI_EVENT_WIN_KEY_LOCK: - /* These events are informational or handled by firmware */ - dev_dbg(&wdev->dev, "State change event: id=3D%d value=3D%d\n", - event->event_id, event->value_low); - break; + return; =20 default: - dev_dbg(&wdev->dev, "Unknown event: id=3D0x%02x value=3D0x%02x\n", - event->event_id, event->value_low); break; } + + payload =3D get_unaligned_le32(buffer->data); + bitland_mifs_wmi_report_key(wdev, payload); } =20 static const struct wmi_device_id bitland_mifs_wmi_id_table[] =3D { --=20 2.55.0 From nobody Mon Sep 28 23:07:03 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 D991741DEF7 for ; Sat, 15 Aug 2026 13:26:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800387; cv=none; b=TFHdHF8GbMxWufIqWDmrxncEiCu95YuP93+CZhHqu61ZZ6UARX9NM0IyUvrRRrzYGtI9R8ty82Ed3shMAGT5U1cZKpmTRNYAQhm5wKBdU2cZ/MQ5rs5u2GiZgT+SyklN0I1lKVLj5TBvX6FVpe5K6NGOLYkNAXf07acMi6teJ+o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800387; c=relaxed/simple; bh=AJSa9Tqjmqi9/yxYOv9ccBJllSdCdY7tgSJDVtXbgn8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NdNNBmvJiAGgTTNpywavW4mdn5VJ0Kujx5dyHRsT4B+HMSlvWP2n+6k0daNK6jrm+1yp5Bts57JF+c+S05s7wiiOwSzEbnGbaNExT11/oJNvPDwFMczurTRNuxmV2cRRDz2q8a25AWlPx5s3ZG4MiRvEBt4H0ihvSRbTcmgbZxw= 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=VDLlRzB6; arc=none smtp.client-ip=209.85.214.177 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="VDLlRzB6" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2cc7e86e7aeso20973505ad.2 for ; Sat, 15 Aug 2026 06:26:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786800384; x=1787405184; 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:content-type; bh=S41r0oHYGLnRHn4fgbBbAuO/lenK3JLT8nieyB3u8mM=; b=VDLlRzB6OJovd/FvWjCun+vLbnoOWb8ul+w9YrAZhZE94DYV1JCPL6nTrj7K5eqIHV fYZeApJFu5LHOfctn26M6B0g7BVXxP5M+CNd9k5SILVAKeibzyhQ+vL1xPRtnax4uQD8 dZiZ7pXQj4zhJ3t2xdWPe37lmEXsszKQU5xlnsUx3Tg1rTi2P9gcW2uXIb61M7x7c17x Os159ihMLLte1lKj8n9kXOPWO0A8lQZhpzVtXugLbIJW6rvpb1aBxAkKMTe6D2WIWYW0 Kz092cGPzEsJ+nHKrewcKP0Onk3X3woDvnM6o1ijxalBaUR1iUHl13Dw8AwB8M+DUpZr qHVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786800384; x=1787405184; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=S41r0oHYGLnRHn4fgbBbAuO/lenK3JLT8nieyB3u8mM=; b=WuX6TssqKLOO+ZsTOmw2c/7CqY5gxJD3mRjCJkEEGd6VDWc74aeVHVSCgfADLA/GZS R3wMy3EPAnWiW9HQpFlWCSNONB3p1eihlZXiIU8DTBtxgEmH4baPbzJhhuUlteN6ajEH DrEeQ/s0G8IazRYIK/r4G/bFnFB4NZ5HuR43tfn/ETNsaz7AxCoNJmbJplKU7WP0YodM hVTtA92NNSMTiIxaELubjjRWqYNsDbOJPecrl1Q6uotz4tyFmkzWL8DupMS4hpkD5WcR XA+p6PrZ4clBOdp0B8CFKQ5HTjToGDmqhMl2rUEwOe8X2e3Nnvu3ZMuEoA+UW/yQyMU6 bucA== X-Forwarded-Encrypted: i=1; AHgh+RoLUDConxvQCvtEF0flDv17j/vugFVyXPUcz5qb/eUX0Ep1Z3Gti2v9bKcYQGBISXJ9az4g1BtbdcJfBxE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/Zu0mjF9XqWBMC/hN7whIP3Z92TnzSLut3frSe8ZNXyNdV7gp KdQqqgClhcu4Fd1juzEDmzWDLifrJSB7fRDYN3U9nQb1ZjGHHsZwfTn7 X-Gm-Gg: AR+sD13sxQIz6/KahnUIr0guD1Qix9sheREivgjpzcQZSx0WdOAck0u9+fl7orC1NKG f2Jy8mYQSqHvHzLKbKbUoEr03srGL9TNr7EJKg+2GXe+8M4DoVEVScpYB/v9CSv/tjBAoeZeNbe axjRLpPCZ4W2yTdfvuJARP6vq8Xuy9m6uTUlL9EcjULqtY3cLPLnxyZ2WduxEOP8R6+5qQDWTJT nlHSnghRuSMBuTdeMYZBr4Hpu9wfxLAs1Ww+j/cb4Jqq9Q3VE0Lyxt9ZHJ3QA5bj5ImtYLCr0Ig XBhcfKEMifA88VkkkwgXDFl2iJzcxN+/tI+50sJFKWOnSb35+txPPiwYrTVRKeUqr+v1a8ZdiRC b6/Nr1p7uomLmLDAd1V86m9jHAxaAPAFkv96cOgW8+cPYk8tSVFB5sNpJRPCZ6BQ41ePLhs8fRa 2gpMTpMRO4fn60eQBGeA+7YBNVsI2QujBc5FE= X-Received: by 2002:a17:902:da82:b0:2cc:777f:d67c with SMTP id d9443c01a7336-2d3b0d5ed01mr130292845ad.13.1786800384339; Sat, 15 Aug 2026 06:26:24 -0700 (PDT) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d3aebc81a6sm19433245ad.72.2026.08.15.06.26.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 06:26:23 -0700 (PDT) From: Mingyou Chen To: qby140326@gmail.com Cc: W_Armin@gmx.de, foxido@foxido.dev, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, nika@nikableh.moe, platform-driver-x86@vger.kernel.org, vlku.milos.fun@gmail.com, i@rsplwe.com, wolf109909@outlook.com Subject: [PATCH v3 3/6] platform/x86: bitland-mifs-wmi: Add Redmi mic-mute key entries Date: Sat, 15 Aug 2026 21:25:44 +0800 Message-ID: <20260815132547.29022-4-qby140326@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260815132547.29022-1-qby140326@gmail.com> References: <20260815132547.29022-1-qby140326@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 the missing Redmibook mic-mute hotkey definitions to the shared sparse keymap table: - 0x00002101 (Fn-lock disabled state) - 0x00012101 (Fn-lock enabled state) Reported-by: Nika Krasnova Link: https://lore.kernel.org/platform-driver-x86/20260531123345.237521-1-nika@ni= kableh.moe/ Signed-off-by: Mingyou Chen --- drivers/platform/x86/bitland-mifs-wmi.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/platform/x86/bitland-mifs-wmi.c b/drivers/platform/x86= /bitland-mifs-wmi.c index 677e08430473..179e72516c71 100644 --- a/drivers/platform/x86/bitland-mifs-wmi.c +++ b/drivers/platform/x86/bitland-mifs-wmi.c @@ -628,6 +628,10 @@ static const struct key_entry bitland_mifs_wmi_keymap[= ] =3D { { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_RESERVED_1, 1, 0), { KEY_SWITCHVIDEOMO= DE } }, { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_REFRESH_RATE, 0, 0), { KEY_REFRESH_RAT= E_TOGGLE } }, =20 + /* Mic-mute key */ + { KE_KEY, BI_HOTKEY_CODE(0x21, 0, 0), { KEY_MICMUTE } }, + { KE_KEY, BI_HOTKEY_CODE(0x21, 1, 0), { KEY_MICMUTE } }, + /* AI button has code for each position */ { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_5, 1, 0), { KEY_ASSISTANT } }, =20 --=20 2.55.0 From nobody Mon Sep 28 23:07:03 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (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 B54F441F369 for ; Sat, 15 Aug 2026 13:26:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800390; cv=none; b=kK0JHSDEC80YOGnPfVuCVZiI9jJZox7GSku5fn60KIV+AM5MPoae2M7GA2XIQKSbA8cqeZzK2QjKevzBRH63zHMDTevz4T4KKHP7LG9ddmoPotf/7L6C9fxtcOBk+bfFfcmO6OpiuXUhWjyF/mYMpBDBgExCFULmsmXIYcWMgWI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800390; c=relaxed/simple; bh=qaNQ/iKdm+tr9gI6Dq66O60lBZHzk6jx64BBqORlpLI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xf91iD+U2FGmVMJ/y1sdSTto1kcdCmiOQ51sbu1mqW10f6XMn28lgjDmzcfhd1LAMzZVyIdew6ghJKhvDHW3WVPe1k2w10bbn4fMzB8+VSox7PmbKZOZGm62EnncSUA+twEyVsIjiD231kCvBKTGSh1z/nn6e2ItJRecmIYBslM= 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=cI1x1nEW; arc=none smtp.client-ip=209.85.214.169 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="cI1x1nEW" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2caed617615so26069775ad.3 for ; Sat, 15 Aug 2026 06:26:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786800388; x=1787405188; 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:content-type; bh=7u0RLtYXUYQ7iwz3Gl2qvOsAZ+m2eRqkafH2q6kwGqA=; b=cI1x1nEW2RGXohKn4hf5UVB9ZVQq1tjrvJ+K/3JoCX5UGEa+Btmgfg9DzchMTv1+dr KRBkwq0xZLYC3UN/MX0mEkczDSCluqREYzidLzDc7fTfitGirtGCSdNteZPqM7ya25Jr s3bCvrbOQ/L+yH+FoABv7BXcxVGB89BeXwyQEvT1EnIk4DZql0E8bt2S6FubsZBcroQh tIyPZJo/mtqGLtOSpLfPGC6RMevd2GsagyBkbFg22wPfuJNJWgy3Rohbit6w09s4i3VX sTkVCbRgNHaTepz6F80mkEmLsHANLpGv7BlPPgD5MbU6AoIePsMeIfIb8sOMwSwXsoY8 KIVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786800388; x=1787405188; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=7u0RLtYXUYQ7iwz3Gl2qvOsAZ+m2eRqkafH2q6kwGqA=; b=hD2edBKB2t7ZJCZFUF5tarhRhfJaJAKSoYFPy4gQNJvZZZENBXTSK/VpNp/MKZ8T5Y biE9sPiJKJqHT5pHdR/y5kOd4m5RKT25EGPE56c2gIKqFaCpN415kY78Lm+GFtB/KXRs Z++CP0zF9c7frdLZVolSY6cxkMhkbJjNZXzTS2+yiE3/s+pAf8jU36xbtsBfiC9zvtXJ wgig2qxHPcQ4AxGcmvCSLKBLB5GQNM6AvxFQP+EYrNZweg7Qk3IzvScEFGbssJQL93c0 Y+ySHm7rI2shqVIEqIgzmg+zKC556+VNx8Uc6bnTtS1VQIDbQ3192dmiNqG1fRoaq1Qd ppJA== X-Forwarded-Encrypted: i=1; AHgh+Rpk1Ht4H99kXeLCLZNBf/nXbeqy9rgbLKgxIDkgNRpGe4peNveJqPOlsbykhhK4/ujd0ZYgYDItHvEhJUU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxi8cnbSyhlis67EvZDCpcdTZb4DRFFoG5E2GpMpNCwZWOwZDz8 YURG7ZEP2nbhNMjyI0ITGfIessmBGTcfS1cH2nqCKviG9zHGEcRLmen6 X-Gm-Gg: AR+sD12wVLC3vPx6OT60NQXprbgZG8gwwrM5I0iS02fI3PVQSH3MtaT7BTxJ4JsVdl0 8TZsfaWx6uzSc8MZs0/hVI8kGbxhZYXmod/Nskoq4uEb2/OAE8rEqiRflmP0udhRNaRT7Ha/ryu dUnK1Swd7yXhDNkTOx52kJGCn+9QDkZohsh3rbyEgln4kJMSKrhsw057PpNd/QgWY1QwLm/M3cE 7bJpNNeqh1V3quevKVVPWPLi462T5C43nOkrG7Q8e/Yw7iETr26AENmKwQsPTT3jXRbeRws1Tx0 8h4IfWieuc31yfDDE+JgpL1NAIDeiuY978wI5/2evLOh4reDr+khixuAK2cdsMMQ+vGYm9tx1nU +dGj/DrY1EM8fsu8kvZfqwhqNX4QwvFK8vTU7r5Ps10JlEAH4zzfp0HMSuqU0vjL8xf1NsB4CJB C7m3h/FVUkSCOWNV0N2Qwk0M0LRarPoKBSaYA= X-Received: by 2002:a17:902:fc4e:b0:2d5:2f49:b3de with SMTP id d9443c01a7336-2d52f49c24bmr111854585ad.0.1786800388131; Sat, 15 Aug 2026 06:26:28 -0700 (PDT) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d3aebc81a6sm19433245ad.72.2026.08.15.06.26.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 06:26:27 -0700 (PDT) From: Mingyou Chen To: qby140326@gmail.com Cc: W_Armin@gmx.de, foxido@foxido.dev, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, nika@nikableh.moe, platform-driver-x86@vger.kernel.org, vlku.milos.fun@gmail.com, i@rsplwe.com, wolf109909@outlook.com Subject: [PATCH v3 4/6] platform/x86: redmi-wmi: Drop redmi-wmi driver Date: Sat, 15 Aug 2026 21:25:45 +0800 Message-ID: <20260815132547.29022-5-qby140326@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260815132547.29022-1-qby140326@gmail.com> References: <20260815132547.29022-1-qby140326@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" The redmi-wmi driver is no longer needed because its functionality has been superseded by the new generic bitland platform driver. All supported Redmi laptop models are now handled properly via the updated WMI interfaces in bitland-mifs-wmi. Remove the obsolete code, Kconfig entries, and Makefile references to clean up the platform directory. Signed-off-by: Mingyou Chen --- MAINTAINERS | 6 -- drivers/platform/x86/Kconfig | 12 --- drivers/platform/x86/Makefile | 1 - drivers/platform/x86/redmi-wmi.c | 154 ------------------------------- 4 files changed, 173 deletions(-) delete mode 100644 drivers/platform/x86/redmi-wmi.c diff --git a/MAINTAINERS b/MAINTAINERS index af86b1df1a94..b92bc4816fa6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22768,12 +22768,6 @@ S: Maintained T: git https://github.com/pkshih/rtw.git F: drivers/net/wireless/realtek/rtw89/ =20 -REDMIBOOK WMI DRIVERS -M: Gladyshev Ilya -L: platform-driver-x86@vger.kernel.org -S: Maintained -F: drivers/platform/x86/redmi-wmi.c - BITLAND LAPTOP DRIVER M: Mingyou Chen M: Gladyshev Ilya diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index b54b5212b204..036fc76f62df 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig @@ -90,18 +90,6 @@ config XIAOMI_WMI To compile this driver as a module, choose M here: the module will be called xiaomi-wmi. =20 -config REDMI_WMI - tristate "Redmibook WMI key driver" - depends on ACPI_WMI - depends on INPUT - select INPUT_SPARSEKMAP - help - Say Y here if you want support for WMI-based hotkey events on - Xiaomi Redmibook devices. - - To compile this driver as a module, choose M here: the module will - be called redmi-wmi. - config GIGABYTE_WMI tristate "Gigabyte WMI temperature driver" depends on ACPI_WMI diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index 872ac3842391..0da4876f766e 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile @@ -12,7 +12,6 @@ obj-$(CONFIG_HUAWEI_WMI) +=3D huawei-wmi.o obj-$(CONFIG_MXM_WMI) +=3D mxm-wmi.o obj-$(CONFIG_NVIDIA_WMI_EC_BACKLIGHT) +=3D nvidia-wmi-ec-backlight.o obj-$(CONFIG_XIAOMI_WMI) +=3D xiaomi-wmi.o -obj-$(CONFIG_REDMI_WMI) +=3D redmi-wmi.o obj-$(CONFIG_GIGABYTE_WMI) +=3D gigabyte-wmi.o obj-$(CONFIG_BITLAND_MIFS_WMI) +=3D bitland-mifs-wmi.o =20 diff --git a/drivers/platform/x86/redmi-wmi.c b/drivers/platform/x86/redmi-= wmi.c deleted file mode 100644 index 58898630eda6..000000000000 --- a/drivers/platform/x86/redmi-wmi.c +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* WMI driver for Xiaomi Redmibooks */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define WMI_REDMIBOOK_KEYBOARD_EVENT_GUID "46C93E13-EE9B-4262-8488-563BCA7= 57FEF" - -#define AI_KEY_VALUE_MASK BIT(8) - -static const struct key_entry redmi_wmi_keymap[] =3D { - {KE_KEY, 0x00000201, {KEY_SELECTIVE_SCREENSHOT}}, - {KE_KEY, 0x00000301, {KEY_ALL_APPLICATIONS}}, - {KE_KEY, 0x00001b01, {KEY_CONFIG}}, - {KE_KEY, 0x00011b01, {KEY_CONFIG}}, - {KE_KEY, 0x00010101, {KEY_SWITCHVIDEOMODE}}, - {KE_KEY, 0x00001a01, {KEY_REFRESH_RATE_TOGGLE}}, - - /* AI button has code for each position */ - {KE_KEY, 0x00011801, {KEY_ASSISTANT}}, - {KE_KEY, 0x00011901, {KEY_ASSISTANT}}, - - /* Keyboard backlight */ - {KE_IGNORE, 0x00000501, {}}, - {KE_IGNORE, 0x00800501, {}}, - {KE_IGNORE, 0x00050501, {}}, - {KE_IGNORE, 0x000a0501, {}}, - - /* Xiaomi G Command Center */ - {KE_KEY, 0x00010a01, {KEY_VENDOR}}, - - /* OEM preset power mode */ - {KE_IGNORE, 0x00011601, {}}, - {KE_IGNORE, 0x00021601, {}}, - {KE_IGNORE, 0x00031601, {}}, - {KE_IGNORE, 0x00041601, {}}, - - /* Fn Lock state */ - {KE_IGNORE, 0x00000701, {}}, - {KE_IGNORE, 0x00010701, {}}, - - /* Fn+`/1/2/3/4 */ - {KE_KEY, 0x00011101, {KEY_F13}}, - {KE_KEY, 0x00011201, {KEY_F14}}, - {KE_KEY, 0x00011301, {KEY_F15}}, - {KE_KEY, 0x00011401, {KEY_F16}}, - {KE_KEY, 0x00011501, {KEY_F17}}, - - {KE_END} -}; - -struct redmi_wmi { - struct input_dev *input_dev; - /* Protects the key event sequence */ - struct mutex key_lock; -}; - -static int redmi_wmi_probe(struct wmi_device *wdev, const void *context) -{ - struct redmi_wmi *data; - int err; - - /* Init dev */ - data =3D devm_kzalloc(&wdev->dev, sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - dev_set_drvdata(&wdev->dev, data); - - err =3D devm_mutex_init(&wdev->dev, &data->key_lock); - if (err) - return err; - - data->input_dev =3D devm_input_allocate_device(&wdev->dev); - if (!data->input_dev) - return -ENOMEM; - - data->input_dev->name =3D "Redmibook WMI keys"; - data->input_dev->phys =3D "wmi/input0"; - - err =3D sparse_keymap_setup(data->input_dev, redmi_wmi_keymap, NULL); - if (err) - return err; - - return input_register_device(data->input_dev); -} - -static void redmi_wmi_notify(struct wmi_device *wdev, union acpi_object *o= bj) -{ - struct key_entry *entry; - struct redmi_wmi *data =3D dev_get_drvdata(&wdev->dev); - bool autorelease =3D true; - u32 payload; - int value =3D 1; - - if (obj->type !=3D ACPI_TYPE_BUFFER) { - dev_err(&wdev->dev, "Bad response type %u\n", obj->type); - return; - } - - if (obj->buffer.length < 32) { - dev_err(&wdev->dev, "Invalid buffer length %u\n", obj->buffer.length); - return; - } - - payload =3D get_unaligned_le32(obj->buffer.pointer); - entry =3D sparse_keymap_entry_from_scancode(data->input_dev, payload); - - if (!entry) { - dev_dbg(&wdev->dev, "Unknown WMI event with payload %u", payload); - return; - } - - /* AI key quirk */ - if (entry->keycode =3D=3D KEY_ASSISTANT) { - value =3D !(payload & AI_KEY_VALUE_MASK); - autorelease =3D false; - } - - guard(mutex)(&data->key_lock); - sparse_keymap_report_entry(data->input_dev, entry, value, autorelease); -} - -static const struct wmi_device_id redmi_wmi_id_table[] =3D { - { WMI_REDMIBOOK_KEYBOARD_EVENT_GUID, NULL }, - { } -}; - -static struct wmi_driver redmi_wmi_driver =3D { - .driver =3D { - .name =3D "redmi-wmi", - .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, - }, - .id_table =3D redmi_wmi_id_table, - .min_event_size =3D 32, - .probe =3D redmi_wmi_probe, - .notify =3D redmi_wmi_notify, - .no_singleton =3D true, -}; -module_wmi_driver(redmi_wmi_driver); - -MODULE_DEVICE_TABLE(wmi, redmi_wmi_id_table); -MODULE_AUTHOR("Gladyshev Ilya "); -MODULE_DESCRIPTION("Redmibook WMI driver"); -MODULE_LICENSE("GPL"); --=20 2.55.0 From nobody Mon Sep 28 23:07:03 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (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 5245B41BA94 for ; Sat, 15 Aug 2026 13:26:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800394; cv=none; b=qxXMHnJmDJaPdR73GpppOtsP01qU3vrvHSQR6YxjsRNDOtb266ip6V2XIzppUCSwDi9fWPq5+HdVe8ZuinVWk4byJg+XGM93bzFtROM94Vd1c7ovqweOG6ra1WAmevCJipqy/TGflPEU8uNdKKxbrMfe4zQFqXlXsZJHZDvm9sY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800394; c=relaxed/simple; bh=Noll+n4mh7IdMjSlR3SppaxcvwV8Z7jrNgTa77SYxD8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P8Qs14oBTr7oofQmJbjphigngZA51tTBHW6/xrCP0LY701i1+C5QcWyddWKfoiVCiFhyfeqCSjSHEaF9ofQtT8dDQSig/+s6nDhEQHNv2kNXVNzFtI22ge6Da9YrzgkiNHaz/w/lMnnE+SodfIzzFwcBcgjFO+iUQ+07E6kqXAc= 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=ld9a6fqb; arc=none smtp.client-ip=209.85.214.172 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="ld9a6fqb" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2cfbbdfa60bso17654545ad.3 for ; Sat, 15 Aug 2026 06:26:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786800393; x=1787405193; 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:content-type; bh=O4S32keuGTlYKlN8742IXc7eWzNigh/W8rHNIKZ+kMk=; b=ld9a6fqbYmJdb1r+pUaLNqeKGNUdImsuxLJ5B4q0dOEI1tuYP0hN9DeaIcqHtqngm9 9UJVGAMpMg7e761VqrYo4QqzN6/UBEWmITBiIjDJXij9GpSJubiOHX6hZ6C95mDwUQ6T C5cxLLkcMaHsoNXGHBO+u8RoI1cHd1Jf48UxEe30vPQPvDGoVKpWpOUy3QLvPnJMalck f0N/zyKU7XPhRDlX1+ISu/QuNlDk087+PsGaxxKg3VHcYkWrJTygD6ABP7anVmquPF5F mqkFsjI6ic8zByR//HtrFbSyVSbPJRtip5FNT2d/g5D/KGgNvbwW23/wnhjLu7kuQOja f6Yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786800393; x=1787405193; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=O4S32keuGTlYKlN8742IXc7eWzNigh/W8rHNIKZ+kMk=; b=dHD0x/78EAHpk1ufBG+5nrYPQh7a3VCPTISc2hNxPf8iY5GtDFxyqqUGOumYjLfVf9 1xbueMKeJ7K3z2FZ1hSXQwY83sJyayxLXVAtmD2G3EUbCzyLeifN0/rBrQuQgf39ZB+n ISOlwtprRpo6EeW3iKjPs4RHiAK3jt+CkKihhHWpVzJj+kHrV0jAXgZrE6xV756G/Obq nGsAgsXb8le7mSWjaaHdVdejdptp8iHjMm8ZzQhkmd/e73ygyk6wG/ounyNcE9c608CB 9KpOgujEkMtPBmqJrrpA5XRgA7U6ZDa7mprzIOQhImV/hOWDAyYy/Rnva3CBKxfm9cwB xtwQ== X-Forwarded-Encrypted: i=1; AHgh+Rqrvwq4/l2IDB75G2+plw8sXlOxTtDfMh1Zhfxpa/mIEhrYH3eKB6lhb0fcvUHq1kGLMMJCUxQJBzbmiRc=@vger.kernel.org X-Gm-Message-State: AOJu0Ywvd0t+2WnTCjn3KcmCeASDDP9VR+lC8KMLfRm7MAC+Bd/FlQd+ AS6WSWM0hM2XDY02sBaWoEFfoGsMfrydshJ5xLzatgTbPItly6aGK8Cy X-Gm-Gg: AR+sD10ghd4pDzVicD4dMjTg7JmvWnN0i6dd6FQ6cWhrfxQeCDynfBQlIqlZV5KdsMT S4DMVsRpRa1SFH5ht0Fftw9CE57YmCEUZfXtmGq+ib0iXrZ2z853sLJQs/Qyb4Plz15S3H93ALj 1ySVyP8xXl0T7XCefAz35g3s35DwBExdN9o0Dqwuxh6eyVMMrOMlqNiFZuKixRHUSacAukmHU64 juqZtiIAW+lmo2bFRKdU3pNB3pmeA0FvslcQT4eXALgraqw0qJ+KDCAJuiPY6LJ9S/ymZN5zF0X 7lATt+DCT8OtQVk92tSjLGjhXLBz6050PS19GMRpQK+4Mxr9zFZ8G5rKAxO/sgCvlI9zeLWPnwO iVkjDgFYQ8GbFW+PyVE5HSsmyY5a2OA+otLXxfUmWdk1jniHDljQ0BrFfMcmX1yi3VrD1FoNp6m UXWsFmT895UbF9AkHfGkxuAkFDw4K7VjgoEvR9R8ZY X-Received: by 2002:a17:903:3c4d:b0:2ca:2079:91cc with SMTP id d9443c01a7336-2d3b0ad30e8mr146623605ad.5.1786800392473; Sat, 15 Aug 2026 06:26:32 -0700 (PDT) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d3aebc81a6sm19433245ad.72.2026.08.15.06.26.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 06:26:31 -0700 (PDT) From: Mingyou Chen To: qby140326@gmail.com Cc: W_Armin@gmx.de, foxido@foxido.dev, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, nika@nikableh.moe, platform-driver-x86@vger.kernel.org, vlku.milos.fun@gmail.com, i@rsplwe.com, wolf109909@outlook.com Subject: [PATCH v3 5/6] platform/x86: bitland-mifs-wmi: Add per-machine ops table Date: Sat, 15 Aug 2026 21:25:46 +0800 Message-ID: <20260815132547.29022-6-qby140326@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260815132547.29022-1-qby140326@gmail.com> References: <20260815132547.29022-1-qby140326@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" The MIFS WMI interface is shared by several Bitland ODM laptops which differ in the layout of the performance mode values of WMI_FN_SYSTEM_PER_MODE and in the capability checks. Introduce a machine ops table to support multiple machine families without sprinkling model checks over the driver: struct bitland_mifs_ops { const char *name; const struct bitland_profile_mode_map *mode_map; int (*check_performance_capability)(struct bitland_mifs_wmi_data *d= ata); bool has_full_speed; }; The default ops instance keeps the current Bitland behavior, so this change is a pure refactor without any functional changes. Signed-off-by: Mingyou Chen --- drivers/platform/x86/bitland-mifs-wmi.c | 89 +++++++++++++++++++------ 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/drivers/platform/x86/bitland-mifs-wmi.c b/drivers/platform/x86= /bitland-mifs-wmi.c index 179e72516c71..39824bba49fe 100644 --- a/drivers/platform/x86/bitland-mifs-wmi.c +++ b/drivers/platform/x86/bitland-mifs-wmi.c @@ -78,6 +78,46 @@ enum bitland_mifs_power_profile { WMI_PP_FULL_SPEED =3D 3, }; =20 +struct bitland_mifs_wmi_data; + +/* + * Value layout of WMI_FN_SYSTEM_PER_MODE. + */ +struct bitland_profile_mode_map { + u8 balanced; + u8 performance; + u8 quiet; + u8 full_speed; +}; + +static const struct bitland_profile_mode_map bitland_mode_map =3D { + .balanced =3D WMI_PP_BALANCED, + .performance =3D WMI_PP_PERFORMANCE, + .quiet =3D WMI_PP_QUIET, + .full_speed =3D WMI_PP_FULL_SPEED, +}; + +static int bitland_pp_check_capability(struct bitland_mifs_wmi_data *data); + +/* + * Machine-specific operations. The MIFS WMI interface is shared by + * several Bitland ODM laptops which differ in the layout of the + * performance mode values and in the capability checks. + */ +struct bitland_mifs_ops { + const char *name; + const struct bitland_profile_mode_map *mode_map; + int (*check_performance_capability)(struct bitland_mifs_wmi_data *data); + bool has_full_speed; +}; + +static const struct bitland_mifs_ops bitland_ops =3D { + .name =3D "Bitland", + .mode_map =3D &bitland_mode_map, + .check_performance_capability =3D bitland_pp_check_capability, + .has_full_speed =3D true, +}; + enum bitland_mifs_event_id { WMI_EVENT_RESERVED_1 =3D 1, WMI_EVENT_RESERVED_2 =3D 2, @@ -163,6 +203,7 @@ struct bitland_mifs_wmi_data { struct input_dev *input_dev; struct device *hwmon_dev; struct device *pp_dev; + const struct bitland_mifs_ops *ops; enum platform_profile_option saved_profile; }; =20 @@ -193,6 +234,7 @@ static int laptop_profile_get(struct device *dev, enum platform_profile_option *profile) { struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + const struct bitland_profile_mode_map *map =3D data->ops->mode_map; struct bitland_mifs_input input =3D { .reserved1 =3D 0, .operation =3D WMI_METHOD_GET, @@ -200,32 +242,29 @@ static int laptop_profile_get(struct device *dev, .function =3D WMI_FN_SYSTEM_PER_MODE, }; struct bitland_mifs_output result; + u8 mode; int ret; =20 ret =3D bitland_mifs_wmi_call(data, &input, &result); if (ret) return ret; =20 - switch (result.data[0]) { - case WMI_PP_BALANCED: + mode =3D result.data[0]; + if (mode =3D=3D map->quiet) + *profile =3D PLATFORM_PROFILE_LOW_POWER; + else if (mode =3D=3D map->balanced) *profile =3D PLATFORM_PROFILE_BALANCED; - break; - case WMI_PP_PERFORMANCE: + else if (mode =3D=3D map->performance) *profile =3D PLATFORM_PROFILE_BALANCED_PERFORMANCE; - break; - case WMI_PP_QUIET: - *profile =3D PLATFORM_PROFILE_LOW_POWER; - break; - case WMI_PP_FULL_SPEED: + else if (mode =3D=3D map->full_speed) *profile =3D PLATFORM_PROFILE_PERFORMANCE; - break; - default: + else return -EINVAL; - } + return 0; } =20 -static int bitland_check_performance_capability(struct bitland_mifs_wmi_da= ta *data) +static int bitland_pp_check_capability(struct bitland_mifs_wmi_data *data) { struct bitland_mifs_input input =3D { .operation =3D WMI_METHOD_GET, @@ -252,6 +291,7 @@ static int laptop_profile_set(struct device *dev, enum platform_profile_option profile) { struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + const struct bitland_profile_mode_map *map =3D data->ops->mode_map; struct bitland_mifs_input input =3D { .reserved1 =3D 0, .operation =3D WMI_METHOD_SET, @@ -259,42 +299,46 @@ static int laptop_profile_set(struct device *dev, .function =3D WMI_FN_SYSTEM_PER_MODE, }; int ret; - u8 val; + u8 mode; =20 switch (profile) { case PLATFORM_PROFILE_LOW_POWER: - val =3D WMI_PP_QUIET; + mode =3D map->quiet; break; case PLATFORM_PROFILE_BALANCED: - val =3D WMI_PP_BALANCED; + mode =3D map->balanced; break; case PLATFORM_PROFILE_BALANCED_PERFORMANCE: - ret =3D bitland_check_performance_capability(data); + ret =3D data->ops->check_performance_capability(data); if (ret) return ret; - val =3D WMI_PP_PERFORMANCE; + mode =3D map->performance; break; case PLATFORM_PROFILE_PERFORMANCE: - ret =3D bitland_check_performance_capability(data); + ret =3D data->ops->check_performance_capability(data); if (ret) return ret; - val =3D WMI_PP_FULL_SPEED; + mode =3D map->full_speed; break; default: return -EOPNOTSUPP; } =20 - input.payload[0] =3D val; + input.payload[0] =3D mode; =20 return bitland_mifs_wmi_call(data, &input, NULL); } =20 static int platform_profile_probe(void *drvdata, unsigned long *choices) { + struct bitland_mifs_wmi_data *data =3D drvdata; + set_bit(PLATFORM_PROFILE_LOW_POWER, choices); set_bit(PLATFORM_PROFILE_BALANCED, choices); set_bit(PLATFORM_PROFILE_BALANCED_PERFORMANCE, choices); - set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); + + if (data->ops->has_full_speed) + set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); =20 return 0; } @@ -717,6 +761,7 @@ static int bitland_mifs_wmi_probe(struct wmi_device *wd= ev, const void *context) return -ENOMEM; =20 drv_data->wdev =3D wdev; + drv_data->ops =3D &bitland_ops; =20 ret =3D devm_mutex_init(&wdev->dev, &drv_data->lock); if (ret) --=20 2.55.0 From nobody Mon Sep 28 23:07:03 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 8370341F5D1 for ; Sat, 15 Aug 2026 13:26:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800399; cv=none; b=m77dY2iur8Chiz4z2z+oi84LoBIrRro/n9ElZi7yQqxiOhS/m6Et1lifWTb0WnbndNV/nYYhcDqYjIjjTKzGEz0hkEh0/8qSdnrltvBA2z36pPoAzmGRUT0CdqcTCuhKc89X1yLwZozYMMOL1HAOdLLP6WAbxGNmkt2+1R6wLcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786800399; c=relaxed/simple; bh=GgTCDQbnUgexFrkANOilkT4JCPBtskdpVFL7CHv8URo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IQTfDHKjVA6dOvLvaaC3JMKQ9BxsXOY4VkIMSZgGtxFWGh3Ek5VBcZWyP0CfFflPKgoqm9g4TQ3qYTBFTdhaBrirQr+uPxED6jcinxiYrK1KRE4gnZWcc4yVOvBagKhn9uL8kjiNeAi4KzhlQUarmxcEnARcKiQaz7TLqxUuIQg= 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=MYDmTiJC; arc=none smtp.client-ip=209.85.214.173 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="MYDmTiJC" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2cc7e86e7aeso20974765ad.2 for ; Sat, 15 Aug 2026 06:26:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786800396; x=1787405196; 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:content-type; bh=A5Ptq6J3I1zDJAH3ElBt92vJlpDCEYTwTmvEKoY+2Xc=; b=MYDmTiJCX2+A28bagm11sEwx3KCB8bi1BcKJWu4yS7Kvo/MBSOAhIQK3Nq4KLhhAjP 2bjmBUKfDRPC4GUAPw1TwiVKd0SN9KjFqRWdC/wIUChLYXyclTk/d5UE2SqQ+E1J8pef fQHeze2W0fOtf4Nm0yU8AMWfUDk9rMHigOmtnXwp8XjjvG26nrqyntCdVxvvQFyAOgqT jD9+lJxMJrPnYgduXmzuXZNEVHMvAOjZ3l1OHH/+Rswu/E6D3y+eWlBlQtkfr7kF00eV na/sTVBl1/2Qub61p8VpE3x2yCY5xOnMhx4/itH0ZngDjjz3kvbwdCOmC8FOuHbkPXy7 f5Zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786800396; x=1787405196; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=A5Ptq6J3I1zDJAH3ElBt92vJlpDCEYTwTmvEKoY+2Xc=; b=W10nG5LskJsdbbfMYCw52bzjbZe6SwnnkeuNgzJhg9NpkB0Vm2525b26YDT44VJrYj f+HUoE/AkOAfEn/40PyTXy8Y6w60S0x465CIF+snXIsaFz85i/rALJA1x0gBlazQrcwj tiEuj3YgdfHuzlmOdPCNYxmujerJf/s1xlpj2LYkqgTiVR+uIOstxMrcRKNFNYrD/v0a 9k5+OF/zrOZF4wT5gLfDKRRPzBspHSGRV4ykWmhwEwW6Wc2vOErw6awX33BimH6IN/Sy AEgSlvVhuavkZTsJllLOzFHZRpvCUh9cvmlDr3USixWGLAbASsJ9MDILU0yQr70D3ENR a92Q== X-Forwarded-Encrypted: i=1; AHgh+Rq813BgV0OJ88l2An136UWTyC7Xn03HK0ApEzgoafeRpNTXyDApy8HqReOy+3QUothmpTQuYtu/qBe67KU=@vger.kernel.org X-Gm-Message-State: AOJu0YwSUiibYkY1eV7PGOYfahdbCRSG0xocfmTWyZ0v+dLV2YLMHX6y iuIQci8jwEmoP/Ig7yvftNuizdW1YQsI3MEO7SDtAu3aZw3baALwzQGM X-Gm-Gg: AR+sD13BTXURlGYps1qfQpOuIneTD2nYS9K9M4bKoONhSrZvjfoDhM8yEic7IZZpe3x 4bCED4eDTOn2JVXvyu+RlsWk11diwF7KR8D9oyb1WTduXPJm5rB/1B8hT+uVN9i18MexJRW6UOR sDQqJQ9sIpNmSy8jijFK8WyJziLS5WsAyt9GeUnD+Us04X4pgC55kkVQ9QTNqD62b6x9TlpMj0u 7HIFcBdB8JdDp9xzznmuHrBBtCmzy00Ovzvan1A9K2iQeblYsubXDY5EL1eKCxy/ICH9yyo55X4 i2ey5NqTcdLxGU6l5EMWWTwweavejQcXj6S+hS/oRK83mC50gyjtqiZEF0xXDbSpMx5gjDtPNc2 SCXHOpLyCgB+fHwHfXfzdEQcJ4xfc6ewl4KVCWWH1ZZt9mnYJjOmkNIBffzspzZBPFZpK2n2Y6S 5p0Xf1Vk0nJH8/rkYoj+dABnTx7xNlMgdLUfuw0nIf X-Received: by 2002:a17:902:ce04:b0:2c8:2808:3ec9 with SMTP id d9443c01a7336-2d3b0d5e658mr154286915ad.12.1786800396295; Sat, 15 Aug 2026 06:26:36 -0700 (PDT) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d3aebc81a6sm19433245ad.72.2026.08.15.06.26.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 06:26:35 -0700 (PDT) From: Mingyou Chen To: qby140326@gmail.com Cc: W_Armin@gmx.de, foxido@foxido.dev, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, nika@nikableh.moe, platform-driver-x86@vger.kernel.org, vlku.milos.fun@gmail.com, i@rsplwe.com, wolf109909@outlook.com Subject: [PATCH v3 6/6] platform/x86: bitland-mifs-wmi: Add Redmi laptop support Date: Sat, 15 Aug 2026 21:25:47 +0800 Message-ID: <20260815132547.29022-7-qby140326@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260815132547.29022-1-qby140326@gmail.com> References: <20260815132547.29022-1-qby140326@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" Redmi laptops (Redmi Book and Redmi G series) use the same MIFS WMI interface but encode the performance mode values of WMI_FN_SYSTEM_PER_MODE differently, as reverse engineered from the Windows GCommandCenter application: 0 =3D performance, 1 =3D balanced, 2 =3D quiet, 4 =3D full speed Add "Redmi Book" and "Redmi G" ops entries selected via DMI: - Redmi G (board TM2135/TM2137): the full-speed mode is available - Redmi Book/Xiaomi Book: no full-speed mode - The performance modes only require AC power (any source); the barrel-jack requirement is Bitland-specific The GCommandCenter application further showed that: - the CPU power sensor (WMI_FN_CPU_POWER) is only available on Redmi machines, gate the hwmon power channel on the ops table - the refresh-rate-toggle quirk in the CPU fan speed event is Redmi-specific, gate it on the ops table instead of applying it unconditionally Also add Redmi support for Fn lock and touchpad lock control (WMI_FN_FN_LOCK / WMI_FN_TP_LOCK sysfs attributes), keyboard type detection (hide the RGB kb_mode attribute on white-only backlit keyboards) and hotkeys (airplane mode -> KEY_RFKILL, ignore the lock-state and keyboard mode indicator events). The sysfs attribute group is now registered in probe (instead of via dev_groups) so that the is_visible callback can access the probe populated driver data. Signed-off-by: Mingyou Chen --- drivers/platform/x86/bitland-mifs-wmi.c | 329 +++++++++++++++++++++++- 1 file changed, 316 insertions(+), 13 deletions(-) diff --git a/drivers/platform/x86/bitland-mifs-wmi.c b/drivers/platform/x86= /bitland-mifs-wmi.c index 39824bba49fe..d5b53008bff0 100644 --- a/drivers/platform/x86/bitland-mifs-wmi.c +++ b/drivers/platform/x86/bitland-mifs-wmi.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,11 @@ enum bitland_system_ac_mode { WMI_SYSTEM_AC_CIRCULARHOLE =3D 2, }; =20 +enum bitland_kbd_type { + WMI_KBD_TYPE_WHITE =3D 0, + WMI_KBD_TYPE_RGB =3D 1, +}; + enum bitland_mifs_power_profile { WMI_PP_BALANCED =3D 0, WMI_PP_PERFORMANCE =3D 1, @@ -97,7 +103,21 @@ static const struct bitland_profile_mode_map bitland_mo= de_map =3D { .full_speed =3D WMI_PP_FULL_SPEED, }; =20 +/* + * Redmi laptops encode the performance mode values differently, as + * reverse engineered from the Windows GCommandCenter application: the + * app sends value 0 to select the performance mode and value 4 to + * select the full-speed mode. + */ +static const struct bitland_profile_mode_map redmi_mode_map =3D { + .balanced =3D 1, + .performance =3D 0, + .quiet =3D 2, + .full_speed =3D 4, +}; + static int bitland_pp_check_capability(struct bitland_mifs_wmi_data *data); +static int redmi_pp_check_capability(struct bitland_mifs_wmi_data *data); =20 /* * Machine-specific operations. The MIFS WMI interface is shared by @@ -109,6 +129,8 @@ struct bitland_mifs_ops { const struct bitland_profile_mode_map *mode_map; int (*check_performance_capability)(struct bitland_mifs_wmi_data *data); bool has_full_speed; + bool has_cpu_power; + bool quirk_refresh_rate_toggle; }; =20 static const struct bitland_mifs_ops bitland_ops =3D { @@ -118,6 +140,54 @@ static const struct bitland_mifs_ops bitland_ops =3D { .has_full_speed =3D true, }; =20 +static const struct bitland_mifs_ops redmi_book_ops =3D { + .name =3D "Redmi Book", + .mode_map =3D &redmi_mode_map, + .check_performance_capability =3D redmi_pp_check_capability, + .has_cpu_power =3D true, + .quirk_refresh_rate_toggle =3D true, +}; + +static const struct bitland_mifs_ops redmi_g_ops =3D { + .name =3D "Redmi G", + .mode_map =3D &redmi_mode_map, + .check_performance_capability =3D redmi_pp_check_capability, + .has_full_speed =3D true, + .has_cpu_power =3D true, + .quirk_refresh_rate_toggle =3D true, +}; + +static const struct dmi_system_id bitland_mifs_dmi_table[] =3D { + { + /* Redmi G */ + .matches =3D { + DMI_MATCH(DMI_BOARD_NAME, "TM2135"), + }, + .driver_data =3D (void *)&redmi_g_ops, + }, + { + .matches =3D { + DMI_MATCH(DMI_BOARD_NAME, "TM2137"), + }, + .driver_data =3D (void *)&redmi_g_ops, + }, + { + /* Redmi Book series */ + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Redmi"), + }, + .driver_data =3D (void *)&redmi_book_ops, + }, + { + /* Xiaomi Book series */ + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Xiaomi"), + }, + .driver_data =3D (void *)&redmi_book_ops, + }, + {} +}; + enum bitland_mifs_event_id { WMI_EVENT_RESERVED_1 =3D 1, WMI_EVENT_RESERVED_2 =3D 2, @@ -203,6 +273,8 @@ struct bitland_mifs_wmi_data { struct input_dev *input_dev; struct device *hwmon_dev; struct device *pp_dev; + enum bitland_wmi_device_type dev_type; + u8 kbd_type; const struct bitland_mifs_ops *ops; enum platform_profile_option saved_profile; }; @@ -273,10 +345,11 @@ static int bitland_pp_check_capability(struct bitland= _mifs_wmi_data *data) struct bitland_mifs_output output; int ret; =20 - /* Full-speed/performance mode requires DC power (not USB-C) */ + /* The performance modes require AC power */ if (!power_supply_is_system_supplied()) return -EOPNOTSUPP; =20 + /* Additionally require the barrel-jack power supply (not USB-C) */ ret =3D bitland_mifs_wmi_call(data, &input, &output); if (ret) return ret; @@ -287,6 +360,15 @@ static int bitland_pp_check_capability(struct bitland_= mifs_wmi_data *data) return 0; } =20 +static int redmi_pp_check_capability(struct bitland_mifs_wmi_data *data) +{ + /* The performance modes require AC power (any source) */ + if (!power_supply_is_system_supplied()) + return -EOPNOTSUPP; + + return 0; +} + static int laptop_profile_set(struct device *dev, enum platform_profile_option profile) { @@ -337,6 +419,7 @@ static int platform_profile_probe(void *drvdata, unsign= ed long *choices) set_bit(PLATFORM_PROFILE_BALANCED, choices); set_bit(PLATFORM_PROFILE_BALANCED_PERFORMANCE, choices); =20 + /* Full-speed mode is not available on regular Redmi Books */ if (data->ops->has_full_speed) set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); =20 @@ -418,6 +501,13 @@ static int laptop_hwmon_read(struct device *dev, enum = hwmon_sensor_types type, default: return -EINVAL; } + case hwmon_power: + /* WMI_FN_CPU_POWER returns the CPU power draw in watts */ + input.function =3D WMI_FN_CPU_POWER; + ret =3D bitland_mifs_wmi_call(data, &input, &res); + if (!ret) + *val =3D res.data[0] * MICROWATT_PER_WATT; + return ret; default: return -EINVAL; } @@ -444,6 +534,15 @@ static const struct hwmon_channel_info *laptop_hwmon_i= nfo[] =3D { NULL }; =20 +static const struct hwmon_channel_info *laptop_hwmon_info_power[] =3D { + HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT), + HWMON_CHANNEL_INFO(fan, HWMON_F_INPUT | HWMON_F_LABEL, + HWMON_F_INPUT | HWMON_F_LABEL, + HWMON_F_INPUT | HWMON_F_LABEL), + HWMON_CHANNEL_INFO(power, HWMON_P_INPUT), + NULL +}; + static const struct hwmon_ops laptop_hwmon_ops =3D { .visible =3D 0444, .read =3D laptop_hwmon_read, @@ -455,6 +554,11 @@ static const struct hwmon_chip_info laptop_chip_info = =3D { .info =3D laptop_hwmon_info, }; =20 +static const struct hwmon_chip_info laptop_chip_info_power =3D { + .ops =3D &laptop_hwmon_ops, + .info =3D laptop_hwmon_info_power, +}; + static int laptop_kbd_led_set(struct led_classdev *led_cdev, enum led_brightness value) { @@ -498,6 +602,96 @@ static const char *const gpu_mode_strings[] =3D { "uma", }; =20 +static ssize_t fn_lock_show(struct device *dev, struct device_attribute *a= ttr, + char *buf) +{ + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + struct bitland_mifs_input input =3D { + .reserved1 =3D 0, + .operation =3D WMI_METHOD_GET, + .reserved2 =3D 0, + .function =3D WMI_FN_FN_LOCK, + }; + struct bitland_mifs_output res; + int ret; + + ret =3D bitland_mifs_wmi_call(data, &input, &res); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", res.data[0]); +} + +static ssize_t fn_lock_store(struct device *dev, struct device_attribute *= attr, + const char *buf, size_t count) +{ + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + struct bitland_mifs_input input =3D { + .reserved1 =3D 0, + .operation =3D WMI_METHOD_SET, + .reserved2 =3D 0, + .function =3D WMI_FN_FN_LOCK, + }; + bool val; + int ret; + + if (kstrtobool(buf, &val)) + return -EINVAL; + + input.payload[0] =3D val; + + ret =3D bitland_mifs_wmi_call(data, &input, NULL); + if (ret) + return ret; + + return count; +} + +static ssize_t touchpad_lock_show(struct device *dev, struct device_attrib= ute *attr, + char *buf) +{ + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + struct bitland_mifs_input input =3D { + .reserved1 =3D 0, + .operation =3D WMI_METHOD_GET, + .reserved2 =3D 0, + .function =3D WMI_FN_TP_LOCK, + }; + struct bitland_mifs_output res; + int ret; + + ret =3D bitland_mifs_wmi_call(data, &input, &res); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", res.data[0]); +} + +static ssize_t touchpad_lock_store(struct device *dev, struct device_attri= bute *attr, + const char *buf, size_t count) +{ + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + struct bitland_mifs_input input =3D { + .reserved1 =3D 0, + .operation =3D WMI_METHOD_SET, + .reserved2 =3D 0, + .function =3D WMI_FN_TP_LOCK, + }; + bool val; + int ret; + + if (kstrtobool(buf, &val)) + return -EINVAL; + + input.payload[0] =3D val; + + ret =3D bitland_mifs_wmi_call(data, &input, NULL); + if (ret) + return ret; + + return count; +} + /* GPU Mode: 0:Hybrid, 1:Discrete, 2:UMA */ static ssize_t gpu_mode_show(struct device *dev, struct device_attribute *= attr, char *buf) @@ -637,17 +831,46 @@ static ssize_t fan_boost_store(struct device *dev, return count; } =20 -static const DEVICE_ATTR_RW(gpu_mode); -static const DEVICE_ATTR_RW(kb_mode); -static const DEVICE_ATTR_WO(fan_boost); +static DEVICE_ATTR_RW(gpu_mode); +static DEVICE_ATTR_RW(kb_mode); +static DEVICE_ATTR_WO(fan_boost); +static DEVICE_ATTR_RW(fn_lock); +static DEVICE_ATTR_RW(touchpad_lock); =20 -static const struct attribute *const laptop_attrs[] =3D { +static struct attribute *laptop_attrs[] =3D { &dev_attr_gpu_mode.attr, &dev_attr_kb_mode.attr, &dev_attr_fan_boost.attr, + &dev_attr_fn_lock.attr, + &dev_attr_touchpad_lock.attr, NULL, }; -ATTRIBUTE_GROUPS(laptop); + +static umode_t laptop_attr_is_visible(struct kobject *kobj, + struct attribute *attr, int idx) +{ + struct device *dev =3D kobj_to_dev(kobj); + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(dev); + + /* The sysfs attributes are only supported on the control device */ + if (data->dev_type !=3D BITLAND_WMI_CONTROL) + return 0; + + /* + * White-only backlit keyboards (e.g. Redmi Book series) do not + * support the RGB backlight modes. + */ + if (attr =3D=3D &dev_attr_kb_mode.attr && + data->kbd_type =3D=3D WMI_KBD_TYPE_WHITE) + return 0; + + return attr->mode; +} + +static const struct attribute_group laptop_group =3D { + .attrs =3D laptop_attrs, + .is_visible =3D laptop_attr_is_visible, +}; =20 static const struct key_entry bitland_mifs_wmi_keymap[] =3D { { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_OPEN_APP, 1, 0), { KEY_PROG1 } }, @@ -699,6 +922,34 @@ static const struct key_entry bitland_mifs_wmi_keymap[= ] =3D { { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FNLOCK_STATE, 0, 0), {} }, { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_FNLOCK_STATE, 1, 0), {} }, =20 + /* Airplane mode toggle (Redmi) */ + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_AIRPLANE_MODE, 0, 0), { KEY_RFKILL } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_AIRPLANE_MODE, 1, 0), { KEY_RFKILL } }, + + /* + * Touchpad state change (Redmi Fn+F7). The EC performs the actual + * toggle itself; userspace can control the state via the + * touchpad_lock sysfs attribute. + */ + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_TOUCHPAD_STATE, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_TOUCHPAD_STATE, 1, 0), {} }, + + /* Keyboard backlight mode change */ + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_MODE, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_MODE, 1, 0), {} }, + + /* Lock-state indicator events */ + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_CAPSLOCK_STATE, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_CAPSLOCK_STATE, 1, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_NUMLOCK_STATE, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_NUMLOCK_STATE, 1, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_SCROLLLOCK_STATE, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_SCROLLLOCK_STATE, 1, 0), {} }, + + /* Win key lock (Redmi gaming mode) */ + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_WIN_KEY_LOCK, 0, 0), {} }, + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_WIN_KEY_LOCK, 1, 0), {} }, + /* Fn+`/1/2/3/4 */ { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_F, 1, 0), { KEY_F13 } }, { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FN_0, 1, 0), { KEY_F14 } }, @@ -744,6 +995,36 @@ static int bitland_notifier_callback(struct notifier_b= lock *nb, return NOTIFY_OK; } =20 +static int bitland_detect_kbd_type(struct bitland_mifs_wmi_data *data) +{ + struct bitland_mifs_input input =3D { + .reserved1 =3D 0, + .operation =3D WMI_METHOD_GET, + .reserved2 =3D 0, + .function =3D WMI_FN_KBD_TYPE, + }; + struct bitland_mifs_output res; + int ret; + + ret =3D bitland_mifs_wmi_call(data, &input, &res); + if (ret) + return ret; + + data->kbd_type =3D res.data[0]; + return 0; +} + +static void bitland_detect_ops(struct bitland_mifs_wmi_data *data) +{ + const struct dmi_system_id *id; + + id =3D dmi_first_match(bitland_mifs_dmi_table); + if (id) + data->ops =3D id->driver_data; + + dev_dbg(&data->wdev->dev, "Detected machine ops: %s\n", data->ops->name); +} + static int bitland_mifs_wmi_probe(struct wmi_device *wdev, const void *con= text) { struct bitland_mifs_wmi_data *drv_data; @@ -761,6 +1042,9 @@ static int bitland_mifs_wmi_probe(struct wmi_device *w= dev, const void *context) return -ENOMEM; =20 drv_data->wdev =3D wdev; + drv_data->dev_type =3D dev_type; + /* Default to RGB so the RGB attributes stay visible if detection fails */ + drv_data->kbd_type =3D WMI_KBD_TYPE_RGB; drv_data->ops =3D &bitland_ops; =20 ret =3D devm_mutex_init(&wdev->dev, &drv_data->lock); @@ -769,6 +1053,8 @@ static int bitland_mifs_wmi_probe(struct wmi_device *w= dev, const void *context) =20 dev_set_drvdata(&wdev->dev, drv_data); =20 + bitland_detect_ops(drv_data); + if (dev_type =3D=3D BITLAND_WMI_EVENT) { /* Register input device for hotkeys */ drv_data->input_dev =3D devm_input_allocate_device(&wdev->dev); @@ -794,12 +1080,28 @@ static int bitland_mifs_wmi_probe(struct wmi_device = *wdev, const void *context) if (IS_ERR(drv_data->pp_dev)) return PTR_ERR(drv_data->pp_dev); =20 + /* Detect the keyboard type */ + ret =3D bitland_detect_kbd_type(drv_data); + if (ret) + dev_dbg(&wdev->dev, "Failed to detect keyboard type, assuming RGB: %d\n"= , ret); + + ret =3D devm_device_add_group(&wdev->dev, &laptop_group); + if (ret) + return ret; + /* Register hwmon */ - drv_data->hwmon_dev =3D devm_hwmon_device_register_with_info(&wdev->dev, - "bitland_mifs", - drv_data, - &laptop_chip_info, - NULL); + if (drv_data->ops->has_cpu_power) + drv_data->hwmon_dev =3D devm_hwmon_device_register_with_info(&wdev->dev, + "bitland_mifs", + drv_data, + &laptop_chip_info_power, + NULL); + else + drv_data->hwmon_dev =3D devm_hwmon_device_register_with_info(&wdev->dev, + "bitland_mifs", + drv_data, + &laptop_chip_info, + NULL); if (IS_ERR(drv_data->hwmon_dev)) return PTR_ERR(drv_data->hwmon_dev); =20 @@ -851,6 +1153,7 @@ static void bitland_mifs_wmi_report_key(struct wmi_dev= ice *wdev, u32 payload) static void bitland_mifs_wmi_notify(struct wmi_device *wdev, const struct wmi_buffer *buffer) { + struct bitland_mifs_wmi_data *data =3D dev_get_drvdata(&wdev->dev); const struct bitland_mifs_event *event =3D buffer->data; struct bitland_fan_notify_data fan_data; u32 payload; @@ -885,7 +1188,8 @@ static void bitland_mifs_wmi_notify(struct wmi_device = *wdev, case WMI_EVENT_CPU_FAN_SPEED: case WMI_EVENT_GPU_FAN_SPEED: /* Redmi refresh rate toggle quirk */ - if (event->event_id =3D=3D WMI_EVENT_CPU_FAN_SPEED && + if (data->ops->quirk_refresh_rate_toggle && + event->event_id =3D=3D WMI_EVENT_CPU_FAN_SPEED && event->value_low =3D=3D 0 && event->value_high =3D=3D 0) { payload =3D BI_HOTKEY_CODE(WMI_EVENT_REFRESH_RATE, 0, 0); bitland_mifs_wmi_report_key(wdev, payload); @@ -923,7 +1227,6 @@ static struct wmi_driver bitland_mifs_wmi_driver =3D { .no_singleton =3D true, .driver =3D { .name =3D DRV_NAME, - .dev_groups =3D laptop_groups, .pm =3D pm_sleep_ptr(&bitland_mifs_wmi_pm_ops), }, .id_table =3D bitland_mifs_wmi_id_table, --=20 2.55.0