]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: amd756: Fix endianness handling for word data
authorAtharva Tiwari <evepolonium@gmail.com>
Wed, 1 Jan 2025 10:34:22 +0000 (16:04 +0530)
committerAndi Shyti <andi.shyti@kernel.org>
Tue, 7 Jan 2025 22:46:11 +0000 (23:46 +0100)
Ensure correct handling of "endianness"
for word-sized data in amd756_access

 - Convert word data into little-endian using cpu_to_le16
 - Convert word data from little-endian
   to cpu native format using le16_to_cpu

This fixes poteential issues on big-endian systems and
ensure proper byte ordering for SMBus word transacitions

Signed-off-by: Atharva Tiwari <evepolonium@gmail.com>
Link: https://lore.kernel.org/r/20250101103422.30523-1-evepolonium@gmail.com
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
drivers/i2c/busses/i2c-amd756.c

index fa0d5a2c37323b4409e34df035083c6d53a07422..e551d63e96b12c68a15a1d9d7836162148c66cb3 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/i2c.h>
 #include <linux/acpi.h>
 #include <linux/io.h>
+#include <linux/byteorder/generic.h>
 
 /* AMD756 SMBus address offsets */
 #define SMB_ADDR_OFFSET                0xE0
@@ -211,7 +212,7 @@ static s32 amd756_access(struct i2c_adapter * adap, u16 addr,
                       SMB_HOST_ADDRESS);
                outb_p(command, SMB_HOST_COMMAND);
                if (read_write == I2C_SMBUS_WRITE)
-                       outw_p(data->word, SMB_HOST_DATA);      /* TODO: endian???? */
+                       outw_p(cpu_to_le16((u16)data->word), SMB_HOST_DATA);
                size = AMD756_WORD_DATA;
                break;
        case I2C_SMBUS_BLOCK_DATA:
@@ -256,7 +257,7 @@ static s32 amd756_access(struct i2c_adapter * adap, u16 addr,
                data->byte = inw_p(SMB_HOST_DATA);
                break;
        case AMD756_WORD_DATA:
-               data->word = inw_p(SMB_HOST_DATA);      /* TODO: endian???? */
+               data->word = (u16)le16_to_cpu(inw_p(SMB_HOST_DATA));
                break;
        case AMD756_BLOCK_DATA:
                data->block[0] = inw_p(SMB_HOST_DATA) & 0x3f;