Commit e08a007d authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] hda-codec - Fix SPDIF device number of ALC codecs

Assign the SPDIF always to the secondary device (dev#1) to keep
the same configuration.  Move the optional capture device to the
third device (dev#2).
hda_intel now just ignores the NULL entries in the pcm arrays
from codecs.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent dafbbb1f
...@@ -1242,7 +1242,12 @@ static int __devinit create_codec_pcm(struct azx *chip, struct hda_codec *codec, ...@@ -1242,7 +1242,12 @@ static int __devinit create_codec_pcm(struct azx *chip, struct hda_codec *codec,
struct snd_pcm *pcm; struct snd_pcm *pcm;
struct azx_pcm *apcm; struct azx_pcm *apcm;
snd_assert(cpcm->stream[0].substreams || cpcm->stream[1].substreams, return -EINVAL); /* if no substreams are defined for both playback and capture,
* it's just a placeholder. ignore it.
*/
if (!cpcm->stream[0].substreams && !cpcm->stream[1].substreams)
return 0;
snd_assert(cpcm->name, return -EINVAL); snd_assert(cpcm->name, return -EINVAL);
err = snd_pcm_new(chip->card, cpcm->name, pcm_dev, err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
...@@ -1268,7 +1273,8 @@ static int __devinit create_codec_pcm(struct azx *chip, struct hda_codec *codec, ...@@ -1268,7 +1273,8 @@ static int __devinit create_codec_pcm(struct azx *chip, struct hda_codec *codec,
snd_dma_pci_data(chip->pci), snd_dma_pci_data(chip->pci),
1024 * 64, 1024 * 128); 1024 * 64, 1024 * 128);
chip->pcm[pcm_dev] = pcm; chip->pcm[pcm_dev] = pcm;
chip->pcm_devs = pcm_dev + 1; if (chip->pcm_devs < pcm_dev + 1)
chip->pcm_devs = pcm_dev + 1;
return 0; return 0;
} }
......
...@@ -1796,25 +1796,9 @@ static int alc_build_pcms(struct hda_codec *codec) ...@@ -1796,25 +1796,9 @@ static int alc_build_pcms(struct hda_codec *codec)
} }
} }
/* If the use of more than one ADC is requested for the current /* SPDIF for stream index #1 */
* model, configure a second analog capture-only PCM.
*/
if (spec->num_adc_nids > 1) {
codec->num_pcms++;
info++;
info->name = spec->stream_name_analog;
/* No playback stream for second PCM */
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = alc_pcm_null_playback;
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
if (spec->stream_analog_capture) {
snd_assert(spec->adc_nids, return -EINVAL);
info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[1];
}
}
if (spec->multiout.dig_out_nid || spec->dig_in_nid) { if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
codec->num_pcms++; codec->num_pcms = 2;
info++; info++;
info->name = spec->stream_name_digital; info->name = spec->stream_name_digital;
if (spec->multiout.dig_out_nid && if (spec->multiout.dig_out_nid &&
...@@ -1829,6 +1813,24 @@ static int alc_build_pcms(struct hda_codec *codec) ...@@ -1829,6 +1813,24 @@ static int alc_build_pcms(struct hda_codec *codec)
} }
} }
/* If the use of more than one ADC is requested for the current
* model, configure a second analog capture-only PCM.
*/
/* Additional Analaog capture for index #2 */
if (spec->num_adc_nids > 1 && spec->stream_analog_capture &&
spec->adc_nids) {
codec->num_pcms = 3;
info++;
info->name = spec->stream_name_analog;
/* No playback stream for second PCM */
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = alc_pcm_null_playback;
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
if (spec->stream_analog_capture) {
info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[1];
}
}
return 0; return 0;
} }
......
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