static int cmi9880_build_controls(struct hda_codec *codec) { struct cmi_spec *spec = codec->spec; int err; err = snd_hda_add_new_ctls(codec, cmi9880_basic_mixer); if (err < 0) return err; if (spec->channel_modes) { err = snd_hda_add_new_ctls(codec, cmi9880_ch_mode_mixer); if (err < 0) return err; } if (spec->multiout.dig_out_nid) { err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); if (err < 0) return err; err = snd_hda_create_spdif_share_sw(codec, &spec->multiout); if (err < 0) return err; spec->multiout.share_spdif = 1; } if (spec->dig_in_nid) { err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); if (err < 0) return err; } return 0; }
static int build_digital_output(struct hda_codec *codec) { struct cs_spec *spec = codec->spec; int err; if (!spec->multiout.dig_out_nid) return 0; err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); if (err < 0) return err; err = snd_hda_create_spdif_share_sw(codec, &spec->multiout); if (err < 0) return err; return 0; }
static int cmi9880_build_controls(struct hda_codec *codec) { struct cmi_spec *spec = codec->spec; struct snd_kcontrol *kctl; int i, err; err = snd_hda_add_new_ctls(codec, cmi9880_basic_mixer); if (err < 0) return err; if (spec->channel_modes) { err = snd_hda_add_new_ctls(codec, cmi9880_ch_mode_mixer); if (err < 0) return err; } if (spec->multiout.dig_out_nid) { err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid, spec->multiout.dig_out_nid); if (err < 0) return err; err = snd_hda_create_spdif_share_sw(codec, &spec->multiout); if (err < 0) return err; spec->multiout.share_spdif = 1; } if (spec->dig_in_nid) { err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); if (err < 0) return err; } /* assign Capture Source enums to NID */ kctl = snd_hda_find_mixer_ctl(codec, "Capture Source"); for (i = 0; kctl && i < kctl->count; i++) { err = snd_hda_add_nid(codec, kctl, i, spec->adc_nids[i]); if (err < 0) return err; } return 0; }
static int ca0110_build_controls(struct hda_codec *codec) { struct ca0110_spec *spec = codec->spec; struct auto_pin_cfg *cfg = &spec->autocfg; static const char * const prefix[AUTO_CFG_MAX_OUTS] = { "Front", "Surround", NULL, "Side", "Multi" }; hda_nid_t mutenid; int i, err; for (i = 0; i < spec->multiout.num_dacs; i++) { if (get_wcaps(codec, spec->out_pins[i]) & AC_WCAP_OUT_AMP) mutenid = spec->out_pins[i]; else mutenid = spec->multiout.dac_nids[i]; if (!prefix[i]) { err = add_mono_switch(codec, mutenid, "Center", 1); if (err < 0) return err; err = add_mono_switch(codec, mutenid, "LFE", 1); if (err < 0) return err; err = add_mono_volume(codec, spec->multiout.dac_nids[i], "Center", 1); if (err < 0) return err; err = add_mono_volume(codec, spec->multiout.dac_nids[i], "LFE", 1); if (err < 0) return err; } else { err = add_out_switch(codec, mutenid, prefix[i]); if (err < 0) return err; err = add_out_volume(codec, spec->multiout.dac_nids[i], prefix[i]); if (err < 0) return err; } } if (cfg->hp_outs) { if (get_wcaps(codec, cfg->hp_pins[0]) & AC_WCAP_OUT_AMP) mutenid = cfg->hp_pins[0]; else mutenid = spec->multiout.dac_nids[i]; err = add_out_switch(codec, mutenid, "Headphone"); if (err < 0) return err; if (spec->hp_dac) { err = add_out_volume(codec, spec->hp_dac, "Headphone"); if (err < 0) return err; } } for (i = 0; i < spec->num_inputs; i++) { const char *label = spec->input_labels[i]; if (get_wcaps(codec, spec->input_pins[i]) & AC_WCAP_IN_AMP) mutenid = spec->input_pins[i]; else mutenid = spec->adcs[i]; err = add_in_switch(codec, mutenid, label); if (err < 0) return err; err = add_in_volume(codec, spec->adcs[i], label); if (err < 0) return err; } if (spec->dig_out) { err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out, spec->dig_out); if (err < 0) return err; err = snd_hda_create_spdif_share_sw(codec, &spec->multiout); if (err < 0) return err; spec->multiout.share_spdif = 1; } if (spec->dig_in) { err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in); if (err < 0) return err; err = add_in_volume(codec, spec->dig_in, "IEC958"); } return 0; }
static int ad198x_build_controls(struct hda_codec *codec) { struct ad198x_spec *spec = codec->spec; struct snd_kcontrol *kctl; unsigned int i; int err; for (i = 0; i < spec->num_mixers; i++) { err = snd_hda_add_new_ctls(codec, spec->mixers[i]); if (err < 0) return err; } if (spec->multiout.dig_out_nid) { err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); if (err < 0) return err; err = snd_hda_create_spdif_share_sw(codec, &spec->multiout); if (err < 0) return err; spec->multiout.share_spdif = 1; } if (spec->dig_in_nid) { err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); if (err < 0) return err; } /* create beep controls if needed */ #ifdef CONFIG_SND_HDA_INPUT_BEEP if (spec->beep_amp) { struct snd_kcontrol_new *knew; knew = spec->analog_beep ? ad_beep2_mixer : ad_beep_mixer; for ( ; knew->name; knew++) { struct snd_kcontrol *kctl; kctl = snd_ctl_new1(knew, codec); if (!kctl) return -ENOMEM; kctl->private_value = spec->beep_amp; err = snd_hda_ctl_add(codec, 0, kctl); if (err < 0) return err; } } #endif /* if we have no master control, let's create it */ if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { unsigned int vmaster_tlv[4]; snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, HDA_OUTPUT, vmaster_tlv); err = snd_hda_add_vmaster(codec, "Master Playback Volume", vmaster_tlv, (spec->slave_vols ? spec->slave_vols : ad_slave_vols)); if (err < 0) return err; } if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { err = snd_hda_add_vmaster(codec, "Master Playback Switch", NULL, (spec->slave_sws ? spec->slave_sws : ad_slave_sws)); if (err < 0) return err; } ad198x_free_kctls(codec); /* no longer needed */ /* assign Capture Source enums to NID */ kctl = snd_hda_find_mixer_ctl(codec, "Capture Source"); if (!kctl) kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); for (i = 0; kctl && i < kctl->count; i++) { err = snd_hda_add_nid(codec, kctl, i, spec->capsrc_nids[i]); if (err < 0) return err; } /* assign IEC958 enums to NID */ kctl = snd_hda_find_mixer_ctl(codec, SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source"); if (kctl) { err = snd_hda_add_nid(codec, kctl, 0, spec->multiout.dig_out_nid); if (err < 0) return err; } return 0; }
static int ad198x_build_controls(struct hda_codec *codec) { struct ad198x_spec *spec = codec->spec; struct snd_kcontrol *kctl; unsigned int i; int err; for (i = 0; i < spec->num_mixers; i++) { err = snd_hda_add_new_ctls(codec, spec->mixers[i]); if (err < 0) return err; } if (spec->multiout.dig_out_nid) { err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid, spec->multiout.dig_out_nid); if (err < 0) return err; err = snd_hda_create_spdif_share_sw(codec, &spec->multiout); if (err < 0) return err; spec->multiout.share_spdif = 1; } if (spec->dig_in_nid) { err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); if (err < 0) return err; } /* create beep controls if needed */ err = create_beep_ctls(codec); if (err < 0) return err; /* if we have no master control, let's create it */ if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { unsigned int vmaster_tlv[4]; snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, HDA_OUTPUT, vmaster_tlv); err = __snd_hda_add_vmaster(codec, "Master Playback Volume", vmaster_tlv, (spec->slave_vols ? spec->slave_vols : ad_slave_pfxs), "Playback Volume", !spec->avoid_init_slave_vol, NULL); if (err < 0) return err; } if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { err = snd_hda_add_vmaster(codec, "Master Playback Switch", NULL, (spec->slave_sws ? spec->slave_sws : ad_slave_pfxs), "Playback Switch"); if (err < 0) return err; } /* assign Capture Source enums to NID */ kctl = snd_hda_find_mixer_ctl(codec, "Capture Source"); if (!kctl) kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); for (i = 0; kctl && i < kctl->count; i++) { err = snd_hda_add_nid(codec, kctl, i, spec->capsrc_nids[i]); if (err < 0) return err; } /* assign IEC958 enums to NID */ kctl = snd_hda_find_mixer_ctl(codec, SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source"); if (kctl) { err = snd_hda_add_nid(codec, kctl, 0, spec->multiout.dig_out_nid); if (err < 0) return err; } return 0; }