添加kcontrol 源码分析

codec driver code

soundsoccodecswm8960.c

源码分析

register

1
2
3
4
5
6
7
static const struct  wm8960_snd_controls[] = {
SOC_DOUBLE_R_TLV("Capture Volume", WM8960_LINVOL, WM8960_RINVOL,
0, 63, 0, adc_tlv),
...
};
static int wm8960_probe(struct snd_soc_codec *codec)
snd_soc_add_controls(codec, wm8960_snd_controls, ARRAY_SIZE(wm8960_snd_controls));

snd_soc_add_controls

将kcontrol添加到snd_card->controls上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int snd_soc_add_controls(struct snd_soc_codec *codec,
const struct snd_kcontrol_new *controls, int num_controls)
{

for (i = 0; i < num_controls; i++) {
const struct *control = &controls[i];
err = snd_ctl_add(card, snd_soc_cnew(control, codec,
control->name,
codec->name_prefix));
// 添加到card->controls链表中
list_add_tail(&kcontrol->list, &card->controls);
// 计算器
card->controls_count += kcontrol->count;
kcontrol->id.numid = card->last_numid + 1;
card->last_numid += kcontrol->count;
}
}