]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - sound/pci/hda/hda_proc.c
ALSA: hda - Limit the number of GPIOs show in proc
[mv-sheeva.git] / sound / pci / hda / hda_proc.c
index 1e5aff5c48d16910074503907775e6d17eac5d66..c39af986bff17dac41abad79090244f7f60b88a1 100644 (file)
@@ -216,7 +216,7 @@ static void print_pin_caps(struct snd_info_buffer *buffer,
        unsigned int caps, val;
 
        caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
-       snd_iprintf(buffer, "  Pincap 0x08%x:", caps);
+       snd_iprintf(buffer, "  Pincap 0x%08x:", caps);
        if (caps & AC_PINCAP_IN)
                snd_iprintf(buffer, " IN");
        if (caps & AC_PINCAP_OUT)
@@ -229,8 +229,13 @@ static void print_pin_caps(struct snd_info_buffer *buffer,
                snd_iprintf(buffer, " Detect");
        if (caps & AC_PINCAP_BALANCE)
                snd_iprintf(buffer, " Balanced");
-       if (caps & AC_PINCAP_LR_SWAP)
-               snd_iprintf(buffer, " R/L");
+       if (caps & AC_PINCAP_HDMI) {
+               /* Realtek uses this bit as a different meaning */
+               if ((codec->vendor_id >> 16) == 0x10ec)
+                       snd_iprintf(buffer, " R/L");
+               else
+                       snd_iprintf(buffer, " HDMI");
+       }
        if (caps & AC_PINCAP_TRIG_REQ)
                snd_iprintf(buffer, " Trigger");
        if (caps & AC_PINCAP_IMP_SENSE)
@@ -478,6 +483,8 @@ static void print_gpio(struct snd_info_buffer *buffer,
                    (gpio & AC_GPIO_UNSOLICITED) ? 1 : 0,
                    (gpio & AC_GPIO_WAKE) ? 1 : 0);
        max = gpio & AC_GPIO_IO_COUNT;
+       if (!max || max > 8)
+               return;
        enable = snd_hda_codec_read(codec, nid, 0,
                                    AC_VERB_GET_GPIO_MASK, 0);
        direction = snd_hda_codec_read(codec, nid, 0,
@@ -552,9 +559,15 @@ static void print_codec_info(struct snd_info_entry *entry,
 
                snd_iprintf(buffer, "Node 0x%02x [%s] wcaps 0x%x:", nid,
                            get_wid_type_name(wid_type), wid_caps);
-               if (wid_caps & AC_WCAP_STEREO)
-                       snd_iprintf(buffer, " Stereo");
-               else
+               if (wid_caps & AC_WCAP_STEREO) {
+                       unsigned int chans;
+                       chans = (wid_caps & AC_WCAP_CHAN_CNT_EXT) >> 13;
+                       chans = ((chans << 1) | 1) + 1;
+                       if (chans == 2)
+                               snd_iprintf(buffer, " Stereo");
+                       else
+                               snd_iprintf(buffer, " %d-Channels", chans);
+               } else
                        snd_iprintf(buffer, " Mono");
                if (wid_caps & AC_WCAP_DIGITAL)
                        snd_iprintf(buffer, " Digital");
@@ -566,6 +579,8 @@ static void print_codec_info(struct snd_info_entry *entry,
                        snd_iprintf(buffer, " Stripe");
                if (wid_caps & AC_WCAP_LR_SWAP)
                        snd_iprintf(buffer, " R/L");
+               if (wid_caps & AC_WCAP_CP_CAPS)
+                       snd_iprintf(buffer, " CP");
                snd_iprintf(buffer, "\n");
 
                /* volume knob is a special widget that always have connection