Revision 91b64626
b/hw/arm/integratorcp.c | ||
---|---|---|
271 | 271 |
/* Integrator/CP hardware emulation. */ |
272 | 272 |
/* Primary interrupt controller. */ |
273 | 273 |
|
274 |
typedef struct icp_pic_state |
|
275 |
{ |
|
276 |
SysBusDevice busdev; |
|
277 |
MemoryRegion iomem; |
|
278 |
uint32_t level; |
|
279 |
uint32_t irq_enabled; |
|
280 |
uint32_t fiq_enabled; |
|
281 |
qemu_irq parent_irq; |
|
282 |
qemu_irq parent_fiq; |
|
274 |
#define TYPE_INTEGRATOR_PIC "integrator_pic" |
|
275 |
#define INTEGRATOR_PIC(obj) \ |
|
276 |
OBJECT_CHECK(icp_pic_state, (obj), TYPE_INTEGRATOR_PIC) |
|
277 |
|
|
278 |
typedef struct icp_pic_state { |
|
279 |
/*< private >*/ |
|
280 |
SysBusDevice parent_obj; |
|
281 |
/*< public >*/ |
|
282 |
|
|
283 |
MemoryRegion iomem; |
|
284 |
uint32_t level; |
|
285 |
uint32_t irq_enabled; |
|
286 |
uint32_t fiq_enabled; |
|
287 |
qemu_irq parent_irq; |
|
288 |
qemu_irq parent_fiq; |
|
283 | 289 |
} icp_pic_state; |
284 | 290 |
|
285 | 291 |
static void icp_pic_update(icp_pic_state *s) |
... | ... | |
374 | 380 |
.endianness = DEVICE_NATIVE_ENDIAN, |
375 | 381 |
}; |
376 | 382 |
|
377 |
static int icp_pic_init(SysBusDevice *dev)
|
|
383 |
static int icp_pic_init(SysBusDevice *sbd)
|
|
378 | 384 |
{ |
379 |
icp_pic_state *s = FROM_SYSBUS(icp_pic_state, dev); |
|
385 |
DeviceState *dev = DEVICE(sbd); |
|
386 |
icp_pic_state *s = INTEGRATOR_PIC(dev); |
|
380 | 387 |
|
381 |
qdev_init_gpio_in(&dev->qdev, icp_pic_set_irq, 32);
|
|
382 |
sysbus_init_irq(dev, &s->parent_irq);
|
|
383 |
sysbus_init_irq(dev, &s->parent_fiq);
|
|
388 |
qdev_init_gpio_in(dev, icp_pic_set_irq, 32); |
|
389 |
sysbus_init_irq(sbd, &s->parent_irq);
|
|
390 |
sysbus_init_irq(sbd, &s->parent_fiq);
|
|
384 | 391 |
memory_region_init_io(&s->iomem, OBJECT(s), &icp_pic_ops, s, |
385 | 392 |
"icp-pic", 0x00800000); |
386 |
sysbus_init_mmio(dev, &s->iomem);
|
|
393 |
sysbus_init_mmio(sbd, &s->iomem);
|
|
387 | 394 |
return 0; |
388 | 395 |
} |
389 | 396 |
|
... | ... | |
487 | 494 |
sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000); |
488 | 495 |
|
489 | 496 |
cpu_pic = arm_pic_init_cpu(cpu); |
490 |
dev = sysbus_create_varargs("integrator_pic", 0x14000000,
|
|
497 |
dev = sysbus_create_varargs(TYPE_INTEGRATOR_PIC, 0x14000000,
|
|
491 | 498 |
cpu_pic[ARM_PIC_CPU_IRQ], |
492 | 499 |
cpu_pic[ARM_PIC_CPU_FIQ], NULL); |
493 | 500 |
for (i = 0; i < 32; i++) { |
494 | 501 |
pic[i] = qdev_get_gpio_in(dev, i); |
495 | 502 |
} |
496 |
sysbus_create_simple("integrator_pic", 0xca000000, pic[26]);
|
|
503 |
sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]);
|
|
497 | 504 |
sysbus_create_varargs("integrator_pit", 0x13000000, |
498 | 505 |
pic[5], pic[6], pic[7], NULL); |
499 | 506 |
sysbus_create_simple("pl031", 0x15000000, pic[8]); |
... | ... | |
559 | 566 |
} |
560 | 567 |
|
561 | 568 |
static const TypeInfo icp_pic_info = { |
562 |
.name = "integrator_pic",
|
|
569 |
.name = TYPE_INTEGRATOR_PIC,
|
|
563 | 570 |
.parent = TYPE_SYS_BUS_DEVICE, |
564 | 571 |
.instance_size = sizeof(icp_pic_state), |
565 | 572 |
.class_init = icp_pic_class_init, |
Also available in: Unified diff