[alsa-devel] [PATCH] hda_proc - Add output of Vref, additional pcaps, and proccaps to proc output

Takashi Iwai tiwai at suse.de
Thu Jan 17 17:58:10 CET 2008


At Thu, 17 Jan 2008 09:46:06 -0400,
Andrew Paprocki wrote:
> 
> 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 at ishiboo.com>

Did you check whether this doesn't break Claudio's codecgraph parser?
If it's OK, I'd like to apply it, of course...


Takashi


> 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);
>  }
> 


More information about the Alsa-devel mailing list