*参照元 [#b5083498] #backlinks *説明 [#l3b4017c] -パス: [[linux-4.4.1/sound/soc/soc-dapm.c]] -FIXME: これは何? --説明 **引数 [#a07e1d7c] -struct snd_kcontrol *kcontrol -- --[[linux-4.4.1/snd_kcontrol]] -struct snd_ctl_elem_value *ucontrol -- --[[linux-4.4.1/snd_ctl_elem_value]] **返り値 [#r8e9aaed] -int -- **参考 [#t40d7111] *実装 [#ve92755d] /** * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback * @kcontrol: mixer control * @ucontrol: control element information * * Callback to set the value of a dapm enumerated double mixer control. * * Returns 0 for success. */ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); struct snd_soc_card *card = dapm->card; struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int *item = ucontrol->value.enumerated.item; unsigned int val, change, reg_change = 0; unsigned int mask; struct snd_soc_dapm_update update; int ret = 0; - --[[linux-4.4.1/snd_soc_dapm_context]] --[[linux-4.4.1/snd_soc_dapm_kcontrol_dapm()]] --[[linux-4.4.1/snd_soc_card]] --[[linux-4.4.1/soc_enum]] --[[linux-4.4.1/snd_soc_dapm_update]] if (item[0] >= e->items) return -EINVAL; val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; mask = e->mask << e->shift_l; if (e->shift_l != e->shift_r) { if (item[1] > e->items) return -EINVAL; val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_l; mask |= e->mask << e->shift_r; } - --[[linux-4.4.1/snd_soc_enum_item_to_val()]] mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); - --[[linux-4.4.1/mutex_lock_nexted()]] change = dapm_kcontrol_set_value(kcontrol, val); - -コントローラに値を設定する。以前と違う値が設定されたならば change は true になる。 --[[linux-4.4.1/dapm_kcontrol_set_value()]] if (e->reg != SND_SOC_NOPM) reg_change = soc_dapm_test_bits(dapm, e->reg, mask, val); -有効なレジスタアドレスが指定されていて、 -レジスタに write アクセスする必要があれば reg_change が 1 になる。 --[[linux-4.4.1/soc_dapm_test_bits()]] if (change || reg_change) { if (reg_change) { update.kcontrol = kcontrol; update.reg = e->reg; update.mask = mask; update.val = val; card->update = &update; } change |= reg_change; ret = soc_dapm_mux_update_power(card, kcontrol, item[0], e); - --[[linux-4.4.1/soc_dapm_mux_update_power()]] card->update = NULL; } mutex_unlock(&card->dapm_mutex); - --[[linux-4.4.1/mutex_unlock()]] if (ret > 0) soc_dpcm_runtime_update(card); - --[[linux-4.4.1/soc_dpcm_runtime_update()]] return change; } EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double); -GPL ライセンスのモジュールにのみシンボルを公開する。 --[[linux-4.4.1/EXPORT_SYMBOL_GPL()]] *コメント [#vdd41c63]