<![CDATA[
   struct snd_rawmidi *rmidi;
   snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port, info_flags,
-                      irq, irq_flags, &rmidi);
+                      irq, &rmidi);
 ]]>
           </programlisting>
         </informalexample>
        by itself to start processing the output stream in the irq handler.
        </para>
 
+       <para>
+       If the MPU-401 interface shares its interrupt with the other logical
+       devices on the card, set <constant>MPU401_INFO_IRQ_HOOK</constant>
+       (see <link linkend="midi-interface-interrupt-handler"><citetitle>
+       below</citetitle></link>).
+       </para>
+
       <para>
         Usually, the port address corresponds to the command port and
         port + 1 corresponds to the data port. If not, you may change
       </para>
 
       <para>
-        The 6th argument specifies the irq number for UART. If the irq
-      is already allocated, pass 0 to the 7th argument
-      (<parameter>irq_flags</parameter>). Otherwise, pass the flags
-      for irq allocation 
-      (<constant>SA_XXX</constant> bits) to it, and the irq will be
-      reserved by the mpu401-uart layer. If the card doesn't generate
-      UART interrupts, pass -1 as the irq number. Then a timer
-      interrupt will be invoked for polling. 
+       The 6th argument specifies the ISA irq number that will be
+       allocated.  If no interrupt is to be allocated (because your
+       code is already allocating a shared interrupt, or because the
+       device does not use interrupts), pass -1 instead.
+       For a MPU-401 device without an interrupt, a polling timer
+       will be used instead.
       </para>
     </section>
 
       <title>Interrupt Handler</title>
       <para>
         When the interrupt is allocated in
-      <function>snd_mpu401_uart_new()</function>, the private
-      interrupt handler is used, hence you don't have anything else to do
-      than creating the mpu401 stuff. Otherwise, you have to call
-      <function>snd_mpu401_uart_interrupt()</function> explicitly when
-      a UART interrupt is invoked and checked in your own interrupt
-      handler.  
+      <function>snd_mpu401_uart_new()</function>, an exclusive ISA
+      interrupt handler is automatically used, hence you don't have
+      anything else to do than creating the mpu401 stuff.  Otherwise, you
+      have to set <constant>MPU401_INFO_IRQ_HOOK</constant>, and call
+      <function>snd_mpu401_uart_interrupt()</function> explicitly from your
+      own interrupt handler when it has determined that a UART interrupt
+      has occurred.
       </para>
 
       <para>
 
 #define MPU401_INFO_INTEGRATED (1 << 2)        /* integrated h/w port */
 #define MPU401_INFO_MMIO       (1 << 3)        /* MMIO access */
 #define MPU401_INFO_TX_IRQ     (1 << 4)        /* independent TX irq */
+#define MPU401_INFO_IRQ_HOOK   (1 << 5)        /* mpu401 irq handler is called
+                                                  from driver irq handler */
 #define MPU401_INFO_NO_ACK     (1 << 6)        /* No ACK cmd needed */
+#define MPU401_INFO_USE_TIMER  (1 << 15)       /* internal */
 
 #define MPU401_MODE_BIT_INPUT          0
 #define MPU401_MODE_BIT_OUTPUT         1
        unsigned long port;             /* base port of MPU-401 chip */
        unsigned long cport;            /* port + 1 (usually) */
        struct resource *res;           /* port resource */
-       int irq;                        /* IRQ number of MPU-401 chip (-1 = poll) */
-       int irq_flags;
+       int irq;                        /* IRQ number of MPU-401 chip */
 
        unsigned long mode;             /* MPU401_MODE_XXXX */
        int timer_invoked;
                        unsigned long port,
                        unsigned int info_flags,
                        int irq,
-                       int irq_flags,
                        struct snd_rawmidi ** rrawmidi);
 
 #endif /* __SOUND_MPU401_H */
 
        }
 
        err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port[dev], 0,
-                                 irq[dev], irq[dev] >= 0 ? IRQF_DISABLED : 0,
-                                 NULL);
+                                 irq[dev], NULL);
        if (err < 0) {
                printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]);
                goto _err;
 
  *  Routines for control of MPU-401 in UART mode
  *
  *  MPU-401 supports UART mode which is not capable generate transmit
- *  interrupts thus output is done via polling. Also, if irq < 0, then
+ *  interrupts thus output is done via polling. Without interrupt,
  *  input is done also via polling. Do not expect good performance.
  *
  *
                        /* first time - flush FIFO */
                        while (max-- > 0)
                                mpu->read(mpu, MPU401D(mpu));
-                       if (mpu->irq < 0)
+                       if (mpu->info_flags & MPU401_INFO_USE_TIMER)
                                snd_mpu401_uart_add_timer(mpu, 1);
                }
                
                snd_mpu401_uart_input_read(mpu);
                spin_unlock_irqrestore(&mpu->input_lock, flags);
        } else {
-               if (mpu->irq < 0)
+               if (mpu->info_flags & MPU401_INFO_USE_TIMER)
                        snd_mpu401_uart_remove_timer(mpu, 1);
                clear_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode);
        }
 static void snd_mpu401_uart_free(struct snd_rawmidi *rmidi)
 {
        struct snd_mpu401 *mpu = rmidi->private_data;
-       if (mpu->irq_flags && mpu->irq >= 0)
+       if (mpu->irq >= 0)
                free_irq(mpu->irq, (void *) mpu);
        release_and_free_resource(mpu->res);
        kfree(mpu);
  * @hardware: the hardware type, MPU401_HW_XXXX
  * @port: the base address of MPU401 port
  * @info_flags: bitflags MPU401_INFO_XXX
- * @irq: the irq number, -1 if no interrupt for mpu
- * @irq_flags: the irq request flags (SA_XXX), 0 if irq was already reserved.
+ * @irq: the ISA irq number, -1 if not to be allocated
  * @rrawmidi: the pointer to store the new rawmidi instance
  *
  * Creates a new MPU-401 instance.
                        unsigned short hardware,
                        unsigned long port,
                        unsigned int info_flags,
-                       int irq, int irq_flags,
+                       int irq,
                        struct snd_rawmidi ** rrawmidi)
 {
        struct snd_mpu401 *mpu;
                mpu->cport = port + 2;
        else
                mpu->cport = port + 1;
-       if (irq >= 0 && irq_flags) {
-               if (request_irq(irq, snd_mpu401_uart_interrupt, irq_flags,
+       if (irq >= 0) {
+               if (request_irq(irq, snd_mpu401_uart_interrupt, IRQF_DISABLED,
                                "MPU401 UART", (void *) mpu)) {
                        snd_printk(KERN_ERR "mpu401_uart: "
                                   "unable to grab IRQ %d\n", irq);
                        return -EBUSY;
                }
        }
+       if (irq < 0 && !(info_flags & MPU401_INFO_IRQ_HOOK))
+               info_flags |= MPU401_INFO_USE_TIMER;
        mpu->info_flags = info_flags;
        mpu->irq = irq;
-       mpu->irq_flags = irq_flags;
        if (card->shortname[0])
                snprintf(rmidi->name, sizeof(rmidi->name), "%s MIDI",
                         card->shortname);
 
 
        if (mpu_port[dev] > 0) {
                if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
-                                       mpu_port[dev], 0, mpu_irq[dev], IRQF_DISABLED,
+                                       mpu_port[dev], 0, mpu_irq[dev],
                                        NULL) < 0)
                        printk(KERN_ERR PFX "no MPU-401 device at 0x%lx.\n", mpu_port[dev]);
        }
 
                                        mpu_type,
                                        mpu_port[dev], 0, 
                                        mpu_irq[dev],
-                                       mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0,
                                        NULL) < 0)
                        snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]);
        }
 
        if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {
                if (snd_mpu401_uart_new(card, 0, MPU401_HW_AZT2320,
                                mpu_port[dev], 0,
-                               mpu_irq[dev], IRQF_DISABLED,
-                               NULL) < 0)
+                               mpu_irq[dev], NULL) < 0)
                        snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]);
        }
 
 
        if (mpuport[dev] != SNDRV_AUTO_PORT) {
                if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
                                        mpuport[dev], 0, mpuirq[dev],
-                                       IRQF_DISABLED, NULL) < 0)
+                                       NULL) < 0)
                        printk(KERN_ERR PFX "no MPU-401 device at 0x%lx.\n",
                                mpuport[dev]);
        }
 
                        mpu_irq[n] = -1;
                if (snd_mpu401_uart_new(card, 0, MPU401_HW_CS4232,
                                        mpu_port[n], 0, mpu_irq[n],
-                                       mpu_irq[n] >= 0 ? IRQF_DISABLED : 0,
                                        NULL) < 0)
                        dev_warn(dev, "MPU401 not detected\n");
        }
 
                        mpu_irq[dev] = -1;
                if (snd_mpu401_uart_new(card, 0, MPU401_HW_CS4232,
                                        mpu_port[dev], 0,
-                                       mpu_irq[dev],
-                                       mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0, NULL) < 0)
+                                       mpu_irq[dev], NULL) < 0)
                        printk(KERN_WARNING IDENT ": MPU401 not detected\n");
        }
 
 
                        chip->mpu_port > 0) {
                error = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688,
                                chip->mpu_port, 0,
-                               mpu_irq[n], IRQF_DISABLED, NULL);
+                               mpu_irq[n], NULL);
                if (error < 0)
                        return error;
        }
 
 
        if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {
                err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES18XX,
-                                         mpu_port[dev], 0,
-                                         irq[dev], 0, &chip->rmidi);
+                                         mpu_port[dev], MPU401_INFO_IRQ_HOOK,
+                                         -1, &chip->rmidi);
                if (err < 0)
                        return err;
        }
 
 
        if (mpu_port[n] >= 0) {
                err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
-                                         mpu_port[n], 0, mpu_irq[n],
-                                         IRQF_DISABLED, NULL);
+                                         mpu_port[n], 0, mpu_irq[n], NULL);
                if (err < 0)
                        goto error;
        }
 
 
        if (es1688->mpu_port >= 0x300) {
                error = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688,
-                               es1688->mpu_port, 0,
-                               mpu_irq[n], IRQF_DISABLED, NULL);
+                               es1688->mpu_port, 0, mpu_irq[n], NULL);
                if (error < 0)
                        goto out;
        }
 
                                          mpu_io[0],
                                          MPU401_MODE_INPUT |
                                          MPU401_MODE_OUTPUT,
-                                         mpu_irq[0], IRQF_DISABLED,
+                                         mpu_irq[0],
                                          &chip->rmidi);
                if (err < 0) {
                        printk(KERN_ERR LOGNAME
 
        }
        if (midi_port[dev] >= 0x300 && midi_port[dev] < 0x340) {
                if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_OPL3SA2,
-                                              midi_port[dev], 0,
-                                              xirq, 0, &chip->rmidi)) < 0)
+                                              midi_port[dev],
+                                              MPU401_INFO_IRQ_HOOK, -1,
+                                              &chip->rmidi)) < 0)
                        return err;
        }
        sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
 
                rmidi = NULL;
        else {
                error = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
-                               mpu_port, 0, miro->mpu_irq, IRQF_DISABLED,
-                               &rmidi);
+                               mpu_port, 0, miro->mpu_irq, &rmidi);
                if (error < 0)
                        snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n",
                                   mpu_port);
 
                rmidi = NULL;
        else {
                error = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
-                               mpu_port, 0, mpu_irq, IRQF_DISABLED, &rmidi);
+                               mpu_port, 0, mpu_irq, &rmidi);
                if (error)
                        snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n",
                                   mpu_port);
 
                                        MPU401_HW_MPU401,
                                        mpu_port[dev], 0,
                                        mpu_irq[dev],
-                                       mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0,
                                        NULL) < 0)
                        snd_printk(KERN_ERR "no MPU-401 device at 0x%lx\n",
                                        mpu_port[dev]);
 
 
        if (chip->mpu_port > 0 && chip->mpu_port != SNDRV_AUTO_PORT) {
                if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SB,
-                                              chip->mpu_port, 0,
-                                              xirq, 0, &chip->rmidi)) < 0)
+                                              chip->mpu_port,
+                                              MPU401_INFO_IRQ_HOOK, -1,
+                                              &chip->rmidi)) < 0)
                        return err;
                chip->rmidi_callback = snd_mpu401_uart_interrupt;
        }
 
                if (snd_mpu401_uart_new(card, 0,
                                        MPU401_HW_MPU401,
                                        mpu_port[dev], 0,
-                                       mpu_irq[dev], IRQF_DISABLED,
-                                       NULL) < 0)
+                                       mpu_irq[dev], NULL) < 0)
                        snd_printk(KERN_ERR "no MPU-401 device at 0x%lx ?\n",
                                        mpu_port[dev]);
        }
 
        int err;
 
        err = snd_mpu401_uart_new(card, devnum, MPU401_HW_MPU401, port,
-                                 MPU401_INFO_INTEGRATED, irq, IRQF_DISABLED,
-                                 &rawmidi);
+                                 MPU401_INFO_INTEGRATED, irq, &rawmidi);
        if (err == 0) {
                struct snd_mpu401 *mpu = rawmidi->private_data;
                mpu->open_input = mpu401_open;
 
        if (cs4232_mpu_port[dev] > 0 && cs4232_mpu_port[dev] != SNDRV_AUTO_PORT) {
                err = snd_mpu401_uart_new(card, midi_dev, MPU401_HW_CS4232,
                                          cs4232_mpu_port[dev], 0,
-                                         cs4232_mpu_irq[dev], IRQF_DISABLED,
-                                         NULL);
+                                         cs4232_mpu_irq[dev], NULL);
                if (err < 0) {
                        snd_printk (KERN_ERR "can't allocate CS4232 MPU-401 device\n");
                        return err;
 
 
        if ((err = snd_mpu401_uart_new( card, 0, MPU401_HW_ALS4000,
                                        iobase + ALS4K_IOB_30_MIDI_DATA,
-                                       MPU401_INFO_INTEGRATED,
-                                       pci->irq, 0, &chip->rmidi)) < 0) {
+                                       MPU401_INFO_INTEGRATED |
+                                       MPU401_INFO_IRQ_HOOK,
+                                       -1, &chip->rmidi)) < 0) {
                printk(KERN_ERR "als4000: no MPU-401 device at 0x%lx?\n",
                                iobase + ALS4K_IOB_30_MIDI_DATA);
                goto out_err;
 
 #ifdef VORTEX_MPU401_LEGACY
        if ((temp =
             snd_mpu401_uart_new(vortex->card, 0, MPU401_HW_MPU401, 0x330,
-                                0, 0, 0, &rmidi)) != 0) {
+                                MPU401_INFO_IRQ_HOOK, -1, &rmidi)) != 0) {
                hwwrite(vortex->mmio, VORTEX_CTRL,
                        (hwread(vortex->mmio, VORTEX_CTRL) &
                         ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN);
        port = (unsigned long)(vortex->mmio + VORTEX_MIDI_DATA);
        if ((temp =
             snd_mpu401_uart_new(vortex->card, 0, MPU401_HW_AUREAL, port,
-                                MPU401_INFO_INTEGRATED | MPU401_INFO_MMIO,
-                                0, 0, &rmidi)) != 0) {
+                                MPU401_INFO_INTEGRATED | MPU401_INFO_MMIO |
+                                MPU401_INFO_IRQ_HOOK, -1, &rmidi)) != 0) {
                hwwrite(vortex->mmio, VORTEX_CTRL,
                        (hwread(vortex->mmio, VORTEX_CTRL) &
                         ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN);
 
           since our hardware ought to be similar, thus use same ID. */
        err = snd_mpu401_uart_new(
                card, 0,
-               MPU401_HW_AZT2320, chip->mpu_io, MPU401_INFO_INTEGRATED,
-               pci->irq, 0, &chip->rmidi
+               MPU401_HW_AZT2320, chip->mpu_io,
+               MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
+               -1, &chip->rmidi
        );
        if (err < 0) {
                snd_printk(KERN_ERR "azf3328: no MPU-401 device at 0x%lx?\n",
 
                if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI,
                                               iomidi,
                                               (integrated_midi ?
-                                               MPU401_INFO_INTEGRATED : 0),
-                                              cm->irq, 0, &cm->rmidi)) < 0) {
+                                               MPU401_INFO_INTEGRATED : 0) |
+                                              MPU401_INFO_IRQ_HOOK,
+                                              -1, &cm->rmidi)) < 0) {
                        printk(KERN_ERR "cmipci: no UART401 device at 0x%lx\n", iomidi);
                }
        }
 
                }
        }
        if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
-                               chip->mpu_port, MPU401_INFO_INTEGRATED,
-                               chip->irq, 0, &chip->rmidi) < 0) {
+                               chip->mpu_port,
+                               MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
+                               -1, &chip->rmidi) < 0) {
                printk(KERN_ERR "es1938: unable to initialize MPU-401\n");
        } else {
                // this line is vital for MIDI interrupt handling on ess-solo1
 
        if (enable_mpu[dev]) {
                if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
                                               chip->io_port + ESM_MPU401_PORT,
-                                              MPU401_INFO_INTEGRATED,
-                                              chip->irq, 0, &chip->rmidi)) < 0) {
+                                              MPU401_INFO_INTEGRATED |
+                                              MPU401_INFO_IRQ_HOOK,
+                                              -1, &chip->rmidi)) < 0) {
                        printk(KERN_WARNING "es1968: skipping MPU-401 MIDI support..\n");
                }
        }
 
        }
        if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_FM801,
                                       FM801_REG(chip, MPU401_DATA),
-                                      MPU401_INFO_INTEGRATED,
-                                      chip->irq, 0, &chip->rmidi)) < 0) {
+                                      MPU401_INFO_INTEGRATED |
+                                      MPU401_INFO_IRQ_HOOK,
+                                      -1, &chip->rmidi)) < 0) {
                snd_card_free(card);
                return err;
        }
 
        if (!c->no_mpu401) {
                err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712,
                        ICEREG(ice, MPU1_CTRL),
-                       (c->mpu401_1_info_flags | MPU401_INFO_INTEGRATED),
-                       ice->irq, 0, &ice->rmidi[0]);
+                       c->mpu401_1_info_flags |
+                       MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
+                       -1, &ice->rmidi[0]);
                if (err < 0) {
                        snd_card_free(card);
                        return err;
                        /*  2nd port used  */
                        err = snd_mpu401_uart_new(card, 1, MPU401_HW_ICE1712,
                                ICEREG(ice, MPU2_CTRL),
-                               (c->mpu401_2_info_flags | MPU401_INFO_INTEGRATED),
-                               ice->irq, 0, &ice->rmidi[1]);
+                               c->mpu401_2_info_flags |
+                               MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
+                               -1, &ice->rmidi[1]);
 
                        if (err < 0) {
                                snd_card_free(card);
 
        /* TODO enable MIDI IRQ and I/O */
        err = snd_mpu401_uart_new(chip->card, 0, MPU401_HW_MPU401,
                                  chip->iobase + MPU401_DATA_PORT,
-                                 MPU401_INFO_INTEGRATED,
-                                 chip->irq, 0, &chip->rmidi);
+                                 MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
+                                 -1, &chip->rmidi);
        if (err < 0)
                printk(KERN_WARNING "maestro3: no MIDI support.\n");
 #endif
 
                goto err_card;
 
        if (chip->model.device_config & (MIDI_OUTPUT | MIDI_INPUT)) {
-               unsigned int info_flags = MPU401_INFO_INTEGRATED;
+               unsigned int info_flags =
+                               MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK;
                if (chip->model.device_config & MIDI_OUTPUT)
                        info_flags |= MPU401_INFO_OUTPUT;
                if (chip->model.device_config & MIDI_INPUT)
                        info_flags |= MPU401_INFO_INPUT;
                err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI,
                                          chip->addr + OXYGEN_MPU401,
-                                         info_flags, 0, 0,
-                                         &chip->midi);
+                                         info_flags, -1, &chip->midi);
                if (err < 0)
                        goto err_card;
        }
 
                val = mpu_port[dev];
                pci_write_config_word(chip->pci, PCI_EXT_MPU_Base, val);
                err = snd_mpu401_uart_new(card, 0, MPU401_HW_RIPTIDE,
-                                         val, 0, chip->irq, 0,
+                                         val, MPU401_INFO_IRQ_HOOK, -1,
                                          &chip->rmidi);
                if (err < 0)
                        snd_printk(KERN_WARNING
 
                return err;
        }
        if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SONICVIBES,
-                                      sonic->midi_port, MPU401_INFO_INTEGRATED,
-                                      sonic->irq, 0,
-                                      &midi_uart)) < 0) {
+                                      sonic->midi_port,
+                                      MPU401_INFO_INTEGRATED |
+                                      MPU401_INFO_IRQ_HOOK,
+                                      -1, &midi_uart)) < 0) {
                snd_card_free(card);
                return err;
        }
 
        if (trident->device != TRIDENT_DEVICE_ID_SI7018 &&
            (err = snd_mpu401_uart_new(card, 0, MPU401_HW_TRID4DWAVE,
                                       trident->midi_port,
-                                      MPU401_INFO_INTEGRATED,
-                                      trident->irq, 0, &trident->rmidi)) < 0) {
+                                      MPU401_INFO_INTEGRATED |
+                                      MPU401_INFO_IRQ_HOOK,
+                                      -1, &trident->rmidi)) < 0) {
                snd_card_free(card);
                return err;
        }
 
        pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, legacy_cfg);
        if (chip->mpu_res) {
                if (snd_mpu401_uart_new(chip->card, 0, MPU401_HW_VIA686A,
-                                       mpu_port, MPU401_INFO_INTEGRATED,
-                                       chip->irq, 0, &chip->rmidi) < 0) {
+                                       mpu_port, MPU401_INFO_INTEGRATED |
+                                       MPU401_INFO_IRQ_HOOK, -1,
+                                       &chip->rmidi) < 0) {
                        printk(KERN_WARNING "unable to initialize MPU-401"
                               " at 0x%lx, skipping\n", mpu_port);
                        legacy &= ~VIA_FUNC_ENABLE_MIDI;
 
        if (chip->mpu_res) {
                if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_YMFPCI,
                                               mpu_port[dev],
-                                              MPU401_INFO_INTEGRATED,
-                                              pci->irq, 0, &chip->rawmidi)) < 0) {
+                                              MPU401_INFO_INTEGRATED |
+                                              MPU401_INFO_IRQ_HOOK,
+                                              -1, &chip->rawmidi)) < 0) {
                        printk(KERN_WARNING "ymfpci: cannot initialize MPU401 at 0x%lx, skipping...\n", mpu_port[dev]);
                        legacy_ctrl &= ~YMFPCI_LEGACY_MIEN; /* disable MPU401 irq */
                        pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);