]>
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 { | |
02e2da45 | 13 | BusState qbus; |
90d37239 PB |
14 | }; |
15 | ||
10c4c98a GH |
16 | static struct BusInfo ssi_bus_info = { |
17 | .name = "SSI", | |
18 | .size = sizeof(SSIBus), | |
19 | }; | |
20 | ||
81a322d4 | 21 | static int ssi_slave_init(DeviceState *dev, DeviceInfo *base_info) |
90d37239 | 22 | { |
02e2da45 | 23 | SSISlaveInfo *info = container_of(base_info, SSISlaveInfo, qdev); |
90d37239 | 24 | SSISlave *s = SSI_SLAVE_FROM_QDEV(dev); |
02e2da45 PB |
25 | SSIBus *bus; |
26 | ||
27 | bus = FROM_QBUS(SSIBus, qdev_get_parent_bus(dev)); | |
72cf2d4f BS |
28 | if (QLIST_FIRST(&bus->qbus.children) != dev |
29 | || QLIST_NEXT(dev, sibling) != NULL) { | |
02e2da45 PB |
30 | hw_error("Too many devices on SSI bus"); |
31 | } | |
90d37239 | 32 | |
90d37239 | 33 | s->info = info; |
81a322d4 | 34 | return info->init(s); |
90d37239 PB |
35 | } |
36 | ||
074f2fff | 37 | void ssi_register_slave(SSISlaveInfo *info) |
90d37239 | 38 | { |
074f2fff | 39 | assert(info->qdev.size >= sizeof(SSISlave)); |
02e2da45 | 40 | info->qdev.init = ssi_slave_init; |
10c4c98a | 41 | info->qdev.bus_info = &ssi_bus_info; |
074f2fff | 42 | qdev_register(&info->qdev); |
90d37239 PB |
43 | } |
44 | ||
45 | DeviceState *ssi_create_slave(SSIBus *bus, const char *name) | |
46 | { | |
47 | DeviceState *dev; | |
02e2da45 | 48 | dev = qdev_create(&bus->qbus, name); |
e23a1b33 | 49 | qdev_init_nofail(dev); |
90d37239 PB |
50 | return dev; |
51 | } | |
52 | ||
02e2da45 | 53 | SSIBus *ssi_create_bus(DeviceState *parent, const char *name) |
90d37239 | 54 | { |
02e2da45 | 55 | BusState *bus; |
10c4c98a | 56 | bus = qbus_create(&ssi_bus_info, parent, name); |
02e2da45 | 57 | return FROM_QBUS(SSIBus, bus); |
90d37239 PB |
58 | } |
59 | ||
60 | uint32_t ssi_transfer(SSIBus *bus, uint32_t val) | |
61 | { | |
02e2da45 PB |
62 | DeviceState *dev; |
63 | SSISlave *slave; | |
72cf2d4f | 64 | dev = QLIST_FIRST(&bus->qbus.children); |
02e2da45 | 65 | if (!dev) { |
90d37239 PB |
66 | return 0; |
67 | } | |
02e2da45 PB |
68 | slave = SSI_SLAVE_FROM_QDEV(dev); |
69 | return slave->info->transfer(slave, val); | |
90d37239 | 70 | } |