1 /* 2 * Universal Interface for Intel High Definition Audio Codec 3 * 4 * Generic proc interface 5 * 6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de> 7 * 8 * 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. 13 * 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. 18 * 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 22 */ 23 24 #include <linux/init.h> 25 #include <linux/slab.h> 26 #include <sound/core.h> 27 #include "hda_codec.h" 28 #include "hda_local.h" 29 30 static char *bits_names(unsigned int bits, char *names[], int size) 31 { 32 int i, n; 33 static char buf[128]; 34 35 for (i = 0, n = 0; i < size; i++) { 36 if (bits & (1U<<i) && names[i]) 37 n += snprintf(buf + n, sizeof(buf) - n, " %s", 38 names[i]); 39 } 40 buf[n] = '\0'; 41 42 return buf; 43 } 44 45 static const char *get_wid_type_name(unsigned int wid_value) 46 { 47 static char *names[16] = { 48 [AC_WID_AUD_OUT] = "Audio Output", 49 [AC_WID_AUD_IN] = "Audio Input", 50 [AC_WID_AUD_MIX] = "Audio Mixer", 51 [AC_WID_AUD_SEL] = "Audio Selector", 52 [AC_WID_PIN] = "Pin Complex", 53 [AC_WID_POWER] = "Power Widget", 54 [AC_WID_VOL_KNB] = "Volume Knob Widget", 55 [AC_WID_BEEP] = "Beep Generator Widget", 56 [AC_WID_VENDOR] = "Vendor Defined Widget", 57 }; 58 if (wid_value == -1) 59 return "UNKNOWN Widget"; 60 wid_value &= 0xf; 61 if (names[wid_value]) 62 return names[wid_value]; 63 else 64 return "UNKNOWN Widget"; 65 } 66 67 static void print_nid_array(struct snd_info_buffer *buffer, 68 struct hda_codec *codec, hda_nid_t nid, 69 struct snd_array *array) 70 { 71 int i; 72 struct hda_nid_item *items = array->list, *item; 73 struct snd_kcontrol *kctl; 74 for (i = 0; i < array->used; i++) { 75 item = &items[i]; 76 if (item->nid == nid) { 77 kctl = item->kctl; 78 snd_iprintf(buffer, 79 " Control: name=\"%s\", index=%i, device=%i\n", 80 kctl->id.name, kctl->id.index + item->index, 81 kctl->id.device); 82 if (item->flags & HDA_NID_ITEM_AMP) 83 snd_iprintf(buffer, 84 " ControlAmp: chs=%lu, dir=%s, " 85 "idx=%lu, ofs=%lu\n", 86 get_amp_channels(kctl), 87 get_amp_direction(kctl) ? "Out" : "In", 88 get_amp_index(kctl), 89 get_amp_offset(kctl)); 90 } 91 } 92 } 93 94 static void print_nid_pcms(struct snd_info_buffer *buffer, 95 struct hda_codec *codec, hda_nid_t nid) 96 { 97 int pcm, type; 98 struct hda_pcm *cpcm; 99 for (pcm = 0; pcm < codec->num_pcms; pcm++) { 100 cpcm = &codec->pcm_info[pcm]; 101 for (type = 0; type < 2; type++) { 102 if (cpcm->stream[type].nid != nid || cpcm->pcm == NULL) 103 continue; 104 snd_iprintf(buffer, " Device: name=\"%s\", " 105 "type=\"%s\", device=%i\n", 106 cpcm->name, 107 snd_hda_pcm_type_name[cpcm->pcm_type], 108 cpcm->pcm->device); 109 } 110 } 111 } 112 113 static void print_amp_caps(struct snd_info_buffer *buffer, 114 struct hda_codec *codec, hda_nid_t nid, int dir) 115 { 116 unsigned int caps; 117 caps = snd_hda_param_read(codec, nid, 118 dir == HDA_OUTPUT ? 119 AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP); 120 if (caps == -1 || caps == 0) { 121 snd_iprintf(buffer, "N/A\n"); 122 return; 123 } 124 snd_iprintf(buffer, "ofs=0x%02x, nsteps=0x%02x, stepsize=0x%02x, " 125 "mute=%x\n", 126 caps & AC_AMPCAP_OFFSET, 127 (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT, 128 (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT, 129 (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT); 130 } 131 132 static void print_amp_vals(struct snd_info_buffer *buffer, 133 struct hda_codec *codec, hda_nid_t nid, 134 int dir, int stereo, int indices) 135 { 136 unsigned int val; 137 int i; 138 139 dir = dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : AC_AMP_GET_INPUT; 140 for (i = 0; i < indices; i++) { 141 snd_iprintf(buffer, " ["); 142 val = snd_hda_codec_read(codec, nid, 0, 143 AC_VERB_GET_AMP_GAIN_MUTE, 144 AC_AMP_GET_LEFT | dir | i); 145 snd_iprintf(buffer, "0x%02x", val); 146 if (stereo) { 147 val = snd_hda_codec_read(codec, nid, 0, 148 AC_VERB_GET_AMP_GAIN_MUTE, 149 AC_AMP_GET_RIGHT | dir | i); 150 snd_iprintf(buffer, " 0x%02x", val); 151 } 152 snd_iprintf(buffer, "]"); 153 } 154 snd_iprintf(buffer, "\n"); 155 } 156 157 static void print_pcm_rates(struct snd_info_buffer *buffer, unsigned int pcm) 158 { 159 static unsigned int rates[] = { 160 8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 161 96000, 176400, 192000, 384000 162 }; 163 int i; 164 165 pcm &= AC_SUPPCM_RATES; 166 snd_iprintf(buffer, " rates [0x%x]:", pcm); 167 for (i = 0; i < ARRAY_SIZE(rates); i++) 168 if (pcm & (1 << i)) 169 snd_iprintf(buffer, " %d", rates[i]); 170 snd_iprintf(buffer, "\n"); 171 } 172 173 static void print_pcm_bits(struct snd_info_buffer *buffer, unsigned int pcm) 174 { 175 char buf[SND_PRINT_BITS_ADVISED_BUFSIZE]; 176 177 snd_iprintf(buffer, " bits [0x%x]:", (pcm >> 16) & 0xff); 178 snd_print_pcm_bits(pcm, buf, sizeof(buf)); 179 snd_iprintf(buffer, "%s\n", buf); 180 } 181 182 static void print_pcm_formats(struct snd_info_buffer *buffer, 183 unsigned int streams) 184 { 185 snd_iprintf(buffer, " formats [0x%x]:", streams & 0xf); 186 if (streams & AC_SUPFMT_PCM) 187 snd_iprintf(buffer, " PCM"); 188 if (streams & AC_SUPFMT_FLOAT32) 189 snd_iprintf(buffer, " FLOAT"); 190 if (streams & AC_SUPFMT_AC3) 191 snd_iprintf(buffer, " AC3"); 192 snd_iprintf(buffer, "\n"); 193 } 194 195 static void print_pcm_caps(struct snd_info_buffer *buffer, 196 struct hda_codec *codec, hda_nid_t nid) 197 { 198 unsigned int pcm = snd_hda_param_read(codec, nid, AC_PAR_PCM); 199 unsigned int stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); 200 if (pcm == -1 || stream == -1) { 201 snd_iprintf(buffer, "N/A\n"); 202 return; 203 } 204 print_pcm_rates(buffer, pcm); 205 print_pcm_bits(buffer, pcm); 206 print_pcm_formats(buffer, stream); 207 } 208 209 static const char *get_jack_connection(u32 cfg) 210 { 211 static char *names[16] = { 212 "Unknown", "1/8", "1/4", "ATAPI", 213 "RCA", "Optical","Digital", "Analog", 214 "DIN", "XLR", "RJ11", "Comb", 215 NULL, NULL, NULL, "Other" 216 }; 217 cfg = (cfg & AC_DEFCFG_CONN_TYPE) >> AC_DEFCFG_CONN_TYPE_SHIFT; 218 if (names[cfg]) 219 return names[cfg]; 220 else 221 return "UNKNOWN"; 222 } 223 224 static const char *get_jack_color(u32 cfg) 225 { 226 static char *names[16] = { 227 "Unknown", "Black", "Grey", "Blue", 228 "Green", "Red", "Orange", "Yellow", 229 "Purple", "Pink", NULL, NULL, 230 NULL, NULL, "White", "Other", 231 }; 232 cfg = (cfg & AC_DEFCFG_COLOR) >> AC_DEFCFG_COLOR_SHIFT; 233 if (names[cfg]) 234 return names[cfg]; 235 else 236 return "UNKNOWN"; 237 } 238 239 static void print_pin_caps(struct snd_info_buffer *buffer, 240 struct hda_codec *codec, hda_nid_t nid, 241 int *supports_vref) 242 { 243 static char *jack_conns[4] = { "Jack", "N/A", "Fixed", "Both" }; 244 unsigned int caps, val; 245 246 caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); 247 snd_iprintf(buffer, " Pincap 0x%08x:", caps); 248 if (caps & AC_PINCAP_IN) 249 snd_iprintf(buffer, " IN"); 250 if (caps & AC_PINCAP_OUT) 251 snd_iprintf(buffer, " OUT"); 252 if (caps & AC_PINCAP_HP_DRV) 253 snd_iprintf(buffer, " HP"); 254 if (caps & AC_PINCAP_EAPD) 255 snd_iprintf(buffer, " EAPD"); 256 if (caps & AC_PINCAP_PRES_DETECT) 257 snd_iprintf(buffer, " Detect"); 258 if (caps & AC_PINCAP_BALANCE) 259 snd_iprintf(buffer, " Balanced"); 260 if (caps & AC_PINCAP_HDMI) { 261 /* Realtek uses this bit as a different meaning */ 262 if ((codec->vendor_id >> 16) == 0x10ec) 263 snd_iprintf(buffer, " R/L"); 264 else { 265 if (caps & AC_PINCAP_HBR) 266 snd_iprintf(buffer, " HBR"); 267 snd_iprintf(buffer, " HDMI"); 268 } 269 } 270 if (caps & AC_PINCAP_DP) 271 snd_iprintf(buffer, " DP"); 272 if (caps & AC_PINCAP_TRIG_REQ) 273 snd_iprintf(buffer, " Trigger"); 274 if (caps & AC_PINCAP_IMP_SENSE) 275 snd_iprintf(buffer, " ImpSense"); 276 snd_iprintf(buffer, "\n"); 277 if (caps & AC_PINCAP_VREF) { 278 unsigned int vref = 279 (caps & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; 280 snd_iprintf(buffer, " Vref caps:"); 281 if (vref & AC_PINCAP_VREF_HIZ) 282 snd_iprintf(buffer, " HIZ"); 283 if (vref & AC_PINCAP_VREF_50) 284 snd_iprintf(buffer, " 50"); 285 if (vref & AC_PINCAP_VREF_GRD) 286 snd_iprintf(buffer, " GRD"); 287 if (vref & AC_PINCAP_VREF_80) 288 snd_iprintf(buffer, " 80"); 289 if (vref & AC_PINCAP_VREF_100) 290 snd_iprintf(buffer, " 100"); 291 snd_iprintf(buffer, "\n"); 292 *supports_vref = 1; 293 } else 294 *supports_vref = 0; 295 if (caps & AC_PINCAP_EAPD) { 296 val = snd_hda_codec_read(codec, nid, 0, 297 AC_VERB_GET_EAPD_BTLENABLE, 0); 298 snd_iprintf(buffer, " EAPD 0x%x:", val); 299 if (val & AC_EAPDBTL_BALANCED) 300 snd_iprintf(buffer, " BALANCED"); 301 if (val & AC_EAPDBTL_EAPD) 302 snd_iprintf(buffer, " EAPD"); 303 if (val & AC_EAPDBTL_LR_SWAP) 304 snd_iprintf(buffer, " R/L"); 305 snd_iprintf(buffer, "\n"); 306 } 307 caps = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); 308 snd_iprintf(buffer, " Pin Default 0x%08x: [%s] %s at %s %s\n", caps, 309 jack_conns[(caps & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT], 310 snd_hda_get_jack_type(caps), 311 snd_hda_get_jack_connectivity(caps), 312 snd_hda_get_jack_location(caps)); 313 snd_iprintf(buffer, " Conn = %s, Color = %s\n", 314 get_jack_connection(caps), 315 get_jack_color(caps)); 316 /* Default association and sequence values refer to default grouping 317 * of pin complexes and their sequence within the group. This is used 318 * for priority and resource allocation. 319 */ 320 snd_iprintf(buffer, " DefAssociation = 0x%x, Sequence = 0x%x\n", 321 (caps & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT, 322 caps & AC_DEFCFG_SEQUENCE); 323 if (((caps & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT) & 324 AC_DEFCFG_MISC_NO_PRESENCE) { 325 /* Miscellaneous bit indicates external hardware does not 326 * support presence detection even if the pin complex 327 * indicates it is supported. 328 */ 329 snd_iprintf(buffer, " Misc = NO_PRESENCE\n"); 330 } 331 } 332 333 static void print_pin_ctls(struct snd_info_buffer *buffer, 334 struct hda_codec *codec, hda_nid_t nid, 335 int supports_vref) 336 { 337 unsigned int pinctls; 338 339 pinctls = snd_hda_codec_read(codec, nid, 0, 340 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 341 snd_iprintf(buffer, " Pin-ctls: 0x%02x:", pinctls); 342 if (pinctls & AC_PINCTL_IN_EN) 343 snd_iprintf(buffer, " IN"); 344 if (pinctls & AC_PINCTL_OUT_EN) 345 snd_iprintf(buffer, " OUT"); 346 if (pinctls & AC_PINCTL_HP_EN) 347 snd_iprintf(buffer, " HP"); 348 if (supports_vref) { 349 int vref = pinctls & AC_PINCTL_VREFEN; 350 switch (vref) { 351 case AC_PINCTL_VREF_HIZ: 352 snd_iprintf(buffer, " VREF_HIZ"); 353 break; 354 case AC_PINCTL_VREF_50: 355 snd_iprintf(buffer, " VREF_50"); 356 break; 357 case AC_PINCTL_VREF_GRD: 358 snd_iprintf(buffer, " VREF_GRD"); 359 break; 360 case AC_PINCTL_VREF_80: 361 snd_iprintf(buffer, " VREF_80"); 362 break; 363 case AC_PINCTL_VREF_100: 364 snd_iprintf(buffer, " VREF_100"); 365 break; 366 } 367 } 368 snd_iprintf(buffer, "\n"); 369 } 370 371 static void print_vol_knob(struct snd_info_buffer *buffer, 372 struct hda_codec *codec, hda_nid_t nid) 373 { 374 unsigned int cap = snd_hda_param_read(codec, nid, 375 AC_PAR_VOL_KNB_CAP); 376 snd_iprintf(buffer, " Volume-Knob: delta=%d, steps=%d, ", 377 (cap >> 7) & 1, cap & 0x7f); 378 cap = snd_hda_codec_read(codec, nid, 0, 379 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0); 380 snd_iprintf(buffer, "direct=%d, val=%d\n", 381 (cap >> 7) & 1, cap & 0x7f); 382 } 383 384 static void print_audio_io(struct snd_info_buffer *buffer, 385 struct hda_codec *codec, hda_nid_t nid, 386 unsigned int wid_type) 387 { 388 int conv = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); 389 snd_iprintf(buffer, 390 " Converter: stream=%d, channel=%d\n", 391 (conv & AC_CONV_STREAM) >> AC_CONV_STREAM_SHIFT, 392 conv & AC_CONV_CHANNEL); 393 394 if (wid_type == AC_WID_AUD_IN && (conv & AC_CONV_CHANNEL) == 0) { 395 int sdi = snd_hda_codec_read(codec, nid, 0, 396 AC_VERB_GET_SDI_SELECT, 0); 397 snd_iprintf(buffer, " SDI-Select: %d\n", 398 sdi & AC_SDI_SELECT); 399 } 400 } 401 402 static void print_digital_conv(struct snd_info_buffer *buffer, 403 struct hda_codec *codec, hda_nid_t nid) 404 { 405 unsigned int digi1 = snd_hda_codec_read(codec, nid, 0, 406 AC_VERB_GET_DIGI_CONVERT_1, 0); 407 unsigned char digi2 = digi1 >> 8; 408 unsigned char digi3 = digi1 >> 16; 409 410 snd_iprintf(buffer, " Digital:"); 411 if (digi1 & AC_DIG1_ENABLE) 412 snd_iprintf(buffer, " Enabled"); 413 if (digi1 & AC_DIG1_V) 414 snd_iprintf(buffer, " Validity"); 415 if (digi1 & AC_DIG1_VCFG) 416 snd_iprintf(buffer, " ValidityCfg"); 417 if (digi1 & AC_DIG1_EMPHASIS) 418 snd_iprintf(buffer, " Preemphasis"); 419 if (digi1 & AC_DIG1_COPYRIGHT) 420 snd_iprintf(buffer, " Non-Copyright"); 421 if (digi1 & AC_DIG1_NONAUDIO) 422 snd_iprintf(buffer, " Non-Audio"); 423 if (digi1 & AC_DIG1_PROFESSIONAL) 424 snd_iprintf(buffer, " Pro"); 425 if (digi1 & AC_DIG1_LEVEL) 426 snd_iprintf(buffer, " GenLevel"); 427 if (digi3 & AC_DIG3_KAE) 428 snd_iprintf(buffer, " KAE"); 429 snd_iprintf(buffer, "\n"); 430 snd_iprintf(buffer, " Digital category: 0x%x\n", 431 digi2 & AC_DIG2_CC); 432 snd_iprintf(buffer, " IEC Coding Type: 0x%x\n", 433 digi3 & AC_DIG3_ICT); 434 } 435 436 static const char *get_pwr_state(u32 state) 437 { 438 static const char * const buf[] = { 439 "D0", "D1", "D2", "D3", "D3cold" 440 }; 441 if (state < ARRAY_SIZE(buf)) 442 return buf[state]; 443 return "UNKNOWN"; 444 } 445 446 static void print_power_state(struct snd_info_buffer *buffer, 447 struct hda_codec *codec, hda_nid_t nid) 448 { 449 static char *names[] = { 450 [ilog2(AC_PWRST_D0SUP)] = "D0", 451 [ilog2(AC_PWRST_D1SUP)] = "D1", 452 [ilog2(AC_PWRST_D2SUP)] = "D2", 453 [ilog2(AC_PWRST_D3SUP)] = "D3", 454 [ilog2(AC_PWRST_D3COLDSUP)] = "D3cold", 455 [ilog2(AC_PWRST_S3D3COLDSUP)] = "S3D3cold", 456 [ilog2(AC_PWRST_CLKSTOP)] = "CLKSTOP", 457 [ilog2(AC_PWRST_EPSS)] = "EPSS", 458 }; 459 460 int sup = snd_hda_param_read(codec, nid, AC_PAR_POWER_STATE); 461 int pwr = snd_hda_codec_read(codec, nid, 0, 462 AC_VERB_GET_POWER_STATE, 0); 463 if (sup != -1) 464 snd_iprintf(buffer, " Power states: %s\n", 465 bits_names(sup, names, ARRAY_SIZE(names))); 466 467 snd_iprintf(buffer, " Power: setting=%s, actual=%s", 468 get_pwr_state(pwr & AC_PWRST_SETTING), 469 get_pwr_state((pwr & AC_PWRST_ACTUAL) >> 470 AC_PWRST_ACTUAL_SHIFT)); 471 if (pwr & AC_PWRST_ERROR) 472 snd_iprintf(buffer, ", Error"); 473 if (pwr & AC_PWRST_CLK_STOP_OK) 474 snd_iprintf(buffer, ", Clock-stop-OK"); 475 if (pwr & AC_PWRST_SETTING_RESET) 476 snd_iprintf(buffer, ", Setting-reset"); 477 snd_iprintf(buffer, "\n"); 478 } 479 480 static void print_unsol_cap(struct snd_info_buffer *buffer, 481 struct hda_codec *codec, hda_nid_t nid) 482 { 483 int unsol = snd_hda_codec_read(codec, nid, 0, 484 AC_VERB_GET_UNSOLICITED_RESPONSE, 0); 485 snd_iprintf(buffer, 486 " Unsolicited: tag=%02x, enabled=%d\n", 487 unsol & AC_UNSOL_TAG, 488 (unsol & AC_UNSOL_ENABLED) ? 1 : 0); 489 } 490 491 static void print_proc_caps(struct snd_info_buffer *buffer, 492 struct hda_codec *codec, hda_nid_t nid) 493 { 494 unsigned int proc_caps = snd_hda_param_read(codec, nid, 495 AC_PAR_PROC_CAP); 496 snd_iprintf(buffer, " Processing caps: benign=%d, ncoeff=%d\n", 497 proc_caps & AC_PCAP_BENIGN, 498 (proc_caps & AC_PCAP_NUM_COEF) >> AC_PCAP_NUM_COEF_SHIFT); 499 } 500 501 static void print_conn_list(struct snd_info_buffer *buffer, 502 struct hda_codec *codec, hda_nid_t nid, 503 unsigned int wid_type, hda_nid_t *conn, 504 int conn_len) 505 { 506 int c, curr = -1; 507 const hda_nid_t *list; 508 int cache_len; 509 510 if (conn_len > 1 && 511 wid_type != AC_WID_AUD_MIX && 512 wid_type != AC_WID_VOL_KNB && 513 wid_type != AC_WID_POWER) 514 curr = snd_hda_codec_read(codec, nid, 0, 515 AC_VERB_GET_CONNECT_SEL, 0); 516 snd_iprintf(buffer, " Connection: %d\n", conn_len); 517 if (conn_len > 0) { 518 snd_iprintf(buffer, " "); 519 for (c = 0; c < conn_len; c++) { 520 snd_iprintf(buffer, " 0x%02x", conn[c]); 521 if (c == curr) 522 snd_iprintf(buffer, "*"); 523 } 524 snd_iprintf(buffer, "\n"); 525 } 526 527 /* Get Cache connections info */ 528 cache_len = snd_hda_get_conn_list(codec, nid, &list); 529 if (cache_len != conn_len 530 || memcmp(list, conn, conn_len)) { 531 snd_iprintf(buffer, " In-driver Connection: %d\n", cache_len); 532 if (cache_len > 0) { 533 snd_iprintf(buffer, " "); 534 for (c = 0; c < cache_len; c++) 535 snd_iprintf(buffer, " 0x%02x", list[c]); 536 snd_iprintf(buffer, "\n"); 537 } 538 } 539 } 540 541 static void print_gpio(struct snd_info_buffer *buffer, 542 struct hda_codec *codec, hda_nid_t nid) 543 { 544 unsigned int gpio = 545 snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP); 546 unsigned int enable, direction, wake, unsol, sticky, data; 547 int i, max; 548 snd_iprintf(buffer, "GPIO: io=%d, o=%d, i=%d, " 549 "unsolicited=%d, wake=%d\n", 550 gpio & AC_GPIO_IO_COUNT, 551 (gpio & AC_GPIO_O_COUNT) >> AC_GPIO_O_COUNT_SHIFT, 552 (gpio & AC_GPIO_I_COUNT) >> AC_GPIO_I_COUNT_SHIFT, 553 (gpio & AC_GPIO_UNSOLICITED) ? 1 : 0, 554 (gpio & AC_GPIO_WAKE) ? 1 : 0); 555 max = gpio & AC_GPIO_IO_COUNT; 556 if (!max || max > 8) 557 return; 558 enable = snd_hda_codec_read(codec, nid, 0, 559 AC_VERB_GET_GPIO_MASK, 0); 560 direction = snd_hda_codec_read(codec, nid, 0, 561 AC_VERB_GET_GPIO_DIRECTION, 0); 562 wake = snd_hda_codec_read(codec, nid, 0, 563 AC_VERB_GET_GPIO_WAKE_MASK, 0); 564 unsol = snd_hda_codec_read(codec, nid, 0, 565 AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK, 0); 566 sticky = snd_hda_codec_read(codec, nid, 0, 567 AC_VERB_GET_GPIO_STICKY_MASK, 0); 568 data = snd_hda_codec_read(codec, nid, 0, 569 AC_VERB_GET_GPIO_DATA, 0); 570 for (i = 0; i < max; ++i) 571 snd_iprintf(buffer, 572 " IO[%d]: enable=%d, dir=%d, wake=%d, " 573 "sticky=%d, data=%d, unsol=%d\n", i, 574 (enable & (1<<i)) ? 1 : 0, 575 (direction & (1<<i)) ? 1 : 0, 576 (wake & (1<<i)) ? 1 : 0, 577 (sticky & (1<<i)) ? 1 : 0, 578 (data & (1<<i)) ? 1 : 0, 579 (unsol & (1<<i)) ? 1 : 0); 580 /* FIXME: add GPO and GPI pin information */ 581 print_nid_array(buffer, codec, nid, &codec->mixers); 582 print_nid_array(buffer, codec, nid, &codec->nids); 583 } 584 585 static void print_device_list(struct snd_info_buffer *buffer, 586 struct hda_codec *codec, hda_nid_t nid) 587 { 588 int i, curr = -1; 589 u8 dev_list[AC_MAX_DEV_LIST_LEN]; 590 int devlist_len; 591 592 devlist_len = snd_hda_get_devices(codec, nid, dev_list, 593 AC_MAX_DEV_LIST_LEN); 594 snd_iprintf(buffer, " Devices: %d\n", devlist_len); 595 if (devlist_len <= 0) 596 return; 597 598 curr = snd_hda_codec_read(codec, nid, 0, 599 AC_VERB_GET_DEVICE_SEL, 0); 600 601 for (i = 0; i < devlist_len; i++) { 602 if (i == curr) 603 snd_iprintf(buffer, " *"); 604 else 605 snd_iprintf(buffer, " "); 606 607 snd_iprintf(buffer, 608 "Dev %02d: PD = %d, ELDV = %d, IA = %d\n", i, 609 !!(dev_list[i] & AC_DE_PD), 610 !!(dev_list[i] & AC_DE_ELDV), 611 !!(dev_list[i] & AC_DE_IA)); 612 } 613 } 614 615 static void print_codec_info(struct snd_info_entry *entry, 616 struct snd_info_buffer *buffer) 617 { 618 struct hda_codec *codec = entry->private_data; 619 hda_nid_t nid; 620 int i, nodes; 621 622 snd_iprintf(buffer, "Codec: "); 623 if (codec->vendor_name && codec->chip_name) 624 snd_iprintf(buffer, "%s %s\n", 625 codec->vendor_name, codec->chip_name); 626 else 627 snd_iprintf(buffer, "Not Set\n"); 628 snd_iprintf(buffer, "Address: %d\n", codec->addr); 629 if (codec->afg) 630 snd_iprintf(buffer, "AFG Function Id: 0x%x (unsol %u)\n", 631 codec->afg_function_id, codec->afg_unsol); 632 if (codec->mfg) 633 snd_iprintf(buffer, "MFG Function Id: 0x%x (unsol %u)\n", 634 codec->mfg_function_id, codec->mfg_unsol); 635 snd_iprintf(buffer, "Vendor Id: 0x%08x\n", codec->vendor_id); 636 snd_iprintf(buffer, "Subsystem Id: 0x%08x\n", codec->subsystem_id); 637 snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id); 638 639 if (codec->mfg) 640 snd_iprintf(buffer, "Modem Function Group: 0x%x\n", codec->mfg); 641 else 642 snd_iprintf(buffer, "No Modem Function Group found\n"); 643 644 if (! codec->afg) 645 return; 646 snd_hda_power_up(codec); 647 snd_iprintf(buffer, "Default PCM:\n"); 648 print_pcm_caps(buffer, codec, codec->afg); 649 snd_iprintf(buffer, "Default Amp-In caps: "); 650 print_amp_caps(buffer, codec, codec->afg, HDA_INPUT); 651 snd_iprintf(buffer, "Default Amp-Out caps: "); 652 print_amp_caps(buffer, codec, codec->afg, HDA_OUTPUT); 653 snd_iprintf(buffer, "State of AFG node 0x%02x:\n", codec->afg); 654 print_power_state(buffer, codec, codec->afg); 655 656 nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid); 657 if (! nid || nodes < 0) { 658 snd_iprintf(buffer, "Invalid AFG subtree\n"); 659 snd_hda_power_down(codec); 660 return; 661 } 662 663 print_gpio(buffer, codec, codec->afg); 664 if (codec->proc_widget_hook) 665 codec->proc_widget_hook(buffer, codec, codec->afg); 666 667 for (i = 0; i < nodes; i++, nid++) { 668 unsigned int wid_caps = 669 snd_hda_param_read(codec, nid, 670 AC_PAR_AUDIO_WIDGET_CAP); 671 unsigned int wid_type = get_wcaps_type(wid_caps); 672 hda_nid_t *conn = NULL; 673 int conn_len = 0; 674 675 snd_iprintf(buffer, "Node 0x%02x [%s] wcaps 0x%x:", nid, 676 get_wid_type_name(wid_type), wid_caps); 677 if (wid_caps & AC_WCAP_STEREO) { 678 unsigned int chans = get_wcaps_channels(wid_caps); 679 if (chans == 2) 680 snd_iprintf(buffer, " Stereo"); 681 else 682 snd_iprintf(buffer, " %d-Channels", chans); 683 } else 684 snd_iprintf(buffer, " Mono"); 685 if (wid_caps & AC_WCAP_DIGITAL) 686 snd_iprintf(buffer, " Digital"); 687 if (wid_caps & AC_WCAP_IN_AMP) 688 snd_iprintf(buffer, " Amp-In"); 689 if (wid_caps & AC_WCAP_OUT_AMP) 690 snd_iprintf(buffer, " Amp-Out"); 691 if (wid_caps & AC_WCAP_STRIPE) 692 snd_iprintf(buffer, " Stripe"); 693 if (wid_caps & AC_WCAP_LR_SWAP) 694 snd_iprintf(buffer, " R/L"); 695 if (wid_caps & AC_WCAP_CP_CAPS) 696 snd_iprintf(buffer, " CP"); 697 snd_iprintf(buffer, "\n"); 698 699 print_nid_array(buffer, codec, nid, &codec->mixers); 700 print_nid_array(buffer, codec, nid, &codec->nids); 701 print_nid_pcms(buffer, codec, nid); 702 703 /* volume knob is a special widget that always have connection 704 * list 705 */ 706 if (wid_type == AC_WID_VOL_KNB) 707 wid_caps |= AC_WCAP_CONN_LIST; 708 709 if (wid_caps & AC_WCAP_CONN_LIST) { 710 conn_len = snd_hda_get_num_raw_conns(codec, nid); 711 if (conn_len > 0) { 712 conn = kmalloc(sizeof(hda_nid_t) * conn_len, 713 GFP_KERNEL); 714 if (!conn) 715 return; 716 if (snd_hda_get_raw_connections(codec, nid, conn, 717 conn_len) < 0) 718 conn_len = 0; 719 } 720 } 721 722 if (wid_caps & AC_WCAP_IN_AMP) { 723 snd_iprintf(buffer, " Amp-In caps: "); 724 print_amp_caps(buffer, codec, nid, HDA_INPUT); 725 snd_iprintf(buffer, " Amp-In vals: "); 726 if (wid_type == AC_WID_PIN || 727 (codec->single_adc_amp && 728 wid_type == AC_WID_AUD_IN)) 729 print_amp_vals(buffer, codec, nid, HDA_INPUT, 730 wid_caps & AC_WCAP_STEREO, 731 1); 732 else 733 print_amp_vals(buffer, codec, nid, HDA_INPUT, 734 wid_caps & AC_WCAP_STEREO, 735 conn_len); 736 } 737 if (wid_caps & AC_WCAP_OUT_AMP) { 738 snd_iprintf(buffer, " Amp-Out caps: "); 739 print_amp_caps(buffer, codec, nid, HDA_OUTPUT); 740 snd_iprintf(buffer, " Amp-Out vals: "); 741 if (wid_type == AC_WID_PIN && 742 codec->pin_amp_workaround) 743 print_amp_vals(buffer, codec, nid, HDA_OUTPUT, 744 wid_caps & AC_WCAP_STEREO, 745 conn_len); 746 else 747 print_amp_vals(buffer, codec, nid, HDA_OUTPUT, 748 wid_caps & AC_WCAP_STEREO, 1); 749 } 750 751 switch (wid_type) { 752 case AC_WID_PIN: { 753 int supports_vref; 754 print_pin_caps(buffer, codec, nid, &supports_vref); 755 print_pin_ctls(buffer, codec, nid, supports_vref); 756 break; 757 } 758 case AC_WID_VOL_KNB: 759 print_vol_knob(buffer, codec, nid); 760 break; 761 case AC_WID_AUD_OUT: 762 case AC_WID_AUD_IN: 763 print_audio_io(buffer, codec, nid, wid_type); 764 if (wid_caps & AC_WCAP_DIGITAL) 765 print_digital_conv(buffer, codec, nid); 766 if (wid_caps & AC_WCAP_FORMAT_OVRD) { 767 snd_iprintf(buffer, " PCM:\n"); 768 print_pcm_caps(buffer, codec, nid); 769 } 770 break; 771 } 772 773 if (wid_caps & AC_WCAP_UNSOL_CAP) 774 print_unsol_cap(buffer, codec, nid); 775 776 if (wid_caps & AC_WCAP_POWER) 777 print_power_state(buffer, codec, nid); 778 779 if (wid_caps & AC_WCAP_DELAY) 780 snd_iprintf(buffer, " Delay: %d samples\n", 781 (wid_caps & AC_WCAP_DELAY) >> 782 AC_WCAP_DELAY_SHIFT); 783 784 if (wid_type == AC_WID_PIN && codec->dp_mst) 785 print_device_list(buffer, codec, nid); 786 787 if (wid_caps & AC_WCAP_CONN_LIST) 788 print_conn_list(buffer, codec, nid, wid_type, 789 conn, conn_len); 790 791 if (wid_caps & AC_WCAP_PROC_WID) 792 print_proc_caps(buffer, codec, nid); 793 794 if (codec->proc_widget_hook) 795 codec->proc_widget_hook(buffer, codec, nid); 796 797 kfree(conn); 798 } 799 snd_hda_power_down(codec); 800 } 801 802 /* 803 * create a proc read 804 */ 805 int snd_hda_codec_proc_new(struct hda_codec *codec) 806 { 807 char name[32]; 808 struct snd_info_entry *entry; 809 int err; 810 811 snprintf(name, sizeof(name), "codec#%d", codec->addr); 812 err = snd_card_proc_new(codec->bus->card, name, &entry); 813 if (err < 0) 814 return err; 815 816 snd_info_set_text_ops(entry, codec, print_codec_info); 817 return 0; 818 } 819 820