]>
Commit | Line | Data |
---|---|---|
90d37239 PB |
1 | /* |
2 | * QEMU Synchronous Serial Interface support | |
3 | * | |
4 | * Copyright (c) 2009 CodeSourcery. | |
5 | * Written by Paul Brook | |
6 | * | |
7 | * This code is licenced under the GNU GPL v2. | |
8 | */ | |
9 | ||
10 | #include "ssi.h" | |
11 | ||
12 | struct SSIBus { | |
13 | SSISlave *slave; | |
14 | }; | |
15 | ||
16 | static void ssi_slave_init(DeviceState *dev, void *opaque) | |
17 | { | |
18 | SSISlaveInfo *info = opaque; | |
19 | SSISlave *s = SSI_SLAVE_FROM_QDEV(dev); | |
20 | SSIBus *bus = qdev_get_bus(dev); | |
21 | ||
22 | bus->slave = s; | |
23 | s->info = info; | |
24 | info->init(s); | |
25 | } | |
26 | ||
27 | void ssi_register_slave(const char *name, int size, SSISlaveInfo *info) | |
28 | { | |
29 | assert(size >= sizeof(SSISlave)); | |
30 | qdev_register(name, size, ssi_slave_init, info); | |
31 | } | |
32 | ||
33 | DeviceState *ssi_create_slave(SSIBus *bus, const char *name) | |
34 | { | |
35 | DeviceState *dev; | |
36 | dev = qdev_create(bus, name); | |
37 | qdev_init(dev); | |
38 | return dev; | |
39 | } | |
40 | ||
41 | SSIBus *ssi_create_bus(void) | |
42 | { | |
43 | return qemu_mallocz(sizeof(SSIBus)); | |
44 | } | |
45 | ||
46 | uint32_t ssi_transfer(SSIBus *bus, uint32_t val) | |
47 | { | |
48 | if (!bus->slave) { | |
49 | return 0; | |
50 | } | |
51 | return bus->slave->info->transfer(bus->slave, val); | |
52 | } |