• Javier Martinez Canillas's avatar
    i2c: exynos5: Avoid transaction timeouts due TRANSFER_DONE_AUTO not set · 9ad22474
    Javier Martinez Canillas authored
    After commit 7999eecb ("i2c: exynos5: fix arbitration lost handling"),
    some I2C transactions are failing because the TRANSFER_DONE_AUTO field is
    not set in the I2C_TRANS_STATUS register so the i2c->status value is left
    to -EINVAL causing the i2c->msg_complete completion to never be signaled.
    
    For example, when reading the time of an I2C rtc on an Exynos5800 machine:
    
    $ cat /sys/class/rtc/rtc0/time
    [   25.924594] exynos5-hsi2c 12e10000.i2c: rx timeout
    [   65.028365] max77686-rtc max77802-rtc: Fail to read time reg(-22)
    cat: /sys/class/rtc/rtc0/time: Invalid argument
    
    The Exynos5422 manual states clearly that most I2C_TRANS_STATUS reg bits
    (including TRANSFER_DONE_AUTO) are cleared after the register is read. So
    reading has side effects and should only be done if HSI2C_INT_I2C was set.
    
    Fixes: 7999eecb ("i2c: exynos5: fix arbitration lost handling")
    Signed-off-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
    Reviewed-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    9ad22474
i2c-exynos5.c 23.6 KB