Skip to content

The SLPI refuses to arm a wake gesture unless tlmm 75 is already high, and it gives up after 500 ms

scope: device:google-taimen · severity: finding · confidence: proven · subsystem: input

The SLPI has its own ftm4 driver. sns_dd_ftm4_init, ftm4_enable_sensor, ftm4_check_chip_id, ftm4_configure_double_tap_parameters, ftm4_best_effort_update_gesture_mask, ftm4_register_interrupt. It talks i2c to the touch controller itself; the AP’s job is only to get out of the way.

And it decides whether it may, by reading the mux pin itself:

bool ftm4_i2c_switched_to_slpi(void) { /* b2194b90 */
r = gpio_read(0x4b, &v); /* 0x4b == tlmm 75 */
if (r) log("%s: failed to read gpio, status = %d");
return r == 0 && v != 0; /* SLPI owns it when 75 is high */
}
/* ftm4_enable_sensor, b2194c04 */
i = -0x32; /* -50 */
do {
if (ftm4_i2c_switched_to_slpi() & 1) { ...chip id, reinit, gesture mask... }
usleep(10000);
} while (++i != 0); /* 500 ms, then: */
log("%s: switch not ready, time out");
log("%s: touch i2c port offline, aborting");

So the arming order matters, and ours is wrong. Userspace writes in_index0_change_en on an awake phone. The AP holds the mux, tlmm 75 is low, the SLPI waits half a second and gives up. The suspend that hands the bus over comes later, and nothing re-arms the sensor after it.

That kills the standing hypothesis – that ftm4.keep_powered plus ftm4_suspend()’s handover was the missing ingredient. It was tested properly on 2026-09-19, with an operator, and produced a clean null.

What is NOT established. Whether handing the bus over first and arming then makes the gesture fire. ftm4.handover (patch 0246) exists to try it and has not been run with anyone at the phone. Two things to know before trying:

  • The AP wake path is probably fine, so do not go fixing it. qcom_glink_smem.c requests the SLPI’s IRQ with IRQF_NO_SUSPEND, so it survives suspend_device_irqs(), and qcom_smgr already calls pm_wakeup_event() on the input device when a gesture arrives. Every glink-smem IRQ reads wakeup=disabled in sysfs and that is not evidence of anything – WLAN_CE_2 reads the same while awake and demonstrably wakes the phone, because ath10k arms it inside its suspend callback.
  • ftm4_enable_sensor has a second exit worth watching, after the mux check: "framework interrupt service not enabled" and "failed to register ftm4 signal on GPIO [%d]". The AP holds the ftm4 interrupt (irq 131, msmgpio 125) and never releases it.