From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.215.174 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794406397; b=fDKZnspJHmUwe3Bib+CcR656EYLaWSdymobGJFkGNTlWzXhVRnWa/Pi2uiCdOPwrXKGM 1++GO/46TBIsISIqSgI0oDCxf+1qMSNQKQJqg0HL2Wip7OTwok/p2pB764mO9+84QSbD0 NNHDu/hBJDpgvrmgmkqGgMwqSBcz333c/dsyrp4e1FajzARARNb81V53gy6+25KFIfK0Z BUlrzt5o8Yc2uHIntD/GHOnvEuwkzRMYQwf2GDaK+n1aE24iGj9rUWR0Fl3VKre+xX8wo KRuhcGYtV5zZIO5jFDCqMss2AVMQEf0xt9hNkHnvRXzbStjTDs93i33YolqFAJz72Vg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794406397; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received:Received: From:To:Cc:Subject:Date:Message-ID:X-Mailer:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding; bh=99XvSMb6mXrpYcdN1AuV0z3eaby2d0kDcwc59A0VX7g=; b=v59SvlP/f55mxA5mk450q2jyoP5bhdrQZMGVYuwG3od8T2/Mfb7dRAYsA8F6bKGsEzng UW0HwpTJWZL0DVXGSAatLuyaBHhtRCWhbkfsWaSFCbe5VIFZeBj+mh7LrVZNPPkAG/UiW hSK4FI7lb+SnRbVtMP/a77qXiznyFQ8ZiRJLm5CJhdhEmopSuAEtCGZvP261N357IpUVO uIERIBoiomyL5GKOG5XTjQCJwL/mvVEa8a1UDm+ZnB11+5DEO71ko2vS4dkIsfv4rEL+x n1uuXeCfazawvvG35Ycm2u6iwiAUSn4d7CNPOgHcOlvf+dLamO3eYWc3bJiE23WfdBg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=pJo28Xp0; arc=none smtp.remote-ip=209.85.215.174 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4098606A32D for ; Wed, 11 Nov 2026 14:13:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org A4098606A32D 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.a=rsa-sha256 header.s=20260707 header.b=pJo28Xp0 Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-cdd9d0c9bbdso787890a12.1 for ; Wed, 11 Nov 2026 06:13:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1794406396; x=1795011196; 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=99XvSMb6mXrpYcdN1AuV0z3eaby2d0kDcwc59A0VX7g=; b=pJo28Xp0dgnu5ML9qpdDWPPOhoZznRDKl8+Iwe5lZEiurYOnvPOO97yW7FH2udc/nd qb64qbzNQqii2Bx4flTXJsmC9JE44OBhps43SG+dEri5OSEG3LjJM3Z70eg7xFMJ91Kp Zr5FaI6AvZJCGG3n4lKQ3wAwjXwaJaQ7+fCLgQcuNXxBLFr3iSd5Rw7x6OY6IO8Atuxh hajRC5MfNQM99hA8STZ0MO0h3J0HitSNyH+mhSoDhLPmSQtqAxetMV47xZwDAj8q152x lipyDmzdXAn+5Zt0dpsmUjWTKQp6UheYIptfnwu6At0s2eExa8a6k9GnCoKrUkTO7NoY cnLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794406396; x=1795011196; 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=99XvSMb6mXrpYcdN1AuV0z3eaby2d0kDcwc59A0VX7g=; b=LlmdC29RLFKnPkX8ApOodgL/K8+/hZY3TeNmB/ZCi1A0B44DMJEdSlEDsx0uAarY9/ 8R+jl4vX0/Trshw2OzCwSLLX0mlUSGxH2t7Dc25+VaUIMypoN3+BnzYZaYUTMAuI/kQF sQ3TjlMcbgZrEXL72yaESz5qU1sixODPETv0OhkeglvJjHWWbEt+RbhCUEk8hUAIG/WN BrKyprWDjzTgaW8d+FpLS7+bv11pzacf5ngthS4lixoY4M4NYgq5hkOkW38zIDOnFt6m sAEboubY0QxJYO1SxLZoSlwQl+dC8pxdzQWT03Mr8Q4IXD/pYtz+GB7wuixkWFHjjKvj 9a3Q== X-Forwarded-Encrypted: i=1; AL+hErH3CyOFfQgq7adm3xnRC/nb3jdCOP88qkzzipFa7uKJJf2xBlCbKTNjtSNODrgJvnScxRMq7BNrHU5MgfE=@vger.kernel.org X-Gm-Message-State: APuU4Z+Ksg2ZDwP4o1F6NsiyoXyL3iBDYo318tA7r4LlKqCYYBXp04g5 BNydNA9PGBulh7mEQ2HLA9Ov+WjWrzO1IVYIfVgghNUnWlXKgWVKRty1 X-Gm-Gg: AYBFou0n3dURnhUFt2Ikipc1250kVx3i+nFcbVdO4m/WbhKGoyzqhgx1SwiII8qBDGH ZzpeQZ26zSZAlmGv+tjzeqtfNYt3Cft9nMFpGjBzcjP5knIVlMnBRQFZ9aMRfOZzB0D7UAeZvLe xGDOHoCDVip6TNx8Yu7eh4W8+TsQ7KbEhJyD40vfgfXfGszNPSmeCasfxaLUNh52js+bSIyGlaT 27+noIYUHFFdQOxpBhzshY7ecyUPpzoMrTObqmgmwCiYsYkMueVrdYnX93JD7zAvyeOz00nQ/j3 Ezd8LaGe2ifJIZA7t6UzYhvnlmCWMU1nFvBlZR8tnfZ9xX1ng+K1iIlT9h60rVwKyG71LqNZt7v vE2sKLV9wTGs7oDyLJ9tLRhPx/7GjbLqneBzloIqKqIogtzRvzVx7dFJuGNynEFP1LJGioeH4bI WeWCSpuuRwT+ms2GgjZUkYagmAw5zO1oE2+s+nXmNXvDH4kRwuKLHPiL5IL/FeeWJqDvyYr3jnn rIJmConrBwVnkFaiC7k9MU1S7XkB8j6k9kUkwpB7YpEYyYbAYWi9CzCmeBGGgYV9pfu4w1Gr5O0 +Jg= X-Received: by 2002:a17:90b:268f:b0:3ad:ce24:acfa with SMTP id 98e67ed59e1d1-3b182e940edmr2520221a91.20.1794406395835; Wed, 11 Nov 2026 06:13:15 -0800 (PST) Received: from qby-laptop ([2a13:edc0:18:16f::a]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3b17db319bdsm4789970a91.6.2026.11.11.06.13.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Nov 2026 06:13:13 -0800 (PST) From: Mingyou Chen To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede , Ilya Gladyshev Cc: KentoNion , platform-driver-x86@vger.kernel.org, ted eric , Armin Wolf , linux-kernel@vger.kernel.org, Chris Taraszka , Matias Civadda , =?UTF-8?q?=E9=AB=98=20=E4=BF=8A=E6=96=87?= , powerfullz , =?UTF-8?q?=E5=AD=99=20=E8=AA=89=E9=93=AD?= , =?UTF-8?q?Milo=C5=A1=20Vlku?= , Rsplwe , Bozhen Peng , Anton Karasev , Jame Jao , Serhiy Shliapuhin , okluar , Mingyou Chen , Nika Krasnova Subject: [PATCH v16 2/6] platform/x86: bitland-mifs-wmi: Merge the function of redmi-wmi into the bitland driver Date: Wed, 11 Nov 2026 22:12:22 +0800 Message-ID: <20261111141226.9482-3-qby140326@gmail.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261111141226.9482-1-qby140326@gmail.com> References: <20261111141226.9482-1-qby140326@gmail.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Tested-by: Ilya Gladyshev Reviewed-by: Ilya Gladyshev Signed-off-by: Mingyou Chen --- drivers/platform/x86/bitland-mifs-wmi.c | 153 ++++++++++++++++-------- 1 file changed, 106 insertions(+), 47 deletions(-) diff --git a/drivers/platform/x86/bitland-mifs-wmi.c b/drivers/platform/x86/bitland-mifs-wmi.c index 6dd901e54d9d..013e19395d71 100644 --- a/drivers/platform/x86/bitland-mifs-wmi.c +++ b/drivers/platform/x86/bitland-mifs-wmi.c @@ -35,6 +35,11 @@ #include #include +#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" @@ -80,9 +85,9 @@ enum bitland_mifs_power_profile { }; enum bitland_mifs_event_id { - WMI_EVENT_RESERVED_1 = 1, - WMI_EVENT_RESERVED_2 = 2, - WMI_EVENT_RESERVED_3 = 3, + WMI_EVENT_SWITCHVIDEOMODE = 1, + WMI_EVENT_SELECTIVE_SCREENSHOT = 2, + WMI_EVENT_ALL_APPLICATIONS = 3, WMI_EVENT_AIRPLANE_MODE = 4, WMI_EVENT_KBD_BRIGHTNESS = 5, WMI_EVENT_TOUCHPAD_STATE = 6, @@ -100,10 +105,11 @@ enum bitland_mifs_event_id { WMI_EVENT_FN_1 = 19, WMI_EVENT_FN_2 = 20, WMI_EVENT_FN_3 = 21, - WMI_EVENT_FN_4 = 22, + WMI_EVENT_PERFORMANCE_PLAN_ALT = 22, WMI_EVENT_FN_5 = 24, WMI_EVENT_REFRESH_RATE = 25, WMI_EVENT_CPU_FAN_SPEED = 26, + WMI_EVENT_CONFIG = 27, WMI_EVENT_GPU_FAN_SPEED = 32, WMI_EVENT_WIN_KEY_LOCK = 33, WMI_EVENT_RESERVED_23 = 34, @@ -607,18 +613,54 @@ static const struct attribute *const laptop_attrs[] = { ATTRIBUTE_GROUPS(laptop); static const struct key_entry bitland_mifs_wmi_keymap[] = { - { 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_5, 0, 0), {} }, + + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_SELECTIVE_SCREENSHOT, 0, 0), + { KEY_SELECTIVE_SCREENSHOT } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_ALL_APPLICATIONS, 0, 0), { KEY_ALL_APPLICATIONS } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_CONFIG, 0, 0), { KEY_CONFIG } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_CONFIG, 1, 0), { KEY_CONFIG } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_SWITCHVIDEOMODE, 1, 0), { KEY_SWITCHVIDEOMODE } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_SWITCHVIDEOMODE, 0, 0), { KEY_SWITCHVIDEOMODE } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_REFRESH_RATE, 0, 0), { KEY_REFRESH_RATE_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_KEY, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0, 0), {KEY_KBDILLUMTOGGLE} }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0x80, 0), {KEY_KBDILLUMTOGGLE} }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 5, 0), {KEY_KBDILLUMTOGGLE} }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0x0a, 0), {KEY_KBDILLUMTOGGLE} }, + + /* Xiaomi G Command Center */ + { KE_KEY, BI_HOTKEY_CODE(0x0a, 1, 0), { KEY_VENDOR } }, + + /* Fn Lock state */ + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FNLOCK_STATE, 0, 0), { KEY_FN_ESC } }, + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_FNLOCK_STATE, 1, 0), { KEY_FN_ESC } }, + + /* 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 } }; static void bitland_notifier_unregister(void *data) @@ -736,13 +778,42 @@ static int bitland_mifs_wmi_probe(struct wmi_device *wdev, const void *context) &drv_data->notifier); } +static bool bitland_is_ai_key_scancode(unsigned int code) +{ + return code == BI_HOTKEY_CODE(WMI_EVENT_FN_5, 1, 0) || + code == BI_HOTKEY_CODE(0x19, 1, 0); +} + +static void bitland_mifs_wmi_report_key(struct wmi_device *wdev, u32 payload) +{ + struct bitland_mifs_wmi_data *data = dev_get_drvdata(&wdev->dev); + struct key_entry *entry; + bool autorelease = true; + int value = 1; + + entry = 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 (bitland_is_ai_key_scancode(entry->code)) { + value = !(payload & AI_KEY_VALUE_MASK); + autorelease = 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 = dev_get_drvdata(&wdev->dev); const struct bitland_mifs_event *event = buffer->data; struct bitland_fan_notify_data fan_data; u8 brightness; + u32 payload; /* Validate event type */ if (event->event_type != WMI_EVENT_TYPE_HOTKEY) @@ -758,24 +829,14 @@ static void bitland_mifs_wmi_notify(struct wmi_device *wdev, blocking_notifier_call_chain(&bitland_notifier_list, BITLAND_NOTIFY_KBD_BRIGHTNESS, &brightness); - break; + return; case WMI_EVENT_PERFORMANCE_PLAN: + case WMI_EVENT_PERFORMANCE_PLAN_ALT: 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; /* * The device has 3 fans (CPU, GPU, SYS), @@ -783,6 +844,14 @@ 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 == WMI_EVENT_CPU_FAN_SPEED && + event->value_low == 0 && event->value_high == 0) { + payload = BI_HOTKEY_CODE(WMI_EVENT_REFRESH_RATE, 0, 0); + bitland_mifs_wmi_report_key(wdev, payload); + return; + } + if (event->event_id == WMI_EVENT_CPU_FAN_SPEED) fan_data.channel = 0; else @@ -793,27 +862,17 @@ 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=%d value=%d\n", - event->event_id, event->value_low); - break; + return; default: - dev_dbg(&wdev->dev, "Unknown event: id=0x%02x value=0x%02x\n", - event->event_id, event->value_low); + dev_dbg(&wdev->dev, + "Unknown WMI event: id=0x%02x value_low=0x%02x value_high=0x%02x\n", + event->event_id, event->value_low, event->value_high); break; } + + payload = get_unaligned_le32(buffer->data); + bitland_mifs_wmi_report_key(wdev, payload); } static const struct wmi_device_id bitland_mifs_wmi_id_table[] = { -- 2.56.0