|
@@ -62,11 +62,16 @@ struct timerblock
|
|
SysBusDevice busdev;
|
|
SysBusDevice busdev;
|
|
MemoryRegion mmio;
|
|
MemoryRegion mmio;
|
|
qemu_irq irq;
|
|
qemu_irq irq;
|
|
- uint32_t nr_timers;
|
|
|
|
|
|
+ uint8_t one_timer_only;
|
|
uint32_t freq_hz;
|
|
uint32_t freq_hz;
|
|
struct xlx_timer *timers;
|
|
struct xlx_timer *timers;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static inline unsigned int num_timers(struct timerblock *t)
|
|
|
|
+{
|
|
|
|
+ return 2 - t->one_timer_only;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline unsigned int timer_from_addr(target_phys_addr_t addr)
|
|
static inline unsigned int timer_from_addr(target_phys_addr_t addr)
|
|
{
|
|
{
|
|
/* Timers get a 4x32bit control reg area each. */
|
|
/* Timers get a 4x32bit control reg area each. */
|
|
@@ -78,7 +83,7 @@ static void timer_update_irq(struct timerblock *t)
|
|
unsigned int i, irq = 0;
|
|
unsigned int i, irq = 0;
|
|
uint32_t csr;
|
|
uint32_t csr;
|
|
|
|
|
|
- for (i = 0; i < t->nr_timers; i++) {
|
|
|
|
|
|
+ for (i = 0; i < num_timers(t); i++) {
|
|
csr = t->timers[i].regs[R_TCSR];
|
|
csr = t->timers[i].regs[R_TCSR];
|
|
irq |= (csr & TCSR_TINT) && (csr & TCSR_ENIT);
|
|
irq |= (csr & TCSR_TINT) && (csr & TCSR_ENIT);
|
|
}
|
|
}
|
|
@@ -202,8 +207,8 @@ static int xilinx_timer_init(SysBusDevice *dev)
|
|
sysbus_init_irq(dev, &t->irq);
|
|
sysbus_init_irq(dev, &t->irq);
|
|
|
|
|
|
/* Init all the ptimers. */
|
|
/* Init all the ptimers. */
|
|
- t->timers = g_malloc0(sizeof t->timers[0] * t->nr_timers);
|
|
|
|
- for (i = 0; i < t->nr_timers; i++) {
|
|
|
|
|
|
+ t->timers = g_malloc0(sizeof t->timers[0] * num_timers(t));
|
|
|
|
+ for (i = 0; i < num_timers(t); i++) {
|
|
struct xlx_timer *xt = &t->timers[i];
|
|
struct xlx_timer *xt = &t->timers[i];
|
|
|
|
|
|
xt->parent = t;
|
|
xt->parent = t;
|
|
@@ -214,14 +219,14 @@ static int xilinx_timer_init(SysBusDevice *dev)
|
|
}
|
|
}
|
|
|
|
|
|
memory_region_init_io(&t->mmio, &timer_ops, t, "xilinx-timer",
|
|
memory_region_init_io(&t->mmio, &timer_ops, t, "xilinx-timer",
|
|
- R_MAX * 4 * t->nr_timers);
|
|
|
|
|
|
+ R_MAX * 4 * num_timers(t));
|
|
sysbus_init_mmio(dev, &t->mmio);
|
|
sysbus_init_mmio(dev, &t->mmio);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static Property xilinx_timer_properties[] = {
|
|
static Property xilinx_timer_properties[] = {
|
|
DEFINE_PROP_UINT32("frequency", struct timerblock, freq_hz, 62 * 1000000),
|
|
DEFINE_PROP_UINT32("frequency", struct timerblock, freq_hz, 62 * 1000000),
|
|
- DEFINE_PROP_UINT32("nr-timers", struct timerblock, nr_timers, 0),
|
|
|
|
|
|
+ DEFINE_PROP_UINT8("one-timer-only", struct timerblock, one_timer_only, 0),
|
|
DEFINE_PROP_END_OF_LIST(),
|
|
DEFINE_PROP_END_OF_LIST(),
|
|
};
|
|
};
|
|
|
|
|