Commit 2f24d159 authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] cmipci - Allow to disable integrated FM port

The driver didn't allow to disable the integrated FM port (if available),
and this annoyed people who don't want FM port.  Now fm_port=0 disables
the FM port unconditionally.  fm_port=1 is used for enabling the integrated
FM port (as default).
Also fixed the documentation about this option.
Fix ALSA bug#2491.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent dd87da1c
...@@ -370,7 +370,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -370,7 +370,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
mpu_port - 0x300,0x310,0x320,0x330 = legacy port, mpu_port - 0x300,0x310,0x320,0x330 = legacy port,
1 = integrated PCI port, 1 = integrated PCI port,
0 = disable (default) 0 = disable (default)
fm_port - 0x388 (default), 0 = disable (default) fm_port - 0x388 = legacy port,
1 = integrated PCI port (default),
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)
joystick_port - Joystick port address (0 = disable, 1 = auto-detect) joystick_port - Joystick port address (0 = disable, 1 = auto-detect)
......
...@@ -57,7 +57,7 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ ...@@ -57,7 +57,7 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable switches */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable switches */
static long mpu_port[SNDRV_CARDS]; static long mpu_port[SNDRV_CARDS];
static long fm_port[SNDRV_CARDS]; static long fm_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
static int soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1}; static int soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
#ifdef SUPPORT_JOYSTICK #ifdef SUPPORT_JOYSTICK
static int joystick_port[SNDRV_CARDS]; static int joystick_port[SNDRV_CARDS];
...@@ -2779,6 +2779,9 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port) ...@@ -2779,6 +2779,9 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port)
struct snd_opl3 *opl3; struct snd_opl3 *opl3;
int err; int err;
if (!fm_port)
goto disable_fm;
/* first try FM regs in PCI port range */ /* first try FM regs in PCI port range */
iosynth = cm->iobase + CM_REG_FM_PCI; iosynth = cm->iobase + CM_REG_FM_PCI;
err = snd_opl3_create(cm->card, iosynth, iosynth + 2, err = snd_opl3_create(cm->card, iosynth, iosynth + 2,
...@@ -2793,7 +2796,7 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port) ...@@ -2793,7 +2796,7 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port)
case 0x3C8: val |= CM_FMSEL_3C8; break; case 0x3C8: val |= CM_FMSEL_3C8; break;
case 0x388: val |= CM_FMSEL_388; break; case 0x388: val |= CM_FMSEL_388; break;
default: default:
return 0; goto disable_fm;
} }
snd_cmipci_write(cm, CM_REG_LEGACY_CTRL, val); snd_cmipci_write(cm, CM_REG_LEGACY_CTRL, val);
/* enable FM */ /* enable FM */
...@@ -2803,11 +2806,7 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port) ...@@ -2803,11 +2806,7 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port)
OPL3_HW_OPL3, 0, &opl3) < 0) { OPL3_HW_OPL3, 0, &opl3) < 0) {
printk(KERN_ERR "cmipci: no OPL device at %#lx, " printk(KERN_ERR "cmipci: no OPL device at %#lx, "
"skipping...\n", iosynth); "skipping...\n", iosynth);
/* disable FM */ goto disable_fm;
snd_cmipci_write(cm, CM_REG_LEGACY_CTRL,
val & ~CM_FMSEL_MASK);
snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN);
return 0;
} }
} }
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) { if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
...@@ -2815,6 +2814,11 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port) ...@@ -2815,6 +2814,11 @@ static int __devinit snd_cmipci_create_fm(struct cmipci *cm, long fm_port)
return err; return err;
} }
return 0; return 0;
disable_fm:
snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_FMSEL_MASK);
snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN);
return 0;
} }
static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pci,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment