diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2007-08-22 11:45:03 +0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2007-10-16 17:59:22 +0400 |
commit | 45c41b4868c9dbec5d43a4023e77994afa94470f (patch) | |
tree | cdf019b41ae2462d5dc63dcf65d879890c9208b5 /sound/pci/cmipci.c | |
parent | c2b1239a9f22f19c53543b460b24507d0e21ea0c (diff) | |
download | linux-45c41b4868c9dbec5d43a4023e77994afa94470f.tar.xz |
[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>
Diffstat (limited to 'sound/pci/cmipci.c')
-rw-r--r-- | sound/pci/cmipci.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index c42c51647df7..9d394c7c221d 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -2774,10 +2774,14 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port) if (!fm_port) goto disable_fm; - /* first try FM regs in PCI port range */ - iosynth = cm->iobase + CM_REG_FM_PCI; - err = snd_opl3_create(cm->card, iosynth, iosynth + 2, - OPL3_HW_OPL3, 1, &opl3); + if (cm->chip_version > 33) { + /* first try FM regs in PCI port range */ + iosynth = cm->iobase + CM_REG_FM_PCI; + err = snd_opl3_create(cm->card, iosynth, iosynth + 2, + OPL3_HW_OPL3, 1, &opl3); + } else { + err = -EIO; + } if (err < 0) { /* then try legacy ports */ 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; } - 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) iomidi = cm->iobase + CM_REG_MPU_PCI; 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) - return err; + if (cm->chip_version < 68) { + err = snd_cmipci_create_fm(cm, fm_port[dev]); + if (err < 0) + return err; + } /* reset mixer */ snd_cmipci_mixer_write(cm, 0, 0); |