2 * Universal Interface for Intel High Definition Audio Codec
4 * Generic proc interface
6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
9 * This driver is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This driver is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include <linux/init.h>
25 #include <sound/core.h>
26 #include "hda_codec.h"
27 #include "hda_local.h"
29 static const char *get_wid_type_name(unsigned int wid_value
)
31 static char *names
[16] = {
32 [AC_WID_AUD_OUT
] = "Audio Output",
33 [AC_WID_AUD_IN
] = "Audio Input",
34 [AC_WID_AUD_MIX
] = "Audio Mixer",
35 [AC_WID_AUD_SEL
] = "Audio Selector",
36 [AC_WID_PIN
] = "Pin Complex",
37 [AC_WID_POWER
] = "Power Widget",
38 [AC_WID_VOL_KNB
] = "Volume Knob Widget",
39 [AC_WID_BEEP
] = "Beep Generator Widget",
40 [AC_WID_VENDOR
] = "Vendor Defined Widget",
44 return names
[wid_value
];
46 return "UNKNOWN Widget";
49 static void print_amp_caps(struct snd_info_buffer
*buffer
,
50 struct hda_codec
*codec
, hda_nid_t nid
, int dir
)
53 caps
= snd_hda_param_read(codec
, nid
,
55 AC_PAR_AMP_OUT_CAP
: AC_PAR_AMP_IN_CAP
);
56 if (caps
== -1 || caps
== 0) {
57 snd_iprintf(buffer
, "N/A\n");
60 snd_iprintf(buffer
, "ofs=0x%02x, nsteps=0x%02x, stepsize=0x%02x, "
62 caps
& AC_AMPCAP_OFFSET
,
63 (caps
& AC_AMPCAP_NUM_STEPS
) >> AC_AMPCAP_NUM_STEPS_SHIFT
,
64 (caps
& AC_AMPCAP_STEP_SIZE
) >> AC_AMPCAP_STEP_SIZE_SHIFT
,
65 (caps
& AC_AMPCAP_MUTE
) >> AC_AMPCAP_MUTE_SHIFT
);
68 static void print_amp_vals(struct snd_info_buffer
*buffer
,
69 struct hda_codec
*codec
, hda_nid_t nid
,
70 int dir
, int stereo
, int indices
)
75 dir
= dir
== HDA_OUTPUT
? AC_AMP_GET_OUTPUT
: AC_AMP_GET_INPUT
;
76 for (i
= 0; i
< indices
; i
++) {
77 snd_iprintf(buffer
, " [");
79 val
= snd_hda_codec_read(codec
, nid
, 0,
80 AC_VERB_GET_AMP_GAIN_MUTE
,
81 AC_AMP_GET_LEFT
| dir
| i
);
82 snd_iprintf(buffer
, "0x%02x ", val
);
84 val
= snd_hda_codec_read(codec
, nid
, 0,
85 AC_VERB_GET_AMP_GAIN_MUTE
,
86 AC_AMP_GET_RIGHT
| dir
| i
);
87 snd_iprintf(buffer
, "0x%02x]", val
);
89 snd_iprintf(buffer
, "\n");
92 static void print_pcm_rates(struct snd_info_buffer
*buffer
, unsigned int pcm
)
94 char buf
[SND_PRINT_RATES_ADVISED_BUFSIZE
];
96 pcm
&= AC_SUPPCM_RATES
;
97 snd_iprintf(buffer
, " rates [0x%x]:", pcm
);
98 snd_print_pcm_rates(pcm
, buf
, sizeof(buf
));
99 snd_iprintf(buffer
, "%s\n", buf
);
102 static void print_pcm_bits(struct snd_info_buffer
*buffer
, unsigned int pcm
)
104 char buf
[SND_PRINT_BITS_ADVISED_BUFSIZE
];
106 snd_iprintf(buffer
, " bits [0x%x]:", (pcm
>> 16) & 0xff);
107 snd_print_pcm_bits(pcm
, buf
, sizeof(buf
));
108 snd_iprintf(buffer
, "%s\n", buf
);
111 static void print_pcm_formats(struct snd_info_buffer
*buffer
,
112 unsigned int streams
)
114 snd_iprintf(buffer
, " formats [0x%x]:", streams
& 0xf);
115 if (streams
& AC_SUPFMT_PCM
)
116 snd_iprintf(buffer
, " PCM");
117 if (streams
& AC_SUPFMT_FLOAT32
)
118 snd_iprintf(buffer
, " FLOAT");
119 if (streams
& AC_SUPFMT_AC3
)
120 snd_iprintf(buffer
, " AC3");
121 snd_iprintf(buffer
, "\n");
124 static void print_pcm_caps(struct snd_info_buffer
*buffer
,
125 struct hda_codec
*codec
, hda_nid_t nid
)
127 unsigned int pcm
= snd_hda_param_read(codec
, nid
, AC_PAR_PCM
);
128 unsigned int stream
= snd_hda_param_read(codec
, nid
, AC_PAR_STREAM
);
129 if (pcm
== -1 || stream
== -1) {
130 snd_iprintf(buffer
, "N/A\n");
133 print_pcm_rates(buffer
, pcm
);
134 print_pcm_bits(buffer
, pcm
);
135 print_pcm_formats(buffer
, stream
);
138 static const char *get_jack_connection(u32 cfg
)
140 static char *names
[16] = {
141 "Unknown", "1/8", "1/4", "ATAPI",
142 "RCA", "Optical","Digital", "Analog",
143 "DIN", "XLR", "RJ11", "Comb",
144 NULL
, NULL
, NULL
, "Other"
146 cfg
= (cfg
& AC_DEFCFG_CONN_TYPE
) >> AC_DEFCFG_CONN_TYPE_SHIFT
;
153 static const char *get_jack_color(u32 cfg
)
155 static char *names
[16] = {
156 "Unknown", "Black", "Grey", "Blue",
157 "Green", "Red", "Orange", "Yellow",
158 "Purple", "Pink", NULL
, NULL
,
159 NULL
, NULL
, "White", "Other",
161 cfg
= (cfg
& AC_DEFCFG_COLOR
) >> AC_DEFCFG_COLOR_SHIFT
;
168 static void print_pin_caps(struct snd_info_buffer
*buffer
,
169 struct hda_codec
*codec
, hda_nid_t nid
,
172 static char *jack_conns
[4] = { "Jack", "N/A", "Fixed", "Both" };
173 unsigned int caps
, val
;
175 caps
= snd_hda_param_read(codec
, nid
, AC_PAR_PIN_CAP
);
176 snd_iprintf(buffer
, " Pincap 0x%08x:", caps
);
177 if (caps
& AC_PINCAP_IN
)
178 snd_iprintf(buffer
, " IN");
179 if (caps
& AC_PINCAP_OUT
)
180 snd_iprintf(buffer
, " OUT");
181 if (caps
& AC_PINCAP_HP_DRV
)
182 snd_iprintf(buffer
, " HP");
183 if (caps
& AC_PINCAP_EAPD
)
184 snd_iprintf(buffer
, " EAPD");
185 if (caps
& AC_PINCAP_PRES_DETECT
)
186 snd_iprintf(buffer
, " Detect");
187 if (caps
& AC_PINCAP_BALANCE
)
188 snd_iprintf(buffer
, " Balanced");
189 if (caps
& AC_PINCAP_HDMI
) {
190 /* Realtek uses this bit as a different meaning */
191 if ((codec
->vendor_id
>> 16) == 0x10ec)
192 snd_iprintf(buffer
, " R/L");
194 snd_iprintf(buffer
, " HDMI");
196 if (caps
& AC_PINCAP_TRIG_REQ
)
197 snd_iprintf(buffer
, " Trigger");
198 if (caps
& AC_PINCAP_IMP_SENSE
)
199 snd_iprintf(buffer
, " ImpSense");
200 snd_iprintf(buffer
, "\n");
201 if (caps
& AC_PINCAP_VREF
) {
203 (caps
& AC_PINCAP_VREF
) >> AC_PINCAP_VREF_SHIFT
;
204 snd_iprintf(buffer
, " Vref caps:");
205 if (vref
& AC_PINCAP_VREF_HIZ
)
206 snd_iprintf(buffer
, " HIZ");
207 if (vref
& AC_PINCAP_VREF_50
)
208 snd_iprintf(buffer
, " 50");
209 if (vref
& AC_PINCAP_VREF_GRD
)
210 snd_iprintf(buffer
, " GRD");
211 if (vref
& AC_PINCAP_VREF_80
)
212 snd_iprintf(buffer
, " 80");
213 if (vref
& AC_PINCAP_VREF_100
)
214 snd_iprintf(buffer
, " 100");
215 snd_iprintf(buffer
, "\n");
219 if (caps
& AC_PINCAP_EAPD
) {
220 val
= snd_hda_codec_read(codec
, nid
, 0,
221 AC_VERB_GET_EAPD_BTLENABLE
, 0);
222 snd_iprintf(buffer
, " EAPD 0x%x:", val
);
223 if (val
& AC_EAPDBTL_BALANCED
)
224 snd_iprintf(buffer
, " BALANCED");
225 if (val
& AC_EAPDBTL_EAPD
)
226 snd_iprintf(buffer
, " EAPD");
227 if (val
& AC_EAPDBTL_LR_SWAP
)
228 snd_iprintf(buffer
, " R/L");
229 snd_iprintf(buffer
, "\n");
231 caps
= snd_hda_codec_read(codec
, nid
, 0, AC_VERB_GET_CONFIG_DEFAULT
, 0);
232 snd_iprintf(buffer
, " Pin Default 0x%08x: [%s] %s at %s %s\n", caps
,
233 jack_conns
[(caps
& AC_DEFCFG_PORT_CONN
) >> AC_DEFCFG_PORT_CONN_SHIFT
],
234 snd_hda_get_jack_type(caps
),
235 snd_hda_get_jack_connectivity(caps
),
236 snd_hda_get_jack_location(caps
));
237 snd_iprintf(buffer
, " Conn = %s, Color = %s\n",
238 get_jack_connection(caps
),
239 get_jack_color(caps
));
240 /* Default association and sequence values refer to default grouping
241 * of pin complexes and their sequence within the group. This is used
242 * for priority and resource allocation.
244 snd_iprintf(buffer
, " DefAssociation = 0x%x, Sequence = 0x%x\n",
245 (caps
& AC_DEFCFG_DEF_ASSOC
) >> AC_DEFCFG_ASSOC_SHIFT
,
246 caps
& AC_DEFCFG_SEQUENCE
);
247 if (((caps
& AC_DEFCFG_MISC
) >> AC_DEFCFG_MISC_SHIFT
) &
248 AC_DEFCFG_MISC_NO_PRESENCE
) {
249 /* Miscellaneous bit indicates external hardware does not
250 * support presence detection even if the pin complex
251 * indicates it is supported.
253 snd_iprintf(buffer
, " Misc = NO_PRESENCE\n");
257 static void print_pin_ctls(struct snd_info_buffer
*buffer
,
258 struct hda_codec
*codec
, hda_nid_t nid
,
261 unsigned int pinctls
;
263 pinctls
= snd_hda_codec_read(codec
, nid
, 0,
264 AC_VERB_GET_PIN_WIDGET_CONTROL
, 0);
265 snd_iprintf(buffer
, " Pin-ctls: 0x%02x:", pinctls
);
266 if (pinctls
& AC_PINCTL_IN_EN
)
267 snd_iprintf(buffer
, " IN");
268 if (pinctls
& AC_PINCTL_OUT_EN
)
269 snd_iprintf(buffer
, " OUT");
270 if (pinctls
& AC_PINCTL_HP_EN
)
271 snd_iprintf(buffer
, " HP");
273 int vref
= pinctls
& AC_PINCTL_VREFEN
;
275 case AC_PINCTL_VREF_HIZ
:
276 snd_iprintf(buffer
, " VREF_HIZ");
278 case AC_PINCTL_VREF_50
:
279 snd_iprintf(buffer
, " VREF_50");
281 case AC_PINCTL_VREF_GRD
:
282 snd_iprintf(buffer
, " VREF_GRD");
284 case AC_PINCTL_VREF_80
:
285 snd_iprintf(buffer
, " VREF_80");
287 case AC_PINCTL_VREF_100
:
288 snd_iprintf(buffer
, " VREF_100");
292 snd_iprintf(buffer
, "\n");
295 static void print_vol_knob(struct snd_info_buffer
*buffer
,
296 struct hda_codec
*codec
, hda_nid_t nid
)
298 unsigned int cap
= snd_hda_param_read(codec
, nid
,
300 snd_iprintf(buffer
, " Volume-Knob: delta=%d, steps=%d, ",
301 (cap
>> 7) & 1, cap
& 0x7f);
302 cap
= snd_hda_codec_read(codec
, nid
, 0,
303 AC_VERB_GET_VOLUME_KNOB_CONTROL
, 0);
304 snd_iprintf(buffer
, "direct=%d, val=%d\n",
305 (cap
>> 7) & 1, cap
& 0x7f);
308 static void print_audio_io(struct snd_info_buffer
*buffer
,
309 struct hda_codec
*codec
, hda_nid_t nid
,
310 unsigned int wid_type
)
312 int conv
= snd_hda_codec_read(codec
, nid
, 0, AC_VERB_GET_CONV
, 0);
314 " Converter: stream=%d, channel=%d\n",
315 (conv
& AC_CONV_STREAM
) >> AC_CONV_STREAM_SHIFT
,
316 conv
& AC_CONV_CHANNEL
);
318 if (wid_type
== AC_WID_AUD_IN
&& (conv
& AC_CONV_CHANNEL
) == 0) {
319 int sdi
= snd_hda_codec_read(codec
, nid
, 0,
320 AC_VERB_GET_SDI_SELECT
, 0);
321 snd_iprintf(buffer
, " SDI-Select: %d\n",
322 sdi
& AC_SDI_SELECT
);
326 static void print_digital_conv(struct snd_info_buffer
*buffer
,
327 struct hda_codec
*codec
, hda_nid_t nid
)
329 unsigned int digi1
= snd_hda_codec_read(codec
, nid
, 0,
330 AC_VERB_GET_DIGI_CONVERT_1
, 0);
331 snd_iprintf(buffer
, " Digital:");
332 if (digi1
& AC_DIG1_ENABLE
)
333 snd_iprintf(buffer
, " Enabled");
334 if (digi1
& AC_DIG1_V
)
335 snd_iprintf(buffer
, " Validity");
336 if (digi1
& AC_DIG1_VCFG
)
337 snd_iprintf(buffer
, " ValidityCfg");
338 if (digi1
& AC_DIG1_EMPHASIS
)
339 snd_iprintf(buffer
, " Preemphasis");
340 if (digi1
& AC_DIG1_COPYRIGHT
)
341 snd_iprintf(buffer
, " Copyright");
342 if (digi1
& AC_DIG1_NONAUDIO
)
343 snd_iprintf(buffer
, " Non-Audio");
344 if (digi1
& AC_DIG1_PROFESSIONAL
)
345 snd_iprintf(buffer
, " Pro");
346 if (digi1
& AC_DIG1_LEVEL
)
347 snd_iprintf(buffer
, " GenLevel");
348 snd_iprintf(buffer
, "\n");
349 snd_iprintf(buffer
, " Digital category: 0x%x\n",
350 (digi1
>> 8) & AC_DIG2_CC
);
353 static const char *get_pwr_state(u32 state
)
355 static const char *buf
[4] = {
356 "D0", "D1", "D2", "D3"
363 static void print_power_state(struct snd_info_buffer
*buffer
,
364 struct hda_codec
*codec
, hda_nid_t nid
)
366 int pwr
= snd_hda_codec_read(codec
, nid
, 0,
367 AC_VERB_GET_POWER_STATE
, 0);
368 snd_iprintf(buffer
, " Power: setting=%s, actual=%s\n",
369 get_pwr_state(pwr
& AC_PWRST_SETTING
),
370 get_pwr_state((pwr
& AC_PWRST_ACTUAL
) >>
371 AC_PWRST_ACTUAL_SHIFT
));
374 static void print_unsol_cap(struct snd_info_buffer
*buffer
,
375 struct hda_codec
*codec
, hda_nid_t nid
)
377 int unsol
= snd_hda_codec_read(codec
, nid
, 0,
378 AC_VERB_GET_UNSOLICITED_RESPONSE
, 0);
380 " Unsolicited: tag=%02x, enabled=%d\n",
381 unsol
& AC_UNSOL_TAG
,
382 (unsol
& AC_UNSOL_ENABLED
) ? 1 : 0);
385 static void print_proc_caps(struct snd_info_buffer
*buffer
,
386 struct hda_codec
*codec
, hda_nid_t nid
)
388 unsigned int proc_caps
= snd_hda_param_read(codec
, nid
,
390 snd_iprintf(buffer
, " Processing caps: benign=%d, ncoeff=%d\n",
391 proc_caps
& AC_PCAP_BENIGN
,
392 (proc_caps
& AC_PCAP_NUM_COEF
) >> AC_PCAP_NUM_COEF_SHIFT
);
395 static void print_conn_list(struct snd_info_buffer
*buffer
,
396 struct hda_codec
*codec
, hda_nid_t nid
,
397 unsigned int wid_type
, hda_nid_t
*conn
,
403 wid_type
!= AC_WID_AUD_MIX
&&
404 wid_type
!= AC_WID_VOL_KNB
&&
405 wid_type
!= AC_WID_POWER
)
406 curr
= snd_hda_codec_read(codec
, nid
, 0,
407 AC_VERB_GET_CONNECT_SEL
, 0);
408 snd_iprintf(buffer
, " Connection: %d\n", conn_len
);
410 snd_iprintf(buffer
, " ");
411 for (c
= 0; c
< conn_len
; c
++) {
412 snd_iprintf(buffer
, " 0x%02x", conn
[c
]);
414 snd_iprintf(buffer
, "*");
416 snd_iprintf(buffer
, "\n");
420 static void print_gpio(struct snd_info_buffer
*buffer
,
421 struct hda_codec
*codec
, hda_nid_t nid
)
424 snd_hda_param_read(codec
, codec
->afg
, AC_PAR_GPIO_CAP
);
425 unsigned int enable
, direction
, wake
, unsol
, sticky
, data
;
427 snd_iprintf(buffer
, "GPIO: io=%d, o=%d, i=%d, "
428 "unsolicited=%d, wake=%d\n",
429 gpio
& AC_GPIO_IO_COUNT
,
430 (gpio
& AC_GPIO_O_COUNT
) >> AC_GPIO_O_COUNT_SHIFT
,
431 (gpio
& AC_GPIO_I_COUNT
) >> AC_GPIO_I_COUNT_SHIFT
,
432 (gpio
& AC_GPIO_UNSOLICITED
) ? 1 : 0,
433 (gpio
& AC_GPIO_WAKE
) ? 1 : 0);
434 max
= gpio
& AC_GPIO_IO_COUNT
;
437 enable
= snd_hda_codec_read(codec
, nid
, 0,
438 AC_VERB_GET_GPIO_MASK
, 0);
439 direction
= snd_hda_codec_read(codec
, nid
, 0,
440 AC_VERB_GET_GPIO_DIRECTION
, 0);
441 wake
= snd_hda_codec_read(codec
, nid
, 0,
442 AC_VERB_GET_GPIO_WAKE_MASK
, 0);
443 unsol
= snd_hda_codec_read(codec
, nid
, 0,
444 AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK
, 0);
445 sticky
= snd_hda_codec_read(codec
, nid
, 0,
446 AC_VERB_GET_GPIO_STICKY_MASK
, 0);
447 data
= snd_hda_codec_read(codec
, nid
, 0,
448 AC_VERB_GET_GPIO_DATA
, 0);
449 for (i
= 0; i
< max
; ++i
)
451 " IO[%d]: enable=%d, dir=%d, wake=%d, "
452 "sticky=%d, data=%d, unsol=%d\n", i
,
453 (enable
& (1<<i
)) ? 1 : 0,
454 (direction
& (1<<i
)) ? 1 : 0,
455 (wake
& (1<<i
)) ? 1 : 0,
456 (sticky
& (1<<i
)) ? 1 : 0,
457 (data
& (1<<i
)) ? 1 : 0,
458 (unsol
& (1<<i
)) ? 1 : 0);
459 /* FIXME: add GPO and GPI pin information */
462 static void print_codec_info(struct snd_info_entry
*entry
,
463 struct snd_info_buffer
*buffer
)
465 struct hda_codec
*codec
= entry
->private_data
;
469 snd_iprintf(buffer
, "Codec: ");
470 if (codec
->vendor_name
&& codec
->chip_name
)
471 snd_iprintf(buffer
, "%s %s\n",
472 codec
->vendor_name
, codec
->chip_name
);
474 snd_iprintf(buffer
, "Not Set\n");
475 snd_iprintf(buffer
, "Address: %d\n", codec
->addr
);
476 snd_iprintf(buffer
, "Function Id: 0x%x\n", codec
->function_id
);
477 snd_iprintf(buffer
, "Vendor Id: 0x%08x\n", codec
->vendor_id
);
478 snd_iprintf(buffer
, "Subsystem Id: 0x%08x\n", codec
->subsystem_id
);
479 snd_iprintf(buffer
, "Revision Id: 0x%x\n", codec
->revision_id
);
482 snd_iprintf(buffer
, "Modem Function Group: 0x%x\n", codec
->mfg
);
484 snd_iprintf(buffer
, "No Modem Function Group found\n");
488 snd_hda_power_up(codec
);
489 snd_iprintf(buffer
, "Default PCM:\n");
490 print_pcm_caps(buffer
, codec
, codec
->afg
);
491 snd_iprintf(buffer
, "Default Amp-In caps: ");
492 print_amp_caps(buffer
, codec
, codec
->afg
, HDA_INPUT
);
493 snd_iprintf(buffer
, "Default Amp-Out caps: ");
494 print_amp_caps(buffer
, codec
, codec
->afg
, HDA_OUTPUT
);
496 nodes
= snd_hda_get_sub_nodes(codec
, codec
->afg
, &nid
);
497 if (! nid
|| nodes
< 0) {
498 snd_iprintf(buffer
, "Invalid AFG subtree\n");
499 snd_hda_power_down(codec
);
503 print_gpio(buffer
, codec
, codec
->afg
);
504 if (codec
->proc_widget_hook
)
505 codec
->proc_widget_hook(buffer
, codec
, codec
->afg
);
507 for (i
= 0; i
< nodes
; i
++, nid
++) {
508 unsigned int wid_caps
=
509 snd_hda_param_read(codec
, nid
,
510 AC_PAR_AUDIO_WIDGET_CAP
);
511 unsigned int wid_type
= get_wcaps_type(wid_caps
);
512 hda_nid_t conn
[HDA_MAX_CONNECTIONS
];
515 snd_iprintf(buffer
, "Node 0x%02x [%s] wcaps 0x%x:", nid
,
516 get_wid_type_name(wid_type
), wid_caps
);
517 if (wid_caps
& AC_WCAP_STEREO
) {
518 unsigned int chans
= get_wcaps_channels(wid_caps
);
520 snd_iprintf(buffer
, " Stereo");
522 snd_iprintf(buffer
, " %d-Channels", chans
);
524 snd_iprintf(buffer
, " Mono");
525 if (wid_caps
& AC_WCAP_DIGITAL
)
526 snd_iprintf(buffer
, " Digital");
527 if (wid_caps
& AC_WCAP_IN_AMP
)
528 snd_iprintf(buffer
, " Amp-In");
529 if (wid_caps
& AC_WCAP_OUT_AMP
)
530 snd_iprintf(buffer
, " Amp-Out");
531 if (wid_caps
& AC_WCAP_STRIPE
)
532 snd_iprintf(buffer
, " Stripe");
533 if (wid_caps
& AC_WCAP_LR_SWAP
)
534 snd_iprintf(buffer
, " R/L");
535 if (wid_caps
& AC_WCAP_CP_CAPS
)
536 snd_iprintf(buffer
, " CP");
537 snd_iprintf(buffer
, "\n");
539 /* volume knob is a special widget that always have connection
542 if (wid_type
== AC_WID_VOL_KNB
)
543 wid_caps
|= AC_WCAP_CONN_LIST
;
545 if (wid_caps
& AC_WCAP_CONN_LIST
)
546 conn_len
= snd_hda_get_connections(codec
, nid
, conn
,
547 HDA_MAX_CONNECTIONS
);
549 if (wid_caps
& AC_WCAP_IN_AMP
) {
550 snd_iprintf(buffer
, " Amp-In caps: ");
551 print_amp_caps(buffer
, codec
, nid
, HDA_INPUT
);
552 snd_iprintf(buffer
, " Amp-In vals: ");
553 print_amp_vals(buffer
, codec
, nid
, HDA_INPUT
,
554 wid_caps
& AC_WCAP_STEREO
,
555 wid_type
== AC_WID_PIN
? 1 : conn_len
);
557 if (wid_caps
& AC_WCAP_OUT_AMP
) {
558 snd_iprintf(buffer
, " Amp-Out caps: ");
559 print_amp_caps(buffer
, codec
, nid
, HDA_OUTPUT
);
560 snd_iprintf(buffer
, " Amp-Out vals: ");
561 if (wid_type
== AC_WID_PIN
&&
562 codec
->pin_amp_workaround
)
563 print_amp_vals(buffer
, codec
, nid
, HDA_OUTPUT
,
564 wid_caps
& AC_WCAP_STEREO
,
567 print_amp_vals(buffer
, codec
, nid
, HDA_OUTPUT
,
568 wid_caps
& AC_WCAP_STEREO
, 1);
574 print_pin_caps(buffer
, codec
, nid
, &supports_vref
);
575 print_pin_ctls(buffer
, codec
, nid
, supports_vref
);
579 print_vol_knob(buffer
, codec
, nid
);
583 print_audio_io(buffer
, codec
, nid
, wid_type
);
584 if (wid_caps
& AC_WCAP_DIGITAL
)
585 print_digital_conv(buffer
, codec
, nid
);
586 if (wid_caps
& AC_WCAP_FORMAT_OVRD
) {
587 snd_iprintf(buffer
, " PCM:\n");
588 print_pcm_caps(buffer
, codec
, nid
);
593 if (wid_caps
& AC_WCAP_UNSOL_CAP
)
594 print_unsol_cap(buffer
, codec
, nid
);
596 if (wid_caps
& AC_WCAP_POWER
)
597 print_power_state(buffer
, codec
, nid
);
599 if (wid_caps
& AC_WCAP_DELAY
)
600 snd_iprintf(buffer
, " Delay: %d samples\n",
601 (wid_caps
& AC_WCAP_DELAY
) >>
602 AC_WCAP_DELAY_SHIFT
);
604 if (wid_caps
& AC_WCAP_CONN_LIST
)
605 print_conn_list(buffer
, codec
, nid
, wid_type
,
608 if (wid_caps
& AC_WCAP_PROC_WID
)
609 print_proc_caps(buffer
, codec
, nid
);
611 if (codec
->proc_widget_hook
)
612 codec
->proc_widget_hook(buffer
, codec
, nid
);
614 snd_hda_power_down(codec
);
620 int snd_hda_codec_proc_new(struct hda_codec
*codec
)
623 struct snd_info_entry
*entry
;
626 snprintf(name
, sizeof(name
), "codec#%d", codec
->addr
);
627 err
= snd_card_proc_new(codec
->bus
->card
, name
, &entry
);
631 snd_info_set_text_ops(entry
, codec
, print_codec_info
);