• Robert Hancock's avatar
    i2c: cadence: Change large transfer count reset logic to be unconditional · 4ca8ca87
    Robert Hancock authored
    Problems were observed on the Xilinx ZynqMP platform with large I2C reads.
    When a read of 277 bytes was performed, the controller NAKed the transfer
    after only 252 bytes were transferred and returned an ENXIO error on the
    transfer.
    
    There is some code in cdns_i2c_master_isr to handle this case by resetting
    the transfer count in the controller before it reaches 0, to allow larger
    transfers to work, but it was conditional on the CDNS_I2C_BROKEN_HOLD_BIT
    quirk being set on the controller, and ZynqMP uses the r1p14 version of
    the core where this quirk is not being set. The requirement to do this to
    support larger reads seems like an inherently required workaround due to
    the core only having an 8-bit transfer size register, so it does not
    appear that this should be conditional on the broken HOLD bit quirk which
    is used elsewhere in the driver.
    
    Remove the dependency on the CDNS_I2C_BROKEN_HOLD_BIT for this transfer
    size reset logic to fix this problem.
    
    Fixes: 63cab195 ("i2c: removed work arounds in i2c driver for Zynq Ultrascale+ MPSoC")
    Signed-off-by: default avatarRobert Hancock <robert.hancock@calian.com>
    Reviewed-by: default avatarShubhrajyoti Datta <Shubhrajyoti.datta@amd.com>
    Acked-by: default avatarMichal Simek <michal.simek@amd.com>
    Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
    4ca8ca87
i2c-cadence.c 37.8 KB