[ALSA] cmipci: fix handling of FM/MIDI port addresses
Make sure that the MPU-401 MIDI and OPL-3 FM devices are used only on those chips where they are supported, and that the correct port addresses are used. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
parent
c2b1239a9f
commit
45c41b4868
|
@ -365,13 +365,15 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
Module snd-cmipci
|
Module snd-cmipci
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Module for C-Media CMI8338 and 8738 PCI sound cards.
|
Module for C-Media CMI8338/8738/8768/8770 PCI sound cards.
|
||||||
|
|
||||||
mpu_port - 0x300,0x310,0x320,0x330 = legacy port,
|
mpu_port - port address of MIDI interface:
|
||||||
1 = integrated PCI port,
|
0x300,0x310,0x320,0x330 = legacy port,
|
||||||
|
1 = integrated PCI port (8738 or later),
|
||||||
0 = disable (default)
|
0 = disable (default)
|
||||||
fm_port - 0x388 = legacy port,
|
fm_port - port address of OPL-3 FM synthesizer (8x38 only):
|
||||||
1 = integrated PCI port (default),
|
0x388 = legacy port,
|
||||||
|
1 = integrated PCI port (default on 8738),
|
||||||
0 = disable
|
0 = disable
|
||||||
soft_ac3 - Software-conversion of raw SPDIF packets (model 033 only)
|
soft_ac3 - Software-conversion of raw SPDIF packets (model 033 only)
|
||||||
(default = 1)
|
(default = 1)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Brief Notes on C-Media 8738/8338 Driver
|
Brief Notes on C-Media 8338/8738/8768/8770 Driver
|
||||||
=======================================
|
=================================================
|
||||||
|
|
||||||
Takashi Iwai <tiwai@suse.de>
|
Takashi Iwai <tiwai@suse.de>
|
||||||
|
|
||||||
|
@ -212,7 +212,9 @@ MIDI CONTROLLER
|
||||||
The MPU401-UART interface is disabled as default. You need to set
|
The MPU401-UART interface is disabled as default. You need to set
|
||||||
module option "mpu_port" with a valid I/O port address to enable the
|
module option "mpu_port" with a valid I/O port address to enable the
|
||||||
MIDI support. The valid I/O ports are 0x300, 0x310, 0x320 and 0x330.
|
MIDI support. The valid I/O ports are 0x300, 0x310, 0x320 and 0x330.
|
||||||
Choose the value which doesn't conflict with other cards.
|
Choose the value which doesn't conflict with other cards. With
|
||||||
|
CMI8738 and newer chips, you can use "mpu_port=1" to use a PCI port
|
||||||
|
address that does not conflict with any other card.
|
||||||
|
|
||||||
There is _no_ hardware wavetable function on this chip (except for
|
There is _no_ hardware wavetable function on this chip (except for
|
||||||
OPL3 synth below).
|
OPL3 synth below).
|
||||||
|
@ -230,6 +232,8 @@ Set "fm_port" module option for more cards.
|
||||||
The output quality of FM OPL/3 is, however, very weird.
|
The output quality of FM OPL/3 is, however, very weird.
|
||||||
I don't know why..
|
I don't know why..
|
||||||
|
|
||||||
|
CMI8768 and newer chips do not have the FM synth.
|
||||||
|
|
||||||
|
|
||||||
Joystick and Modem
|
Joystick and Modem
|
||||||
------------------
|
------------------
|
||||||
|
|
|
@ -170,14 +170,14 @@ config SND_CA0106
|
||||||
will be called snd-ca0106.
|
will be called snd-ca0106.
|
||||||
|
|
||||||
config SND_CMIPCI
|
config SND_CMIPCI
|
||||||
tristate "C-Media 8738, 8338"
|
tristate "C-Media 8338, 8738, 8768, 8770"
|
||||||
depends on SND
|
depends on SND
|
||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
help
|
help
|
||||||
If you want to use soundcards based on C-Media CMI8338 or CMI8738
|
If you want to use soundcards based on C-Media CMI8338, CMI8738,
|
||||||
chips, say Y here and read
|
CMI8768 or CMI8770 chips, say Y here and read
|
||||||
<file:Documentation/sound/alsa/CMIPCI.txt>.
|
<file:Documentation/sound/alsa/CMIPCI.txt>.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the module
|
To compile this driver as a module, choose M here: the module
|
||||||
|
|
|
@ -2774,10 +2774,14 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port)
|
||||||
if (!fm_port)
|
if (!fm_port)
|
||||||
goto disable_fm;
|
goto disable_fm;
|
||||||
|
|
||||||
/* first try FM regs in PCI port range */
|
if (cm->chip_version > 33) {
|
||||||
iosynth = cm->iobase + CM_REG_FM_PCI;
|
/* first try FM regs in PCI port range */
|
||||||
err = snd_opl3_create(cm->card, iosynth, iosynth + 2,
|
iosynth = cm->iobase + CM_REG_FM_PCI;
|
||||||
OPL3_HW_OPL3, 1, &opl3);
|
err = snd_opl3_create(cm->card, iosynth, iosynth + 2,
|
||||||
|
OPL3_HW_OPL3, 1, &opl3);
|
||||||
|
} else {
|
||||||
|
err = -EIO;
|
||||||
|
}
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
/* then try legacy ports */
|
/* then try legacy ports */
|
||||||
val = snd_cmipci_read(cm, CM_REG_LEGACY_CTRL) & ~CM_FMSEL_MASK;
|
val = snd_cmipci_read(cm, CM_REG_LEGACY_CTRL) & ~CM_FMSEL_MASK;
|
||||||
|
@ -2935,7 +2939,8 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
integrated_midi = snd_cmipci_read_b(cm, CM_REG_MPU_PCI) != 0xff;
|
integrated_midi = cm->chip_version > 33 &&
|
||||||
|
snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1) != 0xff;
|
||||||
if (integrated_midi && mpu_port[dev] == 1)
|
if (integrated_midi && mpu_port[dev] == 1)
|
||||||
iomidi = cm->iobase + CM_REG_MPU_PCI;
|
iomidi = cm->iobase + CM_REG_MPU_PCI;
|
||||||
else {
|
else {
|
||||||
|
@ -2955,8 +2960,11 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_cmipci_create_fm(cm, fm_port[dev])) < 0)
|
if (cm->chip_version < 68) {
|
||||||
return err;
|
err = snd_cmipci_create_fm(cm, fm_port[dev]);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/* reset mixer */
|
/* reset mixer */
|
||||||
snd_cmipci_mixer_write(cm, 0, 0);
|
snd_cmipci_mixer_write(cm, 0, 0);
|
||||||
|
|
Loading…
Reference in New Issue