This adds additional pincaps which were not previously output. Also, Vref capabilities are output per-pin along with the current Vref pinctl setting if the NID supports Vref. Also added: processing widgets and proccaps, as well as processing coefficient and coefficient index from the Realtek Define Registers per the ALC883 datasheet.
Signed-off-by: Andrew Paprocki andrew@ishiboo.com
diff -r 1e5c4ccf093c -r 8a9218bae32f pci/hda/hda_proc.c --- a/pci/hda/hda_proc.c Sun Jan 13 12:03:53 2008 +0100 +++ b/pci/hda/hda_proc.c Thu Jan 17 09:44:07 2008 -0500 @@ -202,7 +202,8 @@ static const char *get_jack_color(u32 cf }
static void print_pin_caps(struct snd_info_buffer *buffer, - struct hda_codec *codec, hda_nid_t nid) + struct hda_codec *codec, hda_nid_t nid, + int *supports_vref) { static char *jack_conns[4] = { "Jack", "N/A", "Fixed", "Both" }; static char *jack_types[16] = { @@ -226,7 +227,35 @@ static void print_pin_caps(struct snd_in snd_iprintf(buffer, " EAPD"); if (caps & AC_PINCAP_PRES_DETECT) snd_iprintf(buffer, " Detect"); - snd_iprintf(buffer, "\n"); + if (caps & AC_PINCAP_BALANCE) + snd_iprintf(buffer, " Balanced"); + if (caps & AC_PINCAP_LR_SWAP) + snd_iprintf(buffer, " R/L"); + if (caps & AC_PINCAP_TRIG_REQ) + snd_iprintf(buffer, " Trigger"); + if (caps & AC_PINCAP_IMP_SENSE) + snd_iprintf(buffer, " ImpSense"); + snd_iprintf(buffer, "\n"); + if (caps & AC_PINCAP_VREF) { + unsigned int vref = + (caps & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; + snd_iprintf(buffer, " Vref:"); + if (vref & AC_PINCAP_VREF_HIZ) + snd_iprintf(buffer, " HIZ"); + if (vref & AC_PINCAP_VREF_50) + snd_iprintf(buffer, " 50"); + if (vref & AC_PINCAP_VREF_GRD) + snd_iprintf(buffer, " GRD"); + if (vref & AC_PINCAP_VREF_80) + snd_iprintf(buffer, " 80"); + if (vref & AC_PINCAP_VREF_100) + snd_iprintf(buffer, " 100"); + snd_iprintf(buffer, "\n"); + *supports_vref = 1; + } + else { + *supports_vref = 0; + } caps = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); snd_iprintf(buffer, " Pin Default 0x%08x: [%s] %s at %s %s\n", caps, jack_conns[(caps & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT], @@ -330,8 +359,9 @@ static void print_codec_info(struct snd_ }
switch (wid_type) { - case AC_WID_PIN: - print_pin_caps(buffer, codec, nid); + case AC_WID_PIN: { + int supports_vref; + print_pin_caps(buffer, codec, nid, &supports_vref); pinctls = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); @@ -342,8 +372,29 @@ static void print_codec_info(struct snd_ snd_iprintf(buffer, " OUT"); if (pinctls & AC_PINCTL_HP_EN) snd_iprintf(buffer, " HP"); + if (supports_vref) { + int vref = pinctls & AC_PINCTL_VREFEN; + switch (vref) { + case AC_PINCTL_VREF_HIZ: + snd_iprintf(buffer, " VREF_HIZ"); + break; + case AC_PINCTL_VREF_50: + snd_iprintf(buffer, " VREF_50"); + break; + case AC_PINCTL_VREF_GRD: + snd_iprintf(buffer, " VREF_GRD"); + break; + case AC_PINCTL_VREF_80: + snd_iprintf(buffer, " VREF_80"); + break; + case AC_PINCTL_VREF_100: + snd_iprintf(buffer, " VREF_100"); + break; + } + } snd_iprintf(buffer, "\n"); break; + } case AC_WID_VOL_KNB: pinctls = snd_hda_param_read(codec, nid, AC_PAR_VOL_KNB_CAP); @@ -386,6 +437,31 @@ static void print_codec_info(struct snd_ snd_iprintf(buffer, "\n"); } } + + if (wid_caps & AC_WCAP_PROC_WID) { + unsigned int proc_caps = + snd_hda_param_read(codec, nid, + AC_PAR_PROC_CAP); + snd_iprintf(buffer, + " Processing Caps: benign=%d ncoeff=%d\n", + proc_caps & AC_PCAP_BENIGN, + (proc_caps & AC_PCAP_NUM_COEF) >> + AC_PCAP_NUM_COEF_SHIFT); + } + + /* NID 0x20 == Realtek Define Registers */ + if (codec->vendor_id == 0x10ec && nid == 0x20) { + int coeff = + snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PROC_COEF, 0); + snd_iprintf(buffer, + " Processing Coefficient: 0x%02x\n", + coeff); + coeff = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_COEF_INDEX, 0); + snd_iprintf(buffer, + " Coefficient Index: 0x%02x\n", coeff); + } } snd_hda_power_down(codec); }