aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2011-07-08 10:12:05 -0400
committerTakashi Iwai <tiwai@suse.de>2011-07-08 10:12:05 -0400
commit4c11398edc19fdd9c651f3ff287cd628fecaf574 (patch)
tree57fb45235dfda35678ea488c4a19fa3ef4d10ab1 /sound/pci
parentbe9bc37bccab8c492e6cbaaa4d5b1b2c8296b1c4 (diff)
ALSA: hda - Merge ALC269 parser code
One more code reduction. This codec has less DACs, thus the wiring to DAC can't be filled uniquely for all output pins, i.e. some outputs share the same volume control. Except for that, all seems working fine. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/hda/patch_realtek.c124
1 files changed, 10 insertions, 114 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 8f1bd80e6027..2a94c58b2104 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -4193,119 +4193,6 @@ static int patch_alc882(struct hda_codec *codec)
4193/* 4193/*
4194 * ALC262 support 4194 * ALC262 support
4195 */ 4195 */
4196
4197/* We use two mixers depending on the output pin; 0x16 is a mono output
4198 * and thus it's bound with a different mixer.
4199 * This function returns which mixer amp should be used.
4200 */
4201static int alc262_check_volbit(hda_nid_t nid)
4202{
4203 if (!nid)
4204 return 0;
4205 else if (nid == 0x16)
4206 return 2;
4207 else
4208 return 1;
4209}
4210
4211static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
4212 const char *pfx, int *vbits, int idx)
4213{
4214 unsigned long val;
4215 int vbit;
4216
4217 vbit = alc262_check_volbit(nid);
4218 if (!vbit)
4219 return 0;
4220 if (*vbits & vbit) /* a volume control for this mixer already there */
4221 return 0;
4222 *vbits |= vbit;
4223 if (vbit == 2)
4224 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
4225 else
4226 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
4227 return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx, val);
4228}
4229
4230static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
4231 const char *pfx, int idx)
4232{
4233 unsigned long val;
4234
4235 if (!nid)
4236 return 0;
4237 if (nid == 0x16)
4238 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
4239 else
4240 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
4241 return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx, val);
4242}
4243
4244/* add playback controls from the parsed DAC table */
4245static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
4246 const struct auto_pin_cfg *cfg)
4247{
4248 const char *pfx;
4249 int vbits;
4250 int i, index, err;
4251
4252 spec->multiout.num_dacs = 1; /* only use one dac */
4253 spec->multiout.dac_nids = spec->private_dac_nids;
4254 spec->private_dac_nids[0] = 2;
4255
4256 for (i = 0; i < 2; i++) {
4257 pfx = alc_get_line_out_pfx(spec, i, true, &index);
4258 if (!pfx)
4259 pfx = "PCM";
4260 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx,
4261 index);
4262 if (err < 0)
4263 return err;
4264 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4265 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[i],
4266 "Speaker", i);
4267 if (err < 0)
4268 return err;
4269 }
4270 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4271 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[i],
4272 "Headphone", i);
4273 if (err < 0)
4274 return err;
4275 }
4276 }
4277
4278 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
4279 alc262_check_volbit(cfg->speaker_pins[0]) |
4280 alc262_check_volbit(cfg->hp_pins[0]);
4281 vbits = 0;
4282 for (i = 0; i < 2; i++) {
4283 pfx = alc_get_line_out_pfx(spec, i, true, &index);
4284 if (!pfx)
4285 pfx = "PCM";
4286 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
4287 &vbits, i);
4288 if (err < 0)
4289 return err;
4290 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4291 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[i],
4292 "Speaker", &vbits, i);
4293 if (err < 0)
4294 return err;
4295 }
4296 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4297 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[i],
4298 "Headphone", &vbits, i);
4299 if (err < 0)
4300 return err;
4301 }
4302 }
4303 return 0;
4304}
4305
4306/*
4307 * BIOS auto configuration
4308 */
4309static int alc262_parse_auto_config(struct hda_codec *codec) 4196static int alc262_parse_auto_config(struct hda_codec *codec)
4310{ 4197{
4311 struct alc_spec *spec = codec->spec; 4198 struct alc_spec *spec = codec->spec;
@@ -4324,7 +4211,16 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
4324 } 4211 }
4325 return 0; /* can't find valid BIOS pin config */ 4212 return 0; /* can't find valid BIOS pin config */
4326 } 4213 }
4327 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg); 4214 err = alc_auto_fill_dac_nids(codec);
4215 if (err < 0)
4216 return err;
4217 err = alc_auto_create_multi_out_ctls(codec, &spec->autocfg);
4218 if (err < 0)
4219 return err;
4220 err = alc_auto_create_hp_out(codec);
4221 if (err < 0)
4222 return err;
4223 err = alc_auto_create_speaker_out(codec);
4328 if (err < 0) 4224 if (err < 0)
4329 return err; 4225 return err;
4330 err = alc_auto_create_input_ctls(codec); 4226 err = alc_auto_create_input_ctls(codec);