aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2012-12-17 14:29:29 -0500
committerTakashi Iwai <tiwai@suse.de>2013-01-12 02:30:22 -0500
commit666a70d42b0fc04daaba64635741b649ed918fce (patch)
treecb683f42402555a882153f40349aac3615e10aa0 /sound/pci/hda/patch_realtek.c
parent183a444a6d7e601ddfaba4a40304e020ba1f565c (diff)
ALSA: hda/realtek - Make input path parser more generic
Now we reached to the final big piece of parser rewrite: the input paths. While the old parser code assumes the more-or-less direct and similar connections from input pin to ADC, the new code handles the complete input paths. The capture source is switched by simple calls of activate_path() function. The parsing of capture volume and capture switches is, however, not fully generalized. It assumes that amps are available in the vicinity of ADCs (in three depth). This isn't perfect but it should cover all codecs I know of. Also, this commit removes some NID mapping of capture-related controls temporarily for simplicity. It'll be restored in later commits. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c997
1 files changed, 374 insertions, 623 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 1ec14ac24232..3ee2be544f4d 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -278,6 +278,11 @@ static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
278#define nid_has_volume(codec, nid, dir) \ 278#define nid_has_volume(codec, nid, dir) \
279 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS) 279 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
280 280
281static struct nid_path *
282get_nid_path(struct hda_codec *codec, hda_nid_t from_nid, hda_nid_t to_nid);
283static void activate_path(struct hda_codec *codec, struct nid_path *path,
284 bool enable, bool add_aamix);
285
281/* 286/*
282 * input MUX handling 287 * input MUX handling
283 */ 288 */
@@ -286,12 +291,7 @@ static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
286{ 291{
287 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 292 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
288 struct alc_spec *spec = codec->spec; 293 struct alc_spec *spec = codec->spec;
289 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); 294 return snd_hda_input_mux_info(&spec->input_mux[0], uinfo);
290 if (mux_idx >= spec->num_mux_defs)
291 mux_idx = 0;
292 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
293 mux_idx = 0;
294 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
295} 295}
296 296
297static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, 297static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
@@ -305,6 +305,14 @@ static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
305 return 0; 305 return 0;
306} 306}
307 307
308static hda_nid_t get_adc_nid(struct hda_codec *codec, int adc_idx, int imux_idx)
309{
310 struct alc_spec *spec = codec->spec;
311 if (spec->dyn_adc_switch)
312 adc_idx = spec->dyn_adc_idx[imux_idx];
313 return spec->adc_nids[adc_idx];
314}
315
308static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur) 316static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
309{ 317{
310 struct alc_spec *spec = codec->spec; 318 struct alc_spec *spec = codec->spec;
@@ -322,14 +330,9 @@ static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
322 return false; 330 return false;
323} 331}
324 332
325static inline hda_nid_t get_capsrc(struct alc_spec *spec, int idx)
326{
327 return spec->capsrc_nids ?
328 spec->capsrc_nids[idx] : spec->adc_nids[idx];
329}
330
331static void call_update_outputs(struct hda_codec *codec); 333static void call_update_outputs(struct hda_codec *codec);
332static void alc_inv_dmic_sync(struct hda_codec *codec, bool force); 334static void alc_inv_dmic_sync(struct hda_codec *codec, bool force);
335static void alc_inv_dmic_sync_adc(struct hda_codec *codec, int adc_idx);
333 336
334/* for shared I/O, change the pin-control accordingly */ 337/* for shared I/O, change the pin-control accordingly */
335static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic) 338static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
@@ -369,56 +372,39 @@ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx,
369{ 372{
370 struct alc_spec *spec = codec->spec; 373 struct alc_spec *spec = codec->spec;
371 const struct hda_input_mux *imux; 374 const struct hda_input_mux *imux;
372 unsigned int mux_idx; 375 struct nid_path *path;
373 int i, type, num_conns;
374 hda_nid_t nid;
375
376 if (!spec->input_mux)
377 return 0;
378 376
379 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; 377 imux = spec->input_mux;
380 imux = &spec->input_mux[mux_idx]; 378 if (!imux || !imux->num_items)
381 if (!imux->num_items && mux_idx > 0)
382 imux = &spec->input_mux[0];
383 if (!imux->num_items)
384 return 0; 379 return 0;
385 380
386 if (idx >= imux->num_items) 381 if (idx >= imux->num_items)
387 idx = imux->num_items - 1; 382 idx = imux->num_items - 1;
388 if (spec->cur_mux[adc_idx] == idx && !force) 383 if (spec->cur_mux[adc_idx] == idx && !force)
389 return 0; 384 return 0;
385
386 path = get_nid_path(codec, spec->imux_pins[spec->cur_mux[adc_idx]],
387 spec->adc_nids[adc_idx]);
388 if (!path)
389 return 0;
390 if (path->active)
391 activate_path(codec, path, false, false);
392
390 spec->cur_mux[adc_idx] = idx; 393 spec->cur_mux[adc_idx] = idx;
391 394
392 if (spec->shared_mic_hp) 395 if (spec->shared_mic_hp)
393 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]); 396 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
394 397
395 if (spec->dyn_adc_switch) { 398 if (spec->dyn_adc_switch)
396 alc_dyn_adc_pcm_resetup(codec, idx); 399 alc_dyn_adc_pcm_resetup(codec, idx);
397 adc_idx = spec->dyn_adc_idx[idx];
398 }
399
400 nid = get_capsrc(spec, adc_idx);
401 400
402 /* no selection? */ 401 path = get_nid_path(codec, spec->imux_pins[idx],
403 num_conns = snd_hda_get_num_conns(codec, nid); 402 get_adc_nid(codec, adc_idx, idx));
404 if (num_conns <= 1) 403 if (!path)
405 return 1; 404 return 0;
406 405 if (path->active)
407 type = get_wcaps_type(get_wcaps(codec, nid)); 406 return 0;
408 if (type == AC_WID_AUD_MIX) { 407 activate_path(codec, path, true, false);
409 /* Matrix-mixer style (e.g. ALC882) */
410 int active = imux->items[idx].index;
411 for (i = 0; i < num_conns; i++) {
412 unsigned int v = (i == active) ? 0 : HDA_AMP_MUTE;
413 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, i,
414 HDA_AMP_MUTE, v);
415 }
416 } else {
417 /* MUX style (e.g. ALC880) */
418 snd_hda_codec_write_cache(codec, nid, 0,
419 AC_VERB_SET_CONNECT_SEL,
420 imux->items[idx].index);
421 }
422 alc_inv_dmic_sync(codec, true); 408 alc_inv_dmic_sync(codec, true);
423 return 1; 409 return 1;
424} 410}
@@ -1006,65 +992,12 @@ static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
1006 return -1; 992 return -1;
1007} 993}
1008 994
1009/* check whether dynamic ADC-switching is available */
1010static bool alc_check_dyn_adc_switch(struct hda_codec *codec)
1011{
1012 struct alc_spec *spec = codec->spec;
1013 struct hda_input_mux *imux = &spec->private_imux[0];
1014 int i, n, idx;
1015 hda_nid_t cap, pin;
1016
1017 if (imux != spec->input_mux) /* no dynamic imux? */
1018 return false;
1019
1020 for (n = 0; n < spec->num_adc_nids; n++) {
1021 cap = spec->private_capsrc_nids[n];
1022 for (i = 0; i < imux->num_items; i++) {
1023 pin = spec->imux_pins[i];
1024 if (!pin)
1025 return false;
1026 if (get_connection_index(codec, cap, pin) < 0)
1027 break;
1028 }
1029 if (i >= imux->num_items)
1030 return true; /* no ADC-switch is needed */
1031 }
1032
1033 for (i = 0; i < imux->num_items; i++) {
1034 pin = spec->imux_pins[i];
1035 for (n = 0; n < spec->num_adc_nids; n++) {
1036 cap = spec->private_capsrc_nids[n];
1037 idx = get_connection_index(codec, cap, pin);
1038 if (idx >= 0) {
1039 imux->items[i].index = idx;
1040 spec->dyn_adc_idx[i] = n;
1041 break;
1042 }
1043 }
1044 }
1045
1046 snd_printdd("realtek: enabling ADC switching\n");
1047 spec->dyn_adc_switch = 1;
1048 return true;
1049}
1050
1051/* check whether all auto-mic pins are valid; setup indices if OK */ 995/* check whether all auto-mic pins are valid; setup indices if OK */
1052static bool alc_auto_mic_check_imux(struct hda_codec *codec) 996static bool alc_auto_mic_check_imux(struct hda_codec *codec)
1053{ 997{
1054 struct alc_spec *spec = codec->spec; 998 struct alc_spec *spec = codec->spec;
1055 const struct hda_input_mux *imux; 999 const struct hda_input_mux *imux;
1056 1000
1057 if (!spec->auto_mic)
1058 return false;
1059 if (spec->auto_mic_valid_imux)
1060 return true; /* already checked */
1061
1062 /* fill up imux indices */
1063 if (!alc_check_dyn_adc_switch(codec)) {
1064 spec->auto_mic = 0;
1065 return false;
1066 }
1067
1068 imux = spec->input_mux; 1001 imux = spec->input_mux;
1069 spec->ext_mic_idx = find_idx_in_nid_list(spec->ext_mic_pin, 1002 spec->ext_mic_idx = find_idx_in_nid_list(spec->ext_mic_pin,
1070 spec->imux_pins, imux->num_items); 1003 spec->imux_pins, imux->num_items);
@@ -1072,10 +1005,8 @@ static bool alc_auto_mic_check_imux(struct hda_codec *codec)
1072 spec->imux_pins, imux->num_items); 1005 spec->imux_pins, imux->num_items);
1073 spec->dock_mic_idx = find_idx_in_nid_list(spec->dock_mic_pin, 1006 spec->dock_mic_idx = find_idx_in_nid_list(spec->dock_mic_pin,
1074 spec->imux_pins, imux->num_items); 1007 spec->imux_pins, imux->num_items);
1075 if (spec->ext_mic_idx < 0 || spec->int_mic_idx < 0) { 1008 if (spec->ext_mic_idx < 0 || spec->int_mic_idx < 0)
1076 spec->auto_mic = 0;
1077 return false; /* no corresponding imux */ 1009 return false; /* no corresponding imux */
1078 }
1079 1010
1080 snd_hda_jack_detect_enable_callback(codec, spec->ext_mic_pin, 1011 snd_hda_jack_detect_enable_callback(codec, spec->ext_mic_pin,
1081 ALC_MIC_EVENT, alc_mic_automute); 1012 ALC_MIC_EVENT, alc_mic_automute);
@@ -1085,7 +1016,6 @@ static bool alc_auto_mic_check_imux(struct hda_codec *codec)
1085 alc_mic_automute); 1016 alc_mic_automute);
1086 1017
1087 spec->auto_mic_valid_imux = 1; 1018 spec->auto_mic_valid_imux = 1;
1088 spec->auto_mic = 1;
1089 return true; 1019 return true;
1090} 1020}
1091 1021
@@ -1100,9 +1030,6 @@ static int alc_init_auto_mic(struct hda_codec *codec)
1100 hda_nid_t fixed, ext, dock; 1030 hda_nid_t fixed, ext, dock;
1101 int i; 1031 int i;
1102 1032
1103 if (spec->shared_mic_hp)
1104 return 0; /* no auto-mic for the shared I/O */
1105
1106 spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1; 1033 spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1;
1107 1034
1108 fixed = ext = dock = 0; 1035 fixed = ext = dock = 0;
@@ -1152,30 +1079,18 @@ static int alc_init_auto_mic(struct hda_codec *codec)
1152 spec->int_mic_pin = fixed; 1079 spec->int_mic_pin = fixed;
1153 spec->dock_mic_pin = dock; 1080 spec->dock_mic_pin = dock;
1154 1081
1155 spec->auto_mic = 1;
1156 if (!alc_auto_mic_check_imux(codec)) 1082 if (!alc_auto_mic_check_imux(codec))
1157 return 0; 1083 return 0;
1158 1084
1085 spec->auto_mic = 1;
1086 spec->num_adc_nids = 1;
1087 spec->cur_mux[0] = spec->int_mic_idx;
1159 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n", 1088 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
1160 ext, fixed, dock); 1089 ext, fixed, dock);
1161 1090
1162 return 0; 1091 return 0;
1163} 1092}
1164 1093
1165/* check the availabilities of auto-mute and auto-mic switches */
1166static int alc_auto_check_switches(struct hda_codec *codec)
1167{
1168 int err;
1169
1170 err = alc_init_automute(codec);
1171 if (err < 0)
1172 return err;
1173 err = alc_init_auto_mic(codec);
1174 if (err < 0)
1175 return err;
1176 return 0;
1177}
1178
1179/* 1094/*
1180 * Realtek SSID verification 1095 * Realtek SSID verification
1181 */ 1096 */
@@ -1509,169 +1424,101 @@ static void alc_auto_parse_digital(struct hda_codec *codec)
1509/* 1424/*
1510 * capture mixer elements 1425 * capture mixer elements
1511 */ 1426 */
1512static int alc_cap_vol_info(struct snd_kcontrol *kcontrol, 1427#define alc_cap_vol_info snd_hda_mixer_amp_volume_info
1513 struct snd_ctl_elem_info *uinfo) 1428#define alc_cap_vol_get snd_hda_mixer_amp_volume_get
1514{ 1429#define alc_cap_vol_tlv snd_hda_mixer_amp_tlv
1515 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1516 struct alc_spec *spec = codec->spec;
1517 unsigned long val;
1518 int err;
1519
1520 mutex_lock(&codec->control_mutex);
1521 if (spec->vol_in_capsrc)
1522 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1523 else
1524 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1525 kcontrol->private_value = val;
1526 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1527 mutex_unlock(&codec->control_mutex);
1528 return err;
1529}
1530
1531static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1532 unsigned int size, unsigned int __user *tlv)
1533{
1534 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1535 struct alc_spec *spec = codec->spec;
1536 unsigned long val;
1537 int err;
1538
1539 mutex_lock(&codec->control_mutex);
1540 if (spec->vol_in_capsrc)
1541 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1542 else
1543 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1544 kcontrol->private_value = val;
1545 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1546 mutex_unlock(&codec->control_mutex);
1547 return err;
1548}
1549 1430
1550typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol, 1431typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
1551 struct snd_ctl_elem_value *ucontrol); 1432 struct snd_ctl_elem_value *ucontrol);
1552 1433
1553static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol, 1434static int alc_cap_put_caller(struct snd_kcontrol *kcontrol,
1554 struct snd_ctl_elem_value *ucontrol, 1435 struct snd_ctl_elem_value *ucontrol,
1555 getput_call_t func, bool is_put) 1436 put_call_t func, int type)
1556{ 1437{
1557 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1438 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1558 struct alc_spec *spec = codec->spec; 1439 struct alc_spec *spec = codec->spec;
1559 int i, err = 0; 1440 const struct hda_input_mux *imux;
1441 struct nid_path *path;
1442 int i, adc_idx, err = 0;
1560 1443
1444 imux = spec->input_mux;
1445 adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1561 mutex_lock(&codec->control_mutex); 1446 mutex_lock(&codec->control_mutex);
1562 if (is_put && spec->dyn_adc_switch) { 1447 codec->cached_write = 1;
1563 for (i = 0; i < spec->num_adc_nids; i++) { 1448 for (i = 0; i < imux->num_items; i++) {
1564 kcontrol->private_value = 1449 path = get_nid_path(codec, spec->imux_pins[i],
1565 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i], 1450 get_adc_nid(codec, adc_idx, i));
1566 3, 0, HDA_INPUT); 1451 if (!path->ctls[type])
1567 err = func(kcontrol, ucontrol); 1452 continue;
1568 if (err < 0) 1453 kcontrol->private_value = path->ctls[type];
1569 goto error;
1570 }
1571 } else {
1572 i = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1573 if (spec->vol_in_capsrc)
1574 kcontrol->private_value =
1575 HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[i],
1576 3, 0, HDA_OUTPUT);
1577 else
1578 kcontrol->private_value =
1579 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1580 3, 0, HDA_INPUT);
1581 err = func(kcontrol, ucontrol); 1454 err = func(kcontrol, ucontrol);
1455 if (err < 0)
1456 goto error;
1582 } 1457 }
1583 if (err >= 0 && is_put)
1584 alc_inv_dmic_sync(codec, false);
1585 error: 1458 error:
1459 codec->cached_write = 0;
1586 mutex_unlock(&codec->control_mutex); 1460 mutex_unlock(&codec->control_mutex);
1461 snd_hda_codec_resume_amp(codec);
1462 if (err >= 0 && type == NID_PATH_MUTE_CTL &&
1463 spec->inv_dmic_fixup && spec->inv_dmic_muted)
1464 alc_inv_dmic_sync_adc(codec, adc_idx);
1587 return err; 1465 return err;
1588} 1466}
1589 1467
1590static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1591 struct snd_ctl_elem_value *ucontrol)
1592{
1593 return alc_cap_getput_caller(kcontrol, ucontrol,
1594 snd_hda_mixer_amp_volume_get, false);
1595}
1596
1597static int alc_cap_vol_put(struct snd_kcontrol *kcontrol, 1468static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1598 struct snd_ctl_elem_value *ucontrol) 1469 struct snd_ctl_elem_value *ucontrol)
1599{ 1470{
1600 return alc_cap_getput_caller(kcontrol, ucontrol, 1471 return alc_cap_put_caller(kcontrol, ucontrol,
1601 snd_hda_mixer_amp_volume_put, true); 1472 snd_hda_mixer_amp_volume_put,
1473 NID_PATH_VOL_CTL);
1602} 1474}
1603 1475
1604/* capture mixer elements */ 1476/* capture mixer elements */
1605#define alc_cap_sw_info snd_ctl_boolean_stereo_info 1477#define alc_cap_sw_info snd_ctl_boolean_stereo_info
1478#define alc_cap_sw_get snd_hda_mixer_amp_switch_get
1606 1479
1607static int alc_cap_sw_get(struct snd_kcontrol *kcontrol, 1480static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1608 struct snd_ctl_elem_value *ucontrol) 1481 struct snd_ctl_elem_value *ucontrol)
1609{ 1482{
1610 return alc_cap_getput_caller(kcontrol, ucontrol, 1483 return alc_cap_put_caller(kcontrol, ucontrol,
1611 snd_hda_mixer_amp_switch_get, false); 1484 snd_hda_mixer_amp_switch_put,
1485 NID_PATH_MUTE_CTL);
1612} 1486}
1613 1487
1614static int alc_cap_sw_put(struct snd_kcontrol *kcontrol, 1488static void alc_inv_dmic_sync_adc(struct hda_codec *codec, int adc_idx)
1615 struct snd_ctl_elem_value *ucontrol)
1616{ 1489{
1617 return alc_cap_getput_caller(kcontrol, ucontrol, 1490 struct alc_spec *spec = codec->spec;
1618 snd_hda_mixer_amp_switch_put, true); 1491 struct hda_input_mux *imux = &spec->private_imux[0];
1619} 1492 struct nid_path *path;
1620 1493 hda_nid_t nid;
1621#define _DEFINE_CAPMIX(num) \ 1494 int i, dir, parm;
1622 { \ 1495 unsigned int val;
1623 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1496
1624 .name = "Capture Switch", \ 1497 for (i = 0; i < imux->num_items; i++) {
1625 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 1498 if (spec->imux_pins[i] == spec->inv_dmic_pin)
1626 .count = num, \ 1499 break;
1627 .info = alc_cap_sw_info, \ 1500 }
1628 .get = alc_cap_sw_get, \ 1501 if (i >= imux->num_items)
1629 .put = alc_cap_sw_put, \ 1502 return;
1630 }, \ 1503
1631 { \ 1504 path = get_nid_path(codec, spec->inv_dmic_pin,
1632 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1505 get_adc_nid(codec, adc_idx, i));
1633 .name = "Capture Volume", \ 1506 val = path->ctls[NID_PATH_MUTE_CTL];
1634 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 1507 if (!val)
1635 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 1508 return;
1636 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \ 1509 nid = get_amp_nid_(val);
1637 .count = num, \ 1510 dir = get_amp_direction_(val);
1638 .info = alc_cap_vol_info, \ 1511 parm = AC_AMP_SET_RIGHT |
1639 .get = alc_cap_vol_get, \ 1512 (dir == HDA_OUTPUT ? AC_AMP_SET_OUTPUT : AC_AMP_SET_INPUT);
1640 .put = alc_cap_vol_put, \ 1513
1641 .tlv = { .c = alc_cap_vol_tlv }, \ 1514 /* we care only right channel */
1642 } 1515 val = snd_hda_codec_amp_read(codec, nid, 1, dir, 0);
1643 1516 if (val & 0x80) /* if already muted, we don't need to touch */
1644#define _DEFINE_CAPSRC(num) \ 1517 return;
1645 { \ 1518 val |= 0x80;
1646 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1519 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
1647 /* .name = "Capture Source", */ \ 1520 parm | val);
1648 .name = "Input Source", \ 1521}
1649 .count = num, \
1650 .info = alc_mux_enum_info, \
1651 .get = alc_mux_enum_get, \
1652 .put = alc_mux_enum_put, \
1653 }
1654
1655#define DEFINE_CAPMIX(num) \
1656static const struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
1657 _DEFINE_CAPMIX(num), \
1658 _DEFINE_CAPSRC(num), \
1659 { } /* end */ \
1660}
1661
1662#define DEFINE_CAPMIX_NOSRC(num) \
1663static const struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
1664 _DEFINE_CAPMIX(num), \
1665 { } /* end */ \
1666}
1667
1668/* up to three ADCs */
1669DEFINE_CAPMIX(1);
1670DEFINE_CAPMIX(2);
1671DEFINE_CAPMIX(3);
1672DEFINE_CAPMIX_NOSRC(1);
1673DEFINE_CAPMIX_NOSRC(2);
1674DEFINE_CAPMIX_NOSRC(3);
1675 1522
1676/* 1523/*
1677 * Inverted digital-mic handling 1524 * Inverted digital-mic handling
@@ -1691,40 +1538,22 @@ DEFINE_CAPMIX_NOSRC(3);
1691static void alc_inv_dmic_sync(struct hda_codec *codec, bool force) 1538static void alc_inv_dmic_sync(struct hda_codec *codec, bool force)
1692{ 1539{
1693 struct alc_spec *spec = codec->spec; 1540 struct alc_spec *spec = codec->spec;
1694 int i; 1541 int src, nums;
1695 1542
1696 if (!spec->inv_dmic_fixup) 1543 if (!spec->inv_dmic_fixup)
1697 return; 1544 return;
1698 if (!spec->inv_dmic_muted && !force) 1545 if (!spec->inv_dmic_muted && !force)
1699 return; 1546 return;
1700 for (i = 0; i < spec->num_adc_nids; i++) { 1547 nums = spec->dyn_adc_switch ? 1 : spec->num_adc_nids;
1701 int src = spec->dyn_adc_switch ? 0 : i; 1548 for (src = 0; src < nums; src++) {
1702 bool dmic_fixup = false; 1549 bool dmic_fixup = false;
1703 hda_nid_t nid;
1704 int parm, dir, v;
1705 1550
1706 if (spec->inv_dmic_muted && 1551 if (spec->inv_dmic_muted &&
1707 spec->imux_pins[spec->cur_mux[src]] == spec->inv_dmic_pin) 1552 spec->imux_pins[spec->cur_mux[src]] == spec->inv_dmic_pin)
1708 dmic_fixup = true; 1553 dmic_fixup = true;
1709 if (!dmic_fixup && !force) 1554 if (!dmic_fixup && !force)
1710 continue; 1555 continue;
1711 if (spec->vol_in_capsrc) { 1556 alc_inv_dmic_sync_adc(codec, src);
1712 nid = spec->capsrc_nids[i];
1713 parm = AC_AMP_SET_RIGHT | AC_AMP_SET_OUTPUT;
1714 dir = HDA_OUTPUT;
1715 } else {
1716 nid = spec->adc_nids[i];
1717 parm = AC_AMP_SET_RIGHT | AC_AMP_SET_INPUT;
1718 dir = HDA_INPUT;
1719 }
1720 /* we care only right channel */
1721 v = snd_hda_codec_amp_read(codec, nid, 1, dir, 0);
1722 if (v & 0x80) /* if already muted, we don't need to touch */
1723 continue;
1724 if (dmic_fixup) /* add mute for d-mic */
1725 v |= 0x80;
1726 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
1727 parm | v);
1728 } 1557 }
1729} 1558}
1730 1559
@@ -1800,13 +1629,6 @@ static const char * const alc_slave_pfxs[] = {
1800 1629
1801#define NID_MAPPING (-1) 1630#define NID_MAPPING (-1)
1802 1631
1803#define SUBDEV_SPEAKER_ (0 << 6)
1804#define SUBDEV_HP_ (1 << 6)
1805#define SUBDEV_LINE_ (2 << 6)
1806#define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
1807#define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
1808#define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
1809
1810static void alc_free_kctls(struct hda_codec *codec); 1632static void alc_free_kctls(struct hda_codec *codec);
1811 1633
1812#ifdef CONFIG_SND_HDA_INPUT_BEEP 1634#ifdef CONFIG_SND_HDA_INPUT_BEEP
@@ -1821,11 +1643,7 @@ static const struct snd_kcontrol_new alc_beep_mixer[] = {
1821static int __alc_build_controls(struct hda_codec *codec) 1643static int __alc_build_controls(struct hda_codec *codec)
1822{ 1644{
1823 struct alc_spec *spec = codec->spec; 1645 struct alc_spec *spec = codec->spec;
1824 struct snd_kcontrol *kctl = NULL; 1646 int i, err;
1825 const struct snd_kcontrol_new *knew;
1826 int i, j, err;
1827 unsigned int u;
1828 hda_nid_t nid;
1829 1647
1830 for (i = 0; i < spec->num_mixers; i++) { 1648 for (i = 0; i < spec->num_mixers; i++) {
1831 err = snd_hda_add_new_ctls(codec, spec->mixers[i]); 1649 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
@@ -1897,75 +1715,6 @@ static int __alc_build_controls(struct hda_codec *codec)
1897 return err; 1715 return err;
1898 } 1716 }
1899 1717
1900 /* assign Capture Source enums to NID */
1901 if (spec->capsrc_nids || spec->adc_nids) {
1902 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
1903 if (!kctl)
1904 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
1905 for (i = 0; kctl && i < kctl->count; i++) {
1906 err = snd_hda_add_nid(codec, kctl, i,
1907 get_capsrc(spec, i));
1908 if (err < 0)
1909 return err;
1910 }
1911 }
1912 if (spec->cap_mixer && spec->adc_nids) {
1913 const char *kname = kctl ? kctl->id.name : NULL;
1914 for (knew = spec->cap_mixer; knew->name; knew++) {
1915 if (kname && strcmp(knew->name, kname) == 0)
1916 continue;
1917 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
1918 for (i = 0; kctl && i < kctl->count; i++) {
1919 err = snd_hda_add_nid(codec, kctl, i,
1920 spec->adc_nids[i]);
1921 if (err < 0)
1922 return err;
1923 }
1924 }
1925 }
1926
1927 /* other nid->control mapping */
1928 for (i = 0; i < spec->num_mixers; i++) {
1929 for (knew = spec->mixers[i]; knew->name; knew++) {
1930 if (knew->iface != NID_MAPPING)
1931 continue;
1932 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
1933 if (kctl == NULL)
1934 continue;
1935 u = knew->subdevice;
1936 for (j = 0; j < 4; j++, u >>= 8) {
1937 nid = u & 0x3f;
1938 if (nid == 0)
1939 continue;
1940 switch (u & 0xc0) {
1941 case SUBDEV_SPEAKER_:
1942 nid = spec->autocfg.speaker_pins[nid];
1943 break;
1944 case SUBDEV_LINE_:
1945 nid = spec->autocfg.line_out_pins[nid];
1946 break;
1947 case SUBDEV_HP_:
1948 nid = spec->autocfg.hp_pins[nid];
1949 break;
1950 default:
1951 continue;
1952 }
1953 err = snd_hda_add_nid(codec, kctl, 0, nid);
1954 if (err < 0)
1955 return err;
1956 }
1957 u = knew->private_value;
1958 for (j = 0; j < 4; j++, u >>= 8) {
1959 nid = u & 0xff;
1960 if (nid == 0)
1961 continue;
1962 err = snd_hda_add_nid(codec, kctl, 0, nid);
1963 if (err < 0)
1964 return err;
1965 }
1966 }
1967 }
1968
1969 alc_free_kctls(codec); /* no longer needed */ 1718 alc_free_kctls(codec); /* no longer needed */
1970 1719
1971 return 0; 1720 return 0;
@@ -2007,7 +1756,6 @@ static int alc_build_controls(struct hda_codec *codec)
2007 * Common callbacks 1756 * Common callbacks
2008 */ 1757 */
2009 1758
2010static void alc_init_special_input_src(struct hda_codec *codec);
2011static void alc_auto_init_std(struct hda_codec *codec); 1759static void alc_auto_init_std(struct hda_codec *codec);
2012 1760
2013static int alc_init(struct hda_codec *codec) 1761static int alc_init(struct hda_codec *codec)
@@ -2021,7 +1769,6 @@ static int alc_init(struct hda_codec *codec)
2021 alc_auto_init_amp(codec, spec->init_amp); 1769 alc_auto_init_amp(codec, spec->init_amp);
2022 1770
2023 snd_hda_gen_apply_verbs(codec); 1771 snd_hda_gen_apply_verbs(codec);
2024 alc_init_special_input_src(codec);
2025 alc_auto_init_std(codec); 1772 alc_auto_init_std(codec);
2026 1773
2027 alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT); 1774 alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
@@ -2675,28 +2422,6 @@ static int new_analog_input(struct hda_codec *codec, hda_nid_t pin,
2675 return 0; 2422 return 0;
2676} 2423}
2677 2424
2678static int new_capture_source(struct hda_codec *codec, int adc_idx,
2679 hda_nid_t pin, int idx, const char *label)
2680{
2681 struct alc_spec *spec = codec->spec;
2682 struct hda_input_mux *imux = &spec->private_imux[0];
2683 struct nid_path *path;
2684
2685 path = snd_array_new(&spec->paths);
2686 if (!path)
2687 return -ENOMEM;
2688 memset(path, 0, sizeof(*path));
2689 if (!parse_nid_path(codec, pin, spec->adc_nids[adc_idx], 2, path)) {
2690 snd_printd(KERN_ERR "invalid input path 0x%x -> 0x%x\n",
2691 pin, spec->adc_nids[adc_idx]);
2692 return -EINVAL;
2693 }
2694
2695 spec->imux_pins[imux->num_items] = pin;
2696 snd_hda_add_imux_item(imux, label, idx, NULL);
2697 return 0;
2698}
2699
2700static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid) 2425static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
2701{ 2426{
2702 unsigned int pincap = snd_hda_query_pin_caps(codec, nid); 2427 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
@@ -2712,54 +2437,217 @@ static bool is_reachable_path(struct hda_codec *codec,
2712 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0; 2437 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
2713} 2438}
2714 2439
2715/* Parse the codec tree and retrieve ADCs and corresponding capsrc MUXs */ 2440/* Parse the codec tree and retrieve ADCs */
2716static int alc_auto_fill_adc_caps(struct hda_codec *codec) 2441static int alc_auto_fill_adc_nids(struct hda_codec *codec)
2717{ 2442{
2718 struct alc_spec *spec = codec->spec; 2443 struct alc_spec *spec = codec->spec;
2719 hda_nid_t nid; 2444 hda_nid_t nid;
2720 hda_nid_t *adc_nids = spec->private_adc_nids; 2445 hda_nid_t *adc_nids = spec->private_adc_nids;
2721 hda_nid_t *cap_nids = spec->private_capsrc_nids;
2722 int max_nums = ARRAY_SIZE(spec->private_adc_nids); 2446 int max_nums = ARRAY_SIZE(spec->private_adc_nids);
2723 int i, nums = 0; 2447 int i, nums = 0;
2724 2448
2725 nid = codec->start_nid; 2449 nid = codec->start_nid;
2726 for (i = 0; i < codec->num_nodes; i++, nid++) { 2450 for (i = 0; i < codec->num_nodes; i++, nid++) {
2727 hda_nid_t src;
2728 unsigned int caps = get_wcaps(codec, nid); 2451 unsigned int caps = get_wcaps(codec, nid);
2729 int type = get_wcaps_type(caps); 2452 int type = get_wcaps_type(caps);
2730 2453
2731 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL)) 2454 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
2732 continue; 2455 continue;
2733 adc_nids[nums] = nid; 2456 adc_nids[nums] = nid;
2734 cap_nids[nums] = nid;
2735 src = nid;
2736 for (;;) {
2737 int n;
2738 type = get_wcaps_type(get_wcaps(codec, src));
2739 if (type == AC_WID_PIN)
2740 break;
2741 if (type == AC_WID_AUD_SEL) {
2742 cap_nids[nums] = src;
2743 break;
2744 }
2745 n = snd_hda_get_num_conns(codec, src);
2746 if (n > 1) {
2747 cap_nids[nums] = src;
2748 break;
2749 } else if (n != 1)
2750 break;
2751 if (snd_hda_get_connections(codec, src, &src, 1) != 1)
2752 break;
2753 }
2754 if (++nums >= max_nums) 2457 if (++nums >= max_nums)
2755 break; 2458 break;
2756 } 2459 }
2757 spec->adc_nids = spec->private_adc_nids; 2460 spec->adc_nids = spec->private_adc_nids;
2758 spec->capsrc_nids = spec->private_capsrc_nids;
2759 spec->num_adc_nids = nums; 2461 spec->num_adc_nids = nums;
2760 return nums; 2462 return nums;
2761} 2463}
2762 2464
2465/* filter out invalid adc_nids that don't give all active input pins;
2466 * if needed, check whether dynamic ADC-switching is available
2467 */
2468static int check_dyn_adc_switch(struct hda_codec *codec)
2469{
2470 struct alc_spec *spec = codec->spec;
2471 struct hda_input_mux *imux = &spec->private_imux[0];
2472 hda_nid_t adc_nids[ARRAY_SIZE(spec->private_adc_nids)];
2473 int i, n, nums;
2474 hda_nid_t pin, adc;
2475
2476 again:
2477 nums = 0;
2478 for (n = 0; n < spec->num_adc_nids; n++) {
2479 adc = spec->adc_nids[n];
2480 for (i = 0; i < imux->num_items; i++) {
2481 pin = spec->imux_pins[i];
2482 if (!is_reachable_path(codec, pin, adc))
2483 break;
2484 }
2485 if (i >= imux->num_items)
2486 adc_nids[nums++] = adc;
2487 }
2488
2489 if (!nums) {
2490 if (spec->shared_mic_hp) {
2491 spec->shared_mic_hp = 0;
2492 spec->private_imux[0].num_items = 1;
2493 goto again;
2494 }
2495
2496 /* check whether ADC-switch is possible */
2497 for (i = 0; i < imux->num_items; i++) {
2498 pin = spec->imux_pins[i];
2499 for (n = 0; n < spec->num_adc_nids; n++) {
2500 adc = spec->adc_nids[n];
2501 if (is_reachable_path(codec, pin, adc)) {
2502 spec->dyn_adc_idx[i] = n;
2503 break;
2504 }
2505 }
2506 }
2507
2508 snd_printdd("realtek: enabling ADC switching\n");
2509 spec->dyn_adc_switch = 1;
2510 } else if (nums != spec->num_adc_nids) {
2511 memcpy(spec->private_adc_nids, adc_nids,
2512 nums * sizeof(hda_nid_t));
2513 spec->num_adc_nids = nums;
2514 }
2515
2516 if (spec->input_mux->num_items == 1 || spec->shared_mic_hp) {
2517 snd_printdd("realtek: reducing to a single ADC\n");
2518 spec->num_adc_nids = 1; /* reduce to a single ADC */
2519 }
2520
2521 return 0;
2522}
2523
2524/* templates for capture controls */
2525static const struct snd_kcontrol_new cap_src_temp = {
2526 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2527 .name = "Input Source",
2528 .info = alc_mux_enum_info,
2529 .get = alc_mux_enum_get,
2530 .put = alc_mux_enum_put,
2531};
2532
2533static const struct snd_kcontrol_new cap_vol_temp = {
2534 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2535 .name = "Capture Volume",
2536 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2537 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2538 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2539 .info = alc_cap_vol_info,
2540 .get = alc_cap_vol_get,
2541 .put = alc_cap_vol_put,
2542 .tlv = { .c = alc_cap_vol_tlv },
2543};
2544
2545static const struct snd_kcontrol_new cap_sw_temp = {
2546 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2547 .name = "Capture Switch",
2548 .info = alc_cap_sw_info,
2549 .get = alc_cap_sw_get,
2550 .put = alc_cap_sw_put,
2551};
2552
2553static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2554{
2555 hda_nid_t nid;
2556 int i, depth;
2557
2558 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2559 for (depth = 0; depth < 3; depth++) {
2560 if (depth >= path->depth)
2561 return -EINVAL;
2562 i = path->depth - depth - 1;
2563 nid = path->path[i];
2564 if (!path->ctls[NID_PATH_VOL_CTL]) {
2565 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2566 path->ctls[NID_PATH_VOL_CTL] =
2567 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2568 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2569 int idx = path->idx[i];
2570 if (!depth && codec->single_adc_amp)
2571 idx = 0;
2572 path->ctls[NID_PATH_VOL_CTL] =
2573 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2574 }
2575 }
2576 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2577 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2578 path->ctls[NID_PATH_MUTE_CTL] =
2579 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2580 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2581 int idx = path->idx[i];
2582 if (!depth && codec->single_adc_amp)
2583 idx = 0;
2584 path->ctls[NID_PATH_MUTE_CTL] =
2585 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2586 }
2587 }
2588 }
2589 return 0;
2590}
2591
2592static int create_capture_mixers(struct hda_codec *codec)
2593{
2594 struct alc_spec *spec = codec->spec;
2595 struct hda_input_mux *imux = &spec->private_imux[0];
2596 struct snd_kcontrol_new *knew;
2597 int i, n, nums;
2598
2599 if (spec->dyn_adc_switch)
2600 nums = 1;
2601 else
2602 nums = spec->num_adc_nids;
2603
2604 if (!spec->auto_mic && imux->num_items > 1) {
2605 knew = alc_kcontrol_new(spec, "Input Source", &cap_src_temp);
2606 if (!knew)
2607 return -ENOMEM;
2608 knew->count = nums;
2609 }
2610
2611 for (n = 0; n < nums; n++) {
2612 int vol, sw;
2613
2614 vol = sw = 0;
2615 for (i = 0; i < imux->num_items; i++) {
2616 struct nid_path *path;
2617 path = get_nid_path(codec, spec->imux_pins[i],
2618 get_adc_nid(codec, n, i));
2619 if (!path)
2620 continue;
2621 parse_capvol_in_path(codec, path);
2622 if (!vol)
2623 vol = path->ctls[NID_PATH_VOL_CTL];
2624 if (!sw)
2625 sw = path->ctls[NID_PATH_MUTE_CTL];
2626 }
2627
2628 if (vol) {
2629 knew = alc_kcontrol_new(spec, "Capture Volume",
2630 &cap_vol_temp);
2631 if (!knew)
2632 return -ENOMEM;
2633 knew->index = n;
2634 knew->private_value = vol;
2635 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2636 }
2637 if (sw) {
2638 knew = alc_kcontrol_new(spec, "Capture Switch",
2639 &cap_sw_temp);
2640 if (!knew)
2641 return -ENOMEM;
2642 knew->index = n;
2643 knew->private_value = sw;
2644 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2645 }
2646 }
2647
2648 return 0;
2649}
2650
2763/* create playback/capture controls for input pins */ 2651/* create playback/capture controls for input pins */
2764static int alc_auto_create_input_ctls(struct hda_codec *codec) 2652static int alc_auto_create_input_ctls(struct hda_codec *codec)
2765{ 2653{
@@ -2768,16 +2656,17 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec)
2768 hda_nid_t mixer = spec->mixer_nid; 2656 hda_nid_t mixer = spec->mixer_nid;
2769 struct hda_input_mux *imux = &spec->private_imux[0]; 2657 struct hda_input_mux *imux = &spec->private_imux[0];
2770 int num_adcs; 2658 int num_adcs;
2771 int i, c, err, idx, type_idx = 0; 2659 int i, c, err, type_idx = 0;
2772 const char *prev_label = NULL; 2660 const char *prev_label = NULL;
2773 2661
2774 num_adcs = alc_auto_fill_adc_caps(codec); 2662 num_adcs = alc_auto_fill_adc_nids(codec);
2775 if (num_adcs < 0) 2663 if (num_adcs < 0)
2776 return 0; 2664 return 0;
2777 2665
2778 for (i = 0; i < cfg->num_inputs; i++) { 2666 for (i = 0; i < cfg->num_inputs; i++) {
2779 hda_nid_t pin; 2667 hda_nid_t pin;
2780 const char *label; 2668 const char *label;
2669 bool imux_added;
2781 2670
2782 pin = cfg->inputs[i].pin; 2671 pin = cfg->inputs[i].pin;
2783 if (!alc_is_input_pin(codec, pin)) 2672 if (!alc_is_input_pin(codec, pin))
@@ -2801,21 +2690,35 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec)
2801 } 2690 }
2802 } 2691 }
2803 2692
2693 imux_added = false;
2804 for (c = 0; c < num_adcs; c++) { 2694 for (c = 0; c < num_adcs; c++) {
2805 hda_nid_t cap = get_capsrc(spec, c); 2695 struct nid_path *path;
2806 idx = get_connection_index(codec, cap, pin); 2696 hda_nid_t adc = spec->adc_nids[c];
2807 if (idx >= 0) { 2697
2808 err = new_capture_source(codec, c, pin, idx, label); 2698 if (!is_reachable_path(codec, pin, adc))
2809 if (err < 0) 2699 continue;
2810 return err; 2700 path = snd_array_new(&spec->paths);
2811 break; 2701 if (!path)
2702 return -ENOMEM;
2703 memset(path, 0, sizeof(*path));
2704 if (!parse_nid_path(codec, pin, adc, 2, path)) {
2705 snd_printd(KERN_ERR
2706 "invalid input path 0x%x -> 0x%x\n",
2707 pin, adc);
2708 spec->paths.used--;
2709 continue;
2710 }
2711
2712 if (!imux_added) {
2713 spec->imux_pins[imux->num_items] = pin;
2714 snd_hda_add_imux_item(imux, label,
2715 imux->num_items, NULL);
2716 imux_added = true;
2812 } 2717 }
2813 } 2718 }
2814 } 2719 }
2815 2720
2816 spec->num_mux_defs = 1;
2817 spec->input_mux = imux; 2721 spec->input_mux = imux;
2818
2819 return 0; 2722 return 0;
2820} 2723}
2821 2724
@@ -2852,11 +2755,6 @@ static int alc_auto_create_shared_input(struct hda_codec *codec)
2852 return 0; 2755 return 0;
2853} 2756}
2854 2757
2855static struct nid_path *
2856get_nid_path(struct hda_codec *codec, hda_nid_t from_nid, hda_nid_t to_nid);
2857static void activate_path(struct hda_codec *codec, struct nid_path *path,
2858 bool enable);
2859
2860static int get_pin_type(int line_out_type) 2758static int get_pin_type(int line_out_type)
2861{ 2759{
2862 if (line_out_type == AUTO_PIN_HP_OUT) 2760 if (line_out_type == AUTO_PIN_HP_OUT)
@@ -2886,7 +2784,7 @@ static void alc_auto_init_analog_input(struct hda_codec *codec)
2886 struct nid_path *path; 2784 struct nid_path *path;
2887 path = get_nid_path(codec, nid, spec->mixer_nid); 2785 path = get_nid_path(codec, nid, spec->mixer_nid);
2888 if (path) 2786 if (path)
2889 activate_path(codec, path, path->active); 2787 activate_path(codec, path, path->active, false);
2890 } 2788 }
2891 } 2789 }
2892} 2790}
@@ -3930,15 +3828,18 @@ static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
3930} 3828}
3931 3829
3932static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, 3830static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
3933 int i, bool enable) 3831 int i, bool enable, bool add_aamix)
3934{ 3832{
3935 struct alc_spec *spec = codec->spec; 3833 struct alc_spec *spec = codec->spec;
3936 hda_nid_t conn[16]; 3834 hda_nid_t conn[16];
3937 int n, nums, idx; 3835 int n, nums, idx;
3836 int type;
3938 hda_nid_t nid = path->path[i]; 3837 hda_nid_t nid = path->path[i];
3939 3838
3940 nums = snd_hda_get_connections(codec, nid, conn, ARRAY_SIZE(conn)); 3839 nums = snd_hda_get_connections(codec, nid, conn, ARRAY_SIZE(conn));
3941 if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_PIN) { 3840 type = get_wcaps_type(get_wcaps(codec, nid));
3841 if (type == AC_WID_PIN ||
3842 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
3942 nums = 1; 3843 nums = 1;
3943 idx = 0; 3844 idx = 0;
3944 } else 3845 } else
@@ -3954,14 +3855,14 @@ static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
3954 * when aa-mixer is available, we need to enable the path as well 3855 * when aa-mixer is available, we need to enable the path as well
3955 */ 3856 */
3956 for (n = 0; n < nums; n++) { 3857 for (n = 0; n < nums; n++) {
3957 if (n != idx && conn[n] != spec->mixer_nid) 3858 if (n != idx && (!add_aamix || conn[n] != spec->mixer_nid))
3958 continue; 3859 continue;
3959 activate_amp(codec, nid, HDA_INPUT, n, enable); 3860 activate_amp(codec, nid, HDA_INPUT, n, enable);
3960 } 3861 }
3961} 3862}
3962 3863
3963static void activate_path(struct hda_codec *codec, struct nid_path *path, 3864static void activate_path(struct hda_codec *codec, struct nid_path *path,
3964 bool enable) 3865 bool enable, bool add_aamix)
3965{ 3866{
3966 int i; 3867 int i;
3967 3868
@@ -3974,7 +3875,7 @@ static void activate_path(struct hda_codec *codec, struct nid_path *path,
3974 AC_VERB_SET_CONNECT_SEL, 3875 AC_VERB_SET_CONNECT_SEL,
3975 path->idx[i]); 3876 path->idx[i]);
3976 if (has_amp_in(codec, path, i)) 3877 if (has_amp_in(codec, path, i))
3977 activate_amp_in(codec, path, i, enable); 3878 activate_amp_in(codec, path, i, enable, add_aamix);
3978 if (has_amp_out(codec, path, i)) 3879 if (has_amp_out(codec, path, i))
3979 activate_amp_out(codec, path, i, enable); 3880 activate_amp_out(codec, path, i, enable);
3980 } 3881 }
@@ -3996,7 +3897,7 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
3996 return; 3897 return;
3997 if (path->active) 3898 if (path->active)
3998 return; 3899 return;
3999 activate_path(codec, path, true); 3900 activate_path(codec, path, true, true);
4000} 3901}
4001 3902
4002static void alc_auto_init_multi_out(struct hda_codec *codec) 3903static void alc_auto_init_multi_out(struct hda_codec *codec)
@@ -4210,9 +4111,9 @@ static int alc_set_multi_io(struct hda_codec *codec, int idx, bool output)
4210 4111
4211 if (output) { 4112 if (output) {
4212 snd_hda_set_pin_ctl_cache(codec, nid, PIN_OUT); 4113 snd_hda_set_pin_ctl_cache(codec, nid, PIN_OUT);
4213 activate_path(codec, path, true); 4114 activate_path(codec, path, true, true);
4214 } else { 4115 } else {
4215 activate_path(codec, path, false); 4116 activate_path(codec, path, false, true);
4216 snd_hda_set_pin_ctl_cache(codec, nid, 4117 snd_hda_set_pin_ctl_cache(codec, nid,
4217 spec->multi_io[idx].ctl_in); 4118 spec->multi_io[idx].ctl_in);
4218 } 4119 }
@@ -4276,112 +4177,41 @@ static void alc_auto_init_multi_io(struct hda_codec *codec)
4276 spec->multi_io[i].ctl_in = 4177 spec->multi_io[i].ctl_in =
4277 snd_hda_codec_update_cache(codec, pin, 0, 4178 snd_hda_codec_update_cache(codec, pin, 0,
4278 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 4179 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4279 activate_path(codec, path, path->active); 4180 activate_path(codec, path, path->active, true);
4280 }
4281}
4282
4283/* filter out invalid adc_nids (and capsrc_nids) that don't give all
4284 * active input pins
4285 */
4286static void alc_remove_invalid_adc_nids(struct hda_codec *codec)
4287{
4288 struct alc_spec *spec = codec->spec;
4289 const struct hda_input_mux *imux;
4290 hda_nid_t adc_nids[ARRAY_SIZE(spec->private_adc_nids)];
4291 hda_nid_t capsrc_nids[ARRAY_SIZE(spec->private_adc_nids)];
4292 int i, n, nums;
4293
4294 imux = spec->input_mux;
4295 if (!imux)
4296 return;
4297 if (spec->dyn_adc_switch)
4298 return;
4299
4300 again:
4301 nums = 0;
4302 for (n = 0; n < spec->num_adc_nids; n++) {
4303 hda_nid_t cap = spec->private_capsrc_nids[n];
4304 int num_conns = snd_hda_get_num_conns(codec, cap);
4305 for (i = 0; i < imux->num_items; i++) {
4306 hda_nid_t pin = spec->imux_pins[i];
4307 if (pin) {
4308 if (get_connection_index(codec, cap, pin) < 0)
4309 break;
4310 } else if (num_conns <= imux->items[i].index)
4311 break;
4312 }
4313 if (i >= imux->num_items) {
4314 adc_nids[nums] = spec->private_adc_nids[n];
4315 capsrc_nids[nums++] = cap;
4316 }
4317 } 4181 }
4318 if (!nums) {
4319 /* check whether ADC-switch is possible */
4320 if (!alc_check_dyn_adc_switch(codec)) {
4321 if (spec->shared_mic_hp) {
4322 spec->shared_mic_hp = 0;
4323 spec->private_imux[0].num_items = 1;
4324 goto again;
4325 }
4326 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
4327 " using fallback 0x%x\n",
4328 codec->chip_name, spec->private_adc_nids[0]);
4329 spec->num_adc_nids = 1;
4330 spec->auto_mic = 0;
4331 return;
4332 }
4333 } else if (nums != spec->num_adc_nids) {
4334 memcpy(spec->private_adc_nids, adc_nids,
4335 nums * sizeof(hda_nid_t));
4336 memcpy(spec->private_capsrc_nids, capsrc_nids,
4337 nums * sizeof(hda_nid_t));
4338 spec->num_adc_nids = nums;
4339 }
4340
4341 if (spec->auto_mic)
4342 alc_auto_mic_check_imux(codec); /* check auto-mic setups */
4343 else if (spec->input_mux->num_items == 1 || spec->shared_mic_hp)
4344 spec->num_adc_nids = 1; /* reduce to a single ADC */
4345} 4182}
4346 4183
4347/* 4184/*
4348 * initialize ADC paths 4185 * initialize ADC paths
4349 */ 4186 */
4350static void alc_auto_init_adc(struct hda_codec *codec, int adc_idx)
4351{
4352 struct alc_spec *spec = codec->spec;
4353 hda_nid_t nid;
4354
4355 nid = spec->adc_nids[adc_idx];
4356 /* mute ADC */
4357 if (nid_has_mute(codec, nid, HDA_INPUT)) {
4358 snd_hda_codec_write(codec, nid, 0,
4359 AC_VERB_SET_AMP_GAIN_MUTE,
4360 AMP_IN_MUTE(0));
4361 return;
4362 }
4363 if (!spec->capsrc_nids)
4364 return;
4365 nid = spec->capsrc_nids[adc_idx];
4366 if (nid_has_mute(codec, nid, HDA_OUTPUT))
4367 snd_hda_codec_write(codec, nid, 0,
4368 AC_VERB_SET_AMP_GAIN_MUTE,
4369 AMP_OUT_MUTE);
4370}
4371
4372static void alc_auto_init_input_src(struct hda_codec *codec) 4187static void alc_auto_init_input_src(struct hda_codec *codec)
4373{ 4188{
4374 struct alc_spec *spec = codec->spec; 4189 struct alc_spec *spec = codec->spec;
4375 int c, nums; 4190 struct hda_input_mux *imux = &spec->private_imux[0];
4191 struct nid_path *path;
4192 int i, c, nums;
4376 4193
4377 for (c = 0; c < spec->num_adc_nids; c++)
4378 alc_auto_init_adc(codec, c);
4379 if (spec->dyn_adc_switch) 4194 if (spec->dyn_adc_switch)
4380 nums = 1; 4195 nums = 1;
4381 else 4196 else
4382 nums = spec->num_adc_nids; 4197 nums = spec->num_adc_nids;
4383 for (c = 0; c < nums; c++) 4198
4384 alc_mux_select(codec, c, spec->cur_mux[c], true); 4199 for (c = 0; c < nums; c++) {
4200 for (i = 0; i < imux->num_items; i++) {
4201 path = get_nid_path(codec, spec->imux_pins[i],
4202 get_adc_nid(codec, c, i));
4203 if (path) {
4204 bool active = path->active;
4205 if (i == spec->cur_mux[c])
4206 active = true;
4207 activate_path(codec, path, active, false);
4208 }
4209 }
4210 }
4211
4212 alc_inv_dmic_sync(codec, true);
4213 if (spec->shared_mic_hp)
4214 update_shared_mic_hp(codec, spec->cur_mux[0]);
4385} 4215}
4386 4216
4387/* add mic boosts if needed */ 4217/* add mic boosts if needed */
@@ -4429,94 +4259,6 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec)
4429 return 0; 4259 return 0;
4430} 4260}
4431 4261
4432/* select or unmute the given capsrc route */
4433static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
4434 int idx)
4435{
4436 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
4437 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
4438 HDA_AMP_MUTE, 0);
4439 } else if (snd_hda_get_num_conns(codec, cap) > 1) {
4440 snd_hda_codec_write_cache(codec, cap, 0,
4441 AC_VERB_SET_CONNECT_SEL, idx);
4442 }
4443}
4444
4445/* set the default connection to that pin */
4446static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
4447{
4448 struct alc_spec *spec = codec->spec;
4449 int i;
4450
4451 if (!pin)
4452 return 0;
4453 for (i = 0; i < spec->num_adc_nids; i++) {
4454 hda_nid_t cap = get_capsrc(spec, i);
4455 int idx;
4456
4457 idx = get_connection_index(codec, cap, pin);
4458 if (idx < 0)
4459 continue;
4460 select_or_unmute_capsrc(codec, cap, idx);
4461 return i; /* return the found index */
4462 }
4463 return -1; /* not found */
4464}
4465
4466/* initialize some special cases for input sources */
4467static void alc_init_special_input_src(struct hda_codec *codec)
4468{
4469 struct alc_spec *spec = codec->spec;
4470 int i;
4471
4472 for (i = 0; i < spec->autocfg.num_inputs; i++)
4473 init_capsrc_for_pin(codec, spec->autocfg.inputs[i].pin);
4474}
4475
4476/* assign appropriate capture mixers */
4477static void set_capture_mixer(struct hda_codec *codec)
4478{
4479 struct alc_spec *spec = codec->spec;
4480 static const struct snd_kcontrol_new *caps[2][3] = {
4481 { alc_capture_mixer_nosrc1,
4482 alc_capture_mixer_nosrc2,
4483 alc_capture_mixer_nosrc3 },
4484 { alc_capture_mixer1,
4485 alc_capture_mixer2,
4486 alc_capture_mixer3 },
4487 };
4488
4489 /* check whether either of ADC or MUX has a volume control */
4490 if (!nid_has_volume(codec, spec->adc_nids[0], HDA_INPUT)) {
4491 if (!spec->capsrc_nids)
4492 return; /* no volume */
4493 if (!nid_has_volume(codec, spec->capsrc_nids[0], HDA_OUTPUT))
4494 return; /* no volume in capsrc, too */
4495 spec->vol_in_capsrc = 1;
4496 }
4497
4498 if (spec->num_adc_nids > 0) {
4499 int mux = 0;
4500 int num_adcs = 0;
4501
4502 if (spec->input_mux && spec->input_mux->num_items > 1)
4503 mux = 1;
4504 if (spec->auto_mic) {
4505 num_adcs = 1;
4506 mux = 0;
4507 } else if (spec->dyn_adc_switch)
4508 num_adcs = 1;
4509 if (!num_adcs) {
4510 if (spec->num_adc_nids > 3)
4511 spec->num_adc_nids = 3;
4512 else if (!spec->num_adc_nids)
4513 return;
4514 num_adcs = spec->num_adc_nids;
4515 }
4516 spec->cap_mixer = caps[mux][num_adcs - 1];
4517 }
4518}
4519
4520/* 4262/*
4521 * standard auto-parser initializations 4263 * standard auto-parser initializations
4522 */ 4264 */
@@ -4639,16 +4381,28 @@ static int alc_parse_auto_config(struct hda_codec *codec,
4639 dig_only: 4381 dig_only:
4640 alc_auto_parse_digital(codec); 4382 alc_auto_parse_digital(codec);
4641 4383
4642 if (!spec->no_analog)
4643 alc_remove_invalid_adc_nids(codec);
4644
4645 if (ssid_nids) 4384 if (ssid_nids)
4646 alc_ssid_check(codec, ssid_nids); 4385 alc_ssid_check(codec, ssid_nids);
4647 4386
4648 if (!spec->no_analog) { 4387 if (!spec->no_analog) {
4649 err = alc_auto_check_switches(codec); 4388 err = alc_init_automute(codec);
4650 if (err < 0) 4389 if (err < 0)
4651 return err; 4390 return err;
4391
4392 err = check_dyn_adc_switch(codec);
4393 if (err < 0)
4394 return err;
4395
4396 if (!spec->shared_mic_hp) {
4397 err = alc_init_auto_mic(codec);
4398 if (err < 0)
4399 return err;
4400 }
4401
4402 err = create_capture_mixers(codec);
4403 if (err < 0)
4404 return err;
4405
4652 err = alc_auto_add_mic_boost(codec); 4406 err = alc_auto_add_mic_boost(codec);
4653 if (err < 0) 4407 if (err < 0)
4654 return err; 4408 return err;
@@ -4657,9 +4411,6 @@ static int alc_parse_auto_config(struct hda_codec *codec,
4657 if (spec->kctls.list) 4411 if (spec->kctls.list)
4658 add_mixer(spec, spec->kctls.list); 4412 add_mixer(spec, spec->kctls.list);
4659 4413
4660 if (!spec->no_analog && !spec->cap_mixer)
4661 set_capture_mixer(codec);
4662
4663 return 1; 4414 return 1;
4664} 4415}
4665 4416