32
32
unsigned char priority[32];
35
#define TYPE_OMAP_INTC "common-omap-intc"
36
#define OMAP_INTC(obj) \
37
OBJECT_CHECK(struct omap_intr_handler_s, (obj), TYPE_OMAP_INTC)
35
39
struct omap_intr_handler_s {
40
SysBusDevice parent_obj;
38
43
qemu_irq parent_intr[2];
329
334
static void omap_inth_reset(DeviceState *dev)
331
struct omap_intr_handler_s *s = FROM_SYSBUS(struct omap_intr_handler_s,
332
SYS_BUS_DEVICE(dev));
336
struct omap_intr_handler_s *s = OMAP_INTC(dev);
335
339
for (i = 0; i < s->nbanks; ++i){
356
360
qemu_set_irq(s->parent_intr[1], 0);
359
static int omap_intc_init(SysBusDevice *dev)
363
static int omap_intc_init(SysBusDevice *sbd)
361
struct omap_intr_handler_s *s;
362
s = FROM_SYSBUS(struct omap_intr_handler_s, dev);
365
DeviceState *dev = DEVICE(sbd);
366
struct omap_intr_handler_s *s = OMAP_INTC(dev);
364
369
hw_error("omap-intc: clk not connected\n");
367
sysbus_init_irq(dev, &s->parent_intr[0]);
368
sysbus_init_irq(dev, &s->parent_intr[1]);
369
qdev_init_gpio_in(&dev->qdev, omap_set_intr, s->nbanks * 32);
370
memory_region_init_io(&s->mmio, &omap_inth_mem_ops, s,
372
sysbus_init_irq(sbd, &s->parent_intr[0]);
373
sysbus_init_irq(sbd, &s->parent_intr[1]);
374
qdev_init_gpio_in(dev, omap_set_intr, s->nbanks * 32);
375
memory_region_init_io(&s->mmio, OBJECT(s), &omap_inth_mem_ops, s,
371
376
"omap-intc", s->size);
372
sysbus_init_mmio(dev, &s->mmio);
377
sysbus_init_mmio(sbd, &s->mmio);
392
397
static const TypeInfo omap_intc_info = {
393
398
.name = "omap-intc",
394
.parent = TYPE_SYS_BUS_DEVICE,
395
.instance_size = sizeof(struct omap_intr_handler_s),
399
.parent = TYPE_OMAP_INTC,
396
400
.class_init = omap_intc_class_init,
504
508
case 0x10: /* INTC_SYSCONFIG */
505
509
s->autoidle &= 4;
506
510
s->autoidle |= (value & 1) << 2;
507
if (value & 2) /* SOFTRESET */
508
omap_inth_reset(&s->busdev.qdev);
511
if (value & 2) { /* SOFTRESET */
512
omap_inth_reset(DEVICE(s));
511
516
case 0x48: /* INTC_CONTROL */
601
static int omap2_intc_init(SysBusDevice *dev)
606
static int omap2_intc_init(SysBusDevice *sbd)
603
struct omap_intr_handler_s *s;
604
s = FROM_SYSBUS(struct omap_intr_handler_s, dev);
608
DeviceState *dev = DEVICE(sbd);
609
struct omap_intr_handler_s *s = OMAP_INTC(dev);
606
612
hw_error("omap2-intc: iclk not connected\n");
611
617
s->level_only = 1;
613
sysbus_init_irq(dev, &s->parent_intr[0]);
614
sysbus_init_irq(dev, &s->parent_intr[1]);
615
qdev_init_gpio_in(&dev->qdev, omap_set_intr_noedge, s->nbanks * 32);
616
memory_region_init_io(&s->mmio, &omap2_inth_mem_ops, s,
619
sysbus_init_irq(sbd, &s->parent_intr[0]);
620
sysbus_init_irq(sbd, &s->parent_intr[1]);
621
qdev_init_gpio_in(dev, omap_set_intr_noedge, s->nbanks * 32);
622
memory_region_init_io(&s->mmio, OBJECT(s), &omap2_inth_mem_ops, s,
617
623
"omap2-intc", 0x1000);
618
sysbus_init_mmio(dev, &s->mmio);
624
sysbus_init_mmio(sbd, &s->mmio);
640
646
static const TypeInfo omap2_intc_info = {
641
647
.name = "omap2-intc",
642
.parent = TYPE_SYS_BUS_DEVICE,
643
.instance_size = sizeof(struct omap_intr_handler_s),
648
.parent = TYPE_OMAP_INTC,
644
649
.class_init = omap2_intc_class_init,
652
static const TypeInfo omap_intc_type_info = {
653
.name = TYPE_OMAP_INTC,
654
.parent = TYPE_SYS_BUS_DEVICE,
655
.instance_size = sizeof(struct omap_intr_handler_s),
647
659
static void omap_intc_register_types(void)
661
type_register_static(&omap_intc_type_info);
649
662
type_register_static(&omap_intc_info);
650
663
type_register_static(&omap2_intc_info);