static int cs421x_parse_auto_config(struct hda_codec *codec) { struct cs_spec *spec = codec->spec; hda_nid_t dac = CS4210_DAC_NID; int err; fix_volume_caps(codec, dac); err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, 0); if (err < 0) return err; err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg); if (err < 0) return err; parse_cs421x_digital(codec); if (spec->gen.autocfg.speaker_outs && spec->vendor_nid == CS4210_VENDOR_NID) { if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &cs421x_speaker_boost_ctl)) return -ENOMEM; } return 0; }
static int add_output(struct hda_codec *codec, hda_nid_t dac, int idx, int num_ctls, int type) { struct cs_spec *spec = codec->spec; const char *name; int err, index; struct snd_kcontrol *kctl; static const char * const speakers[] = { "Front Speaker", "Surround Speaker", "Bass Speaker" }; static const char * const line_outs[] = { "Front Line-Out", "Surround Line-Out", "Bass Line-Out" }; fix_volume_caps(codec, dac); if (!spec->vmaster_sw) { err = add_vmaster(codec, dac); if (err < 0) return err; } index = 0; switch (type) { case AUTO_PIN_HP_OUT: name = "Headphone"; index = idx; break; case AUTO_PIN_SPEAKER_OUT: if (num_ctls > 1) name = speakers[idx]; else name = "Speaker"; break; default: if (num_ctls > 1) name = line_outs[idx]; else name = "Line-Out"; break; } err = add_mute(codec, name, index, HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl); if (err < 0) return err; err = snd_ctl_add_slave(spec->vmaster_sw, kctl); if (err < 0) return err; err = add_volume(codec, name, index, HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl); if (err < 0) return err; err = snd_ctl_add_slave(spec->vmaster_vol, kctl); if (err < 0) return err; return 0; }
static int cs421x_parse_auto_config(struct hda_codec *codec) { struct cs_spec *spec = codec->spec; hda_nid_t dac = CS4210_DAC_NID; int err; fix_volume_caps(codec, dac); err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, 0); if (err < 0) return err; err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg); if (err < 0) return err; parse_cs421x_digital(codec); return 0; }