Lines Matching full:bus
2 * QEMU I2C bus interface.
33 I2CBus *bus = opaque; in i2c_bus_pre_save() local
35 bus->saved_address = -1; in i2c_bus_pre_save()
36 if (!QLIST_EMPTY(&bus->current_devs)) { in i2c_bus_pre_save()
37 if (!bus->broadcast) { in i2c_bus_pre_save()
38 bus->saved_address = QLIST_FIRST(&bus->current_devs)->elt->address; in i2c_bus_pre_save()
40 bus->saved_address = I2C_BROADCAST; in i2c_bus_pre_save()
58 /* Create a new I2C bus. */
61 I2CBus *bus; in i2c_init_bus() local
63 bus = I2C_BUS(qbus_new(TYPE_I2C_BUS, parent, name)); in i2c_init_bus()
64 QLIST_INIT(&bus->current_devs); in i2c_init_bus()
65 QSIMPLEQ_INIT(&bus->pending_masters); in i2c_init_bus()
66 vmstate_register_any(NULL, &vmstate_i2c_bus, bus); in i2c_init_bus()
67 return bus; in i2c_init_bus()
75 /* Return nonzero if bus is busy. */
76 int i2c_bus_busy(I2CBus *bus) in i2c_bus_busy() argument
78 return !QLIST_EMPTY(&bus->current_devs) || bus->bh; in i2c_bus_busy()
81 bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool broadcast, in i2c_scan_bus() argument
86 QTAILQ_FOREACH(kid, &bus->qbus.children, sibling) { in i2c_scan_bus()
109 * the bus transaction is terminated (or really never started). If
116 * without releasing the bus. If that fails, the bus is still
121 static int i2c_do_start_transfer(I2CBus *bus, uint8_t address, in i2c_do_start_transfer() argument
131 * bus. in i2c_do_start_transfer()
133 bus->broadcast = true; in i2c_do_start_transfer()
138 * the middle of a transaction and we shouldn't rescan the bus. in i2c_do_start_transfer()
144 if (QLIST_EMPTY(&bus->current_devs)) { in i2c_do_start_transfer()
146 (void)i2c_scan_bus(bus, address, bus->broadcast, &bus->current_devs); in i2c_do_start_transfer()
150 if (QLIST_EMPTY(&bus->current_devs)) { in i2c_do_start_transfer()
154 QLIST_FOREACH(node, &bus->current_devs, next) { in i2c_do_start_transfer()
159 /* If the bus is already busy, assume this is a repeated in i2c_do_start_transfer()
166 if (rv && !bus->broadcast) { in i2c_do_start_transfer()
169 i2c_end_transfer(bus); in i2c_do_start_transfer()
178 int i2c_start_transfer(I2CBus *bus, uint8_t address, bool is_recv) in i2c_start_transfer() argument
180 return i2c_do_start_transfer(bus, address, is_recv in i2c_start_transfer()
185 void i2c_bus_master(I2CBus *bus, QEMUBH *bh) in i2c_bus_master() argument
190 QSIMPLEQ_INSERT_TAIL(&bus->pending_masters, node, entry); in i2c_bus_master()
193 void i2c_schedule_pending_master(I2CBus *bus) in i2c_schedule_pending_master() argument
197 if (i2c_bus_busy(bus)) { in i2c_schedule_pending_master()
198 /* someone is already controlling the bus; wait for it to release it */ in i2c_schedule_pending_master()
202 if (QSIMPLEQ_EMPTY(&bus->pending_masters)) { in i2c_schedule_pending_master()
206 node = QSIMPLEQ_FIRST(&bus->pending_masters); in i2c_schedule_pending_master()
207 bus->bh = node->bh; in i2c_schedule_pending_master()
209 QSIMPLEQ_REMOVE_HEAD(&bus->pending_masters, entry); in i2c_schedule_pending_master()
212 qemu_bh_schedule(bus->bh); in i2c_schedule_pending_master()
215 void i2c_bus_release(I2CBus *bus) in i2c_bus_release() argument
217 bus->bh = NULL; in i2c_bus_release()
219 i2c_schedule_pending_master(bus); in i2c_bus_release()
222 int i2c_start_recv(I2CBus *bus, uint8_t address) in i2c_start_recv() argument
224 return i2c_do_start_transfer(bus, address, I2C_START_RECV); in i2c_start_recv()
227 int i2c_start_send(I2CBus *bus, uint8_t address) in i2c_start_send() argument
229 return i2c_do_start_transfer(bus, address, I2C_START_SEND); in i2c_start_send()
232 int i2c_start_send_async(I2CBus *bus, uint8_t address) in i2c_start_send_async() argument
234 return i2c_do_start_transfer(bus, address, I2C_START_SEND_ASYNC); in i2c_start_send_async()
237 void i2c_end_transfer(I2CBus *bus) in i2c_end_transfer() argument
242 QLIST_FOREACH_SAFE(node, &bus->current_devs, next, next) { in i2c_end_transfer()
252 bus->broadcast = false; in i2c_end_transfer()
255 int i2c_send(I2CBus *bus, uint8_t data) in i2c_send() argument
262 QLIST_FOREACH(node, &bus->current_devs, next) { in i2c_send()
276 int i2c_send_async(I2CBus *bus, uint8_t data) in i2c_send_async() argument
278 I2CNode *node = QLIST_FIRST(&bus->current_devs); in i2c_send_async()
293 uint8_t i2c_recv(I2CBus *bus) in i2c_recv() argument
299 if (!QLIST_EMPTY(&bus->current_devs) && !bus->broadcast) { in i2c_recv()
300 sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt); in i2c_recv()
302 s = QLIST_FIRST(&bus->current_devs)->elt; in i2c_recv()
311 void i2c_nack(I2CBus *bus) in i2c_nack() argument
316 if (QLIST_EMPTY(&bus->current_devs)) { in i2c_nack()
320 QLIST_FOREACH(node, &bus->current_devs, next) { in i2c_nack()
329 void i2c_ack(I2CBus *bus) in i2c_ack() argument
331 if (!bus->bh) { in i2c_ack()
337 qemu_bh_schedule(bus->bh); in i2c_ack()
343 I2CBus *bus; in i2c_slave_post_load() local
346 bus = I2C_BUS(qdev_get_parent_bus(DEVICE(dev))); in i2c_slave_post_load()
347 if ((bus->saved_address == dev->address) || in i2c_slave_post_load()
348 (bus->saved_address == I2C_BROADCAST)) { in i2c_slave_post_load()
351 QLIST_INSERT_HEAD(&bus->current_devs, node, next); in i2c_slave_post_load()
376 bool i2c_slave_realize_and_unref(I2CSlave *dev, I2CBus *bus, Error **errp) in i2c_slave_realize_and_unref() argument
378 return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp); in i2c_slave_realize_and_unref()
381 I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t addr) in i2c_slave_create_simple() argument
385 i2c_slave_realize_and_unref(dev, bus, &error_abort); in i2c_slave_create_simple()