|
@@ -58,6 +58,10 @@ static void bcm2835_peripherals_init(Object *obj)
|
|
|
/* Interrupt Controller */
|
|
|
sysbus_init_child_obj(obj, "ic", &s->ic, sizeof(s->ic), TYPE_BCM2835_IC);
|
|
|
|
|
|
+ /* SYS Timer */
|
|
|
+ sysbus_init_child_obj(obj, "systimer", &s->systmr, sizeof(s->systmr),
|
|
|
+ TYPE_BCM2835_SYSTIMER);
|
|
|
+
|
|
|
/* UART0 */
|
|
|
sysbus_init_child_obj(obj, "uart0", &s->uart0, sizeof(s->uart0),
|
|
|
TYPE_PL011);
|
|
@@ -171,6 +175,18 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
|
|
|
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->ic), 0));
|
|
|
sysbus_pass_irq(SYS_BUS_DEVICE(s), SYS_BUS_DEVICE(&s->ic));
|
|
|
|
|
|
+ /* Sys Timer */
|
|
|
+ object_property_set_bool(OBJECT(&s->systmr), true, "realized", &err);
|
|
|
+ if (err) {
|
|
|
+ error_propagate(errp, err);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ memory_region_add_subregion(&s->peri_mr, ST_OFFSET,
|
|
|
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->systmr), 0));
|
|
|
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->systmr), 0,
|
|
|
+ qdev_get_gpio_in_named(DEVICE(&s->ic), BCM2835_IC_ARM_IRQ,
|
|
|
+ INTERRUPT_ARM_TIMER));
|
|
|
+
|
|
|
/* UART0 */
|
|
|
qdev_prop_set_chr(DEVICE(&s->uart0), "chardev", serial_hd(0));
|
|
|
object_property_set_bool(OBJECT(&s->uart0), true, "realized", &err);
|
|
@@ -352,7 +368,6 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
|
|
|
}
|
|
|
|
|
|
create_unimp(s, &s->armtmr, "bcm2835-sp804", ARMCTRL_TIMER0_1_OFFSET, 0x40);
|
|
|
- create_unimp(s, &s->systmr, "bcm2835-systimer", ST_OFFSET, 0x20);
|
|
|
create_unimp(s, &s->cprman, "bcm2835-cprman", CPRMAN_OFFSET, 0x1000);
|
|
|
create_unimp(s, &s->a2w, "bcm2835-a2w", A2W_OFFSET, 0x1000);
|
|
|
create_unimp(s, &s->i2s, "bcm2835-i2s", I2S_OFFSET, 0x100);
|