| From 705c4ed0643366963547b2616d53165f2519c81f Mon Sep 17 00:00:00 2001 |
| From: Myeonghun Pak <mhun512@gmail.com> |
| Date: Fri, 26 Jun 2026 19:35:52 +0300 |
| Subject: tpm: tpm_i2c_nuvoton: disable IRQ on wait timeout |
| |
| From: Myeonghun Pak <mhun512@gmail.com> |
| |
| commit 705c4ed0643366963547b2616d53165f2519c81f upstream. |
| |
| i2c_nuvoton_wait_for_stat() enables the IRQ before waiting for the |
| interrupt handler to report a status change. If the wait times out, or is |
| interrupted before the handler runs, the function returns without |
| balancing the enable_irq() call. |
| |
| Disable the IRQ before leaving the failed wait path. Also preserve an |
| interrupted wait's original error code instead of converting it to |
| -ETIMEDOUT inside the helper. |
| |
| Cc: stable@vger.kernel.org # v5.10+ |
| Fixes: 4c336e4b1556 ("tpm: Add support for the Nuvoton NPCT501 I2C TPM") |
| Co-developed-by: Ijae Kim <ae878000@gmail.com> |
| Signed-off-by: Ijae Kim <ae878000@gmail.com> |
| Signed-off-by: Myeonghun Pak <mhun512@gmail.com> |
| Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> |
| Link: https://lore.kernel.org/r/20260626091653.54929-1-mhun512@gmail.com |
| Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/char/tpm/tpm_i2c_nuvoton.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/char/tpm/tpm_i2c_nuvoton.c |
| +++ b/drivers/char/tpm/tpm_i2c_nuvoton.c |
| @@ -181,8 +181,10 @@ static int i2c_nuvoton_wait_for_stat(str |
| timeout); |
| if (rc > 0) |
| return 0; |
| - /* At this point we know that the SINT pin is asserted, so we |
| - * do not need to do i2c_nuvoton_check_status */ |
| + |
| + disable_irq(priv->irq); |
| + if (rc < 0) |
| + return rc; |
| } else { |
| unsigned long ten_msec, stop; |
| bool status_valid; |