*参照元 [#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]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS