diff options
author | Takashi Iwai <tiwai@suse.de> | 2007-10-26 06:35:56 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2007-11-19 12:38:32 -0500 |
commit | d29240ce57d96db7300360d1e6f18357810a5c2b (patch) | |
tree | 5e095bde9f0180962481bbf330fd5a7de0bb8fd5 /sound | |
parent | 2ffbb8377c7a0713baf6644e285adc27a5654582 (diff) |
[ALSA] hda-codec - Disable shared stream on AD1986A
AD1986A has a hardware problem that it cannot share a stream with
multiple pins properly. The problem occurs e.g. when a volume is changed
during playback.
So far, hda-intel driver unconditionally assigns the stream to multiple
output pins in copy-front mode, and this should be avoided for AD1986A
codec.
The original fix patch was by zhejiang <zhe.jiang@intel.com>.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 7 | ||||
-rw-r--r-- | sound/pci/hda/hda_local.h | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_analog.c | 8 |
3 files changed, 13 insertions, 3 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index ad4cb38109fc..b52f56ffedf4 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -2485,13 +2485,14 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, | |||
2485 | /* front */ | 2485 | /* front */ |
2486 | snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, | 2486 | snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, |
2487 | 0, format); | 2487 | 0, format); |
2488 | if (mout->hp_nid && mout->hp_nid != nids[HDA_FRONT]) | 2488 | if (!mout->no_share_stream && |
2489 | mout->hp_nid && mout->hp_nid != nids[HDA_FRONT]) | ||
2489 | /* headphone out will just decode front left/right (stereo) */ | 2490 | /* headphone out will just decode front left/right (stereo) */ |
2490 | snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag, | 2491 | snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag, |
2491 | 0, format); | 2492 | 0, format); |
2492 | /* extra outputs copied from front */ | 2493 | /* extra outputs copied from front */ |
2493 | for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) | 2494 | for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) |
2494 | if (mout->extra_out_nid[i]) | 2495 | if (!mout->no_share_stream && mout->extra_out_nid[i]) |
2495 | snd_hda_codec_setup_stream(codec, | 2496 | snd_hda_codec_setup_stream(codec, |
2496 | mout->extra_out_nid[i], | 2497 | mout->extra_out_nid[i], |
2497 | stream_tag, 0, format); | 2498 | stream_tag, 0, format); |
@@ -2501,7 +2502,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, | |||
2501 | if (chs >= (i + 1) * 2) /* independent out */ | 2502 | if (chs >= (i + 1) * 2) /* independent out */ |
2502 | snd_hda_codec_setup_stream(codec, nids[i], stream_tag, | 2503 | snd_hda_codec_setup_stream(codec, nids[i], stream_tag, |
2503 | i * 2, format); | 2504 | i * 2, format); |
2504 | else /* copy front */ | 2505 | else if (!mout->no_share_stream) /* copy front */ |
2505 | snd_hda_codec_setup_stream(codec, nids[i], stream_tag, | 2506 | snd_hda_codec_setup_stream(codec, nids[i], stream_tag, |
2506 | 0, format); | 2507 | 0, format); |
2507 | } | 2508 | } |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 20c5e6250374..8c56c9cb0d09 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
@@ -220,6 +220,7 @@ struct hda_multi_out { | |||
220 | hda_nid_t dig_out_nid; /* digital out audio widget */ | 220 | hda_nid_t dig_out_nid; /* digital out audio widget */ |
221 | int max_channels; /* currently supported analog channels */ | 221 | int max_channels; /* currently supported analog channels */ |
222 | int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ | 222 | int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ |
223 | int no_share_stream; /* don't share a stream with multiple pins */ | ||
223 | }; | 224 | }; |
224 | 225 | ||
225 | int snd_hda_multi_out_dig_open(struct hda_codec *codec, | 226 | int snd_hda_multi_out_dig_open(struct hda_codec *codec, |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 0ee8ae4d4410..196ad3c9405d 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -957,6 +957,14 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
957 | break; | 957 | break; |
958 | } | 958 | } |
959 | 959 | ||
960 | /* AD1986A has a hardware problem that it can't share a stream | ||
961 | * with multiple output pins. The copy of front to surrounds | ||
962 | * causes noisy or silent outputs at a certain timing, e.g. | ||
963 | * changing the volume. | ||
964 | * So, let's disable the shared stream. | ||
965 | */ | ||
966 | spec->multiout.no_share_stream = 1; | ||
967 | |||
960 | return 0; | 968 | return 0; |
961 | } | 969 | } |
962 | 970 | ||