diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 171400216326..6b7eeba656ed 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -2949,17 +2949,30 @@ static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid) | |||
2949 | return 1; | 2949 | return 1; |
2950 | } | 2950 | } |
2951 | 2951 | ||
2952 | static int is_unique_dac(struct sigmatel_spec *spec, hda_nid_t nid) | ||
2953 | { | ||
2954 | int i; | ||
2955 | |||
2956 | if (spec->autocfg.line_outs != 1) | ||
2957 | return 0; | ||
2958 | if (spec->multiout.hp_nid == nid) | ||
2959 | return 0; | ||
2960 | for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) | ||
2961 | if (spec->multiout.extra_out_nid[i] == nid) | ||
2962 | return 0; | ||
2963 | return 1; | ||
2964 | } | ||
2965 | |||
2952 | /* add playback controls from the parsed DAC table */ | 2966 | /* add playback controls from the parsed DAC table */ |
2953 | static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | 2967 | static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, |
2954 | const struct auto_pin_cfg *cfg) | 2968 | const struct auto_pin_cfg *cfg) |
2955 | { | 2969 | { |
2970 | struct sigmatel_spec *spec = codec->spec; | ||
2956 | static const char *chname[4] = { | 2971 | static const char *chname[4] = { |
2957 | "Front", "Surround", NULL /*CLFE*/, "Side" | 2972 | "Front", "Surround", NULL /*CLFE*/, "Side" |
2958 | }; | 2973 | }; |
2959 | hda_nid_t nid = 0; | 2974 | hda_nid_t nid = 0; |
2960 | int i, err; | 2975 | int i, err, num_dacs; |
2961 | |||
2962 | struct sigmatel_spec *spec = codec->spec; | ||
2963 | unsigned int wid_caps, pincap; | 2976 | unsigned int wid_caps, pincap; |
2964 | 2977 | ||
2965 | for (i = 0; i < cfg->line_outs && spec->multiout.dac_nids[i]; i++) { | 2978 | for (i = 0; i < cfg->line_outs && spec->multiout.dac_nids[i]; i++) { |
@@ -2985,7 +2998,19 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
2985 | } | 2998 | } |
2986 | 2999 | ||
2987 | } else { | 3000 | } else { |
2988 | err = create_controls(spec, chname[i], nid, 3); | 3001 | const char *name = chname[i]; |
3002 | /* if it's a single DAC, assign a better name */ | ||
3003 | if (!i && is_unique_dac(spec, nid)) { | ||
3004 | switch (cfg->line_out_type) { | ||
3005 | case AUTO_PIN_HP_OUT: | ||
3006 | name = "Headphone"; | ||
3007 | break; | ||
3008 | case AUTO_PIN_SPEAKER_OUT: | ||
3009 | name = "Speaker"; | ||
3010 | break; | ||
3011 | } | ||
3012 | } | ||
3013 | err = create_controls(spec, name, nid, 3); | ||
2989 | if (err < 0) | 3014 | if (err < 0) |
2990 | return err; | 3015 | return err; |
2991 | } | 3016 | } |