AnsweredAssumed Answered

linux-imx 4.9.11 I2C is not working

Question asked by Daniel RodLor on Dec 11, 2018



We are working on a custom board based on the iMX6Q processor which uses the linux-imx kernel 4.9.11 (linux-imx.git - i.MX Linux Kernel). However, when we send an I2C message to one of our peripherals (we have 4 slaves on the i2c-2 bus, the processor is the unique master) the following error arises from the controller:


[ 82.972843] i2c i2c-2: ioctl, cmd=0x703, arg=0x5c
[ 82.972854] i2c i2c-2: ioctl, cmd=0x720, arg=0x7ec06bbc
[ 82.972865] i2c i2c-2: master_xfer[0] R, addr=0x5c, len=1
[ 82.972871] i2c i2c-2: <i2c_imx_xfer>
[ 82.972877] i2c i2c-2: <i2c_imx_start>
[ 82.973053] i2c i2c-2: <i2c_imx_bus_busy>
[ 83.482804] i2c i2c-2: <i2c_imx_bus_busy> I2C bus is busy
[ 83.482810] i2c i2c-2: Trying i2c bus recovery
[ 83.482854] i2c i2c-2: <i2c_imx_start>
[ 83.483029] i2c i2c-2: <i2c_imx_bus_busy>
[ 83.992804] i2c i2c-2: <i2c_imx_bus_busy> I2C bus is busy
[ 83.992816] i2c i2c-2: <i2c_imx_xfer> exit with: error: -110


Taking a look over with the oscilloscope, we can see that the bus is high when in idle state (as expected). Nevertheless, when we try to begin a transfer the master sets the start condition on the bus, then, the bus remains low (both, SDA and SCL) until the transfer times out and the driver warns that the bus is busy with a timeout error (though it really isn't!). We know it is not a HW issue/bug, since we can manage to communicate via I2C through U-Boot (and older kernel versions, e.g. 4.1.15).


PD: I2C related kernel configuration attached to this post. The default kernel configuration (imx_v7_defconfig) is neither working.


Thank you!