Fix lance segfaults
[qemu] / hw / ssi.c
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 }