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