Revision cde844fa
b/hw/grlib_gptimer.c | ||
---|---|---|
68 | 68 |
|
69 | 69 |
struct GPTimerUnit { |
70 | 70 |
SysBusDevice busdev; |
71 |
MemoryRegion iomem; |
|
71 | 72 |
|
72 | 73 |
uint32_t nr_timers; /* Number of timers available */ |
73 | 74 |
uint32_t freq_hz; /* System frequency */ |
... | ... | |
153 | 154 |
} |
154 | 155 |
} |
155 | 156 |
|
156 |
static uint32_t grlib_gptimer_readl(void *opaque, target_phys_addr_t addr) |
|
157 |
static uint64_t grlib_gptimer_read(void *opaque, target_phys_addr_t addr, |
|
158 |
unsigned size) |
|
157 | 159 |
{ |
158 | 160 |
GPTimerUnit *unit = opaque; |
159 | 161 |
target_phys_addr_t timer_addr; |
... | ... | |
211 | 213 |
return 0; |
212 | 214 |
} |
213 | 215 |
|
214 |
static void |
|
215 |
grlib_gptimer_writel(void *opaque, target_phys_addr_t addr, uint32_t value)
|
|
216 |
static void grlib_gptimer_write(void *opaque, target_phys_addr_t addr,
|
|
217 |
uint64_t value, unsigned size)
|
|
216 | 218 |
{ |
217 | 219 |
GPTimerUnit *unit = opaque; |
218 | 220 |
target_phys_addr_t timer_addr; |
... | ... | |
299 | 301 |
trace_grlib_gptimer_writel(-1, addr, value); |
300 | 302 |
} |
301 | 303 |
|
302 |
static CPUReadMemoryFunc * const grlib_gptimer_read[] = { |
|
303 |
NULL, NULL, grlib_gptimer_readl, |
|
304 |
}; |
|
305 |
|
|
306 |
static CPUWriteMemoryFunc * const grlib_gptimer_write[] = { |
|
307 |
NULL, NULL, grlib_gptimer_writel, |
|
304 |
static const MemoryRegionOps grlib_gptimer_ops = { |
|
305 |
.read = grlib_gptimer_read, |
|
306 |
.write = grlib_gptimer_write, |
|
307 |
.endianness = DEVICE_NATIVE_ENDIAN, |
|
308 |
.valid = { |
|
309 |
.min_access_size = 4, |
|
310 |
.max_access_size = 4, |
|
311 |
}, |
|
308 | 312 |
}; |
309 | 313 |
|
310 | 314 |
static void grlib_gptimer_reset(DeviceState *d) |
... | ... | |
340 | 344 |
{ |
341 | 345 |
GPTimerUnit *unit = FROM_SYSBUS(typeof(*unit), dev); |
342 | 346 |
unsigned int i; |
343 |
int timer_regs; |
|
344 | 347 |
|
345 | 348 |
assert(unit->nr_timers > 0); |
346 | 349 |
assert(unit->nr_timers <= GPTIMER_MAX_TIMERS); |
... | ... | |
361 | 364 |
ptimer_set_freq(timer->ptimer, unit->freq_hz); |
362 | 365 |
} |
363 | 366 |
|
364 |
timer_regs = cpu_register_io_memory(grlib_gptimer_read, |
|
365 |
grlib_gptimer_write, |
|
366 |
unit, DEVICE_NATIVE_ENDIAN); |
|
367 |
if (timer_regs < 0) { |
|
368 |
return -1; |
|
369 |
} |
|
367 |
memory_region_init_io(&unit->iomem, &grlib_gptimer_ops, unit, "gptimer", |
|
368 |
UNIT_REG_SIZE + GPTIMER_REG_SIZE * unit->nr_timers); |
|
370 | 369 |
|
371 |
sysbus_init_mmio(dev, UNIT_REG_SIZE + GPTIMER_REG_SIZE * unit->nr_timers, |
|
372 |
timer_regs); |
|
370 |
sysbus_init_mmio_region(dev, &unit->iomem); |
|
373 | 371 |
return 0; |
374 | 372 |
} |
375 | 373 |
|
Also available in: Unified diff