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.
</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);
if (err < 0) { printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]); goto _err;irq[dev], IRQF_DISABLED, NULL);
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)
clear_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode); }if (mpu->info_flags & MPU401_INFO_USE_TIMER) snd_mpu401_uart_remove_timer(mpu, 1);
@@ -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))
mpu->info_flags = info_flags; mpu->irq = irq;info_flags |= MPU401_INFO_USE_TIMER;
- 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,
if (err < 0) return err; }-1, 0, &chip->rmidi);
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,
} sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",&chip->rmidi)) < 0) return err;
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_callback = snd_mpu401_uart_interrupt; }&chip->rmidi)) < 0) return err;
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,
printk(KERN_ERR "als4000: no MPU-401 device at 0x%lx?\n", iobase + ALS4K_IOB_30_MIDI_DATA); goto out_err;-1, 0, &chip->rmidi)) < 0) {
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) {
hwwrite(vortex->mmio, VORTEX_CTRL, (hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN);MPU401_INFO_IRQ_HOOK, -1, 0, &rmidi)) != 0) {
@@ -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 |
hwwrite(vortex->mmio, VORTEX_CTRL, (hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN);MPU401_INFO_IRQ_HOOK, -1, 0, &rmidi)) != 0) {
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,
); if (err < 0) { snd_printk(KERN_ERR "azf3328: no MPU-401 device at 0x%lx?\n",-1, 0, &chip->rmidi
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,
printk(KERN_ERR "es1938: unable to initialize MPU-401\n"); } else { // this line is vital for MIDI interrupt handling on ess-solo1-1, 0, &chip->rmidi) < 0) {
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,
snd_card_free(card); return err; }-1, 0, &chip->rmidi)) < 0) {
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,
if (err < 0) { snd_card_free(card); return err;-1, 0, &ice->rmidi[0]);
@@ -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,
if (err < 0) printk(KERN_WARNING "maestro3: no MIDI support.\n");-1, 0, &chip->rmidi);
#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 =
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,MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK;
info_flags, 0, 0,
if (err < 0) goto err_card;info_flags, -1, 0, &chip->midi);
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,
if (err < 0) snd_printk(KERN_WARNINGval, MPU401_INFO_IRQ_HOOK, -1, 0, &chip->rmidi);
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,
snd_card_free(card); return err;-1, 0, &midi_uart)) < 0) {
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,
snd_card_free(card); return err; }-1, 0, &trident->rmidi)) < 0) {
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);