Re: [RFC] [PATCH 02/62] mpu401:snd_mpu401_uart_new(): split semantic of irq_flags

Takashi Iwai
2011-09-13T07:12:29Z

At Mon, 12 Sep 2011 22:23:16 +0200,
Clemens Ladisch wrote:
>
> I wrote:
> > I'll have a new patch until tomorrow.
>
> --8<---------------------------------------------------------------->8--
> ALSA: mpu401: clean up interrupt specification
>
> The semantics of snd_mpu401_uart_new()'s interrupt parameters are
> somewhat counterintuitive: To prevent the function from allocating its
> own interrupt, either the irq number must be invalid, or the irq_flags
> parameter must be zero. At the same time, the irq parameter being
> invalid specifies that the mpu401 code has to work without an interrupt
> allocated by the caller. This implies that, if there is an interrupt
> and it is allocated by the caller, the irq parameter must be set to
> a valid-looking number which then isn't actually used.
>
> With the removal of IRQF_DISABLED, zero becomes a valid irq_flags value,
> which forces us to handle the parameters differently.
>
> This patch introduces a new flag MPU401_INFO_IRQ_HOOK for when the
> device interrupt is handled by the caller, and makes the allocation of
> the interrupt to depend only on the irq parameter.
>
> Signed-off-by: Clemens Ladisch <clemens@ladisch.de>

This patch looks better indeed.

However, if we are going to remove IRQF_DISABLED in near future, and
all the callers use IRQF_DISABLED when requesting an irq, why not
remove this argument now? Then the IRQF_DISABLED-removal patch will
touch less code.
The irq registration in snd_mpu401_uart_new() is just for convenience
for ISA-type devices, and any other devices that need special IRQ
flags (if any) would require other irq handler, thus not necessarily
to be registered inside snd_mpu401_uart_new().

thanks,

Takashi

> ---
> Documentation/DocBook/writing-an-alsa-driver.tmpl | 33 +++++++++++++---------
> include/sound/mpu401.h | 6 ++--
> sound/drivers/mpu401/mpu401.c | 3 --
> sound/drivers/mpu401/mpu401_uart.c | 17 ++++++-----
> sound/isa/als100.c | 2 -
> sound/isa/cs423x/cs4231.c | 2 -
> sound/isa/cs423x/cs4236.c | 2 -
> sound/isa/es18xx.c | 4 +-
> sound/isa/opl3sa2.c | 5 ++-
> sound/isa/sb/jazz16.c | 2 -
> sound/isa/sb/sb16.c | 5 ++-
> sound/pci/als4000.c | 5 ++-
> sound/pci/au88x0/au88x0_mpu401.c | 6 ++--
> sound/pci/azt3328.c | 5 ++-
> sound/pci/cmipci.c | 5 ++-
> sound/pci/es1938.c | 5 ++-
> sound/pci/es1968.c | 5 ++-
> sound/pci/fm801.c | 5 ++-
> sound/pci/ice1712/ice1712.c | 10 ++++--
> sound/pci/maestro3.c | 4 +-
> sound/pci/oxygen/oxygen_lib.c | 5 ++-
> sound/pci/riptide/riptide.c | 2 -
> sound/pci/sonicvibes.c | 6 ++--
> sound/pci/trident/trident.c | 5 ++-
> sound/pci/via82xx.c | 5 ++-
> sound/pci/ymfpci/ymfpci.c | 5 ++-
> 26 files changed, 92 insertions(+), 67 deletions(-)
>
>
> diff --git a/Documentation/DocBook/writing-an-alsa-driver.tmpl b/Documentation/DocBook/writing-an-alsa-driver.tmpl
> index 598c22f..31ccd27 100644
> --- a/Documentation/DocBook/writing-an-alsa-driver.tmpl
> +++ b/Documentation/DocBook/writing-an-alsa-driver.tmpl
> @@ -4343,6 +4343,13 @@ struct _snd_pcm_runtime {
> by itself to start processing the output stream in the irq handler.
>
>
> +
> + If the MPU-401 interface shares its interrupt with the other logical
> + devices on the card, set <constant>MPU401_INFO_IRQ_HOOK</constant>
> + (see
> + below ).
> +
> +
>
> Usually, the port address corresponds to the command port and
> port + 1 corresponds to the data port. If not, you may change
> @@ -4375,14 +4382,13 @@ struct _snd_pcm_runtime {
>
>
>
> - 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 irq number that will be allocated.
> + Pass the irq flags for calling <function>request_irq()</function>
> + (<constant>IRQF_XXX</constant> bits) in the 7th argument.
> + If no interrupt is to be allocated (because your code is already
> + allocating it, or because the device does not use interrupts),
> + pass -1 and 0 instead. For a MPU-401 device without an interrupt,
> + a polling timer will be used instead.
>
>
>
> @@ -4390,12 +4396,13 @@ struct _snd_pcm_runtime {
> Interrupt Handler
>
> When the interrupt is allocated in
> - <function>snd_mpu401_uart_new()</function>, the private
> + <function>snd_mpu401_uart_new()</function>, a 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.
> + 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.
>
>
>
> diff --git a/include/sound/mpu401.h b/include/sound/mpu401.h
> index 1f1d53f..8f26148 100644
> --- a/include/sound/mpu401.h
> +++ b/include/sound/mpu401.h
> @@ -50,7 +50,10 @@
> #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
> @@ -73,8 +76,7 @@ struct snd_mpu401 {
> 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;
> diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c
> index 149d05a..4133e0d 100644
> --- a/sound/drivers/mpu401/mpu401.c
> +++ b/sound/drivers/mpu401/mpu401.c
> @@ -86,8 +86,7 @@ static int snd_mpu401_create(int dev, struct snd_card **rcard)
> }
>
> err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port[dev], 0,
> - irq[dev], irq[dev] >= 0 ? IRQF_DISABLED : 0,
> - NULL);
> + irq[dev], IRQF_DISABLED, NULL);
> if (err < 0) {
> printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]);
> goto _err;
> diff --git a/sound/drivers/mpu401/mpu401_uart.c b/sound/drivers/mpu401/mpu401_uart.c
> index 2af0999..893a94f 100644
> --- a/sound/drivers/mpu401/mpu401_uart.c
> +++ b/sound/drivers/mpu401/mpu401_uart.c
> @@ -3,7 +3,7 @@
> * 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.
> *
> *
> @@ -374,7 +374,7 @@ snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substream, int up)
> /* 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);
> }
>
> @@ -383,7 +383,7 @@ snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substream, int up)
> 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);
> }
> @@ -496,7 +496,7 @@ static struct snd_rawmidi_ops snd_mpu401_uart_input =
> 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);
> @@ -509,8 +509,8 @@ static void snd_mpu401_uart_free(struct snd_rawmidi *rmidi)
> * @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 irq number, -1 if not to be allocated
> + * @irq_flags: the irq request flags (IRQF_XXX)
> * @rrawmidi: the pointer to store the new rawmidi instance
> *
> * Creates a new MPU-401 instance.
> @@ -577,7 +577,7 @@ int snd_mpu401_uart_new(struct snd_card *card, int device,
> mpu->cport = port + 2;
> else
> mpu->cport = port + 1;
> - if (irq >= 0 && irq_flags) {
> + if (irq >= 0) {
> if (request_irq(irq, snd_mpu401_uart_interrupt, irq_flags,
> "MPU401 UART", (void *) mpu)) {
> snd_printk(KERN_ERR "mpu401_uart: "
> @@ -586,9 +586,10 @@ int snd_mpu401_uart_new(struct snd_card *card, int device,
> 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);
> diff --git a/sound/isa/als100.c b/sound/isa/als100.c
> index 20becc8..efa071c 100644
> --- a/sound/isa/als100.c
> +++ b/sound/isa/als100.c
> @@ -256,7 +256,7 @@ static int __devinit snd_card_als100_probe(int dev,
> mpu_type,
> mpu_port[dev], 0,
> mpu_irq[dev],
> - mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0,
> + IRQF_DISABLED,
> NULL) < 0)
> snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]);
> }
> diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c
> index cb9153e..6c24248 100644
> --- a/sound/isa/cs423x/cs4231.c
> +++ b/sound/isa/cs423x/cs4231.c
> @@ -131,7 +131,7 @@ static int __devinit snd_cs4231_probe(struct device *dev, unsigned int n)
> 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,
> + IRQF_DISABLED,
> NULL) < 0)
> dev_warn(dev, "MPU401 not detected\n");
> }
> diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
> index 999dc1e..17c9a3e 100644
> --- a/sound/isa/cs423x/cs4236.c
> +++ b/sound/isa/cs423x/cs4236.c
> @@ -450,7 +450,7 @@ static int __devinit snd_cs423x_probe(struct snd_card *card, int dev)
> 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)
> + IRQF_DISABLED, NULL) < 0)
> printk(KERN_WARNING IDENT ": MPU401 not detected\n");
> }
>
> diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c
> index fb4d6b3..f5f3071 100644
> --- a/sound/isa/es18xx.c
> +++ b/sound/isa/es18xx.c
> @@ -2160,8 +2160,8 @@ static int __devinit snd_audiodrive_probe(struct snd_card *card, int dev)
>
> 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, 0, &chip->rmidi);
> if (err < 0)
> return err;
> }
> diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c
> index 9b915e2..2003c67 100644
> --- a/sound/isa/opl3sa2.c
> +++ b/sound/isa/opl3sa2.c
> @@ -707,8 +707,9 @@ static int __devinit snd_opl3sa2_probe(struct snd_card *card, int dev)
> }
> 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, 0,
> + &chip->rmidi)) < 0)
> return err;
> }
> sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
> diff --git a/sound/isa/sb/jazz16.c b/sound/isa/sb/jazz16.c
> index 8ccbcdd..fbd8c16 100644
> --- a/sound/isa/sb/jazz16.c
> +++ b/sound/isa/sb/jazz16.c
> @@ -322,7 +322,7 @@ static int __devinit snd_jazz16_probe(struct device *devptr, unsigned int dev)
> MPU401_HW_MPU401,
> mpu_port[dev], 0,
> mpu_irq[dev],
> - mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0,
> + IRQF_DISABLED,
> NULL) < 0)
> snd_printk(KERN_ERR "no MPU-401 device at 0x%lx\n",
> mpu_port[dev]);
> diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c
> index 4d1c5a3..b10f021 100644
> --- a/sound/isa/sb/sb16.c
> +++ b/sound/isa/sb/sb16.c
> @@ -394,8 +394,9 @@ static int __devinit snd_sb16_probe(struct snd_card *card, int 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, 0,
> + &chip->rmidi)) < 0)
> return err;
> chip->rmidi_callback = snd_mpu401_uart_interrupt;
> }
> diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c
> index a9c1af3..507434b 100644
> --- a/sound/pci/als4000.c
> +++ b/sound/pci/als4000.c
> @@ -931,8 +931,9 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci,
>
> 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, 0, &chip->rmidi)) < 0) {
> printk(KERN_ERR "als4000: no MPU-401 device at 0x%lx?\n",
> iobase + ALS4K_IOB_30_MIDI_DATA);
> goto out_err;
> diff --git a/sound/pci/au88x0/au88x0_mpu401.c b/sound/pci/au88x0/au88x0_mpu401.c
> index 0dc8d25..fc2133b 100644
> --- a/sound/pci/au88x0/au88x0_mpu401.c
> +++ b/sound/pci/au88x0/au88x0_mpu401.c
> @@ -84,7 +84,7 @@ static int __devinit snd_vortex_midi(vortex_t * vortex)
> #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, 0, &rmidi)) != 0) {
> hwwrite(vortex->mmio, VORTEX_CTRL,
> (hwread(vortex->mmio, VORTEX_CTRL) &
> ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN);
> @@ -94,8 +94,8 @@ static int __devinit snd_vortex_midi(vortex_t * vortex)
> 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, 0, &rmidi)) != 0) {
> hwwrite(vortex->mmio, VORTEX_CTRL,
> (hwread(vortex->mmio, VORTEX_CTRL) &
> ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN);
> diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c
> index 579fc0d..b80e87b 100644
> --- a/sound/pci/azt3328.c
> +++ b/sound/pci/azt3328.c
> @@ -2652,8 +2652,9 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
> 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, 0, &chip->rmidi
> );
> if (err < 0) {
> snd_printk(KERN_ERR "azf3328: no MPU-401 device at 0x%lx?\n",
> diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c
> index 9cf99fb..4776790 100644
> --- a/sound/pci/cmipci.c
> +++ b/sound/pci/cmipci.c
> @@ -3228,8 +3228,9 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc
> 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, 0, &cm->rmidi)) < 0) {
> printk(KERN_ERR "cmipci: no UART401 device at 0x%lx\n", iomidi);
> }
> }
> diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c
> index 26a5a2f..8f4ddc3 100644
> --- a/sound/pci/es1938.c
> +++ b/sound/pci/es1938.c
> @@ -1854,8 +1854,9 @@ static int __devinit snd_es1938_probe(struct pci_dev *pci,
> }
> }
> 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, 0, &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
> diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c
> index 99ea932..b6397d0 100644
> --- a/sound/pci/es1968.c
> +++ b/sound/pci/es1968.c
> @@ -2843,8 +2843,9 @@ static int __devinit snd_es1968_probe(struct pci_dev *pci,
> 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, 0, &chip->rmidi)) < 0) {
> printk(KERN_WARNING "es1968: skipping MPU-401 MIDI support..\n");
> }
> }
> diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c
> index f9123f0..34a3414 100644
> --- a/sound/pci/fm801.c
> +++ b/sound/pci/fm801.c
> @@ -1306,8 +1306,9 @@ static int __devinit snd_card_fm801_probe(struct pci_dev *pci,
> }
> 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, 0, &chip->rmidi)) < 0) {
> snd_card_free(card);
> return err;
> }
> diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
> index 0ccc0eb..a1d9815 100644
> --- a/sound/pci/ice1712/ice1712.c
> +++ b/sound/pci/ice1712/ice1712.c
> @@ -2748,8 +2748,9 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
> 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, 0, &ice->rmidi[0]);
> if (err < 0) {
> snd_card_free(card);
> return err;
> @@ -2764,8 +2765,9 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
> /* 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, 0, &ice->rmidi[1]);
>
> if (err < 0) {
> snd_card_free(card);
> diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c
> index 0378126..3e5f0bd 100644
> --- a/sound/pci/maestro3.c
> +++ b/sound/pci/maestro3.c
> @@ -2820,8 +2820,8 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
> /* 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, 0, &chip->rmidi);
> if (err < 0)
> printk(KERN_WARNING "maestro3: no MIDI support.\n");
> #endif
> diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c
> index 82311fc..4aa3a80 100644
> --- a/sound/pci/oxygen/oxygen_lib.c
> +++ b/sound/pci/oxygen/oxygen_lib.c
> @@ -678,14 +678,15 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
> 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,
> + info_flags, -1, 0,
> &chip->midi);
> if (err < 0)
> goto err_card;
> diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c
> index e34ae14..0c2bc68 100644
> --- a/sound/pci/riptide/riptide.c
> +++ b/sound/pci/riptide/riptide.c
> @@ -2109,7 +2109,7 @@ snd_card_riptide_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
> 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, 0,
> &chip->rmidi);
> if (err < 0)
> snd_printk(KERN_WARNING
> diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c
> index 2571a67..a439f17 100644
> --- a/sound/pci/sonicvibes.c
> +++ b/sound/pci/sonicvibes.c
> @@ -1493,8 +1493,10 @@ static int __devinit snd_sonic_probe(struct pci_dev *pci,
> return err;
> }
> if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SONICVIBES,
> - sonic->midi_port, MPU401_INFO_INTEGRATED,
> - sonic->irq, 0,
> + sonic->midi_port,
> + MPU401_INFO_INTEGRATED |
> + MPU401_INFO_IRQ_HOOK,
> + -1, 0,
> &midi_uart)) < 0) {
> snd_card_free(card);
> return err;
> diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c
> index d8a128f..6406a18 100644
> --- a/sound/pci/trident/trident.c
> +++ b/sound/pci/trident/trident.c
> @@ -148,8 +148,9 @@ static int __devinit snd_trident_probe(struct pci_dev *pci,
> 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, 0, &trident->rmidi)) < 0) {
> snd_card_free(card);
> return err;
> }
> diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c
> index f03fd62..d2204ed 100644
> --- a/sound/pci/via82xx.c
> +++ b/sound/pci/via82xx.c
> @@ -2068,8 +2068,9 @@ static int __devinit snd_via686_init_misc(struct via82xx *chip)
> 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, 0,
> + &chip->rmidi) < 0) {
> printk(KERN_WARNING "unable to initialize MPU-401"
> " at 0x%lx, skipping\n", mpu_port);
> legacy &= ~VIA_FUNC_ENABLE_MIDI;
> diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c
> index 511d576..553aa57 100644
> --- a/sound/pci/ymfpci/ymfpci.c
> +++ b/sound/pci/ymfpci/ymfpci.c
> @@ -305,8 +305,9 @@ static int __devinit snd_card_ymfpci_probe(struct pci_dev *pci,
> 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, 0, &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);
>