1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright 2015-2016 Google Inc.
5 * Copyright 2015-2016 Linaro Ltd.
8 #include "audio_codec.h"
9 #include "greybus_protocols.h"
11 #define GBAUDIO_INVALID_ID 0xFF
14 struct gb_mixer_control {
16 unsigned int reg, rreg, shift, rshift, invert;
19 struct gbaudio_ctl_pvt {
21 unsigned int data_cport;
24 struct gb_audio_ctl_elem_info *info;
27 static struct gbaudio_module_info *find_gb_module(
28 struct gbaudio_codec_info *codec,
32 char begin[NAME_SIZE];
33 struct gbaudio_module_info *module;
38 ret = sscanf(name, "%s %d", begin, &dev_id);
39 dev_dbg(codec->dev, "%s:Find module#%d\n", __func__, dev_id);
41 mutex_lock(&codec->lock);
42 list_for_each_entry(module, &codec->module_list, list) {
43 if (module->dev_id == dev_id) {
44 mutex_unlock(&codec->lock);
48 mutex_unlock(&codec->lock);
49 dev_warn(codec->dev, "%s: module#%d missing in codec list\n", name,
54 static const char *gbaudio_map_controlid(struct gbaudio_module_info *module,
55 __u8 control_id, __u8 index)
57 struct gbaudio_control *control;
59 if (control_id == GBAUDIO_INVALID_ID)
62 list_for_each_entry(control, &module->ctl_list, list) {
63 if (control->id == control_id) {
64 if (index == GBAUDIO_INVALID_ID)
66 if (index >= control->items)
68 return control->texts[index];
71 list_for_each_entry(control, &module->widget_ctl_list, list) {
72 if (control->id == control_id) {
73 if (index == GBAUDIO_INVALID_ID)
75 if (index >= control->items)
77 return control->texts[index];
83 static int gbaudio_map_controlname(struct gbaudio_module_info *module,
86 struct gbaudio_control *control;
88 list_for_each_entry(control, &module->ctl_list, list) {
89 if (!strncmp(control->name, name, NAME_SIZE))
93 dev_warn(module->dev, "%s: missing in modules controls list\n", name);
98 static int gbaudio_map_wcontrolname(struct gbaudio_module_info *module,
101 struct gbaudio_control *control;
103 list_for_each_entry(control, &module->widget_ctl_list, list) {
104 if (!strncmp(control->wname, name, NAME_SIZE))
107 dev_warn(module->dev, "%s: missing in modules controls list\n", name);
112 static int gbaudio_map_widgetname(struct gbaudio_module_info *module,
115 struct gbaudio_widget *widget;
117 list_for_each_entry(widget, &module->widget_list, list) {
118 if (!strncmp(widget->name, name, NAME_SIZE))
121 dev_warn(module->dev, "%s: missing in modules widgets list\n", name);
126 static const char *gbaudio_map_widgetid(struct gbaudio_module_info *module,
129 struct gbaudio_widget *widget;
131 list_for_each_entry(widget, &module->widget_list, list) {
132 if (widget->id == widget_id)
138 static const char **gb_generate_enum_strings(struct gbaudio_module_info *gb,
139 struct gb_audio_enumerated *gbenum)
141 const char **strings;
146 items = le32_to_cpu(gbenum->items);
147 strings = devm_kcalloc(gb->dev, items, sizeof(char *), GFP_KERNEL);
151 data = gbenum->names;
153 for (i = 0; i < items; i++) {
154 strings[i] = (const char *)data;
155 while (*data != '\0')
163 static int gbcodec_mixer_ctl_info(struct snd_kcontrol *kcontrol,
164 struct snd_ctl_elem_info *uinfo)
168 struct gbaudio_ctl_pvt *data;
169 struct gb_audio_ctl_elem_info *info;
170 struct gbaudio_module_info *module;
171 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
172 struct gbaudio_codec_info *gbcodec = snd_soc_codec_get_drvdata(codec);
174 dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
175 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
176 info = (struct gb_audio_ctl_elem_info *)data->info;
179 dev_err(codec->dev, "NULL info for %s\n", uinfo->id.name);
184 uinfo->access = data->access;
185 uinfo->count = data->vcount;
186 uinfo->type = (snd_ctl_elem_type_t)info->type;
188 switch (info->type) {
189 case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN:
190 case GB_AUDIO_CTL_ELEM_TYPE_INTEGER:
191 uinfo->value.integer.min = le32_to_cpu(info->value.integer.min);
192 uinfo->value.integer.max = le32_to_cpu(info->value.integer.max);
194 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
195 max = le32_to_cpu(info->value.enumerated.items);
196 uinfo->value.enumerated.items = max;
197 if (uinfo->value.enumerated.item > max - 1)
198 uinfo->value.enumerated.item = max - 1;
199 module = find_gb_module(gbcodec, kcontrol->id.name);
202 name = gbaudio_map_controlid(module, data->ctl_id,
203 uinfo->value.enumerated.item);
204 strlcpy(uinfo->value.enumerated.name, name, NAME_SIZE);
207 dev_err(codec->dev, "Invalid type: %d for %s:kcontrol\n",
208 info->type, kcontrol->id.name);
214 static int gbcodec_mixer_ctl_get(struct snd_kcontrol *kcontrol,
215 struct snd_ctl_elem_value *ucontrol)
218 struct gb_audio_ctl_elem_info *info;
219 struct gbaudio_ctl_pvt *data;
220 struct gb_audio_ctl_elem_value gbvalue;
221 struct gbaudio_module_info *module;
222 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
223 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
224 struct gb_bundle *bundle;
226 dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
227 module = find_gb_module(gb, kcontrol->id.name);
231 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
232 info = (struct gb_audio_ctl_elem_info *)data->info;
233 bundle = to_gb_bundle(module->dev);
235 ret = gb_pm_runtime_get_sync(bundle);
239 ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
240 GB_AUDIO_INVALID_INDEX, &gbvalue);
242 gb_pm_runtime_put_autosuspend(bundle);
245 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
246 __func__, kcontrol->id.name);
250 /* update ucontrol */
251 switch (info->type) {
252 case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN:
253 case GB_AUDIO_CTL_ELEM_TYPE_INTEGER:
254 ucontrol->value.integer.value[0] =
255 le32_to_cpu(gbvalue.value.integer_value[0]);
256 if (data->vcount == 2)
257 ucontrol->value.integer.value[1] =
258 le32_to_cpu(gbvalue.value.integer_value[1]);
260 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
261 ucontrol->value.enumerated.item[0] =
262 le32_to_cpu(gbvalue.value.enumerated_item[0]);
263 if (data->vcount == 2)
264 ucontrol->value.enumerated.item[1] =
265 le32_to_cpu(gbvalue.value.enumerated_item[1]);
268 dev_err(codec->dev, "Invalid type: %d for %s:kcontrol\n",
269 info->type, kcontrol->id.name);
276 static int gbcodec_mixer_ctl_put(struct snd_kcontrol *kcontrol,
277 struct snd_ctl_elem_value *ucontrol)
280 struct gb_audio_ctl_elem_info *info;
281 struct gbaudio_ctl_pvt *data;
282 struct gb_audio_ctl_elem_value gbvalue;
283 struct gbaudio_module_info *module;
284 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
285 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
286 struct gb_bundle *bundle;
288 dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
289 module = find_gb_module(gb, kcontrol->id.name);
293 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
294 info = (struct gb_audio_ctl_elem_info *)data->info;
295 bundle = to_gb_bundle(module->dev);
297 /* update ucontrol */
298 switch (info->type) {
299 case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN:
300 case GB_AUDIO_CTL_ELEM_TYPE_INTEGER:
301 gbvalue.value.integer_value[0] =
302 cpu_to_le32(ucontrol->value.integer.value[0]);
303 if (data->vcount == 2)
304 gbvalue.value.integer_value[1] =
305 cpu_to_le32(ucontrol->value.integer.value[1]);
307 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
308 gbvalue.value.enumerated_item[0] =
309 cpu_to_le32(ucontrol->value.enumerated.item[0]);
310 if (data->vcount == 2)
311 gbvalue.value.enumerated_item[1] =
312 cpu_to_le32(ucontrol->value.enumerated.item[1]);
315 dev_err(codec->dev, "Invalid type: %d for %s:kcontrol\n",
316 info->type, kcontrol->id.name);
324 ret = gb_pm_runtime_get_sync(bundle);
328 ret = gb_audio_gb_set_control(module->mgmt_connection, data->ctl_id,
329 GB_AUDIO_INVALID_INDEX, &gbvalue);
331 gb_pm_runtime_put_autosuspend(bundle);
334 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
335 __func__, kcontrol->id.name);
341 #define SOC_MIXER_GB(xname, kcount, data) \
342 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
343 .count = kcount, .info = gbcodec_mixer_ctl_info, \
344 .get = gbcodec_mixer_ctl_get, .put = gbcodec_mixer_ctl_put, \
345 .private_value = (unsigned long)data }
348 * although below callback functions seems redundant to above functions.
349 * same are kept to allow provision for different handling in case
350 * of DAPM related sequencing, etc.
352 static int gbcodec_mixer_dapm_ctl_info(struct snd_kcontrol *kcontrol,
353 struct snd_ctl_elem_info *uinfo)
355 int platform_max, platform_min;
356 struct gbaudio_ctl_pvt *data;
357 struct gb_audio_ctl_elem_info *info;
358 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
359 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
360 struct snd_soc_codec *codec = widget->codec;
362 dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
363 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
364 info = (struct gb_audio_ctl_elem_info *)data->info;
367 platform_max = le32_to_cpu(info->value.integer.max);
368 platform_min = le32_to_cpu(info->value.integer.min);
370 if (platform_max == 1 &&
371 !strnstr(kcontrol->id.name, " Volume", NAME_SIZE))
372 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
374 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
376 uinfo->count = data->vcount;
377 uinfo->value.integer.min = platform_min;
378 uinfo->value.integer.max = platform_max;
383 static int gbcodec_mixer_dapm_ctl_get(struct snd_kcontrol *kcontrol,
384 struct snd_ctl_elem_value *ucontrol)
387 struct gb_audio_ctl_elem_info *info;
388 struct gbaudio_ctl_pvt *data;
389 struct gb_audio_ctl_elem_value gbvalue;
390 struct gbaudio_module_info *module;
391 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
392 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
393 struct snd_soc_codec *codec = widget->codec;
394 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
395 struct gb_bundle *bundle;
397 dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
398 module = find_gb_module(gb, kcontrol->id.name);
402 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
403 info = (struct gb_audio_ctl_elem_info *)data->info;
404 bundle = to_gb_bundle(module->dev);
406 if (data->vcount == 2)
407 dev_warn(widget->dapm->dev,
408 "GB: Control '%s' is stereo, which is not supported\n",
411 ret = gb_pm_runtime_get_sync(bundle);
415 ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
416 GB_AUDIO_INVALID_INDEX, &gbvalue);
418 gb_pm_runtime_put_autosuspend(bundle);
421 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
422 __func__, kcontrol->id.name);
425 /* update ucontrol */
426 ucontrol->value.integer.value[0] =
427 le32_to_cpu(gbvalue.value.integer_value[0]);
432 static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
433 struct snd_ctl_elem_value *ucontrol)
435 int ret, wi, max, connect;
436 unsigned int mask, val;
437 struct gb_audio_ctl_elem_info *info;
438 struct gbaudio_ctl_pvt *data;
439 struct gb_audio_ctl_elem_value gbvalue;
440 struct gbaudio_module_info *module;
441 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
442 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
443 struct snd_soc_codec *codec = widget->codec;
444 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
445 struct gb_bundle *bundle;
447 dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
448 module = find_gb_module(gb, kcontrol->id.name);
452 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
453 info = (struct gb_audio_ctl_elem_info *)data->info;
454 bundle = to_gb_bundle(module->dev);
456 if (data->vcount == 2)
457 dev_warn(widget->dapm->dev,
458 "GB: Control '%s' is stereo, which is not supported\n",
461 max = le32_to_cpu(info->value.integer.max);
462 mask = (1 << fls(max)) - 1;
463 val = ucontrol->value.integer.value[0] & mask;
466 ret = gb_pm_runtime_get_sync(bundle);
470 ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
471 GB_AUDIO_INVALID_INDEX, &gbvalue);
475 /* update ucontrol */
476 if (gbvalue.value.integer_value[0] != val) {
477 for (wi = 0; wi < wlist->num_widgets; wi++) {
478 widget = wlist->widgets[wi];
481 widget->dapm->update = NULL;
482 snd_soc_dapm_mixer_update_power(widget, kcontrol,
485 gbvalue.value.integer_value[0] =
486 cpu_to_le32(ucontrol->value.integer.value[0]);
488 ret = gb_audio_gb_set_control(module->mgmt_connection,
490 GB_AUDIO_INVALID_INDEX, &gbvalue);
494 gb_pm_runtime_put_autosuspend(bundle);
496 dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret,
497 __func__, kcontrol->id.name);
501 #define SOC_DAPM_MIXER_GB(xname, kcount, data) \
502 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
503 .count = kcount, .info = gbcodec_mixer_dapm_ctl_info, \
504 .get = gbcodec_mixer_dapm_ctl_get, .put = gbcodec_mixer_dapm_ctl_put, \
505 .private_value = (unsigned long)data}
507 static int gbcodec_event_spk(struct snd_soc_dapm_widget *w,
508 struct snd_kcontrol *k, int event)
510 /* Ensure GB speaker is connected */
515 static int gbcodec_event_hp(struct snd_soc_dapm_widget *w,
516 struct snd_kcontrol *k, int event)
518 /* Ensure GB module supports jack slot */
523 static int gbcodec_event_int_mic(struct snd_soc_dapm_widget *w,
524 struct snd_kcontrol *k, int event)
526 /* Ensure GB module supports jack slot */
531 static int gbaudio_validate_kcontrol_count(struct gb_audio_widget *w)
536 case snd_soc_dapm_spk:
537 case snd_soc_dapm_hp:
538 case snd_soc_dapm_mic:
539 case snd_soc_dapm_output:
540 case snd_soc_dapm_input:
544 case snd_soc_dapm_switch:
545 case snd_soc_dapm_mux:
546 if (w->ncontrols != 1)
556 static int gbcodec_enum_ctl_get(struct snd_kcontrol *kcontrol,
557 struct snd_ctl_elem_value *ucontrol)
560 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
561 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
562 struct gb_audio_ctl_elem_value gbvalue;
563 struct gbaudio_module_info *module;
564 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
565 struct gb_bundle *bundle;
567 module = find_gb_module(gb, kcontrol->id.name);
571 ctl_id = gbaudio_map_controlname(module, kcontrol->id.name);
575 bundle = to_gb_bundle(module->dev);
577 ret = gb_pm_runtime_get_sync(bundle);
581 ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id,
582 GB_AUDIO_INVALID_INDEX, &gbvalue);
584 gb_pm_runtime_put_autosuspend(bundle);
587 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
588 __func__, kcontrol->id.name);
592 ucontrol->value.enumerated.item[0] =
593 le32_to_cpu(gbvalue.value.enumerated_item[0]);
594 if (e->shift_l != e->shift_r)
595 ucontrol->value.enumerated.item[1] =
596 le32_to_cpu(gbvalue.value.enumerated_item[1]);
601 static int gbcodec_enum_ctl_put(struct snd_kcontrol *kcontrol,
602 struct snd_ctl_elem_value *ucontrol)
605 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
606 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
607 struct gb_audio_ctl_elem_value gbvalue;
608 struct gbaudio_module_info *module;
609 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
610 struct gb_bundle *bundle;
612 module = find_gb_module(gb, kcontrol->id.name);
616 ctl_id = gbaudio_map_controlname(module, kcontrol->id.name);
620 if (ucontrol->value.enumerated.item[0] > e->max - 1)
622 gbvalue.value.enumerated_item[0] =
623 cpu_to_le32(ucontrol->value.enumerated.item[0]);
625 if (e->shift_l != e->shift_r) {
626 if (ucontrol->value.enumerated.item[1] > e->max - 1)
628 gbvalue.value.enumerated_item[1] =
629 cpu_to_le32(ucontrol->value.enumerated.item[1]);
632 bundle = to_gb_bundle(module->dev);
634 ret = gb_pm_runtime_get_sync(bundle);
638 ret = gb_audio_gb_set_control(module->mgmt_connection, ctl_id,
639 GB_AUDIO_INVALID_INDEX, &gbvalue);
641 gb_pm_runtime_put_autosuspend(bundle);
644 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
645 __func__, kcontrol->id.name);
651 static int gbaudio_tplg_create_enum_kctl(struct gbaudio_module_info *gb,
652 struct snd_kcontrol_new *kctl,
653 struct gb_audio_control *ctl)
655 struct soc_enum *gbe;
656 struct gb_audio_enumerated *gb_enum;
659 gbe = devm_kzalloc(gb->dev, sizeof(*gbe), GFP_KERNEL);
663 gb_enum = &ctl->info.value.enumerated;
665 /* since count=1, and reg is dummy */
666 gbe->max = le32_to_cpu(gb_enum->items);
667 gbe->texts = gb_generate_enum_strings(gb, gb_enum);
671 /* debug enum info */
672 dev_dbg(gb->dev, "Max:%d, name_length:%d\n", gbe->max,
673 le16_to_cpu(gb_enum->names_length));
674 for (i = 0; i < gbe->max; i++)
675 dev_dbg(gb->dev, "src[%d]: %s\n", i, gbe->texts[i]);
677 *kctl = (struct snd_kcontrol_new)
678 SOC_ENUM_EXT(ctl->name, *gbe, gbcodec_enum_ctl_get,
679 gbcodec_enum_ctl_put);
683 static int gbaudio_tplg_create_kcontrol(struct gbaudio_module_info *gb,
684 struct snd_kcontrol_new *kctl,
685 struct gb_audio_control *ctl)
688 struct gbaudio_ctl_pvt *ctldata;
690 switch (ctl->iface) {
691 case SNDRV_CTL_ELEM_IFACE_MIXER:
692 switch (ctl->info.type) {
693 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
694 ret = gbaudio_tplg_create_enum_kctl(gb, kctl, ctl);
697 ctldata = devm_kzalloc(gb->dev,
698 sizeof(struct gbaudio_ctl_pvt),
702 ctldata->ctl_id = ctl->id;
703 ctldata->data_cport = le16_to_cpu(ctl->data_cport);
704 ctldata->access = ctl->access;
705 ctldata->vcount = ctl->count_values;
706 ctldata->info = &ctl->info;
707 *kctl = (struct snd_kcontrol_new)
708 SOC_MIXER_GB(ctl->name, ctl->count, ctldata);
717 dev_dbg(gb->dev, "%s:%d control created\n", ctl->name, ctl->id);
721 static int gbcodec_enum_dapm_ctl_get(struct snd_kcontrol *kcontrol,
722 struct snd_ctl_elem_value *ucontrol)
725 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
726 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
727 struct gbaudio_module_info *module;
728 struct gb_audio_ctl_elem_value gbvalue;
729 struct snd_soc_codec *codec = widget->codec;
730 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
731 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
732 struct gb_bundle *bundle;
734 module = find_gb_module(gb, kcontrol->id.name);
738 ctl_id = gbaudio_map_wcontrolname(module, kcontrol->id.name);
742 bundle = to_gb_bundle(module->dev);
744 ret = gb_pm_runtime_get_sync(bundle);
748 ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id,
749 GB_AUDIO_INVALID_INDEX, &gbvalue);
751 gb_pm_runtime_put_autosuspend(bundle);
754 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
755 __func__, kcontrol->id.name);
759 ucontrol->value.enumerated.item[0] = gbvalue.value.enumerated_item[0];
760 if (e->shift_l != e->shift_r)
761 ucontrol->value.enumerated.item[1] =
762 gbvalue.value.enumerated_item[1];
767 static int gbcodec_enum_dapm_ctl_put(struct snd_kcontrol *kcontrol,
768 struct snd_ctl_elem_value *ucontrol)
771 unsigned int val, mux, change;
773 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
774 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
775 struct gb_audio_ctl_elem_value gbvalue;
776 struct gbaudio_module_info *module;
777 struct snd_soc_codec *codec = widget->codec;
778 struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
779 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
780 struct gb_bundle *bundle;
782 if (ucontrol->value.enumerated.item[0] > e->max - 1)
785 module = find_gb_module(gb, kcontrol->id.name);
789 ctl_id = gbaudio_map_wcontrolname(module, kcontrol->id.name);
794 bundle = to_gb_bundle(module->dev);
796 ret = gb_pm_runtime_get_sync(bundle);
800 ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id,
801 GB_AUDIO_INVALID_INDEX, &gbvalue);
803 gb_pm_runtime_put_autosuspend(bundle);
806 dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
807 __func__, kcontrol->id.name);
811 mux = ucontrol->value.enumerated.item[0];
812 val = mux << e->shift_l;
813 mask = e->mask << e->shift_l;
815 if (gbvalue.value.enumerated_item[0] !=
816 ucontrol->value.enumerated.item[0]) {
818 gbvalue.value.enumerated_item[0] =
819 ucontrol->value.enumerated.item[0];
822 if (e->shift_l != e->shift_r) {
823 if (ucontrol->value.enumerated.item[1] > e->max - 1)
825 val |= ucontrol->value.enumerated.item[1] << e->shift_r;
826 mask |= e->mask << e->shift_r;
827 if (gbvalue.value.enumerated_item[1] !=
828 ucontrol->value.enumerated.item[1]) {
830 gbvalue.value.enumerated_item[1] =
831 ucontrol->value.enumerated.item[1];
836 ret = gb_pm_runtime_get_sync(bundle);
840 ret = gb_audio_gb_set_control(module->mgmt_connection, ctl_id,
841 GB_AUDIO_INVALID_INDEX, &gbvalue);
843 gb_pm_runtime_put_autosuspend(bundle);
846 dev_err_ratelimited(codec->dev,
847 "%d:Error in %s for %s\n", ret,
848 __func__, kcontrol->id.name);
850 for (wi = 0; wi < wlist->num_widgets; wi++) {
851 widget = wlist->widgets[wi];
854 widget->dapm->update = NULL;
855 snd_soc_dapm_mux_update_power(widget, kcontrol, mux, e);
862 static int gbaudio_tplg_create_enum_ctl(struct gbaudio_module_info *gb,
863 struct snd_kcontrol_new *kctl,
864 struct gb_audio_control *ctl)
866 struct soc_enum *gbe;
867 struct gb_audio_enumerated *gb_enum;
870 gbe = devm_kzalloc(gb->dev, sizeof(*gbe), GFP_KERNEL);
874 gb_enum = &ctl->info.value.enumerated;
876 /* since count=1, and reg is dummy */
877 gbe->max = le32_to_cpu(gb_enum->items);
878 gbe->texts = gb_generate_enum_strings(gb, gb_enum);
882 /* debug enum info */
883 dev_dbg(gb->dev, "Max:%d, name_length:%d\n", gbe->max,
884 le16_to_cpu(gb_enum->names_length));
885 for (i = 0; i < gbe->max; i++)
886 dev_dbg(gb->dev, "src[%d]: %s\n", i, gbe->texts[i]);
888 *kctl = (struct snd_kcontrol_new)
889 SOC_DAPM_ENUM_EXT(ctl->name, *gbe, gbcodec_enum_dapm_ctl_get,
890 gbcodec_enum_dapm_ctl_put);
894 static int gbaudio_tplg_create_mixer_ctl(struct gbaudio_module_info *gb,
895 struct snd_kcontrol_new *kctl,
896 struct gb_audio_control *ctl)
898 struct gbaudio_ctl_pvt *ctldata;
900 ctldata = devm_kzalloc(gb->dev, sizeof(struct gbaudio_ctl_pvt),
904 ctldata->ctl_id = ctl->id;
905 ctldata->data_cport = le16_to_cpu(ctl->data_cport);
906 ctldata->access = ctl->access;
907 ctldata->vcount = ctl->count_values;
908 ctldata->info = &ctl->info;
909 *kctl = (struct snd_kcontrol_new)
910 SOC_DAPM_MIXER_GB(ctl->name, ctl->count, ctldata);
915 static int gbaudio_tplg_create_wcontrol(struct gbaudio_module_info *gb,
916 struct snd_kcontrol_new *kctl,
917 struct gb_audio_control *ctl)
921 switch (ctl->iface) {
922 case SNDRV_CTL_ELEM_IFACE_MIXER:
923 switch (ctl->info.type) {
924 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
925 ret = gbaudio_tplg_create_enum_ctl(gb, kctl, ctl);
928 ret = gbaudio_tplg_create_mixer_ctl(gb, kctl, ctl);
937 dev_dbg(gb->dev, "%s:%d DAPM control created, ret:%d\n", ctl->name,
942 static int gbaudio_widget_event(struct snd_soc_dapm_widget *w,
943 struct snd_kcontrol *kcontrol, int event)
947 struct snd_soc_codec *codec = w->codec;
948 struct gbaudio_codec_info *gbcodec = snd_soc_codec_get_drvdata(codec);
949 struct gbaudio_module_info *module;
950 struct gb_bundle *bundle;
952 dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
954 /* Find relevant module */
955 module = find_gb_module(gbcodec, w->name);
959 /* map name to widget id */
960 wid = gbaudio_map_widgetname(module, w->name);
962 dev_err(codec->dev, "Invalid widget name:%s\n", w->name);
966 bundle = to_gb_bundle(module->dev);
968 ret = gb_pm_runtime_get_sync(bundle);
973 case SND_SOC_DAPM_PRE_PMU:
974 ret = gb_audio_gb_enable_widget(module->mgmt_connection, wid);
976 ret = gbaudio_module_update(gbcodec, w, module, 1);
978 case SND_SOC_DAPM_POST_PMD:
979 ret = gb_audio_gb_disable_widget(module->mgmt_connection, wid);
981 ret = gbaudio_module_update(gbcodec, w, module, 0);
985 dev_err_ratelimited(codec->dev,
986 "%d: widget, event:%d failed:%d\n", wid,
989 gb_pm_runtime_put_autosuspend(bundle);
994 static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
995 struct snd_soc_dapm_widget *dw,
996 struct gb_audio_widget *w, int *w_size)
999 struct snd_kcontrol_new *widget_kctls;
1000 struct gb_audio_control *curr;
1001 struct gbaudio_control *control, *_control;
1003 char temp_name[NAME_SIZE];
1005 ret = gbaudio_validate_kcontrol_count(w);
1007 dev_err(module->dev, "Invalid kcontrol count=%d for %s\n",
1008 w->ncontrols, w->name);
1012 /* allocate memory for kcontrol */
1014 size = sizeof(struct snd_kcontrol_new) * w->ncontrols;
1015 widget_kctls = devm_kzalloc(module->dev, size, GFP_KERNEL);
1020 *w_size = sizeof(struct gb_audio_widget);
1022 /* create relevant kcontrols */
1024 for (i = 0; i < w->ncontrols; i++) {
1025 ret = gbaudio_tplg_create_wcontrol(module, &widget_kctls[i],
1028 dev_err(module->dev,
1029 "%s:%d type widget_ctl not supported\n",
1030 curr->name, curr->iface);
1033 control = devm_kzalloc(module->dev,
1034 sizeof(struct gbaudio_control),
1040 control->id = curr->id;
1041 control->name = curr->name;
1042 control->wname = w->name;
1044 if (curr->info.type == GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED) {
1045 struct gb_audio_enumerated *gbenum =
1046 &curr->info.value.enumerated;
1048 csize = offsetof(struct gb_audio_control, info);
1049 csize += offsetof(struct gb_audio_ctl_elem_info, value);
1050 csize += offsetof(struct gb_audio_enumerated, names);
1051 csize += le16_to_cpu(gbenum->names_length);
1052 control->texts = (const char * const *)
1053 gb_generate_enum_strings(module, gbenum);
1054 if (!control->texts) {
1058 control->items = le32_to_cpu(gbenum->items);
1060 csize = sizeof(struct gb_audio_control);
1064 curr = (void *)curr + csize;
1065 list_add(&control->list, &module->widget_ctl_list);
1066 dev_dbg(module->dev, "%s: control of type %d created\n",
1067 widget_kctls[i].name, widget_kctls[i].iface);
1070 /* Prefix dev_id to widget control_name */
1071 strlcpy(temp_name, w->name, NAME_SIZE);
1072 snprintf(w->name, NAME_SIZE, "GB %d %s", module->dev_id, temp_name);
1075 case snd_soc_dapm_spk:
1076 *dw = (struct snd_soc_dapm_widget)
1077 SND_SOC_DAPM_SPK(w->name, gbcodec_event_spk);
1078 module->op_devices |= GBAUDIO_DEVICE_OUT_SPEAKER;
1080 case snd_soc_dapm_hp:
1081 *dw = (struct snd_soc_dapm_widget)
1082 SND_SOC_DAPM_HP(w->name, gbcodec_event_hp);
1083 module->op_devices |= (GBAUDIO_DEVICE_OUT_WIRED_HEADSET
1084 | GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE);
1085 module->ip_devices |= GBAUDIO_DEVICE_IN_WIRED_HEADSET;
1087 case snd_soc_dapm_mic:
1088 *dw = (struct snd_soc_dapm_widget)
1089 SND_SOC_DAPM_MIC(w->name, gbcodec_event_int_mic);
1090 module->ip_devices |= GBAUDIO_DEVICE_IN_BUILTIN_MIC;
1092 case snd_soc_dapm_output:
1093 *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_OUTPUT(w->name);
1095 case snd_soc_dapm_input:
1096 *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_INPUT(w->name);
1098 case snd_soc_dapm_switch:
1099 *dw = (struct snd_soc_dapm_widget)
1100 SND_SOC_DAPM_SWITCH_E(w->name, SND_SOC_NOPM, 0, 0,
1101 widget_kctls, gbaudio_widget_event,
1102 SND_SOC_DAPM_PRE_PMU |
1103 SND_SOC_DAPM_POST_PMD);
1105 case snd_soc_dapm_pga:
1106 *dw = (struct snd_soc_dapm_widget)
1107 SND_SOC_DAPM_PGA_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 0,
1108 gbaudio_widget_event,
1109 SND_SOC_DAPM_PRE_PMU |
1110 SND_SOC_DAPM_POST_PMD);
1112 case snd_soc_dapm_mixer:
1113 *dw = (struct snd_soc_dapm_widget)
1114 SND_SOC_DAPM_MIXER_E(w->name, SND_SOC_NOPM, 0, 0, NULL,
1115 0, gbaudio_widget_event,
1116 SND_SOC_DAPM_PRE_PMU |
1117 SND_SOC_DAPM_POST_PMD);
1119 case snd_soc_dapm_mux:
1120 *dw = (struct snd_soc_dapm_widget)
1121 SND_SOC_DAPM_MUX_E(w->name, SND_SOC_NOPM, 0, 0,
1122 widget_kctls, gbaudio_widget_event,
1123 SND_SOC_DAPM_PRE_PMU |
1124 SND_SOC_DAPM_POST_PMD);
1126 case snd_soc_dapm_aif_in:
1127 *dw = (struct snd_soc_dapm_widget)
1128 SND_SOC_DAPM_AIF_IN_E(w->name, w->sname, 0,
1130 0, 0, gbaudio_widget_event,
1131 SND_SOC_DAPM_PRE_PMU |
1132 SND_SOC_DAPM_POST_PMD);
1134 case snd_soc_dapm_aif_out:
1135 *dw = (struct snd_soc_dapm_widget)
1136 SND_SOC_DAPM_AIF_OUT_E(w->name, w->sname, 0,
1138 0, 0, gbaudio_widget_event,
1139 SND_SOC_DAPM_PRE_PMU |
1140 SND_SOC_DAPM_POST_PMD);
1147 dev_dbg(module->dev, "%s: widget of type %d created\n", dw->name,
1151 list_for_each_entry_safe(control, _control, &module->widget_ctl_list,
1153 list_del(&control->list);
1154 devm_kfree(module->dev, control);
1159 static int gbaudio_tplg_process_kcontrols(struct gbaudio_module_info *module,
1160 struct gb_audio_control *controls)
1163 struct snd_kcontrol_new *dapm_kctls;
1164 struct gb_audio_control *curr;
1165 struct gbaudio_control *control, *_control;
1167 char temp_name[NAME_SIZE];
1169 size = sizeof(struct snd_kcontrol_new) * module->num_controls;
1170 dapm_kctls = devm_kzalloc(module->dev, size, GFP_KERNEL);
1175 for (i = 0; i < module->num_controls; i++) {
1176 ret = gbaudio_tplg_create_kcontrol(module, &dapm_kctls[i],
1179 dev_err(module->dev, "%s:%d type not supported\n",
1180 curr->name, curr->iface);
1183 control = devm_kzalloc(module->dev, sizeof(struct
1190 control->id = curr->id;
1191 /* Prefix dev_id to widget_name */
1192 strlcpy(temp_name, curr->name, NAME_SIZE);
1193 snprintf(curr->name, NAME_SIZE, "GB %d %s", module->dev_id,
1195 control->name = curr->name;
1196 if (curr->info.type == GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED) {
1197 struct gb_audio_enumerated *gbenum =
1198 &curr->info.value.enumerated;
1200 csize = offsetof(struct gb_audio_control, info);
1201 csize += offsetof(struct gb_audio_ctl_elem_info, value);
1202 csize += offsetof(struct gb_audio_enumerated, names);
1203 csize += le16_to_cpu(gbenum->names_length);
1204 control->texts = (const char * const *)
1205 gb_generate_enum_strings(module, gbenum);
1206 if (!control->texts) {
1210 control->items = le32_to_cpu(gbenum->items);
1212 csize = sizeof(struct gb_audio_control);
1215 list_add(&control->list, &module->ctl_list);
1216 dev_dbg(module->dev, "%d:%s created of type %d\n", curr->id,
1217 curr->name, curr->info.type);
1218 curr = (void *)curr + csize;
1220 module->controls = dapm_kctls;
1224 list_for_each_entry_safe(control, _control, &module->ctl_list,
1226 list_del(&control->list);
1227 devm_kfree(module->dev, control);
1229 devm_kfree(module->dev, dapm_kctls);
1233 static int gbaudio_tplg_process_widgets(struct gbaudio_module_info *module,
1234 struct gb_audio_widget *widgets)
1237 struct snd_soc_dapm_widget *dapm_widgets;
1238 struct gb_audio_widget *curr;
1239 struct gbaudio_widget *widget, *_widget;
1242 size = sizeof(struct snd_soc_dapm_widget) * module->num_dapm_widgets;
1243 dapm_widgets = devm_kzalloc(module->dev, size, GFP_KERNEL);
1248 for (i = 0; i < module->num_dapm_widgets; i++) {
1249 ret = gbaudio_tplg_create_widget(module, &dapm_widgets[i],
1252 dev_err(module->dev, "%s:%d type not supported\n",
1253 curr->name, curr->type);
1256 widget = devm_kzalloc(module->dev, sizeof(struct
1263 widget->id = curr->id;
1264 widget->name = curr->name;
1265 list_add(&widget->list, &module->widget_list);
1266 curr = (void *)curr + w_size;
1268 module->dapm_widgets = dapm_widgets;
1273 list_for_each_entry_safe(widget, _widget, &module->widget_list,
1275 list_del(&widget->list);
1276 devm_kfree(module->dev, widget);
1278 devm_kfree(module->dev, dapm_widgets);
1282 static int gbaudio_tplg_process_routes(struct gbaudio_module_info *module,
1283 struct gb_audio_route *routes)
1286 struct snd_soc_dapm_route *dapm_routes;
1287 struct gb_audio_route *curr;
1290 size = sizeof(struct snd_soc_dapm_route) * module->num_dapm_routes;
1291 dapm_routes = devm_kzalloc(module->dev, size, GFP_KERNEL);
1295 module->dapm_routes = dapm_routes;
1298 for (i = 0; i < module->num_dapm_routes; i++) {
1300 gbaudio_map_widgetid(module, curr->destination_id);
1301 if (!dapm_routes->sink) {
1302 dev_err(module->dev, "%d:%d:%d:%d - Invalid sink\n",
1303 curr->source_id, curr->destination_id,
1304 curr->control_id, curr->index);
1308 dapm_routes->source =
1309 gbaudio_map_widgetid(module, curr->source_id);
1310 if (!dapm_routes->source) {
1311 dev_err(module->dev, "%d:%d:%d:%d - Invalid source\n",
1312 curr->source_id, curr->destination_id,
1313 curr->control_id, curr->index);
1317 dapm_routes->control =
1318 gbaudio_map_controlid(module,
1321 if ((curr->control_id != GBAUDIO_INVALID_ID) &&
1322 !dapm_routes->control) {
1323 dev_err(module->dev, "%d:%d:%d:%d - Invalid control\n",
1324 curr->source_id, curr->destination_id,
1325 curr->control_id, curr->index);
1329 dev_dbg(module->dev, "Route {%s, %s, %s}\n", dapm_routes->sink,
1330 (dapm_routes->control) ? dapm_routes->control : "NULL",
1331 dapm_routes->source);
1339 devm_kfree(module->dev, module->dapm_routes);
1343 static int gbaudio_tplg_process_header(struct gbaudio_module_info *module,
1344 struct gb_audio_topology *tplg_data)
1346 /* fetch no. of kcontrols, widgets & routes */
1347 module->num_controls = tplg_data->num_controls;
1348 module->num_dapm_widgets = tplg_data->num_widgets;
1349 module->num_dapm_routes = tplg_data->num_routes;
1351 /* update block offset */
1352 module->dai_offset = (unsigned long)&tplg_data->data;
1353 module->control_offset = module->dai_offset +
1354 le32_to_cpu(tplg_data->size_dais);
1355 module->widget_offset = module->control_offset +
1356 le32_to_cpu(tplg_data->size_controls);
1357 module->route_offset = module->widget_offset +
1358 le32_to_cpu(tplg_data->size_widgets);
1360 dev_dbg(module->dev, "DAI offset is 0x%lx\n", module->dai_offset);
1361 dev_dbg(module->dev, "control offset is %lx\n",
1362 module->control_offset);
1363 dev_dbg(module->dev, "widget offset is %lx\n", module->widget_offset);
1364 dev_dbg(module->dev, "route offset is %lx\n", module->route_offset);
1369 int gbaudio_tplg_parse_data(struct gbaudio_module_info *module,
1370 struct gb_audio_topology *tplg_data)
1373 struct gb_audio_control *controls;
1374 struct gb_audio_widget *widgets;
1375 struct gb_audio_route *routes;
1376 unsigned int jack_type;
1381 ret = gbaudio_tplg_process_header(module, tplg_data);
1383 dev_err(module->dev, "%d: Error in parsing topology header\n",
1388 /* process control */
1389 controls = (struct gb_audio_control *)module->control_offset;
1390 ret = gbaudio_tplg_process_kcontrols(module, controls);
1392 dev_err(module->dev,
1393 "%d: Error in parsing controls data\n", ret);
1396 dev_dbg(module->dev, "Control parsing finished\n");
1398 /* process widgets */
1399 widgets = (struct gb_audio_widget *)module->widget_offset;
1400 ret = gbaudio_tplg_process_widgets(module, widgets);
1402 dev_err(module->dev,
1403 "%d: Error in parsing widgets data\n", ret);
1406 dev_dbg(module->dev, "Widget parsing finished\n");
1409 routes = (struct gb_audio_route *)module->route_offset;
1410 ret = gbaudio_tplg_process_routes(module, routes);
1412 dev_err(module->dev,
1413 "%d: Error in parsing routes data\n", ret);
1416 dev_dbg(module->dev, "Route parsing finished\n");
1418 /* parse jack capabilities */
1419 jack_type = le32_to_cpu(tplg_data->jack_type);
1421 module->jack_mask = jack_type & GBCODEC_JACK_MASK;
1422 module->button_mask = jack_type & GBCODEC_JACK_BUTTON_MASK;
1428 void gbaudio_tplg_release(struct gbaudio_module_info *module)
1430 struct gbaudio_control *control, *_control;
1431 struct gbaudio_widget *widget, *_widget;
1433 if (!module->topology)
1436 /* release kcontrols */
1437 list_for_each_entry_safe(control, _control, &module->ctl_list,
1439 list_del(&control->list);
1440 devm_kfree(module->dev, control);
1442 if (module->controls)
1443 devm_kfree(module->dev, module->controls);
1445 /* release widget controls */
1446 list_for_each_entry_safe(control, _control, &module->widget_ctl_list,
1448 list_del(&control->list);
1449 devm_kfree(module->dev, control);
1452 /* release widgets */
1453 list_for_each_entry_safe(widget, _widget, &module->widget_list,
1455 list_del(&widget->list);
1456 devm_kfree(module->dev, widget);
1458 if (module->dapm_widgets)
1459 devm_kfree(module->dev, module->dapm_widgets);
1461 /* release routes */
1462 if (module->dapm_routes)
1463 devm_kfree(module->dev, module->dapm_routes);