提交 888afa15 编写于 作者: T Takashi Iwai

[ALSA] hda-codec - keep the format verb at closing PCM streams

Keep the format verb at closing PCM streams.
Introduced snd_hda_codec_cleanup_stream() for the parcicular purpose.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 117f257d
...@@ -720,6 +720,19 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, ...@@ -720,6 +720,19 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, format); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, format);
} }
void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid)
{
if (!nid)
return;
snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid);
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0);
#if 0 /* keep the format */
msleep(1);
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0);
#endif
}
/* /*
* amp access functions * amp access functions
*/ */
...@@ -2204,7 +2217,7 @@ static int hda_pcm_default_cleanup(struct hda_pcm_stream *hinfo, ...@@ -2204,7 +2217,7 @@ static int hda_pcm_default_cleanup(struct hda_pcm_stream *hinfo,
struct hda_codec *codec, struct hda_codec *codec,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
snd_hda_codec_setup_stream(codec, hinfo->nid, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, hinfo->nid);
return 0; return 0;
} }
...@@ -2589,7 +2602,7 @@ int snd_hda_multi_out_dig_open(struct hda_codec *codec, ...@@ -2589,7 +2602,7 @@ int snd_hda_multi_out_dig_open(struct hda_codec *codec,
mutex_lock(&codec->spdif_mutex); mutex_lock(&codec->spdif_mutex);
if (mout->dig_out_used == HDA_DIG_ANALOG_DUP) if (mout->dig_out_used == HDA_DIG_ANALOG_DUP)
/* already opened as analog dup; reset it once */ /* already opened as analog dup; reset it once */
snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, mout->dig_out_nid);
mout->dig_out_used = HDA_DIG_EXCLUSIVE; mout->dig_out_used = HDA_DIG_EXCLUSIVE;
mutex_unlock(&codec->spdif_mutex); mutex_unlock(&codec->spdif_mutex);
return 0; return 0;
...@@ -2684,8 +2697,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, ...@@ -2684,8 +2697,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
stream_tag, format); stream_tag, format);
} else { } else {
mout->dig_out_used = 0; mout->dig_out_used = 0;
snd_hda_codec_setup_stream(codec, mout->dig_out_nid, snd_hda_codec_cleanup_stream(codec, mout->dig_out_nid);
0, 0, 0);
} }
} }
mutex_unlock(&codec->spdif_mutex); mutex_unlock(&codec->spdif_mutex);
...@@ -2727,17 +2739,16 @@ int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, ...@@ -2727,17 +2739,16 @@ int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
int i; int i;
for (i = 0; i < mout->num_dacs; i++) for (i = 0; i < mout->num_dacs; i++)
snd_hda_codec_setup_stream(codec, nids[i], 0, 0, 0); snd_hda_codec_cleanup_stream(codec, nids[i]);
if (mout->hp_nid) if (mout->hp_nid)
snd_hda_codec_setup_stream(codec, mout->hp_nid, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, mout->hp_nid);
for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++)
if (mout->extra_out_nid[i]) if (mout->extra_out_nid[i])
snd_hda_codec_setup_stream(codec, snd_hda_codec_cleanup_stream(codec,
mout->extra_out_nid[i], mout->extra_out_nid[i]);
0, 0, 0);
mutex_lock(&codec->spdif_mutex); mutex_lock(&codec->spdif_mutex);
if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) { if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) {
snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, mout->dig_out_nid);
mout->dig_out_used = 0; mout->dig_out_used = 0;
} }
mutex_unlock(&codec->spdif_mutex); mutex_unlock(&codec->spdif_mutex);
......
...@@ -722,6 +722,7 @@ int snd_hda_build_pcms(struct hda_bus *bus); ...@@ -722,6 +722,7 @@ int snd_hda_build_pcms(struct hda_bus *bus);
void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
u32 stream_tag, u32 stream_tag,
int channel_id, int format); int channel_id, int format);
void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid);
unsigned int snd_hda_calc_stream_format(unsigned int rate, unsigned int snd_hda_calc_stream_format(unsigned int rate,
unsigned int channels, unsigned int channels,
unsigned int format, unsigned int format,
......
...@@ -1007,8 +1007,8 @@ static int generic_pcm2_cleanup(struct hda_pcm_stream *hinfo, ...@@ -1007,8 +1007,8 @@ static int generic_pcm2_cleanup(struct hda_pcm_stream *hinfo,
{ {
struct hda_gspec *spec = codec->spec; struct hda_gspec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, hinfo->nid, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, hinfo->nid);
snd_hda_codec_setup_stream(codec, spec->dac_node[1]->nid, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, spec->dac_node[1]->nid);
return 0; return 0;
} }
......
...@@ -296,8 +296,7 @@ static int ad198x_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -296,8 +296,7 @@ static int ad198x_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
0, 0, 0);
return 0; return 0;
} }
...@@ -3325,8 +3324,7 @@ static int ad1984_pcm_dmic_cleanup(struct hda_pcm_stream *hinfo, ...@@ -3325,8 +3324,7 @@ static int ad1984_pcm_dmic_cleanup(struct hda_pcm_stream *hinfo,
struct hda_codec *codec, struct hda_codec *codec,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
snd_hda_codec_setup_stream(codec, 0x05 + substream->number, snd_hda_codec_cleanup_stream(codec, 0x05 + substream->number);
0, 0, 0);
return 0; return 0;
} }
......
...@@ -513,7 +513,7 @@ static int cmi9880_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -513,7 +513,7 @@ static int cmi9880_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
{ {
struct cmi_spec *spec = codec->spec; struct cmi_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0); snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
return 0; return 0;
} }
......
...@@ -174,8 +174,7 @@ static int conexant_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -174,8 +174,7 @@ static int conexant_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct conexant_spec *spec = codec->spec; struct conexant_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
0, 0, 0);
return 0; return 0;
} }
...@@ -243,7 +242,7 @@ static int cx5051_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -243,7 +242,7 @@ static int cx5051_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct conexant_spec *spec = codec->spec; struct conexant_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->cur_adc, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
spec->cur_adc = 0; spec->cur_adc = 0;
return 0; return 0;
} }
...@@ -1594,7 +1593,7 @@ static void cxt5051_portc_automic(struct hda_codec *codec) ...@@ -1594,7 +1593,7 @@ static void cxt5051_portc_automic(struct hda_codec *codec)
new_adc = spec->adc_nids[spec->cur_adc_idx]; new_adc = spec->adc_nids[spec->cur_adc_idx];
if (spec->cur_adc && spec->cur_adc != new_adc) { if (spec->cur_adc && spec->cur_adc != new_adc) {
/* stream is running, let's swap the current ADC */ /* stream is running, let's swap the current ADC */
snd_hda_codec_setup_stream(codec, spec->cur_adc, 0, 0, 0); snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
spec->cur_adc = new_adc; spec->cur_adc = new_adc;
snd_hda_codec_setup_stream(codec, new_adc, snd_hda_codec_setup_stream(codec, new_adc,
spec->cur_adc_stream_tag, 0, spec->cur_adc_stream_tag, 0,
......
...@@ -2409,8 +2409,8 @@ static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -2409,8 +2409,8 @@ static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1], snd_hda_codec_cleanup_stream(codec,
0, 0, 0); spec->adc_nids[substream->number + 1]);
return 0; return 0;
} }
......
...@@ -1932,7 +1932,7 @@ static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -1932,7 +1932,7 @@ static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
{ {
struct sigmatel_spec *spec = codec->spec; struct sigmatel_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0); snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
return 0; return 0;
} }
......
...@@ -431,8 +431,7 @@ static int via_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, ...@@ -431,8 +431,7 @@ static int via_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct via_spec *spec = codec->spec; struct via_spec *spec = codec->spec;
snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
0, 0, 0);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册