From 569be443e3c1329fc6725988004f5d8a32fe3be5 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Sun, 27 Jan 2008 18:14:45 +0100 Subject: [PATCH] i2c-stub: Use a single array for byte and word operations This mimics the behavior of actual SMBus chips better. Signed-off-by: Jean Delvare Cc: Mark M. Hoffman --- Documentation/i2c/i2c-stub | 3 --- drivers/i2c/busses/i2c-stub.c | 15 ++++++++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Documentation/i2c/i2c-stub b/Documentation/i2c/i2c-stub index 41889c091a37..0d8be1c20c16 100644 --- a/Documentation/i2c/i2c-stub +++ b/Documentation/i2c/i2c-stub @@ -35,9 +35,6 @@ int chip_addr[10]: CAVEATS: -There are independent arrays for byte/data and word/data commands. Depending -on if/how a target driver mixes them, you'll need to be careful. - If your target driver polls some byte or word waiting for it to change, the stub could lock it up. Use i2cset to unlock it. diff --git a/drivers/i2c/busses/i2c-stub.c b/drivers/i2c/busses/i2c-stub.c index 84df29da1ddc..c2a9f8c94f5e 100644 --- a/drivers/i2c/busses/i2c-stub.c +++ b/drivers/i2c/busses/i2c-stub.c @@ -1,8 +1,8 @@ /* - i2c-stub.c - Part of lm_sensors, Linux kernel modules for hardware - monitoring + i2c-stub.c - I2C/SMBus chip emulator Copyright (c) 2004 Mark M. Hoffman + Copyright (C) 2007 Jean Delvare This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,8 +37,8 @@ MODULE_PARM_DESC(chip_addr, struct stub_chip { u8 pointer; - u8 bytes[256]; - u16 words[256]; + u16 words[256]; /* Byte operations use the LSB as per SMBus + specification */ }; static struct stub_chip *stub_chips; @@ -75,7 +75,7 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, "wrote 0x%02x.\n", addr, command); } else { - data->byte = chip->bytes[chip->pointer++]; + data->byte = chip->words[chip->pointer++] & 0xff; dev_dbg(&adap->dev, "smbus byte - addr 0x%02x, " "read 0x%02x.\n", addr, data->byte); @@ -86,12 +86,13 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, case I2C_SMBUS_BYTE_DATA: if (read_write == I2C_SMBUS_WRITE) { - chip->bytes[command] = data->byte; + chip->words[command] &= 0xff00; + chip->words[command] |= data->byte; dev_dbg(&adap->dev, "smbus byte data - addr 0x%02x, " "wrote 0x%02x at 0x%02x.\n", addr, data->byte, command); } else { - data->byte = chip->bytes[command]; + data->byte = chip->words[command] & 0xff; dev_dbg(&adap->dev, "smbus byte data - addr 0x%02x, " "read 0x%02x at 0x%02x.\n", addr, data->byte, command);