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 <khali@linux-fr.org>
Cc: Mark M. Hoffman <mhoffman@lightlink.com>
This commit is contained in:
Jean Delvare 2008-01-27 18:14:45 +01:00 committed by Jean Delvare
parent b3af547e19
commit 569be443e3
2 changed files with 8 additions and 10 deletions

View File

@ -35,9 +35,6 @@ int chip_addr[10]:
CAVEATS: 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 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. stub could lock it up. Use i2cset to unlock it.

View File

@ -1,8 +1,8 @@
/* /*
i2c-stub.c - Part of lm_sensors, Linux kernel modules for hardware i2c-stub.c - I2C/SMBus chip emulator
monitoring
Copyright (c) 2004 Mark M. Hoffman <mhoffman@lightlink.com> Copyright (c) 2004 Mark M. Hoffman <mhoffman@lightlink.com>
Copyright (C) 2007 Jean Delvare <khali@linux-fr.org>
This program is free software; you can redistribute it and/or modify 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 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 { struct stub_chip {
u8 pointer; u8 pointer;
u8 bytes[256]; u16 words[256]; /* Byte operations use the LSB as per SMBus
u16 words[256]; specification */
}; };
static struct stub_chip *stub_chips; 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", "wrote 0x%02x.\n",
addr, command); addr, command);
} else { } else {
data->byte = chip->bytes[chip->pointer++]; data->byte = chip->words[chip->pointer++] & 0xff;
dev_dbg(&adap->dev, "smbus byte - addr 0x%02x, " dev_dbg(&adap->dev, "smbus byte - addr 0x%02x, "
"read 0x%02x.\n", "read 0x%02x.\n",
addr, data->byte); 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: case I2C_SMBUS_BYTE_DATA:
if (read_write == I2C_SMBUS_WRITE) { 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, " dev_dbg(&adap->dev, "smbus byte data - addr 0x%02x, "
"wrote 0x%02x at 0x%02x.\n", "wrote 0x%02x at 0x%02x.\n",
addr, data->byte, command); addr, data->byte, command);
} else { } else {
data->byte = chip->bytes[command]; data->byte = chip->words[command] & 0xff;
dev_dbg(&adap->dev, "smbus byte data - addr 0x%02x, " dev_dbg(&adap->dev, "smbus byte data - addr 0x%02x, "
"read 0x%02x at 0x%02x.\n", "read 0x%02x at 0x%02x.\n",
addr, data->byte, command); addr, data->byte, command);