[PATCH v1 1/1] usb: typec: tipd: Restore generic TPS6598x contract interrupts

Vincent Cloutier
2026-04-02T00:09:57Z

From: Vincent Cloutier <vincent@cloutier.co>

The generic TPS6598x interrupt handler still relies on
PP_SWITCH_CHANGED, NEW_CONTRACT_AS_CONSUMER, HARD_RESET, and
STATUS_UPDATE, but the irq_mask1 refactor only kept
POWER_STATUS_UPDATE, DATA_STATUS_UPDATE, and PLUG_EVENT in
tps6598x_data.

On the librem5 that leaves PD partners stuck at the 500 mA fallback
because the active contract is never refreshed after attach.

Restore the missing interrupt bits so the existing handler paths are
reachable again. This fixes USB-C charging negotiation on the librem5:
after a replug the TPS6598x source power supply reports 3 A instead of
500 mA and the BQ25890 input limit follows suit.

Fixes: b3dddff502c5 ("usb: typec: tipd: Move initial irq mask to tipd_data")
Cc: stable@vger.kernel.org
Signed-off-by: Vincent Cloutier <vincent@cloutier.co>
---
drivers/usb/typec/tipd/core.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index 84ee5687bb27..83f2fec6e34e 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -2395,7 +2395,11 @@ static const struct tipd_data tps6598x_data = {
.irq_handler = tps6598x_interrupt,
.irq_mask1 = TPS_REG_INT_POWER_STATUS_UPDATE |
TPS_REG_INT_DATA_STATUS_UPDATE |
- TPS_REG_INT_PLUG_EVENT,
+ TPS_REG_INT_PLUG_EVENT |
+ TPS_REG_INT_PP_SWITCH_CHANGED |
+ TPS_REG_INT_NEW_CONTRACT_AS_CONSUMER |
+ TPS_REG_INT_HARD_RESET |
+ TPS_REG_INT_STATUS_UPDATE,
.tps_struct_size = sizeof(struct tps6598x),
.register_port = tps6598x_register_port,
.unregister_port = tps6598x_unregister_port,
--
2.53.0