Commit 7413482b authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman

[PATCH] I2C: Add byte commands to i2c-stub

While working on EEPROMs, DDC/EDID and the like these last few days, I
wanted to use your i2c-stub driver to test my code. However, I noticed
that it wouldn't handle byte commands, while both i2cdetect and the
eeprom driver need it for proper operation. Thus I added this
functionality to the driver. What do you think about it?
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 14f4eefa
...@@ -2,14 +2,19 @@ MODULE: i2c-stub ...@@ -2,14 +2,19 @@ MODULE: i2c-stub
DESCRIPTION: DESCRIPTION:
This module is a very simple fake I2C/SMBus driver. It implements three This module is a very simple fake I2C/SMBus driver. It implements four
types of SMBus commands: write quick, (r/w) byte data, and (r/w) word data. types of SMBus commands: write quick, (r/w) byte, (r/w) byte data, and
(r/w) word data.
No hardware is needed nor associated with this module. It will accept write No hardware is needed nor associated with this module. It will accept write
quick commands to all addresses; it will respond to the other commands (also quick commands to all addresses; it will respond to the other commands (also
to all addresses) by reading from or writing to an array in memory. It will to all addresses) by reading from or writing to an array in memory. It will
also spam the kernel logs for every command it handles. also spam the kernel logs for every command it handles.
A pointer register with auto-increment is implemented for all byte
operations. This allows for continuous byte reads like those supported by
EEPROMs, among others.
The typical use-case is like this: The typical use-case is like this:
1. load this module 1. load this module
2. use i2cset (from lm_sensors project) to pre-load some data 2. use i2cset (from lm_sensors project) to pre-load some data
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/i2c.h> #include <linux/i2c.h>
static u8 stub_pointer;
static u8 stub_bytes[256]; static u8 stub_bytes[256];
static u16 stub_words[256]; static u16 stub_words[256];
...@@ -44,6 +45,22 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, ...@@ -44,6 +45,22 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags,
ret = 0; ret = 0;
break; break;
case I2C_SMBUS_BYTE:
if (read_write == I2C_SMBUS_WRITE) {
stub_pointer = command;
dev_dbg(&adap->dev, "smbus byte - addr 0x%02x, "
"wrote 0x%02x.\n",
addr, command);
} else {
data->byte = stub_bytes[stub_pointer++];
dev_dbg(&adap->dev, "smbus byte - addr 0x%02x, "
"read 0x%02x.\n",
addr, data->byte);
}
ret = 0;
break;
case I2C_SMBUS_BYTE_DATA: case I2C_SMBUS_BYTE_DATA:
if (read_write == I2C_SMBUS_WRITE) { if (read_write == I2C_SMBUS_WRITE) {
stub_bytes[command] = data->byte; stub_bytes[command] = data->byte;
...@@ -56,6 +73,7 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, ...@@ -56,6 +73,7 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags,
"read 0x%02x at 0x%02x.\n", "read 0x%02x at 0x%02x.\n",
addr, data->byte, command); addr, data->byte, command);
} }
stub_pointer = command + 1;
ret = 0; ret = 0;
break; break;
...@@ -87,8 +105,8 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, ...@@ -87,8 +105,8 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags,
static u32 stub_func(struct i2c_adapter *adapter) static u32 stub_func(struct i2c_adapter *adapter)
{ {
return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE_DATA | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
I2C_FUNC_SMBUS_WORD_DATA; I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA;
} }
static struct i2c_algorithm smbus_algorithm = { static struct i2c_algorithm smbus_algorithm = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment