From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mta1.migadu.com (out-134.mta1.migadu.com [95.215.58.134]) (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 4424B3B95EB for ; Wed, 30 Sep 2026 22:01:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.134 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790805710; cv=none; b=Zcz7Hj41P8SW7zqp8fIgn2b24Ds3GuHtA4QZ8PW83zmkRGVe4GeTvq739VWxhzWTRdmaMbTXT2d0dvVTAf/PLSKYl47vXCBwOu7sDJ7RDmgdX0NwcS7+bYG9R/8T/AcV+7copmnbR2EcZHVoMPgVCGX44rWMDRs0jLfWRBT6dyk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790805710; c=relaxed/simple; bh=jTaStd3+0ew72+ffXTT1sChu/gNIAwqoQJW8VrkxEfU=; h=MIME-Version:Date:Content-Type:From:Message-ID:Subject:To:Cc: In-Reply-To:References; b=Oh8bufLKsYpAKTFvk7rXvtYZpYERQUqF2jjTJoC57Hmpl1sdSM09/iIltDbSRiOzxNS625eq6iY7HfJFmsQI/iPqcNME7Vp8r6Lh9HhpEc9z2YQvJ4NvYEKz1gEsZK8SvIYPAL+qKen7aQMH8DvqdLRJerQlo4eJWNQq5/ZH6HE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=AmlvrPSG; arc=none smtp.client-ip=95.215.58.134 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="AmlvrPSG" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=jTaStd3+0ew72+ffXTT1sChu/gNIAwqoQJW8VrkxEfU=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1790805702; v=1; x=1791410502; b=AmlvrPSGOX54R5C+MoF799SXqHCsnSfoD+voZGy0PkOqL3xh9J72cc064E1msjnS41YAgwFD XkgIIucFTIV2c599vk3nBmQnfeMImBB7nU+LVBlJxDYHcawAENPIAVlGm02jhmW0Z3cRrrwvCde jJmLrOIIwsPwTMFaMf4nQ5L4= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id de2e50cb399fccd8; Wed, 30 Sep 2026 22:01:41 +0000 X-Mizu-Trace-ID: de2e50cb399fccd8 X-Migadu-Flow: FLOW_OUT Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Date: Wed, 30 Sep 2026 22:01:41 +0000 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: "Ilya Gladyshev" Message-ID: TLS-Required: No Subject: Re: [PATCH v6 2/5] platform/x86: bitland-mifs-wmi: Merge the function of redmi-wmi into the bitland driver To: "Mingyou Chen" , "=?utf-8?B?SWxwbyBKw6RydmluZW4=?=" , "Hans de Goede" Cc: "KentoNion" , platform-driver-x86@vger.kernel.org, "ted eric" , "Armin Wolf" , linux-kernel@vger.kernel.org, "Chris Taraszka" , "Matias Civadda" , "=?utf-8?B?6auYIOS/iuaWhw==?=" , "powerfullz" , "=?utf-8?B?5a2ZIOiqiemTrQ==?=" , "=?utf-8?B?TWlsb8WhIFZsa3U=?=" , "Rsplwe" , "Bozhen Peng" , "Nika Krasnova" , "Musaev Ibragim" In-Reply-To: <20260929134503.17249-3-qby140326@gmail.com> References: <20260929134503.17249-1-qby140326@gmail.com> <20260929134503.17249-3-qby140326@gmail.com> On 9/29/26 16:45, Mingyou Chen wrote: > 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 | 139 ++++++++++++++++-------= - > 1 file changed, 96 insertions(+), 43 deletions(-) > > diff --git a/drivers/platform/x86/bitland-mifs-wmi.c b/drivers/platfo= rm/x86/bitland-mifs-wmi.c > index dd1648b7de77..e1a81e89856e 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_EV= ENT_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" > @@ -607,18 +612,59 @@ static const struct attribute *const laptop_attrs= [] =3D { > ATTRIBUTE_GROUPS(laptop); > > 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_CAL= C } }, > + > + { 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= _SCREENSHOT } }, > + { KE_KEY, BI_HOTKEY_CODE(WMI_EVENT_RESERVED_3, 0, 0), { KEY_ALL_APPLI= CATIONS } }, > + { 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_SWITCHVID= EOMODE } }, > + { 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_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0, 0), {} }, > + { KE_IGNORE, BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0, 0x80), {} }, Sorry, I missed this in my previous email. 0x00800501 -> BI_HOTKEY_CODE(WMI_EVENT_KBD_BRIGHTNESS, 0x80, 0), probably a typo? > + { 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), {} }, These keys are reported as KEY_FN_ESC in the current redmi-wmi driver (commit e0d6312578e1fd03738fc2ac8ac21c8bd84e965e), so those mappings (and other from that commit) in bitland-mifs-wmi should be updated. Cc'ing the commit author, who highlighted those issues during the v1 review. Please see his other comments in [1] (and don't forget to cc the reviewers on future submissions [2]). [1]: https://lore.kernel.org/all/178444076601.4076.16818759313258005640@g= mail.com/ [2]: https://docs.kernel.org/process/submitting-patches.html#respond-to-r= eview-comments > + /* 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,12 +782,35 @@ static int bitland_mifs_wmi_probe(struct wmi_devi= ce *wdev, const void *context) > &drv_data->notifier); > } > > +static void bitland_mifs_wmi_report_key(struct wmi_device *wdev, u= 32 payload) > +{ > + 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", payl= oad); > + 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; > > /* Validate event type */ > @@ -758,24 +827,13 @@ static void bitland_mifs_wmi_notify(struct wmi_de= vice *wdev, > blocking_notifier_call_chain(&bitland_notifier_list, > BITLAND_NOTIFY_KBD_BRIGHTNESS, > &brightness); > - break; > + return; > > 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; > > /* > * The device has 3 fans (CPU, GPU, SYS), > @@ -783,6 +841,14 @@ static void bitland_mifs_wmi_notify(struct wmi_dev= ice *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 && > + 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 > @@ -793,27 +859,14 @@ static void bitland_mifs_wmi_notify(struct wmi_de= vice *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; > > 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); > } > > static const struct wmi_device_id bitland_mifs_wmi_id_table[] =3D= =20{