hw/arm/bcm2835_peripherals: Use the SYS_timer
Connect the recently added SYS_timer. Now U-Boot does not hang anymore polling a free running counter stuck at 0. This timer is also used by the Linux kernel thermal subsystem. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20191019234715.25750-5-f4bug@amsat.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
d05be883fc
commit
0e5bbd7406
@ -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);
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "hw/sd/sdhci.h"
|
||||
#include "hw/sd/bcm2835_sdhost.h"
|
||||
#include "hw/gpio/bcm2835_gpio.h"
|
||||
#include "hw/timer/bcm2835_systmr.h"
|
||||
#include "hw/misc/unimp.h"
|
||||
|
||||
#define TYPE_BCM2835_PERIPHERALS "bcm2835-peripherals"
|
||||
@ -39,7 +40,7 @@ typedef struct BCM2835PeripheralState {
|
||||
MemoryRegion ram_alias[4];
|
||||
qemu_irq irq, fiq;
|
||||
|
||||
UnimplementedDeviceState systmr;
|
||||
BCM2835SystemTimerState systmr;
|
||||
UnimplementedDeviceState armtmr;
|
||||
UnimplementedDeviceState cprman;
|
||||
UnimplementedDeviceState a2w;
|
||||
|
Loading…
Reference in New Issue
Block a user