aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/cmipci.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2007-08-22 03:45:03 -0400
committerJaroslav Kysela <perex@perex.cz>2007-10-16 09:59:22 -0400
commit45c41b4868c9dbec5d43a4023e77994afa94470f (patch)
treecdf019b41ae2462d5dc63dcf65d879890c9208b5 /sound/pci/cmipci.c
parentc2b1239a9f22f19c53543b460b24507d0e21ea0c (diff)
[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.c22
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)
2774 if (!fm_port) 2774 if (!fm_port)
2775 goto disable_fm; 2775 goto disable_fm;
2776 2776
2777 /* first try FM regs in PCI port range */ 2777 if (cm->chip_version > 33) {
2778 iosynth = cm->iobase + CM_REG_FM_PCI; 2778 /* first try FM regs in PCI port range */
2779 err = snd_opl3_create(cm->card, iosynth, iosynth + 2, 2779 iosynth = cm->iobase + CM_REG_FM_PCI;
2780 OPL3_HW_OPL3, 1, &opl3); 2780 err = snd_opl3_create(cm->card, iosynth, iosynth + 2,
2781 OPL3_HW_OPL3, 1, &opl3);
2782 } else {
2783 err = -EIO;
2784 }
2781 if (err < 0) { 2785 if (err < 0) {
2782 /* then try legacy ports */ 2786 /* then try legacy ports */
2783 val = snd_cmipci_read(cm, CM_REG_LEGACY_CTRL) & ~CM_FMSEL_MASK; 2787 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
2935 return err; 2939 return err;
2936 } 2940 }
2937 2941
2938 integrated_midi = snd_cmipci_read_b(cm, CM_REG_MPU_PCI) != 0xff; 2942 integrated_midi = cm->chip_version > 33 &&
2943 snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1) != 0xff;
2939 if (integrated_midi && mpu_port[dev] == 1) 2944 if (integrated_midi && mpu_port[dev] == 1)
2940 iomidi = cm->iobase + CM_REG_MPU_PCI; 2945 iomidi = cm->iobase + CM_REG_MPU_PCI;
2941 else { 2946 else {
@@ -2955,8 +2960,11 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc
2955 } 2960 }
2956 } 2961 }
2957 2962
2958 if ((err = snd_cmipci_create_fm(cm, fm_port[dev])) < 0) 2963 if (cm->chip_version < 68) {
2959 return err; 2964 err = snd_cmipci_create_fm(cm, fm_port[dev]);
2965 if (err < 0)
2966 return err;
2967 }
2960 2968
2961 /* reset mixer */ 2969 /* reset mixer */
2962 snd_cmipci_mixer_write(cm, 0, 0); 2970 snd_cmipci_mixer_write(cm, 0, 0);