|
@@ -10,8 +10,10 @@
|
|
|
*/
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
|
+#include "qapi/error.h"
|
|
|
#include "hw/sysbus.h"
|
|
|
#include "hw/timer/aspeed_timer.h"
|
|
|
+#include "hw/misc/aspeed_scu.h"
|
|
|
#include "qemu-common.h"
|
|
|
#include "qemu/bitops.h"
|
|
|
#include "qemu/timer.h"
|
|
@@ -26,7 +28,6 @@
|
|
|
#define TIMER_CLOCK_USE_EXT true
|
|
|
#define TIMER_CLOCK_EXT_HZ 1000000
|
|
|
#define TIMER_CLOCK_USE_APB false
|
|
|
-#define TIMER_CLOCK_APB_HZ 24000000
|
|
|
|
|
|
#define TIMER_REG_STATUS 0
|
|
|
#define TIMER_REG_RELOAD 1
|
|
@@ -80,11 +81,11 @@ static inline bool timer_external_clock(AspeedTimer *t)
|
|
|
return timer_ctrl_status(t, op_external_clock);
|
|
|
}
|
|
|
|
|
|
-static uint32_t clock_rates[] = { TIMER_CLOCK_APB_HZ, TIMER_CLOCK_EXT_HZ };
|
|
|
-
|
|
|
static inline uint32_t calculate_rate(struct AspeedTimer *t)
|
|
|
{
|
|
|
- return clock_rates[timer_external_clock(t)];
|
|
|
+ AspeedTimerCtrlState *s = timer_to_ctrl(t);
|
|
|
+
|
|
|
+ return timer_external_clock(t) ? TIMER_CLOCK_EXT_HZ : s->scu->apb_freq;
|
|
|
}
|
|
|
|
|
|
static inline uint32_t calculate_ticks(struct AspeedTimer *t, uint64_t now_ns)
|
|
@@ -449,6 +450,16 @@ static void aspeed_timer_realize(DeviceState *dev, Error **errp)
|
|
|
int i;
|
|
|
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
|
|
AspeedTimerCtrlState *s = ASPEED_TIMER(dev);
|
|
|
+ Object *obj;
|
|
|
+ Error *err = NULL;
|
|
|
+
|
|
|
+ obj = object_property_get_link(OBJECT(dev), "scu", &err);
|
|
|
+ if (!obj) {
|
|
|
+ error_propagate(errp, err);
|
|
|
+ error_prepend(errp, "required link 'scu' not found: ");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ s->scu = ASPEED_SCU(obj);
|
|
|
|
|
|
for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) {
|
|
|
aspeed_init_one_timer(s, i);
|