static int vt1709_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) { int err; if (!pin) return 0; if (spec->multiout.num_dacs == 5) /* 10 channels */ spec->multiout.hp_nid = VT1709_HP_DAC_NID; else if (spec->multiout.num_dacs == 3) /* 6 channels */ spec->multiout.hp_nid = 0; err = via_add_control(spec, VIA_CTL_WIDGET_VOL, "Headphone Playback Volume", HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); if (err < 0) return err; err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, "Headphone Playback Switch", HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); if (err < 0) return err; 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 ad1986a_pcm_amp_sw_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *ad = codec->spec; int i, change = 0; down(&ad->amp_mutex); for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); } kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); up(&ad->amp_mutex); return change; }
/* create input playback/capture controls for the given pin */ static int via_new_analog_input(struct via_spec *spec, hda_nid_t pin, const char *ctlname, int idx, int mix_nid) { char name[32]; int err; sprintf(name, "%s Playback Volume", ctlname); err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); if (err < 0) return err; sprintf(name, "%s Playback Switch", ctlname); err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); if (err < 0) return err; return 0; }
static int vt1708_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) { int err; if (!pin) return 0; spec->multiout.hp_nid = VT1708_HP_NID; /* AOW3 */ err = via_add_control(spec, VIA_CTL_WIDGET_VOL, "Headphone Playback Volume", HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); if (err < 0) return err; err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, "Headphone Playback Switch", HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); if (err < 0) return err; return 0; }
/* add a (input-boost) volume control to the given input pin */ static int add_input_volume_control(struct hda_codec *codec, struct auto_pin_cfg *cfg, int item) { hda_nid_t pin = cfg->inputs[item].pin; u32 caps; const char *label; struct snd_kcontrol *kctl; if (!(get_wcaps(codec, pin) & AC_WCAP_IN_AMP)) return 0; caps = query_amp_caps(codec, pin, HDA_INPUT); caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT; if (caps <= 1) return 0; label = hda_get_autocfg_input_label(codec, cfg, item); return add_volume(codec, label, 0, HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT), 1, &kctl); }
static const struct hda_bind_ctls *make_bind_capture(struct hda_codec *codec, struct hda_ctl_ops *ops) { struct cs_spec *spec = codec->spec; struct hda_bind_ctls *bind; int i, n; bind = kzalloc(sizeof(*bind) + sizeof(long) * (spec->num_inputs + 1), GFP_KERNEL); if (!bind) return NULL; bind->ops = ops; n = 0; for (i = 0; i < AUTO_PIN_LAST; i++) { if (!spec->adc_nid[i]) continue; bind->values[n++] = HDA_COMPOSE_AMP_VAL(spec->adc_nid[i], 3, spec->adc_idx[i], HDA_INPUT); } return bind; }
{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, { } }; /* Toshiba specific */ static const struct hda_verb alc268_toshiba_verbs[] = { {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, { } /* end */ }; /* Acer specific */ /* bind volumes of both NID 0x02 and 0x03 */ static const struct hda_bind_ctls alc268_acer_bind_master_vol = { .ops = &snd_hda_bind_vol, .values = { HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT), 0 }, }; static void alc268_acer_setup(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; spec->autocfg.hp_pins[0] = 0x14; spec->autocfg.speaker_pins[0] = 0x15; spec->automute = 1; spec->automute_mode = ALC_AUTOMUTE_AMP; }
static inline void set_beep_amp(struct conexant_spec *spec, hda_nid_t nid, int idx, int dir) { spec->gen.beep_nid = nid; spec->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir); }
/* add playback controls from the parsed DAC table */ static int vt1708_auto_create_multi_out_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { char name[32]; static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; hda_nid_t nid, nid_vol = 0; int i, err; for (i = 0; i <= AUTO_SEQ_SIDE; i++) { nid = cfg->line_out_pins[i]; if (!nid) continue; if (i != AUTO_SEQ_FRONT) nid_vol = 0x1b - i + 1; if (i == AUTO_SEQ_CENLFE) { /* Center/LFE */ err = via_add_control(spec, VIA_CTL_WIDGET_VOL, "Center Playback Volume", HDA_COMPOSE_AMP_VAL(nid_vol, 1, 0, HDA_OUTPUT)); if (err < 0) return err; err = via_add_control(spec, VIA_CTL_WIDGET_VOL, "LFE Playback Volume", HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT)); if (err < 0) return err; err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, "Center Playback Switch", HDA_COMPOSE_AMP_VAL(nid_vol, 1, 0, HDA_OUTPUT)); if (err < 0) return err; err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, "LFE Playback Switch", HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT)); if (err < 0) return err; } else if (i == AUTO_SEQ_FRONT){ /* add control to mixer index 0 */ err = via_add_control(spec, VIA_CTL_WIDGET_VOL, "Master Front Playback Volume", HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT)); if (err < 0) return err; err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, "Master Front Playback Switch", HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT)); if (err < 0) return err; /* add control to PW3 */ sprintf(name, "%s Playback Volume", chname[i]); err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); if (err < 0) return err; sprintf(name, "%s Playback Switch", chname[i]); err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); if (err < 0) return err; } else { sprintf(name, "%s Playback Volume", chname[i]); err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT)); if (err < 0) return err; sprintf(name, "%s Playback Switch", chname[i]); err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT)); if (err < 0) return err; } } return 0; }