]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i2c: designware: Optimize flag reading in i2c_dw_read()
authorBenoît Monin <benoit.monin@bootlin.com>
Wed, 26 Nov 2025 10:46:25 +0000 (11:46 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Tue, 16 Dec 2025 23:37:07 +0000 (00:37 +0100)
Optimize the i2c_dw_read() function by reading the message flags only
once per message, rather than for every byte.

The message flags are accessed both in the outer loop and the inner loop,
so move the declaration of the local flags variable to the outer loop.

The message index is only modified by the outer loop, so reading the
flags in the inner loop was always getting the same value.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20251126-i2c-dw-v4-2-b0654598e7c5@bootlin.com
drivers/i2c/busses/i2c-designware-master.c

index 45bfca05bb300fa81a08520c423febabd75ca2b3..4493568e2fa3864a78bed7a73ff64255dd6febb4 100644 (file)
@@ -593,11 +593,12 @@ i2c_dw_read(struct dw_i2c_dev *dev)
        unsigned int rx_valid;
 
        for (; dev->msg_read_idx < dev->msgs_num; dev->msg_read_idx++) {
+               u32 flags = msgs[dev->msg_read_idx].flags;
                unsigned int tmp;
                u32 len;
                u8 *buf;
 
-               if (!(msgs[dev->msg_read_idx].flags & I2C_M_RD))
+               if (!(flags & I2C_M_RD))
                        continue;
 
                if (!(dev->status & STATUS_READ_IN_PROGRESS)) {
@@ -611,8 +612,6 @@ i2c_dw_read(struct dw_i2c_dev *dev)
                regmap_read(dev->map, DW_IC_RXFLR, &rx_valid);
 
                for (; len > 0 && rx_valid > 0; len--, rx_valid--) {
-                       u32 flags = msgs[dev->msg_read_idx].flags;
-
                        regmap_read(dev->map, DW_IC_DATA_CMD, &tmp);
                        tmp &= DW_IC_DATA_CMD_DAT;
                        /* Ensure length byte is a valid value */