]> git.neil.brown.name Git - history.git/commitdiff
ALSA CVS update
authorJaroslav Kysela <perex@suse.cz>
Thu, 25 Sep 2003 16:46:51 +0000 (18:46 +0200)
committerJaroslav Kysela <perex@suse.cz>
Thu, 25 Sep 2003 16:46:51 +0000 (18:46 +0200)
D:2003/09/01 10:53:26
C:AC97 Codec Core
A:Takashi Iwai <tiwai@suse.de>
F:include/ac97_codec.h:1.33->1.34
F:pci/ac97/ac97_patch.c:1.21->1.22
F:pci/ac97/ac97_proc.c:1.1->1.2
L:James Courtier-Dutton <James@superbug.demon.co.uk>:
L:- enabled SPDIF input of ALC650.

include/sound/ac97_codec.h
sound/pci/ac97/ac97_patch.c
sound/pci/ac97/ac97_proc.c

index 94e88a0159f37e7274d6588c340cf18dd2d10eaa..b73755aa7f3b2a7ae670e4deb506c551f9707a44 100644 (file)
 #define AC97_CXR_SPDIF_AC3     0x2
 
 /* specific - ALC */
+#define AC97_ALC650_SPDIF_INPUT_STATUS1        0x60
+/* S/PDIF input status 1 bit defines */
+#define AC97_ALC650_PRO             0x0001  /* Professional status */
+#define AC97_ALC650_NAUDIO          0x0002  /* Non audio stream */
+#define AC97_ALC650_COPY            0x0004  /* Copyright status */
+#define AC97_ALC650_PRE             0x0038  /* Preemphasis status */
+#define AC97_ALC650_PRE_SHIFT       3
+#define AC97_ALC650_MODE            0x00C0  /* Preemphasis status */
+#define AC97_ALC650_MODE_SHIFT      6
+#define AC97_ALC650_CC_MASK         0x7f00  /* Category Code mask */
+#define AC97_ALC650_CC_SHIFT        8
+#define AC97_ALC650_L               0x8000  /* Generation Level status */
+
+#define AC97_ALC650_SPDIF_INPUT_STATUS2        0x62
+/* S/PDIF input status 2 bit defines */
+#define AC97_ALC650_SOUCE_MASK      0x000f  /* Source number */
+#define AC97_ALC650_CHANNEL_MASK    0x00f0  /* Channel number */
+#define AC97_ALC650_CHANNEL_SHIFT   4 
+#define AC97_ALC650_SPSR_MASK       0x0f00  /* S/PDIF Sample Rate bits */
+#define AC97_ALC650_SPSR_SHIFT      8
+#define AC97_ALC650_SPSR_44K        0x0000  /* Use 44.1kHz Sample rate */
+#define AC97_ALC650_SPSR_48K        0x0200  /* Use 48kHz Sample rate */
+#define AC97_ALC650_SPSR_32K        0x0300  /* Use 32kHz Sample rate */
+#define AC97_ALC650_CLOCK_ACCURACY  0x3000  /* Clock accuracy */
+#define AC97_ALC650_CLOCK_SHIFT     12
+#define AC97_ALC650_CLOCK_LOCK      0x4000  /* Clock locked status */
+#define AC97_ALC650_V               0x8000  /* Validity status */
+
 #define AC97_ALC650_SURR_DAC_VOL       0x64
 #define AC97_ALC650_LFE_DAC_VOL                0x66
-#define AC97_ALC650_MULTICH    0x6a
-#define AC97_ALC650_REVISION    0x6e
-#define AC97_ALC650_CLOCK      0x7a
+#define AC97_ALC650_UNKNOWN1           0x68
+#define AC97_ALC650_MULTICH            0x6a
+#define AC97_ALC650_UNKNOWN2           0x6c
+#define AC97_ALC650_REVISION           0x6e
+#define AC97_ALC650_UNKNOWN3           0x70
+#define AC97_ALC650_UNKNOWN4           0x72
+#define AC97_ALC650_MISC               0x74
+#define AC97_ALC650_GPIO_SETUP         0x76
+#define AC97_ALC650_GPIO_STATUS                0x78
+#define AC97_ALC650_CLOCK              0x7a
 
 /* specific - Yamaha YMF753 */
 #define AC97_YMF753_DIT_CTRL2  0x66    /* DIT Control 2 */
index cb00b376df2e7c54d5a290ddbbe64863b05567bd..839648833cb0170f23ee5f8653034c4b94a127b4 100644 (file)
@@ -915,6 +915,9 @@ int patch_alc650(ac97_t * ac97)
        }
 
        if (spdif) {
+               /* enable AC97_ALC650_GPIO_SETUP, AC97_ALC650_CLOCK for R/W */
+               snd_ac97_write_cache(ac97, AC97_ALC650_GPIO_STATUS, 
+                       snd_ac97_read(ac97, AC97_ALC650_GPIO_STATUS) | 0x8000);
                /* enable spdif in */
                snd_ac97_write_cache(ac97, AC97_ALC650_CLOCK,
                                     snd_ac97_read(ac97, AC97_ALC650_CLOCK) | 0x03);
@@ -930,18 +933,18 @@ int patch_alc650(ac97_t * ac97)
                int mic_off;
                mic_off = snd_ac97_read(ac97, AC97_ALC650_MULTICH) & (1 << 10);
                /* GPIO0 direction */
-               val = snd_ac97_read(ac97, 0x76);
+               val = snd_ac97_read(ac97, AC97_ALC650_GPIO_SETUP);
                if (mic_off)
                        val &= ~0x01;
                else
                        val |= 0x01;
-               snd_ac97_write_cache(ac97, 0x76, val);
-               val = snd_ac97_read(ac97, 0x78);
+               snd_ac97_write_cache(ac97, AC97_ALC650_GPIO_SETUP, val);
+               val = snd_ac97_read(ac97, AC97_ALC650_GPIO_STATUS);
                if (mic_off)
                        val &= ~0x100;
                else
                        val = val | 0x100;
-               snd_ac97_write_cache(ac97, 0x78, val);
+               snd_ac97_write_cache(ac97, AC97_ALC650_GPIO_STATUS, val);
        }
 
        /* full DAC volume */
index 4619cc1f25aca929e77483c547ce0cc9b2a24bf5..0a985ad57c1fd58e2dcb91d283dc75bd9719421f 100644 (file)
@@ -151,7 +151,7 @@ static void snd_ac97_proc_read_main(ac97_t *ac97, snd_info_buffer_t * buffer, in
                snd_iprintf(buffer, "SPDIF Control    :%s%s%s%s Category=0x%x Generation=%i%s%s%s\n",
                        val & AC97_SC_PRO ? " PRO" : " Consumer",
                        val & AC97_SC_NAUDIO ? " Non-audio" : " PCM",
-                       val & AC97_SC_COPY ? " Copyright" : "",
+                       val & AC97_SC_COPY ? "" : " Copyright",
                        val & AC97_SC_PRE ? " Preemph50/15" : "",
                        (val & AC97_SC_CC_MASK) >> AC97_SC_CC_SHIFT,
                        (val & AC97_SC_L) >> 11,
@@ -164,8 +164,32 @@ static void snd_ac97_proc_read_main(ac97_t *ac97, snd_info_buffer_t * buffer, in
                        (ac97->flags & AC97_CS_SPDIF) ?
                            (val & AC97_SC_V ? " Enabled" : "") :
                            (val & AC97_SC_V ? " Validity" : ""));
+               /* ALC650 specific*/
+               if ((ac97->id & 0xfffffff0) == 0x414c4720 &&
+                   (snd_ac97_read(ac97, AC97_ALC650_CLOCK) & 0x01)) {
+                       val = snd_ac97_read(ac97, AC97_ALC650_SPDIF_INPUT_STATUS2);
+                       if (val & AC97_ALC650_CLOCK_LOCK) {
+                               val = snd_ac97_read(ac97, AC97_ALC650_SPDIF_INPUT_STATUS1);
+                               snd_iprintf(buffer, "SPDIF In Status  :%s%s%s%s Category=0x%x Generation=%i",
+                                           val & AC97_ALC650_PRO ? " PRO" : " Consumer",
+                                           val & AC97_ALC650_NAUDIO ? " Non-audio" : " PCM",
+                                           val & AC97_ALC650_COPY ? "" : " Copyright",
+                                           val & AC97_ALC650_PRE ? " Preemph50/15" : "",
+                                           (val & AC97_ALC650_CC_MASK) >> AC97_ALC650_CC_SHIFT,
+                                           (val & AC97_ALC650_L) >> 15);
+                               val = snd_ac97_read(ac97, AC97_ALC650_SPDIF_INPUT_STATUS2);
+                               snd_iprintf(buffer, "%s Accuracy=%i%s%s\n",
+                                           spdif_rates[(val & AC97_ALC650_SPSR_MASK) >> AC97_ALC650_SPSR_SHIFT],
+                                           (val & AC97_ALC650_CLOCK_ACCURACY) >> AC97_ALC650_CLOCK_SHIFT,
+                                           (val & AC97_ALC650_CLOCK_LOCK ? " Locked" : " Unlocked"),
+                                           (val & AC97_ALC650_V ? " Validity?" : ""));
+                       } else {
+                               snd_iprintf(buffer, "SPDIF In Status  : Not Locked\n");
+                       }
+               }
        }
 
+
       __modem:
        mext = snd_ac97_read(ac97, AC97_EXTENDED_MID);
        if (mext == 0)