Revision 3a38d437

b/Makefile.target
261 261
obj-arm-y += pxa2xx.o pxa2xx_pic.o pxa2xx_gpio.o pxa2xx_timer.o pxa2xx_dma.o
262 262
obj-arm-y += pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o
263 263
obj-arm-y += pflash_cfi01.o gumstix.o
264
obj-arm-y += zaurus.o ide.o serial.o spitz.o tosa.o tc6393xb.o
264
obj-arm-y += zaurus.o ide.o isa-bus.o serial.o spitz.o tosa.o tc6393xb.o
265 265
obj-arm-y += omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o
266 266
obj-arm-y += omap2.o omap_dss.o soc_dma.o
267 267
obj-arm-y += omap_sx1.o palm.o tsc210x.o
......
275 275

  
276 276
obj-sh4-y = shix.o r2d.o sh7750.o sh7750_regnames.o tc58128.o
277 277
obj-sh4-y += sh_timer.o sh_serial.o sh_intc.o sh_pci.o sm501.o serial.o
278
obj-sh4-y += ide.o
278
obj-sh4-y += ide.o isa-bus.o
279 279

  
280 280
obj-m68k-y = an5206.o mcf5206.o mcf_uart.o mcf_intc.o mcf5208.o mcf_fec.o
281 281
obj-m68k-y += m68k-semi.o dummy_m68k.o
b/hw/cs4231a.c
60 60

  
61 61
typedef struct CSState {
62 62
    QEMUSoundCard card;
63
    qemu_irq *pic;
63
    qemu_irq pic;
64 64
    uint32_t regs[CS_REGS];
65 65
    uint8_t dregs[CS_DREGS];
66
    int irq;
67 66
    int dma;
68 67
    int port;
69 68
    int shift;
......
483 482
        case Alternate_Feature_Status:
484 483
            if ((s->dregs[iaddr] & PI) && !(val & PI)) {
485 484
                /* XXX: TI CI */
486
                qemu_irq_lower (s->pic[s->irq]);
485
                qemu_irq_lower (s->pic);
487 486
                s->regs[Status] &= ~INT;
488 487
            }
489 488
            s->dregs[iaddr] = val;
......
503 502

  
504 503
    case Status:
505 504
        if (s->regs[Status] & INT) {
506
            qemu_irq_lower (s->pic[s->irq]);
505
            qemu_irq_lower (s->pic);
507 506
        }
508 507
        s->regs[Status] &= ~INT;
509 508
        s->dregs[Alternate_Feature_Status] &= ~(PI | CI | TI);
......
588 587
        s->regs[Status] |= INT;
589 588
        s->dregs[Alternate_Feature_Status] |= PI;
590 589
        s->transferred = 0;
591
        qemu_irq_raise (s->pic[s->irq]);
590
        qemu_irq_raise (s->pic);
592 591
    }
593 592
    else {
594 593
        s->transferred += written;
......
643 642

  
644 643
    s = qemu_mallocz (sizeof (*s));
645 644

  
646
    s->pic = pic;
647
    s->irq = conf.irq;
645
    s->pic = isa_reserve_irq(conf.irq);
648 646
    s->dma = conf.dma;
649 647
    s->port = conf.port;
650 648

  
b/hw/ide.c
3610 3610
    pci_register_bar((PCIDevice *)d, 4, 0x10,
3611 3611
                           PCI_ADDRESS_SPACE_IO, bmdma_map);
3612 3612

  
3613
    ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], pic[14]);
3614
    ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], pic[15]);
3613
    ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], isa_reserve_irq(14));
3614
    ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], isa_reserve_irq(15));
3615 3615
    ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
3616 3616
    ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
3617 3617

  
......
3650 3650
    pci_register_bar((PCIDevice *)d, 4, 0x10,
3651 3651
                           PCI_ADDRESS_SPACE_IO, bmdma_map);
3652 3652

  
3653
    /*
3654
     * These should call isa_reserve_irq() instead when MIPS supports it
3655
     */
3653 3656
    ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], pic[14]);
3654 3657
    ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], pic[15]);
3655 3658
    ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
b/hw/isa-bus.c
76 76
    }
77 77
}
78 78

  
79
/*
80
 * isa_reserve_irq() reserves the ISA irq and returns the corresponding
81
 * qemu_irq entry for the i8259.
82
 *
83
 * This function is only for special cases such as the 'ferr', and
84
 * temporary use for normal devices until they are converted to qdev.
85
 */
86
qemu_irq isa_reserve_irq(int isairq)
87
{
88
    if (isairq < 0 || isairq > 15) {
89
        fprintf(stderr, "isa irq %d invalid\n", isairq);
90
        exit(1);
91
    }
92
    if (isabus->assigned & (1 << isairq)) {
93
        fprintf(stderr, "isa irq %d already assigned\n", isairq);
94
        exit(1);
95
    }
96
    isabus->assigned |= (1 << isairq);
97
    return isabus->irqs[isairq];
98
}
99

  
79 100
void isa_init_irq(ISADevice *dev, qemu_irq *p)
80 101
{
81 102
    assert(dev->nirqs < ARRAY_SIZE(dev->irqs));
b/hw/isa.h
27 27
ISABus *isa_bus_new(DeviceState *dev);
28 28
void isa_bus_irqs(qemu_irq *irqs);
29 29
void isa_connect_irq(ISADevice *dev, int devirq, int isairq);
30
qemu_irq isa_reserve_irq(int isairq);
30 31
void isa_init_irq(ISADevice *dev, qemu_irq *p);
31 32
void isa_qdev_register(ISADeviceInfo *info);
32 33
ISADevice *isa_create_simple(const char *name, uint32_t iobase, uint32_t iobase2);
b/hw/pc.c
1043 1043
}
1044 1044
#endif
1045 1045

  
1046
static void pc_init_ne2k_isa(NICInfo *nd, qemu_irq *pic)
1046
static void pc_init_ne2k_isa(NICInfo *nd)
1047 1047
{
1048 1048
    static int nb_ne2k = 0;
1049 1049

  
1050 1050
    if (nb_ne2k == NE2000_NB_MAX)
1051 1051
        return;
1052
    isa_ne2000_init(ne2000_io[nb_ne2k], pic[ne2000_irq[nb_ne2k]], nd);
1052
    isa_ne2000_init(ne2000_io[nb_ne2k],
1053
                    isa_reserve_irq(ne2000_irq[nb_ne2k]), nd);
1053 1054
    nb_ne2k++;
1054 1055
}
1055 1056

  
......
1276 1277
    isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
1277 1278
    isa_irq_state->i8259 = i8259;
1278 1279
    isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
1279
    ferr_irq = isa_irq[13];
1280 1280

  
1281 1281
    if (pci_enabled) {
1282 1282
        pci_bus = i440fx_init(&i440fx_state, isa_irq);
......
1287 1287
    }
1288 1288
    isa_bus_irqs(isa_irq);
1289 1289

  
1290
    ferr_irq = isa_reserve_irq(13);
1291

  
1290 1292
    /* init basic PC hardware */
1291 1293
    register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
1292 1294

  
......
1311 1313
        }
1312 1314
    }
1313 1315

  
1314
    rtc_state = rtc_init(0x70, isa_irq[8], 2000);
1316
    rtc_state = rtc_init(0x70, isa_reserve_irq(8), 2000);
1315 1317

  
1316 1318
    qemu_register_boot_set(pc_boot_set, rtc_state);
1317 1319

  
......
1321 1323
    if (pci_enabled) {
1322 1324
        isa_irq_state->ioapic = ioapic_init();
1323 1325
    }
1324
    pit = pit_init(0x40, isa_irq[0]);
1326
    pit = pit_init(0x40, isa_reserve_irq(0));
1325 1327
    pcspk_init(pit);
1326 1328
    if (!no_hpet) {
1327 1329
        hpet_init(isa_irq);
......
1329 1331

  
1330 1332
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
1331 1333
        if (serial_hds[i]) {
1332
            serial_init(serial_io[i], isa_irq[serial_irq[i]], 115200,
1334
            serial_init(serial_io[i], isa_reserve_irq(serial_irq[i]), 115200,
1333 1335
                        serial_hds[i]);
1334 1336
        }
1335 1337
    }
1336 1338

  
1337 1339
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
1338 1340
        if (parallel_hds[i]) {
1339
            parallel_init(parallel_io[i], isa_irq[parallel_irq[i]],
1341
            parallel_init(parallel_io[i], isa_reserve_irq(parallel_irq[i]),
1340 1342
                          parallel_hds[i]);
1341 1343
        }
1342 1344
    }
......
1347 1349
        NICInfo *nd = &nd_table[i];
1348 1350

  
1349 1351
        if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0))
1350
            pc_init_ne2k_isa(nd, isa_irq);
1352
            pc_init_ne2k_isa(nd);
1351 1353
        else
1352 1354
            pci_nic_init(nd, "e1000", NULL);
1353 1355
    }
......
1368 1370
        pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, isa_irq);
1369 1371
    } else {
1370 1372
        for(i = 0; i < MAX_IDE_BUS; i++) {
1371
            isa_ide_init(ide_iobase[i], ide_iobase2[i], isa_irq[ide_irq[i]],
1373
            isa_ide_init(ide_iobase[i], ide_iobase2[i],
1374
                         isa_reserve_irq(ide_irq[i]),
1372 1375
	                 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
1373 1376
        }
1374 1377
    }
......
1398 1401
        i2c_bus *smbus;
1399 1402

  
1400 1403
        /* TODO: Populate SPD eeprom data.  */
1401
        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, isa_irq[9]);
1404
        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
1405
                              isa_reserve_irq(9));
1402 1406
        for (i = 0; i < 8; i++) {
1403 1407
            DeviceState *eeprom;
1404 1408
            eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
b/hw/sb16.c
56 56

  
57 57
typedef struct SB16State {
58 58
    QEMUSoundCard card;
59
    qemu_irq *pic;
59
    qemu_irq pic;
60 60
    int irq;
61 61
    int dma;
62 62
    int hdma;
......
190 190
{
191 191
    SB16State *s = opaque;
192 192
    s->can_write = 1;
193
    qemu_irq_raise (s->pic[s->irq]);
193
    qemu_irq_raise (s->pic);
194 194
}
195 195

  
196 196
#define DMA8_AUTO 1
......
598 598
        case 0xf3:
599 599
            dsp_out_data (s, 0xaa);
600 600
            s->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2;
601
            qemu_irq_raise (s->pic[s->irq]);
601
            qemu_irq_raise (s->pic);
602 602
            break;
603 603

  
604 604
        case 0xf9:
......
766 766
                bytes = samples << s->fmt_stereo << (s->fmt_bits == 16);
767 767
                ticks = (bytes * ticks_per_sec) / freq;
768 768
                if (ticks < ticks_per_sec / 1024) {
769
                    qemu_irq_raise (s->pic[s->irq]);
769
                    qemu_irq_raise (s->pic);
770 770
                }
771 771
                else {
772 772
                    if (s->aux_ts) {
......
858 858

  
859 859
static void reset (SB16State *s)
860 860
{
861
    qemu_irq_lower (s->pic[s->irq]);
861
    qemu_irq_lower (s->pic);
862 862
    if (s->dma_auto) {
863
        qemu_irq_raise (s->pic[s->irq]);
864
        qemu_irq_lower (s->pic[s->irq]);
863
        qemu_irq_raise (s->pic);
864
        qemu_irq_lower (s->pic);
865 865
    }
866 866

  
867 867
    s->mixer_regs[0x82] = 0;
......
897 897
            if (s->v2x6 == 1) {
898 898
                if (0 && s->highspeed) {
899 899
                    s->highspeed = 0;
900
                    qemu_irq_lower (s->pic[s->irq]);
900
                    qemu_irq_lower (s->pic);
901 901
                    control (s, 0);
902 902
                }
903 903
                else {
......
1008 1008
        if (s->mixer_regs[0x82] & 1) {
1009 1009
            ack = 1;
1010 1010
            s->mixer_regs[0x82] &= 1;
1011
            qemu_irq_lower (s->pic[s->irq]);
1011
            qemu_irq_lower (s->pic);
1012 1012
        }
1013 1013
        break;
1014 1014

  
......
1017 1017
        if (s->mixer_regs[0x82] & 2) {
1018 1018
            ack = 1;
1019 1019
            s->mixer_regs[0x82] &= 2;
1020
            qemu_irq_lower (s->pic[s->irq]);
1020
            qemu_irq_lower (s->pic);
1021 1021
        }
1022 1022
        break;
1023 1023

  
......
1231 1231

  
1232 1232
    if (s->left_till_irq <= 0) {
1233 1233
        s->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1;
1234
        qemu_irq_raise (s->pic[s->irq]);
1234
        qemu_irq_raise (s->pic);
1235 1235
        if (0 == s->dma_auto) {
1236 1236
            control (s, 0);
1237 1237
            speaker (s, 0);
......
1408 1408
    s = qemu_mallocz (sizeof (*s));
1409 1409

  
1410 1410
    s->cmd = -1;
1411
    s->pic = pic;
1412
    s->irq = conf.irq;
1411
    s->pic = isa_reserve_irq(conf.irq);
1413 1412
    s->dma = conf.dma;
1414 1413
    s->hdma = conf.hdma;
1415 1414
    s->port = conf.port;

Also available in: Unified diff