[i2c] [patch 2.6.23-rc5] i2c_msg kerneldoc

David Brownell david-b at pacbell.net
Fri Sep 7 23:10:29 CEST 2007


Clarify use of the I2C_M_* flags by highlighting the fact that
most of them depend on I2C_FUNC_PROTOCOL_MANGLING.

Also provide kerneldoc for i2c_smbus_read_block_data() and also
for "struct i2c_msg".

Signed-off-by: David Brownell <dbrownell at users.sourceforge.net>
---
 drivers/i2c/i2c-core.c |   17 ++++++++++++++++-
 include/linux/i2c.h    |   47 ++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 54 insertions(+), 10 deletions(-)

--- at91.orig/drivers/i2c/i2c-core.c	2007-09-07 11:14:16.000000000 -0700
+++ at91/drivers/i2c/i2c-core.c	2007-09-07 13:15:06.000000000 -0700
@@ -1457,7 +1457,22 @@ s32 i2c_smbus_write_word_data(struct i2c
 }
 EXPORT_SYMBOL(i2c_smbus_write_word_data);
 
-/* Returns the number of read bytes */
+/**
+ * i2c_smbus_read_block_data - SMBus "read block data" request
+ * @client: handle to slave device
+ * @command: command byte issued to let the slave know what data should
+ *	be returned
+ * @values: byte array into which data will be read; big enough to hold
+ *	the data returned by the slave.
+ *
+ * Returns the number of bytes read in the slave's response, else a negative
+ * number to indicate some kind of error.
+ *
+ * Note that using this function requires the client's adapter support the
+ * I2C_FUNC_SMBUS_READ_BLOCK_DATA functionality.  Not all adapter drivers
+ * support this; its emulation through I2C messaging relies on a specific
+ * mechanism which may not be implemented.
+ */
 s32 i2c_smbus_read_block_data(struct i2c_client *client, u8 command,
 			      u8 *values)
 {
--- at91.orig/include/linux/i2c.h	2007-09-07 10:15:54.000000000 -0700
+++ at91/include/linux/i2c.h	2007-09-07 13:39:40.000000000 -0700
@@ -456,19 +456,48 @@ static inline int i2c_adapter_id(struct 
 }
 #endif /* __KERNEL__ */
 
-/*
- * I2C Message - used for pure i2c transaction, also from /dev interface
+/**
+ * struct i2c_msg - Represents an I2C transaction beginning with START
+ * @addr: Slave address, either seven or ten bits.  When this is a ten
+ *	bit address, I2C_M_TEN must be set in @flags and the adapter
+ *	must support I2C_FUNC_10BIT_ADDR.
+ * @flags: I2C_M_RD is handled by all adapters.  No other flags may be
+ *	provided unless the adapter exported the relevant I2C_FUNC__*
+ *	flags through i2c_check_functionality().
+ * @len: Length of the buffer being read or written to the I2C address.
+ *	For read transactions where I2C_M_RECV_LEN is set, the caller
+ *	guarantees that this buffer can hold up to 32 bytes in addition
+ *	to the initial length byte sent by the slave (plus, if used,
+ *	the SMBus PEC); and this value will be incremented by the number
+ *	of block data bytes received.
+ * @buf: The buffer into which data is read, or from which it's written.
+ *
+ * An i2c_msg is the lowest level representation of an i2c transaction.
+ * It is exposed to drivers by @i2c_transfer(), to userspace by i2c-dev, and
+ * to I2C adapter drivers through the @i2c_adapter. at master_xfer() method.
+ *
+ * Except when I2C "protocol mangling" is used, all i2c adapters implement
+ * the standard rules for I2C transactions.  Each transaction begins with a
+ * START.  That is followed by the slave address, and a bit encoding read
+ * versus write.  Then follow all the data bytes.  The transfer terminates
+ * with a NAK, or when all specified bytes have been transferred and ACKed.
+ * If this is the last message in a group, it is followed by a STOP; otherwise
+ * it is followed by the (repeated) START of the next @i2c_msg.
+ *
+ * Alternatively, adapters supporting I2C_FUNC_PROTOCOL_MANGLING accept
+ * some flags which change the standard protocol behavior described above.
+ * Those flags are defined only for use with broken/nonconformant slaves.
  */
 struct i2c_msg {
 	__u16 addr;	/* slave address			*/
 	__u16 flags;
-#define I2C_M_TEN	0x10	/* we have a ten bit chip address	*/
-#define I2C_M_RD	0x01
-#define I2C_M_NOSTART	0x4000
-#define I2C_M_REV_DIR_ADDR	0x2000
-#define I2C_M_IGNORE_NAK	0x1000
-#define I2C_M_NO_RD_ACK		0x0800
-#define I2C_M_RECV_LEN		0x0400 /* length will be first received byte */
+#define I2C_M_TEN		0x0010	/* this is a ten bit chip address */
+#define I2C_M_RD		0x0001
+#define I2C_M_NOSTART		0x4000	/* iff I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_REV_DIR_ADDR	0x2000	/* iff I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_IGNORE_NAK	0x1000	/* iff I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_NO_RD_ACK		0x0800	/* iff I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_RECV_LEN		0x0400	/* length will be first received byte */
 	__u16 len;		/* msg length				*/
 	__u8 *buf;		/* pointer to msg data			*/
 };



More information about the i2c mailing list