From 9bf5d45f63aa4cbdc897e112fcdcf958545aca7e Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Sun, 13 Aug 2006 23:46:44 +0200 Subject: [PATCH] --- yaml --- r: 36103 b: refs/heads/master c: 7a8d29cec7a53cf1a29dc5055aa9d1fa0f95830f h: refs/heads/master i: 36101: 4920169e7972663e83b749c4c8ae60a9022b342d 36099: 5ab8688864608e7f874eefd315c0d552c7f0827d 36095: f12adeebc6aad58f98de2e5a45668d82e536b80e v: v3 --- [refs] | 2 +- trunk/Documentation/i2c/i2c-stub | 15 +++++++++++++-- trunk/drivers/i2c/busses/i2c-stub.c | 19 ++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 1c2c57dff7e5..126e4c031d83 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6c805d2ce9d910ea915d7dbe4aed0a91f138be07 +refs/heads/master: 7a8d29cec7a53cf1a29dc5055aa9d1fa0f95830f diff --git a/trunk/Documentation/i2c/i2c-stub b/trunk/Documentation/i2c/i2c-stub index d6dcb138abf5..9cc081e69764 100644 --- a/trunk/Documentation/i2c/i2c-stub +++ b/trunk/Documentation/i2c/i2c-stub @@ -6,9 +6,12 @@ This module is a very simple fake I2C/SMBus driver. It implements four types of SMBus commands: write quick, (r/w) byte, (r/w) byte data, and (r/w) word data. +You need to provide a chip address as a module parameter when loading +this driver, which will then only react to SMBus commands to this address. + 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 -to all addresses) by reading from or writing to an array in memory. It will +quick commands to one address; it will respond to the other commands (also +to one address) by reading from or writing to an array in memory. It will also spam the kernel logs for every command it handles. A pointer register with auto-increment is implemented for all byte @@ -21,6 +24,11 @@ The typical use-case is like this: 3. load the target sensors chip driver module 4. observe its behavior in the kernel log +PARAMETERS: + +int chip_addr: + The SMBus address to emulate a chip at. + CAVEATS: There are independent arrays for byte/data and word/data commands. Depending @@ -33,6 +41,9 @@ If the hardware for your driver has banked registers (e.g. Winbond sensors chips) this module will not work well - although it could be extended to support that pretty easily. +Only one chip address is supported - although this module could be +extended to support more. + If you spam it hard enough, printk can be lossy. This module really wants something like relayfs. diff --git a/trunk/drivers/i2c/busses/i2c-stub.c b/trunk/drivers/i2c/busses/i2c-stub.c index 73f481e93a36..8cf374ddd989 100644 --- a/trunk/drivers/i2c/busses/i2c-stub.c +++ b/trunk/drivers/i2c/busses/i2c-stub.c @@ -27,6 +27,10 @@ #include #include +static unsigned short chip_addr; +module_param(chip_addr, ushort, S_IRUGO); +MODULE_PARM_DESC(chip_addr, "Chip address (between 0x03 and 0x77)\n"); + static u8 stub_pointer; static u8 stub_bytes[256]; static u16 stub_words[256]; @@ -37,6 +41,9 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, { s32 ret; + if (addr != chip_addr) + return -ENODEV; + switch (size) { case I2C_SMBUS_QUICK: @@ -122,7 +129,17 @@ static struct i2c_adapter stub_adapter = { static int __init i2c_stub_init(void) { - printk(KERN_INFO "i2c-stub loaded\n"); + if (!chip_addr) { + printk(KERN_ERR "i2c-stub: Please specify a chip address\n"); + return -ENODEV; + } + if (chip_addr < 0x03 || chip_addr > 0x77) { + printk(KERN_ERR "i2c-stub: Invalid chip address 0x%02x\n", + chip_addr); + return -EINVAL; + } + + printk(KERN_INFO "i2c-stub: Virtual chip at 0x%02x\n", chip_addr); return i2c_add_adapter(&stub_adapter); }