Hi,I've found that the Bus free interrupt can be used for STOP condition in slave mode.
The omap i2c controller (at least on dra7x devices)I think you can deduce that. If a new {READ|WRITE}_REQUESTED slave event
doesn't have start/stop (STT/STP) support for slave mode
so event #5 is not implemented in the driver.
comes in when you had *_PROCESSED events before, there must have been a
STOP on the bus inbetween.
Will fix this.
+ if (stat & OMAP_I2C_STAT_XRDY) {This looks fishy. READ_REQUESTED is only sent after the address phase.
+ i2c_slave_event(omap->slave, I2C_SLAVE_READ_REQUESTED,
+ &value);
+ omap_i2c_write_reg(omap, OMAP_I2C_DATA_REG, value);
+ i2c_slave_event(omap->slave, I2C_SLAVE_READ_PROCESSED,
+ &value);
Have you read the documentation (Documentation/i2c/slave-interface)?
Please say if it was unclear.
Dynamic switching on OMAP I2C IP could be a difficult task.+ /* As of now, We dont need all interrupts be enabled */This looks even more fishy. Are you disabling the master interrupts?
+ omap->iestate = OMAP_I2C_IE_AAS | OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY;
That's a no (unless there are HW constraints). Your driver should be
able to switch between master and slave depending on what happens on the
bus.
For more guidance, here is my talk at ELCE 2015:Thanks for sharing the video.
https://www.youtube.com/watch?v=JdQ21jlwb58
Regards,
Wolfram