From nobody Sat Jul 25 18:53:19 2026 Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D694231830 for ; Wed, 15 Jul 2026 00:42:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784076135; cv=none; b=qpuU6cHvRb92bMsBn82tSmDo4FsRm8i8Xdv/ZufhWyyEdqGXq7BzkiHJUKTUMNHnApk+I07f7qUineL68ARxwMqnW4qEevMj2qIkihhhgmeCoAiGv8Zg/kAiYebN+vPeRleJGbuSxqE9V5RePDE8UrfcG9Uy7C2Y2SOW0QRIgYc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784076135; c=relaxed/simple; bh=Xhh4875qo0KPn31j0oCBWQE4DediDkd7AhMFu0bZfp0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=QmvzKX2TIdRr3JOzoVwr6lLZy2J9sH03Jx948t+rEbeY8S9Tot4mNrsuCfDv1cKEBhwLxYqDZQ6yJ5zGe70RO2qrLNE/nAk3EGsC/uvtZhNxfvpc8HCAhNwaHcr4FGGTYHPdtvAvXoi/Tq60quufwBhc9QFKBSb9bpN9QLnxk0o= 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=GRtmm4Nu; arc=none smtp.client-ip=209.85.218.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GRtmm4Nu" Received: by mail-ej1-f41.google.com with SMTP id a640c23a62f3a-c166f1bbeaeso146197366b.0 for ; Tue, 14 Jul 2026 17:42:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784076128; x=1784680928; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=xUKUlfDTAo3vrLAu+doVpEONO9BXUFJiSq1WH9CFOSM=; b=GRtmm4NueVkl7ASUfxMQMGsFs40Xefm+L/Jjey77TrNe4fOffmwCw23uulmhkfDTTF XXXIAabsUn2um7iRYLmfhQ8t7CsFSU5xyPL3f/SDPQSrObEzxa2unbJrByhTqLVCqib5 O9uIAw/4BbEYVEOECZdfTRgkRhG6+Fes637roBlw3BZ0Ho5+8e24/xupxFZMrdu4Ghlp wqo8GMJzVCMhyl4TwnWuKizrGzUSl6y3HMX7PYAyq0V/ZC6Pt4B7z2V/guWhsL9bPyP8 KW6aXUMRFRSePanniKLIv7ljmenmOfuE0tKtj4YQh7wOcFBZ/IS+roudRwq0bCabhpkx AfOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784076128; x=1784680928; h=content-transfer-encoding:mime-version: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=xUKUlfDTAo3vrLAu+doVpEONO9BXUFJiSq1WH9CFOSM=; b=Uc9kHquNEm12Y3MNtBAMPlI0YdyPLOIYxXLc2yq1I9R9zM/RtPvo4yNgXVhvBOlIwE uzg34EttrlFmbj8mSWLXTjxVUkvZA6mUpx8gOY7MBk24mW0i8QncFM8kHCwgUjq+JqQa /kmLgV1WsJA0QJJ4BqMCb04dhpVLmg5pcDH6ISuOBUpcDTaxuUVKQo7YU6ZLtBlpGr/R VJWfO+kNATkJeBm/us1Uzpa2yUri3VFOeoPPeX6OoP/sEECmlqf+ilJth726CpVtLA/n cOkNYTm0rwahGObMSBrt/3dYriqx6RhZy+9CO3nqJqnqkWox9dBzW4rlsG/PcHz/lygF bGHg== X-Forwarded-Encrypted: i=1; AHgh+RryZJWj+Pay3zLa1nBt637/NxJ496XhsGqgi4kzy0t3OGYvsNBlfISE94Xr0z7HIiPMAOpL1hZKWPM+qEo=@vger.kernel.org X-Gm-Message-State: AOJu0Yx3YfPcKKIG00VEQS7c+/kEasdZCSg96sZmHZYzJR2dqPoviRzT YrVL8oOsIYWPhK6bm+nxQqkkwvoQsY3NQRgaEgqBU9hL3vpIOBNbWAAyPU6RHx91 X-Gm-Gg: AfdE7ck7uuWiOFv2xGxFo3b+8YTOZxNsR5Si1Vv4PQRRvSg1L8YLMLU0OR2yEHrkomj i92zfe/Jdgj+sh3HZXtXPAhFUgsysKZJbq7zzXJDGD0GgGYejEUyAGAMxGb3EhmbF2aPrINdpDD O0VN+IRAVjWgpDiOF2yTgz35pRSE+l3SpB9w+FZ+WWv5TWwGtdZ8XQoddPLBTZDWmRnULDnKO62 Z2HUtlRkiLki72BSDZ9caVFUOJHBe1afoBoTKAkgNSCHqDSXOX/f6sYT5l2NxLYZ8EMsESYJKQJ jjBA4A49fdmyRhNFO3oXEAsJcXMNOxpoiYYkhrFQyKKhYQjufX4ksC54Rl0zF4EtsAEDgSrztXI uw5MitHHMe/ixS0wuxTgDI9a8kdFWlGFu/4WUS4dDUCidAUAS9HQtwiz2S0+wS2QjAL80voWK7f 56RoVKBDcpnIXUTzKRvMbI5+sJPPYQjVyjqW3EIkM4xlpTtkY0e97+/xnYA1L0Pg== X-Received: by 2002:a17:907:3d55:b0:c15:efb1:9ff7 with SMTP id a640c23a62f3a-c16616ad29bmr346193066b.28.1784076128265; Tue, 14 Jul 2026 17:42:08 -0700 (PDT) Received: from fedora.ts.hejka.me (83.22.230.193.ipv4.supernova.orange.pl. [83.22.230.193]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c15deea5cf6sm909671966b.16.2026.07.14.17.42.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 17:42:06 -0700 (PDT) From: Zhan Chubukou To: platform-driver-x86@vger.kernel.org Cc: hansg@kernel.org, linux-kernel@vger.kernel.org, chubukou Subject: [PATCH] platform/x86: Add GETAC MPMD programmable button driver Date: Wed, 15 Jul 2026 02:42:03 +0200 Message-ID: <20260715004203.14549-1-chubukou@gmail.com> X-Mailer: git-send-email 2.55.0 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" From: chubukou GETAC rugged laptops (e.g. S410) expose vendor button events through an ACPI device "MPMD" with hardware ID MTC0303. The Embedded Controller raises query methods that issue Notify(MPMD, ) on programmable / hotkey button activity. Because no Linux driver binds MTC0303, these notifies are silently dropped and the buttons appear dead under Linux (neither libinput nor acpid observe them: they are device notifies, not generic ACPI events). Add a minimal ACPI driver that binds MTC0303 and forwards the notifies as input events through a sparse-keymap. On the S410 (BIOS R1.25) the programmable P2 button generates Notify(MPMD, 0x97) and is mapped to KEY_PROG1. Other buttons in the 0xC0..0xCB range (EC queries _Q81.._Q89, _Q6A, _Q6B) remain unmapped until confirmed on a given model; enable dynamic-debug to identify them. Signed-off-by: chubukou --- MAINTAINERS | 6 ++ drivers/platform/x86/Kconfig | 11 ++++ drivers/platform/x86/Makefile | 3 + drivers/platform/x86/getac-mpmd.c | 96 +++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 drivers/platform/x86/getac-mpmd.c diff --git a/MAINTAINERS b/MAINTAINERS index ce5c518..9bdabdf 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -11014,6 +11014,12 @@ F: Documentation/filesystems/gfs2/ F: fs/gfs2/ F: include/uapi/linux/gfs2_ondisk.h =20 +GETAC MPMD DRIVER +M: chubukou +L: platform-driver-x86@vger.kernel.org +S: Maintained +F: drivers/platform/x86/getac-mpmd.c + GIGABYTE WATERFORCE SENSOR DRIVER M: Aleksa Savic L: linux-hwmon@vger.kernel.org diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index b54b521..2effb96 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig @@ -440,6 +440,17 @@ config FUJITSU_TABLET =20 If you have a Fujitsu convertible or slate, say Y or M here. =20 +config GETAC_MPMD + tristate "GETAC MPMD programmable button support" + depends on ACPI + help + Driver for the GETAC MPMD ACPI device (HID MTC0303) which forwards + Embedded Controller button events (e.g. the programmable P2 button) + as input key events. Without this driver the buttons are silently + dropped and appear dead under Linux. + + Say Y or M if you have a GETAC rugged laptop (e.g. S410). + config GPD_POCKET_FAN tristate "GPD Pocket Fan Controller support" depends on ACPI diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index 872ac38..8896da3 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile @@ -57,6 +57,9 @@ obj-$(CONFIG_FUJITSU_TABLET) +=3D fujitsu-tablet.o # GPD obj-$(CONFIG_GPD_POCKET_FAN) +=3D gpd-pocket-fan.o =20 +# GETAC +obj-$(CONFIG_GETAC_MPMD) +=3D getac-mpmd.o + # Hewlett Packard obj-$(CONFIG_X86_PLATFORM_DRIVERS_HP) +=3D hp/ =20 diff --git a/drivers/platform/x86/getac-mpmd.c b/drivers/platform/x86/getac= -mpmd.c new file mode 100644 index 0000000..0f1ec8b --- /dev/null +++ b/drivers/platform/x86/getac-mpmd.c @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * GETAC MPMD programmable button driver + * + * GETAC rugged laptops expose vendor events through an ACPI device named + * "MPMD" with hardware ID MTC0303. The Embedded Controller raises query + * methods that Notify(MPMD, ) on programmable / hotkey button + * activity. Without a driver bound to MTC0303 these notifies are silently + * dropped, so the buttons appear dead under Linux. + * + * This driver binds MTC0303 and forwards the notifies as input events. + * + * Observed on GETAC S410 (BIOS R1.25.070520): + * 0x97 P2 programmable button (repeats at ~3 Hz while held) + * + * The 0xC0..0xCB range is generated by EC query methods _Q81.._Q89, _Q6A + * and _Q6B and is left as KEY_UNKNOWN until a button is confirmed; enable + * module dynamic-debug to identify further buttons on a given model. + * + * Copyright (C) 2026 chubukou + */ + +#include +#include +#include +#include + +struct getac_mpmd_priv { + struct input_dev *input; +}; + +static const struct key_entry getac_mpmd_keymap[] =3D { + { KE_KEY, 0x97, { KEY_PROG1 } }, /* P2 programmable button */ + { KE_END, 0 } +}; + +static void getac_mpmd_notify(struct acpi_device *adev, u32 event) +{ + struct getac_mpmd_priv *priv =3D acpi_driver_data(adev); + + if (!sparse_keymap_report_event(priv->input, event, 1, true)) + dev_dbg(&adev->dev, "unknown notify event 0x%02x\n", event); +} + +static int getac_mpmd_add(struct acpi_device *adev) +{ + struct getac_mpmd_priv *priv; + struct input_dev *input; + int ret; + + priv =3D devm_kzalloc(&adev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + input =3D devm_input_allocate_device(&adev->dev); + if (!input) + return -ENOMEM; + + input->name =3D "GETAC MPMD programmable buttons"; + input->phys =3D "getac-mpmd/input0"; + input->id.bustype =3D BUS_HOST; + + ret =3D sparse_keymap_setup(input, getac_mpmd_keymap, NULL); + if (ret) + return ret; + + ret =3D input_register_device(input); + if (ret) + return ret; + + priv->input =3D input; + adev->driver_data =3D priv; + return 0; +} + +static const struct acpi_device_id getac_mpmd_ids[] =3D { + { "MTC0303" }, + { } +}; +MODULE_DEVICE_TABLE(acpi, getac_mpmd_ids); + +static struct acpi_driver getac_mpmd_driver =3D { + .name =3D "getac_mpmd", + .class =3D "getac", + .ids =3D getac_mpmd_ids, + .ops =3D { + .add =3D getac_mpmd_add, + .notify =3D getac_mpmd_notify, + }, +}; + +module_acpi_driver(getac_mpmd_driver); + +MODULE_AUTHOR("chubukou "); +MODULE_DESCRIPTION("GETAC MPMD (MTC0303) programmable button driver"); +MODULE_LICENSE("GPL"); --=20 2.55.0