ALSA: hda - Don't reset SPDIF in each status change
authorTakashi Iwai <tiwai@suse.de>
Mon, 11 Aug 2008 08:04:40 +0000 (10:04 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 13 Aug 2008 09:46:59 +0000 (11:46 +0200)
The SPDIF output is toggled at each time any SPDIF status bits are changed
because of the known problems on some codecs.  But, this also results in
loosing the sync, and the problem is more obvious on HDMI output over
SPDIF.  Since the toggle is necessary only for some codecs, we should
check whether this workaround is needed and skip if unnecessary.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/patch_realtek.c

index 77fbcd4a69b71f828df7d51b8a3ef8c31a4b6c15..529bd5f6521f2b0ff5b94cdec4f877930ef7f4ca 100644 (file)
@@ -2590,12 +2590,12 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
                                 unsigned int stream_tag, unsigned int format)
 {
        /* turn off SPDIF once; otherwise the IEC958 bits won't be updated */
-       if (codec->spdif_ctls & AC_DIG1_ENABLE)
+       if (codec->spdif_status_reset && (codec->spdif_ctls & AC_DIG1_ENABLE))
                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
                                    codec->spdif_ctls & ~AC_DIG1_ENABLE & 0xff);
        snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
        /* turn on again (if needed) */
-       if (codec->spdif_ctls & AC_DIG1_ENABLE)
+       if (codec->spdif_status_reset && (codec->spdif_ctls & AC_DIG1_ENABLE))
                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
                                    codec->spdif_ctls & 0xff);
 }
index 2f112626f24422574564e8f947eefb87507c0497..aeee5816153787ebc0cd0a8123dba4e8c0d186b5 100644 (file)
@@ -654,6 +654,11 @@ struct hda_codec {
 
        struct snd_hwdep *hwdep;        /* assigned hwdep device */
 
+       /* misc flags */
+       unsigned int spdif_status_reset :1; /* needs to toggle SPDIF for each
+                                            * status change
+                                            * (e.g. Realtek codecs)
+                                            */
 #ifdef CONFIG_SND_HDA_POWER_SAVE
        unsigned int power_on :1;       /* current (global) power-state */
        unsigned int power_transition :1; /* power-state in transition */
index 7e5422f64caf9d834eef20161d200f44b49b6984..8bff732958e0b12303d7c38e0826711419d50def 100644 (file)
@@ -2670,6 +2670,8 @@ static int alc_build_pcms(struct hda_codec *codec)
                        info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
                        info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
                }
+               /* FIXME: do we need this for all Realtek codec models? */
+               codec->spdif_status_reset = 1;
        }
 
        /* If the use of more than one ADC is requested for the current