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.crequests the SLPI’s IRQ withIRQF_NO_SUSPEND, so it survivessuspend_device_irqs(), andqcom_smgralready callspm_wakeup_event()on the input device when a gesture arrives. Everyglink-smemIRQ readswakeup=disabledin sysfs and that is not evidence of anything –WLAN_CE_2reads the same while awake and demonstrably wakes the phone, because ath10k arms it inside its suspend callback. ftm4_enable_sensorhas 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.
