
On 03/03/2014 12:58 AM, Shaveta Leekha wrote:
Most of the I2C slaves support accesses in the typical style viz.read/write series of bytes at particular address offset. These transactions are currently supportd in the i2c driver using i2c_read and i2c_write APIs. I2C EEPROMs, RTC, etc fall in this category. The transactions look like:" START:Address:Tx:Offset:RESTART:Address[0..4]:Tx/Rx:data[0..n]:STOP"
However there are certain devices which support accesses in terms of the transactions as follows: "START:Address:Tx:Txdata[0..n1]:Clock_stretching: RESTART:Address:Rx:data[0..n2]"
The Txdata is typically a command and some associated data, similarly Rxdata could be command status plus some data received as a response to the command sent. i2c_write_read() function provides support for such transactions (multiple bytes write followed by read)
Signed-off-by: Poonam Aggrwal poonam.aggrwal@freescale.com Signed-off-by: Shaveta Leekha shaveta@freescale.com
drivers/i2c/fsl_i2c.c | 64 ++++++++++++++++++++++++++++++++++++++++++----- drivers/i2c/i2c_core.c | 7 +++++ include/i2c.h | 19 ++++++++++--- 3 files changed, 78 insertions(+), 12 deletions(-)
<snip>
diff --git a/include/i2c.h b/include/i2c.h index 1b4078e..7bac20a 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -65,6 +65,9 @@ struct i2c_adapter { int (*write)(struct i2c_adapter *adap, uint8_t chip, uint addr, int alen, uint8_t *buffer, int len);
- int (*write_read)(struct i2c_adapter *adap, uint8_t chip,
uint8_t *wbuffer, int wlength, uint8_t *rbuffer,
uint (*set_bus_speed)(struct i2c_adapter *adap, uint speed); int speed;int rlength);
@@ -75,13 +78,14 @@ struct i2c_adapter { char *name; };
-#define U_BOOT_I2C_MKENT_COMPLETE(_init, _probe, _read, _write, \ +#define U_BOOT_I2C_MKENT_COMPLETE(_init, _probe, _read, _write, _write_read, \ _set_speed, _speed, _slaveaddr, _hwadapnr, _name) \ { \ .init = _init, \ .probe = _probe, \ .read = _read, \ .write = _write, \
.set_bus_speed = _set_speed, \ .speed = _speed, \ .slaveaddr = _slaveaddr, \.write_read = _write_read, \
@@ -90,10 +94,11 @@ struct i2c_adapter { .name = #_name \ };
-#define U_BOOT_I2C_ADAP_COMPLETE(_name, _init, _probe, _read, _write, \
_set_speed, _speed, _slaveaddr, _hwadapnr) \
- ll_entry_declare(struct i2c_adapter, _name, i2c) = \
- U_BOOT_I2C_MKENT_COMPLETE(_init, _probe, _read, _write, \
+#define U_BOOT_I2C_ADAP_COMPLETE(_name, _init, _probe, _read, _write, \
_write_read, _set_speed, _speed, _slaveaddr, \
_hwadapnr) \
- ll_entry_declare(struct i2c_adapter, _name, i2c) = \
- U_BOOT_I2C_MKENT_COMPLETE(_init, _probe, _read, _write, _write_read, \ _set_speed, _speed, _slaveaddr, _hwadapnr, _name);
struct i2c_adapter *i2c_get_adapter(int index); @@ -237,6 +242,8 @@ int i2c_read(uint8_t chip, unsigned int addr, int alen,
int i2c_write(uint8_t chip, unsigned int addr, int alen, uint8_t *buffer, int len); +int i2c_write_read(uint8_t chip, uchar *wbuffer, int wlen, uchar *rbuffer,
int rlen);
/*
- Utility routines to read/write registers.
@@ -302,6 +309,8 @@ int i2c_probe(uchar chip); */ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len); int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len); +int i2c_write_read(uchar chip, uchar *wbuffer, int wlen, uchar *rbuffer,
int rlen);
You need to be careful when changing the header file. If you compile other platforms, you will see the error. Try ./MAKEALL -a powerpc. I don't know how bad you broke other architectures.
York