static int ad1988_auto_smux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *spec = codec->spec; unsigned int val = ucontrol->value.enumerated.item[0]; struct nid_path *path; int num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1; if (val >= num_conns) return -EINVAL; if (spec->cur_smux == val) return 0; mutex_lock(&codec->control_mutex); codec->cached_write = 1; path = snd_hda_get_path_from_idx(codec, spec->smux_paths[spec->cur_smux]); if (path) snd_hda_activate_path(codec, path, false, true); path = snd_hda_get_path_from_idx(codec, spec->smux_paths[val]); if (path) snd_hda_activate_path(codec, path, true, true); spec->cur_smux = val; codec->cached_write = 0; mutex_unlock(&codec->control_mutex); snd_hda_codec_flush_cache(codec); /* flush the updates */ return 1; }
/* mic_autoswitch hook */ static void olpc_xo_automic(struct hda_codec *codec, struct hda_jack_tbl *jack) { struct conexant_spec *spec = codec->spec; int saved_cached_write = codec->cached_write; codec->cached_write = 1; /* in DC mode, we don't handle automic */ if (!spec->dc_enable) snd_hda_gen_mic_autoswitch(codec, jack); olpc_xo_update_mic_pins(codec); snd_hda_codec_flush_cache(codec); codec->cached_write = saved_cached_write; if (spec->dc_enable) olpc_xo_update_mic_boost(codec); }