Hello Uwe,
On Thursday, 17 September 2020, 16:02:35 CEST, Uwe Kleine-König wrote:
Hello,
On Thu, Sep 17, 2020 at 02:20:27PM +0200, Christian Eggers wrote: ...
/* check for arbitration lost */ if (temp & I2SR_IAL) { temp &= ~I2SR_IAL;
temp |= (i2c_imx->hwdata->i2sr_clr_opcode & I2SR_IAL); imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); return -EAGAIN;
...
This looks strange. First the flag is cleared and then it is (in some cases) set again.
i.MX controllers require writing a 0 to clear these bits. Vybrid controllers need writing a 1 for the same.
If I2SR_IIF is set in temp you ack this irq without handling it. (Which might happen if atomic is set and irqs are off?!)
This patch is only about using the correct processor specific value for acknowledging an IRQ... But I think that returning EAGAIN (which aborts the transfer) should be handling enough. At the next transfer, the controller will be set back to master mode.
I see this idiom is used in a few more places in the driver already, I didn't check but these might have the same problem maybe?
Best regards Christian