In Nomadik I2c controller, register I2C_MCR has 11-bit wide LENGTH field. Its maximum value is 2047, so this is the maximum length of a single message. It is less than the common maximum I2C message length in I2C subsystem (8192), so define a quirk in order to report the unsupported message without any attempt to transfer it.
Zero length reading doesn't work properly on this controller, so add `I2C_AQ_NO_ZERO_LEN_READ` quirk flag. Signed-off-by: Dmitry Guzman <[email protected]> --- drivers/i2c/busses/i2c-nomadik.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index 7d93fb3876dc1324003dd19884e3fd5cbba9cfbb..9cff0c2757fafeaf809395e02a5e754570f65e08 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -79,6 +79,9 @@ #define I2C_MCR_STOP BIT(14) /* Stop condition */ #define I2C_MCR_LENGTH GENMASK(25, 15) /* Transaction length */ +/* Controller hardware limitation of the message length */ +#define I2C_MAX_MSG_LENGTH (I2C_MCR_LENGTH >> 15) + /* Status register (SR) */ #define I2C_SR_OP GENMASK(1, 0) /* Operation */ #define I2C_SR_STATUS GENMASK(3, 2) /* controller status */ @@ -238,6 +241,12 @@ static int fault_codes[] = { EIO }; +static const struct i2c_adapter_quirks nmk_i2c_quirks = { + .flags = I2C_AQ_NO_ZERO_LEN_READ, + .max_read_len = I2C_MAX_MSG_LENGTH, + .max_write_len = I2C_MAX_MSG_LENGTH, +}; + static inline void i2c_set_bit(void __iomem *reg, u32 mask) { writel(readl(reg) | mask, reg); @@ -1162,6 +1171,7 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) adap->class = I2C_CLASS_DEPRECATED; adap->algo = &nmk_i2c_algo; adap->timeout = usecs_to_jiffies(priv->timeout_usecs); + adap->quirks = &nmk_i2c_quirks; snprintf(adap->name, sizeof(adap->name), "Nomadik I2C at %pR", &adev->res); -- 2.43.0
