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

Takashi Iwai tiwai at suse.de
Tue Sep 13 09:12:25 CEST 2011


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 at 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.
>  	</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
> @@ -4375,14 +4382,13 @@ struct _snd_pcm_runtime {
>        </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 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.
>        </para>
>      </section>
> 
> @@ -4390,12 +4396,13 @@ struct _snd_pcm_runtime {
>        <title>Interrupt Handler</title>
>        <para>
>          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.
>        </para>
> 
>        <para>
> 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);
> 


More information about the Alsa-devel mailing list