aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-10-26 06:35:56 -0400
committerJaroslav Kysela <perex@perex.cz>2007-11-19 12:38:32 -0500
commitd29240ce57d96db7300360d1e6f18357810a5c2b (patch)
tree5e095bde9f0180962481bbf330fd5a7de0bb8fd5
parent2ffbb8377c7a0713baf6644e285adc27a5654582 (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>
-rw-r--r--sound/pci/hda/hda_codec.c7
-rw-r--r--sound/pci/hda/hda_local.h1
-rw-r--r--sound/pci/hda/patch_analog.c8
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
225int snd_hda_multi_out_dig_open(struct hda_codec *codec, 226int 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