[PATCH v2 0/2] Input: add support for OnePlus/OPPO Pad pogo-pin keyboards

From: wyibo6109

Date: Sat Oct 10 2026 - 10:38:59 EST


From: Yibo Wang <wyibo6109@xxxxxxxxx>

This series adds support for the magnetic pogo-pin smart keyboards of
the OnePlus Pad 3 Pro / Pad 4 and the OPPO Pad 5 Pro. The keyboard is
built around a Tinno MCU attached to a tablet UART. Both sides share a
single data wire, so the host gates its transmission onto the bus with a
PMIC GPIO for the duration of a frame, and every host frame is echoed
back on RX.

The MCU speaks a framed "one wire bus" protocol over the half-duplex
921600 8N1 UART: 8x 0x55 preamble, 0xF1, src/dst addresses, command,
length, payload, CRC16-IBM (poly 0x8005, init 0xC596), 0xFE and 4x 0xAA.
The protocol was reverse engineered from the vendor kernel driver; this
is a clean-room serdev reimplementation that replaces the downstream
platform driver, which depends on a private msm_geni_serial callback and
a user-space held tty fd.

Patch 1 adds the DT binding for the "oneplus,pogo-keyboard" device,
describing the supply, TX-gate and wake GPIOs, with a MAINTAINERS entry.

Patch 2 adds the driver: keyboard matrix, touchpad, function and URL
keys, caps-lock LED, attach detection through the wake GPIO plus a
100 ms heartbeat timeout, and the keyboard backlight as a
"pogo-keyboard::kbd_backlight" LED class device so UPower and the
desktop keyboard-backlight controls drive it through the standard
interface (the level is cached while detached and restored on
re-attach). A sysfs battery level is exported for the keyboards that
carry a battery.

Changes in v2, addressing Krzysztof Kozlowski's review of the binding:

- dropped the redundant "binding" from the dt-bindings subject;

- replaced the custom oneplus,touchpad-xy-max/-resolution properties
with the common touchscreen properties touchscreen-size-x/y and
touchscreen-x-mm/y-mm, parsed with touchscreen_parse_properties() in
the driver: the MCU protocol has no way to query the touchpad
geometry and the same MCU is shipped in keyboards with different
touchpad matrices, so the geometry stays in DT but uses the common
schema instead of vendor properties;

- dropped the serial wrapper node from the binding example;

- the MAINTAINERS entry added with the binding references only the
binding file; the driver F: line is added together with the driver
patch.

Tested on the OnePlus Pad 4 (iceland) running Linux 7.2.0-sm8850
(v7.2-based iceland tree).

Yibo Wang (2):
dt-bindings: input: add OnePlus pogo-pin keyboard
Input: add OnePlus/OPPO Pad pogo-pin keyboard serdev driver

.../bindings/input/oneplus,pogo-keyboard.yaml | 66 +
MAINTAINERS | 7 +
drivers/input/keyboard/Kconfig | 13 +
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/oneplus-pogo-kbd.c | 1196 +++++++++++++++++
5 files changed, 1283 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/oneplus,pogo-keyboard.yaml
create mode 100644 drivers/input/keyboard/oneplus-pogo-kbd.c

--
2.53.0