pi: cross-port refactoring/cleanup from private branch used for ongoing upstreaming
[qemu/ar7.git] / hw / misc / bcm2835_power.c
blob2485d8deffc281c96f8ec27f15a3b0988fef50af
1 /*
2 * Raspberry Pi emulation (c) 2012 Gregory Estrade
3 * This code is licensed under the GNU GPLv2 and later.
4 */
6 #include "hw/misc/bcm2835_power.h"
7 #include "hw/misc/bcm2835_mbox_defs.h"
9 static uint64_t bcm2835_power_read(void *opaque, hwaddr offset, unsigned size)
11 BCM2835PowerState *s = (BCM2835PowerState *)opaque;
12 uint32_t res = 0;
14 switch (offset) {
15 case 0:
16 res = MBOX_CHAN_POWER;
17 s->pending = 0;
18 qemu_set_irq(s->mbox_irq, 0);
19 break;
20 case 4:
21 res = s->pending;
22 break;
23 default:
24 qemu_log_mask(LOG_GUEST_ERROR,
25 "bcm2835_power_read: Bad offset %x\n", (int)offset);
26 return 0;
28 return res;
31 static void bcm2835_power_write(void *opaque, hwaddr offset, uint64_t value,
32 unsigned size)
34 BCM2835PowerState *s = (BCM2835PowerState *)opaque;
35 switch (offset) {
36 case 0:
37 s->pending = 1;
38 qemu_set_irq(s->mbox_irq, 1);
39 break;
40 default:
41 qemu_log_mask(LOG_GUEST_ERROR,
42 "bcm2835_power_write: Bad offset %x\n", (int)offset);
43 return;
48 static const MemoryRegionOps bcm2835_power_ops = {
49 .read = bcm2835_power_read,
50 .write = bcm2835_power_write,
51 .endianness = DEVICE_NATIVE_ENDIAN,
54 static const VMStateDescription vmstate_bcm2835_power = {
55 .name = TYPE_BCM2835_POWER,
56 .version_id = 1,
57 .minimum_version_id = 1,
58 .minimum_version_id_old = 1,
59 .fields = (VMStateField[]) {
60 VMSTATE_END_OF_LIST()
64 static void bcm2835_power_init(Object *obj)
66 BCM2835PowerState *s = BCM2835_POWER(obj);
68 sysbus_init_irq(SYS_BUS_DEVICE(s), &s->mbox_irq);
69 memory_region_init_io(&s->iomem, obj, &bcm2835_power_ops, s,
70 TYPE_BCM2835_POWER, 0x10);
71 sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
74 static void bcm2835_power_realize(DeviceState *dev, Error **errp)
76 BCM2835PowerState *s = BCM2835_POWER(dev);
78 s->pending = 0;
81 static void bcm2835_power_class_init(ObjectClass *klass, void *data)
83 DeviceClass *dc = DEVICE_CLASS(klass);
85 dc->realize = bcm2835_power_realize;
86 dc->vmsd = &vmstate_bcm2835_power;
89 static TypeInfo bcm2835_power_info = {
90 .name = TYPE_BCM2835_POWER,
91 .parent = TYPE_SYS_BUS_DEVICE,
92 .instance_size = sizeof(BCM2835PowerState),
93 .class_init = bcm2835_power_class_init,
94 .instance_init = bcm2835_power_init,
97 static void bcm2835_power_register_types(void)
99 type_register_static(&bcm2835_power_info);
102 type_init(bcm2835_power_register_types)