i2c: i801: Fix a refactoring that broke a touchpad on Lenovo P1
authorMaxim Levitsky <mlevitsk@redhat.com>
Thu, 21 Mar 2024 14:19:19 +0000 (10:19 -0400)
committerAndi Shyti <andi.shyti@kernel.org>
Mon, 25 Mar 2024 23:47:08 +0000 (00:47 +0100)
Commit 857cc04cdf50 ("i2c: i801: Add helper i801_get_block_len")
introduced a slight functional change: the status variable is now
overwritten with the length of an SMBUS tranasaction,
even in case of success.

This breaks the touchpad on at least my Lenovo P1:

rmi4_physical rmi4-00: Read PDT entry at 0x00e9 failed, code: -6.
rmi4_physical rmi4-00: RMI initial reset failed! Continuing in spite of this.
rmi4_physical rmi4-00: Read PDT entry at 0x00e9 failed, code: -6.
rmi4_physical rmi4-00: IRQ counting failed with code -6.

Fixes: 857cc04cdf50 ("i2c: i801: Add helper i801_get_block_len")
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
drivers/i2c/busses/i2c-i801.c

index a6861660cb8ca771f38415c08561f0cbb232588b..79870dd7a0146ead83e325a6f2c6b6a8e41a8b4c 100644 (file)
@@ -536,11 +536,12 @@ static int i801_block_transaction_by_block(struct i801_priv *priv,
 
        if (read_write == I2C_SMBUS_READ ||
            command == I2C_SMBUS_BLOCK_PROC_CALL) {
-               status = i801_get_block_len(priv);
-               if (status < 0)
+               len = i801_get_block_len(priv);
+               if (len < 0) {
+                       status = len;
                        goto out;
+               }
 
-               len = status;
                data->block[0] = len;
                inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */
                for (i = 0; i < len; i++)