#include "qemu/osdep.h"
#include "hw/i2c/i2c.h"
+#include "trace.h"
#define I2C_BROADCAST 0x00
}
QLIST_FOREACH(node, &bus->current_devs, next) {
+ I2CSlave *s = node->elt;
int rv;
- sc = I2C_SLAVE_GET_CLASS(node->elt);
+ sc = I2C_SLAVE_GET_CLASS(s);
/* If the bus is already busy, assume this is a repeated
start condition. */
if (sc->event) {
- rv = sc->event(node->elt, recv ? I2C_START_RECV : I2C_START_SEND);
+ trace_i2c_event("start", s->address);
+ rv = sc->event(s, recv ? I2C_START_RECV : I2C_START_SEND);
if (rv && !bus->broadcast) {
if (bus_scanned) {
/* First call, terminate the transfer. */
I2CNode *node, *next;
QLIST_FOREACH_SAFE(node, &bus->current_devs, next, next) {
- sc = I2C_SLAVE_GET_CLASS(node->elt);
+ I2CSlave *s = node->elt;
+ sc = I2C_SLAVE_GET_CLASS(s);
if (sc->event) {
- sc->event(node->elt, I2C_FINISH);
+ trace_i2c_event("finish", s->address);
+ sc->event(s, I2C_FINISH);
}
QLIST_REMOVE(node, next);
g_free(node);
int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
{
I2CSlaveClass *sc;
+ I2CSlave *s;
I2CNode *node;
int ret = 0;
if (send) {
QLIST_FOREACH(node, &bus->current_devs, next) {
- sc = I2C_SLAVE_GET_CLASS(node->elt);
+ s = node->elt;
+ sc = I2C_SLAVE_GET_CLASS(s);
if (sc->send) {
- ret = ret || sc->send(node->elt, *data);
+ trace_i2c_send(s->address, *data);
+ ret = ret || sc->send(s, *data);
} else {
ret = -1;
}
sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt);
if (sc->recv) {
- ret = sc->recv(QLIST_FIRST(&bus->current_devs)->elt);
+ s = QLIST_FIRST(&bus->current_devs)->elt;
+ ret = sc->recv(s);
+ trace_i2c_recv(s->address, ret);
if (ret < 0) {
return ret;
} else {
QLIST_FOREACH(node, &bus->current_devs, next) {
sc = I2C_SLAVE_GET_CLASS(node->elt);
if (sc->event) {
+ trace_i2c_event("nack", node->elt->address);
sc->event(node->elt, I2C_NACK);
}
}