aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2012-10-03 05:12:53 -0400
committerTakashi Iwai <tiwai@suse.de>2012-10-06 10:51:09 -0400
commiteee3ed43a6e5aedf146027047c11eb92a27ee9ed (patch)
tree536c409ba2805268425332fb5599ae29e2d3e007 /sound
parent74d3e69728a0dcee8cd0f93da4dc077431d59606 (diff)
ALSA: hda - avoid unneccesary indices on "Headphone Jack" controls
In case there is one "Headphone Jack" and one "Dock Headphone Jack", one of them will get an index, even though that is not needed. This patch fixes that issue. BugLink: https://bugs.launchpad.net/bugs/1060729 Signed-off-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/hda_auto_parser.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c
index a98e25ebfd6..4ec6dc88b7f 100644
--- a/sound/pci/hda/hda_auto_parser.c
+++ b/sound/pci/hda/hda_auto_parser.c
@@ -498,6 +498,38 @@ static const char *check_output_sfx(hda_nid_t nid, const hda_nid_t *pins,
498 return channel_sfx[i]; 498 return channel_sfx[i];
499} 499}
500 500
501static const char *check_output_pfx(struct hda_codec *codec, hda_nid_t nid)
502{
503 unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
504 int attr = snd_hda_get_input_pin_attr(def_conf);
505
506 /* check the location */
507 switch (attr) {
508 case INPUT_PIN_ATTR_DOCK:
509 return "Dock ";
510 case INPUT_PIN_ATTR_FRONT:
511 return "Front ";
512 }
513 return "";
514}
515
516static int get_hp_label_index(struct hda_codec *codec, hda_nid_t nid,
517 const hda_nid_t *pins, int num_pins)
518{
519 int i, j, idx = 0;
520
521 const char *pfx = check_output_pfx(codec, nid);
522
523 i = find_idx_in_nid_list(nid, pins, num_pins);
524 if (i < 0)
525 return -1;
526 for (j = 0; j < i; j++)
527 if (pfx == check_output_pfx(codec, pins[j]))
528 idx++;
529
530 return idx;
531}
532
501static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, 533static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid,
502 const struct auto_pin_cfg *cfg, 534 const struct auto_pin_cfg *cfg,
503 const char *name, char *label, int maxlen, 535 const char *name, char *label, int maxlen,
@@ -505,20 +537,13 @@ static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid,
505{ 537{
506 unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); 538 unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
507 int attr = snd_hda_get_input_pin_attr(def_conf); 539 int attr = snd_hda_get_input_pin_attr(def_conf);
508 const char *pfx = "", *sfx = ""; 540 const char *pfx, *sfx = "";
509 541
510 /* handle as a speaker if it's a fixed line-out */ 542 /* handle as a speaker if it's a fixed line-out */
511 if (!strcmp(name, "Line Out") && attr == INPUT_PIN_ATTR_INT) 543 if (!strcmp(name, "Line Out") && attr == INPUT_PIN_ATTR_INT)
512 name = "Speaker"; 544 name = "Speaker";
513 /* check the location */ 545 pfx = check_output_pfx(codec, nid);
514 switch (attr) { 546
515 case INPUT_PIN_ATTR_DOCK:
516 pfx = "Dock ";
517 break;
518 case INPUT_PIN_ATTR_FRONT:
519 pfx = "Front ";
520 break;
521 }
522 if (cfg) { 547 if (cfg) {
523 /* try to give a unique suffix if needed */ 548 /* try to give a unique suffix if needed */
524 sfx = check_output_sfx(nid, cfg->line_out_pins, cfg->line_outs, 549 sfx = check_output_sfx(nid, cfg->line_out_pins, cfg->line_outs,
@@ -528,8 +553,8 @@ static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid,
528 indexp); 553 indexp);
529 if (!sfx) { 554 if (!sfx) {
530 /* don't add channel suffix for Headphone controls */ 555 /* don't add channel suffix for Headphone controls */
531 int idx = find_idx_in_nid_list(nid, cfg->hp_pins, 556 int idx = get_hp_label_index(codec, nid, cfg->hp_pins,
532 cfg->hp_outs); 557 cfg->hp_outs);
533 if (idx >= 0) 558 if (idx >= 0)
534 *indexp = idx; 559 *indexp = idx;
535 sfx = ""; 560 sfx = "";