Revision d537cf6c hw/arm_timer.c
b/hw/arm_timer.c | ||
---|---|---|
32 | 32 |
int raw_freq; |
33 | 33 |
int freq; |
34 | 34 |
int int_level; |
35 |
void *pic; |
|
36 |
int irq; |
|
35 |
qemu_irq irq; |
|
37 | 36 |
} arm_timer_state; |
38 | 37 |
|
39 | 38 |
/* Calculate the new expiry time of the given timer. */ |
... | ... | |
85 | 84 |
} |
86 | 85 |
/* Update interrupts. */ |
87 | 86 |
if (s->int_level && (s->control & TIMER_CTRL_IE)) { |
88 |
pic_set_irq_new(s->pic, s->irq, 1);
|
|
87 |
qemu_irq_raise(s->irq);
|
|
89 | 88 |
} else { |
90 |
pic_set_irq_new(s->pic, s->irq, 0);
|
|
89 |
qemu_irq_lower(s->irq);
|
|
91 | 90 |
} |
92 | 91 |
|
93 | 92 |
next = now; |
... | ... | |
215 | 214 |
arm_timer_update((arm_timer_state *)opaque, now); |
216 | 215 |
} |
217 | 216 |
|
218 |
static void *arm_timer_init(uint32_t freq, void *pic, int irq)
|
|
217 |
static void *arm_timer_init(uint32_t freq, qemu_irq irq)
|
|
219 | 218 |
{ |
220 | 219 |
arm_timer_state *s; |
221 | 220 |
|
222 | 221 |
s = (arm_timer_state *)qemu_mallocz(sizeof(arm_timer_state)); |
223 |
s->pic = pic; |
|
224 | 222 |
s->irq = irq; |
225 | 223 |
s->raw_freq = s->freq = 1000000; |
226 | 224 |
s->control = TIMER_CTRL_IE; |
... | ... | |
237 | 235 |
Integrator/CP timer modules. */ |
238 | 236 |
|
239 | 237 |
typedef struct { |
240 |
/* Include a pseudo-PIC device to merge the two interrupt sources. */ |
|
241 |
arm_pic_handler handler; |
|
242 | 238 |
void *timer[2]; |
243 | 239 |
int level[2]; |
244 | 240 |
uint32_t base; |
245 |
/* The output PIC device. */ |
|
246 |
void *pic; |
|
247 |
int irq; |
|
241 |
qemu_irq irq; |
|
248 | 242 |
} sp804_state; |
249 | 243 |
|
244 |
/* Merge the IRQs from the two component devices. */ |
|
250 | 245 |
static void sp804_set_irq(void *opaque, int irq, int level) |
251 | 246 |
{ |
252 | 247 |
sp804_state *s = (sp804_state *)opaque; |
253 | 248 |
|
254 | 249 |
s->level[irq] = level; |
255 |
pic_set_irq_new(s->pic, s->irq, s->level[0] || s->level[1]);
|
|
250 |
qemu_set_irq(s->irq, s->level[0] || s->level[1]);
|
|
256 | 251 |
} |
257 | 252 |
|
258 | 253 |
static uint32_t sp804_read(void *opaque, target_phys_addr_t offset) |
... | ... | |
293 | 288 |
sp804_write |
294 | 289 |
}; |
295 | 290 |
|
296 |
void sp804_init(uint32_t base, void *pic, int irq)
|
|
291 |
void sp804_init(uint32_t base, qemu_irq irq)
|
|
297 | 292 |
{ |
298 | 293 |
int iomemtype; |
299 | 294 |
sp804_state *s; |
295 |
qemu_irq *qi; |
|
300 | 296 |
|
301 | 297 |
s = (sp804_state *)qemu_mallocz(sizeof(sp804_state)); |
302 |
s->handler = sp804_set_irq;
|
|
298 |
qi = qemu_allocate_irqs(sp804_set_irq, s, 2);
|
|
303 | 299 |
s->base = base; |
304 |
s->pic = pic; |
|
305 | 300 |
s->irq = irq; |
306 | 301 |
/* ??? The timers are actually configurable between 32kHz and 1MHz, but |
307 | 302 |
we don't implement that. */ |
308 |
s->timer[0] = arm_timer_init(1000000, s, 0);
|
|
309 |
s->timer[1] = arm_timer_init(1000000, s, 1);
|
|
303 |
s->timer[0] = arm_timer_init(1000000, qi[0]);
|
|
304 |
s->timer[1] = arm_timer_init(1000000, qi[1]);
|
|
310 | 305 |
iomemtype = cpu_register_io_memory(0, sp804_readfn, |
311 | 306 |
sp804_writefn, s); |
312 | 307 |
cpu_register_physical_memory(base, 0x00000fff, iomemtype); |
... | ... | |
362 | 357 |
icp_pit_write |
363 | 358 |
}; |
364 | 359 |
|
365 |
void icp_pit_init(uint32_t base, void *pic, int irq)
|
|
360 |
void icp_pit_init(uint32_t base, qemu_irq *pic, int irq)
|
|
366 | 361 |
{ |
367 | 362 |
int iomemtype; |
368 | 363 |
icp_pit_state *s; |
... | ... | |
370 | 365 |
s = (icp_pit_state *)qemu_mallocz(sizeof(icp_pit_state)); |
371 | 366 |
s->base = base; |
372 | 367 |
/* Timer 0 runs at the system clock speed (40MHz). */ |
373 |
s->timer[0] = arm_timer_init(40000000, pic, irq);
|
|
368 |
s->timer[0] = arm_timer_init(40000000, pic[irq]);
|
|
374 | 369 |
/* The other two timers run at 1MHz. */ |
375 |
s->timer[1] = arm_timer_init(1000000, pic, irq + 1);
|
|
376 |
s->timer[2] = arm_timer_init(1000000, pic, irq + 2);
|
|
370 |
s->timer[1] = arm_timer_init(1000000, pic[irq + 1]);
|
|
371 |
s->timer[2] = arm_timer_init(1000000, pic[irq + 2]);
|
|
377 | 372 |
|
378 | 373 |
iomemtype = cpu_register_io_memory(0, icp_pit_readfn, |
379 | 374 |
icp_pit_writefn, s); |
Also available in: Unified diff