[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