bcm283* refactoring continues
[qemu/ar7.git] / hw / arm / bcm2835.c
bloba811d456e8a6b69e4fc2884de58ea43c4f3ff21f
1 #include "hw/arm/bcm2835.h"
2 #include "hw/arm/raspi_platform.h"
3 #include "hw/sysbus.h"
4 #include "exec/address-spaces.h"
6 #define DEFAULT_VCRAM_SIZE 0x4000000
8 static void bcm2835_init(Object *obj)
10 BCM2835State *s = BCM2835(obj);
12 object_initialize(&s->cpu, sizeof(s->cpu), "arm1176-" TYPE_ARM_CPU);
13 object_property_add_child(obj, "cpu", OBJECT(&s->cpu), &error_abort);
15 object_initialize(&s->peripherals, sizeof(s->peripherals),
16 TYPE_BCM2835_PERIPHERALS);
17 object_property_add_child(obj, "peripherals", OBJECT(&s->peripherals),
18 &error_abort);
19 qdev_set_parent_bus(DEVICE(&s->peripherals), sysbus_get_default());
22 static void bcm2835_realize(DeviceState *dev, Error **errp)
24 BCM2835State *s = BCM2835(dev);
25 Error *err = NULL;
27 /* common peripherals from bcm2835 */
28 object_property_set_bool(OBJECT(&s->peripherals), true, "realized", &err);
29 if (err) {
30 error_propagate(errp, err);
31 return;
34 sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->peripherals), 0,
35 BCM2835_PERI_BASE, 1);
37 object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
38 if (err) {
39 error_report_err(err);
40 exit(1);
43 sysbus_connect_irq(SYS_BUS_DEVICE(&s->peripherals), 0,
44 qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
45 sysbus_connect_irq(SYS_BUS_DEVICE(&s->peripherals), 1,
46 qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
50 static Property bcm2835_props[] = {
51 DEFINE_PROP_SIZE("vcram-size", BCM2835State, vcram_size, DEFAULT_VCRAM_SIZE),
52 DEFINE_PROP_END_OF_LIST()
55 static void bcm2835_class_init(ObjectClass *oc, void *data)
57 DeviceClass *dc = DEVICE_CLASS(oc);
59 dc->props = bcm2835_props;
60 dc->realize = bcm2835_realize;
63 * Reason: creates an ARM CPU, thus use after free(), see
64 * arm_cpu_class_init()
66 dc->cannot_destroy_with_object_finalize_yet = true;
69 static const TypeInfo bcm2835_type_info = {
70 .name = TYPE_BCM2835,
71 .parent = TYPE_SYS_BUS_DEVICE,
72 .instance_size = sizeof(BCM2835State),
73 .instance_init = bcm2835_init,
74 .class_init = bcm2835_class_init,
77 static void bcm2835_register_types(void)
79 type_register_static(&bcm2835_type_info);
82 type_init(bcm2835_register_types)