[i2c] [PATCH RFC] i2c-stub: Chip address as a module parameter

Jean Delvare khali at linux-fr.org
Sat Aug 12 14:32:12 CEST 2006


Hi Mark,

Running sensors-detect when i2c-stub is loaded triggers many false
positives. Sometimes a desperate user loads i2c drivers at random in the
hope it will help him/her get sensors to work on his/her system. The
subsequent sensors-detect run is very confusing [1].

[1] http://lists.lm-sensors.org/pipermail/lm-sensors/2006-August/017145.html

One way to solve the problem would be to refine all the detection
functions in sensors-detect. However, this ain't trivial.

An easier way would be to prevent i2c-stub from being loaded "at
random". Here comes a patch, very similar in spirit to what you proposed
for i2c-parport some times ago [2], which adds a mandatory parameter to
i2c-stub. This parameter is the address at which i2c-stub will emulate
a chip. This differs from the original behavior where i2c-stub would
answer to all addresses.

[2] http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e97b81ddbb8b8c72b85330ac4a454a4513dcba8a

What do you think?

i2c-stub: Chip address as a module parameter

Add a mandatory chip_addr parameter to i2c-stub. This parameter
defines to which chip address the driver will respond, instead of
reponding to all addresses as before. The idea is to prevent the
users from loading i2c-stub at random and being then confused by
the results of sensors-detect or other user-space tools.

Signed-off-by: Jean Delvare <khali at linux-fr.org>
---
 Documentation/i2c/i2c-stub    |   15 +++++++++++++--
 drivers/i2c/busses/i2c-stub.c |   19 ++++++++++++++++++-
 2 files changed, 31 insertions(+), 3 deletions(-)

--- linux-2.6.18-rc4.orig/Documentation/i2c/i2c-stub	2006-01-03 04:21:10.000000000 +0100
+++ linux-2.6.18-rc4/Documentation/i2c/i2c-stub	2006-08-12 11:36:00.000000000 +0200
@@ -6,9 +6,12 @@
 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 @@
 	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 @@
 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.
 
--- linux-2.6.18-rc4.orig/drivers/i2c/busses/i2c-stub.c	2006-01-03 04:21:10.000000000 +0100
+++ linux-2.6.18-rc4/drivers/i2c/busses/i2c-stub.c	2006-08-12 14:28:10.000000000 +0200
@@ -27,6 +27,10 @@
 #include <linux/errno.h>
 #include <linux/i2c.h>
 
+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 @@
 {
 	s32 ret;
 
+	if (addr != chip_addr)
+		return -ENODEV;
+
 	switch (size) {
 
 	case I2C_SMBUS_QUICK:
@@ -122,7 +129,17 @@
 
 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);
 }
 

-- 
Jean Delvare



More information about the i2c mailing list