Signed-off-by: Andrey Danin <danind...@mail.ru> CC: Stephen Warren <swar...@nvidia.com> CC: Marc Dietrich <marvi...@gmx.de> CC: Julian Andres Klode <j...@jak-linux.org> CC: ac...@lists.launchpad.net --- drivers/i2c/i2c_core.c | 13 +++++++++++++ include/i2c.h | 30 +++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/drivers/i2c/i2c_core.c b/drivers/i2c/i2c_core.c index 18d6736..105aa0a 100644 --- a/drivers/i2c/i2c_core.c +++ b/drivers/i2c/i2c_core.c @@ -395,6 +395,19 @@ void i2c_reg_write(uint8_t addr, uint8_t reg, uint8_t val) i2c_write(addr, reg, 1, &val, 1); } +int i2c_slave_io(struct i2c_transaction *trans) +{ + struct i2c_adapter *cur = I2C_ADAP; + + if (!cur->slave_io) { + printf("Error: slave IO is not supported on adap %d\n", + cur->hwadapnr); + return -1; + } + + return cur->slave_io(cur, trans); +} + void __i2c_init(int speed, int slaveaddr) { i2c_init_bus(i2c_get_bus_num(), speed, slaveaddr); diff --git a/include/i2c.h b/include/i2c.h index f93a183..165b919 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -55,6 +55,20 @@ #define CONFIG_SYS_SPD_BUS_NUM 0 #endif +struct i2c_transaction { + char rx_buf[34]; + int rx_pos; + + char tx_buf[34]; + int tx_pos; + int tx_size; + + unsigned int start_timeout; + unsigned int timeout; + + int res; +}; + struct i2c_adapter { void (*init)(struct i2c_adapter *adap, int speed, int slaveaddr); @@ -65,6 +79,8 @@ struct i2c_adapter { int (*write)(struct i2c_adapter *adap, uint8_t chip, uint addr, int alen, uint8_t *buffer, int len); + int (*slave_io)(struct i2c_adapter *adap, + struct i2c_transaction *trans); uint (*set_bus_speed)(struct i2c_adapter *adap, uint speed); int speed; @@ -81,12 +97,13 @@ struct i2c_adapter { .probe = _probe, \ .read = _read, \ .write = _write, \ + .slave_io = 0, \ .set_bus_speed = _set_speed, \ .speed = _speed, \ .slaveaddr = _slaveaddr, \ .init_done = 0, \ .hwadapnr = _hwadapnr, \ - .name = #_name \ + .name = #_name, \ }; #define U_BOOT_I2C_ADAP_COMPLETE(_name, _init, _probe, _read, _write, \ @@ -450,4 +467,15 @@ int i2c_get_bus_num_fdt(int node); * @return 0 if port was reset, -1 if not found */ int i2c_reset_port_fdt(const void *blob, int node); + +/** + * Perform I2C transaction with master device. + * + * @param trans I2C transaction object + * @return 0 if succeeded, -1 if not supported, + * 1 if not ready, 2 if operation timed out, + * 3 if not our packet, other - unknown error. + */ +int i2c_slave_io(struct i2c_transaction *trans); + #endif /* _I2C_H_ */ -- 1.7.9.5 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot