diff options
author | Stephen Warren <swarren@nvidia.com> | 2011-06-01 13:14:17 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-06-06 06:48:59 -0400 |
commit | 7c9359762797ba7a70bbaa6364aaecc16786ac83 (patch) | |
tree | 82830d36c0bc7d934deed1e99b9c4bb80f404b11 /sound/pci/hda/hda_intel.c | |
parent | c3d52105753dafdf2d993e540cc3192f23447dac (diff) |
ALSA: hda: Allow multple SPDIF controls per codec
Currently, the data that backs the kcontrols created by
snd_hda_create_spdif_out_ctls is stored directly in struct hda_codec. When
multiple sets of these controls are stored, they will all manipulate the
same data, causing confusion. Instead, store an array of this data, one
copy per converter, to isolate the controls.
This patch would cause a behavioural change in the case where
snd_hda_create_spdif_out_ctls was called multiple times for a single codec.
As best I can tell, this is never the case for any codec.
This will be relevant at least for some HDMI audio codecs, such as the
NVIDIA GeForce 520 and Intel Ibex Peak. A future change will modify the
driver's handling of those codecs to create multiple PCMs per codec. Note
that this issue isn't affected by whether one creates a PCM-per-converter
or PCM-per-pin; there are multiple of both within a single codec in both
of those codecs.
Note that those codecs don't currently create multiple PCMs for the codec
due to the default HW mux state of all pins being to point at the same
converter, hence there is only a single converter routed to any pin, and
hence only a single PCM.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_intel.c')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 486f6deb3eee..966f40147bc3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -1706,13 +1706,16 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
1706 | struct snd_pcm_runtime *runtime = substream->runtime; | 1706 | struct snd_pcm_runtime *runtime = substream->runtime; |
1707 | unsigned int bufsize, period_bytes, format_val, stream_tag; | 1707 | unsigned int bufsize, period_bytes, format_val, stream_tag; |
1708 | int err; | 1708 | int err; |
1709 | struct hda_spdif_out *spdif = | ||
1710 | snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid); | ||
1711 | unsigned short ctls = spdif ? spdif->ctls : 0; | ||
1709 | 1712 | ||
1710 | azx_stream_reset(chip, azx_dev); | 1713 | azx_stream_reset(chip, azx_dev); |
1711 | format_val = snd_hda_calc_stream_format(runtime->rate, | 1714 | format_val = snd_hda_calc_stream_format(runtime->rate, |
1712 | runtime->channels, | 1715 | runtime->channels, |
1713 | runtime->format, | 1716 | runtime->format, |
1714 | hinfo->maxbps, | 1717 | hinfo->maxbps, |
1715 | apcm->codec->spdif_ctls); | 1718 | ctls); |
1716 | if (!format_val) { | 1719 | if (!format_val) { |
1717 | snd_printk(KERN_ERR SFX | 1720 | snd_printk(KERN_ERR SFX |
1718 | "invalid format_val, rate=%d, ch=%d, format=%d\n", | 1721 | "invalid format_val, rate=%d, ch=%d, format=%d\n", |