[PATCH linux dev-5.3] i2c: aspeed: Prevent state corruption for IRQ with no status
Jae Hyun Yoo
jae.hyun.yoo at linux.intel.com
Sat Oct 19 03:10:37 AEDT 2019
On 10/18/2019 8:46 AM, Eddie James wrote:
> On the AST2600, interrupts have been observed with no interrupt status
> bits set. This can break the driver state machine, so these interrupts
> should be detected and the handler should return IRQ_NONE.
>
> Signed-off-by: Eddie James <eajames at linux.ibm.com>
Reviewed-by: Jae Hyun Yoo <jae.hyun.yoo at linux.intel.com>
Thanks Eddie!
> ---
> drivers/i2c/busses/i2c-aspeed.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c
> index c2a6e5a27314..e19f24c0acb2 100644
> --- a/drivers/i2c/busses/i2c-aspeed.c
> +++ b/drivers/i2c/busses/i2c-aspeed.c
> @@ -603,6 +603,17 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id)
>
> spin_lock(&bus->lock);
> irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG);
> +
> + /*
> + * On the AST2600, interrupts have been observed with no interrupt
> + * status bits set. In this case, the handler should return IRQ_NONE
> + * immediately to prevent driver state machine corruption.
> + */
> + if (!irq_received) {
> + spin_unlock(&bus->lock);
> + return IRQ_NONE;
> + }
> +
> /* Ack all interrupts except for Rx done */
> writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE,
> bus->base + ASPEED_I2C_INTR_STS_REG);
>
More information about the openbmc
mailing list