Though the TCAN4550's device-specific interrupts are cleared in tcan4x5x_clear_interrupts(), they are ignored, which may cause the m_can driver to stop working due to the ISR becoming disabled (the famous "nobody cared" message). Signed-off-by: Torin Cooper-Bennun <torin@xxxxxxxxxxxxxxxxxx> --- drivers/net/can/m_can/tcan4x5x-core.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c index 4147cecfbbd6..cee7dfff381f 100644 --- a/drivers/net/can/m_can/tcan4x5x-core.c +++ b/drivers/net/can/m_can/tcan4x5x-core.c @@ -39,6 +39,7 @@ #define TCAN4X5X_CANBUS_ERR_INT_EN BIT(5) #define TCAN4X5X_BUS_FAULT BIT(4) #define TCAN4X5X_MCAN_INT BIT(1) +#define TCAN4X5X_VTWD_INT BIT(0) #define TCAN4X5X_ENABLE_TCAN_INT \ (TCAN4X5X_MCAN_INT | TCAN4X5X_BUS_FAULT | \ TCAN4X5X_CANBUS_ERR_INT_EN | TCAN4X5X_CANINT_INT_EN) @@ -190,6 +191,16 @@ static int tcan4x5x_power_enable(struct regulator *reg, int enable) return regulator_disable(reg); } +static u32 tcan4x5x_read_tcan_reg(struct m_can_classdev *cdev, int reg) +{ + struct tcan4x5x_priv *priv = cdev_to_priv(cdev); + u32 val; + + regmap_read(priv->regmap, reg, &val); + + return val; +} + static int tcan4x5x_write_tcan_reg(struct m_can_classdev *cdev, int reg, int val) { @@ -221,6 +232,19 @@ static int tcan4x5x_clear_interrupts(struct m_can_classdev *cdev) TCAN4X5X_CLEAR_ALL_INT); } +static irqreturn_t tcan4x5x_handle_dev_interrupts(struct m_can_classdev *cdev) +{ + irqreturn_t ret = IRQ_NONE; + int ir; + + ir = tcan4x5x_read_tcan_reg(cdev, TCAN4X5X_INT_FLAGS); + + if (ir & (TCAN4X5X_CANDOM_INT_EN | TCAN4X5X_VTWD_INT)) + ret = IRQ_HANDLED; + + return ret; +} + static int tcan4x5x_init(struct m_can_classdev *cdev) { struct tcan4x5x_priv *tcan4x5x = cdev_to_priv(cdev); @@ -305,6 +329,7 @@ static struct m_can_ops tcan4x5x_ops = { .write_fifo = tcan4x5x_write_fifo, .read_fifo = tcan4x5x_read_fifo, .clear_interrupts = tcan4x5x_clear_interrupts, + .handle_dev_interrupts = tcan4x5x_handle_dev_interrupts, }; static int tcan4x5x_can_probe(struct spi_device *spi) -- 2.30.2