1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Greybus audio driver
4  * Copyright 2015-2016 Google Inc.
5  * Copyright 2015-2016 Linaro Ltd.
6  */
7 
8 #include "audio_codec.h"
9 #include "greybus_protocols.h"
10 
11 #define GBAUDIO_INVALID_ID	0xFF
12 
13 /* mixer control */
14 struct gb_mixer_control {
15 	int min, max;
16 	unsigned int reg, rreg, shift, rshift, invert;
17 };
18 
19 struct gbaudio_ctl_pvt {
20 	unsigned int ctl_id;
21 	unsigned int data_cport;
22 	unsigned int access;
23 	unsigned int vcount;
24 	struct gb_audio_ctl_elem_info *info;
25 };
26 
find_gb_module(struct gbaudio_codec_info * codec,char const * name)27 static struct gbaudio_module_info *find_gb_module(
28 					struct gbaudio_codec_info *codec,
29 					char const *name)
30 {
31 	int dev_id, ret;
32 	char begin[NAME_SIZE];
33 	struct gbaudio_module_info *module;
34 
35 	if (!name)
36 		return NULL;
37 
38 	ret = sscanf(name, "%s %d", begin, &dev_id);
39 	dev_dbg(codec->dev, "%s:Find module#%d\n", __func__, dev_id);
40 
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);
45 			return module;
46 		}
47 	}
48 	mutex_unlock(&codec->lock);
49 	dev_warn(codec->dev, "%s: module#%d missing in codec list\n", name,
50 		 dev_id);
51 	return NULL;
52 }
53 
gbaudio_map_controlid(struct gbaudio_module_info * module,__u8 control_id,__u8 index)54 static const char *gbaudio_map_controlid(struct gbaudio_module_info *module,
55 					 __u8 control_id, __u8 index)
56 {
57 	struct gbaudio_control *control;
58 
59 	if (control_id == GBAUDIO_INVALID_ID)
60 		return NULL;
61 
62 	list_for_each_entry(control, &module->ctl_list, list) {
63 		if (control->id == control_id) {
64 			if (index == GBAUDIO_INVALID_ID)
65 				return control->name;
66 			if (index >= control->items)
67 				return NULL;
68 			return control->texts[index];
69 		}
70 	}
71 	list_for_each_entry(control, &module->widget_ctl_list, list) {
72 		if (control->id == control_id) {
73 			if (index == GBAUDIO_INVALID_ID)
74 				return control->name;
75 			if (index >= control->items)
76 				return NULL;
77 			return control->texts[index];
78 		}
79 	}
80 	return NULL;
81 }
82 
gbaudio_map_controlname(struct gbaudio_module_info * module,const char * name)83 static int gbaudio_map_controlname(struct gbaudio_module_info *module,
84 				   const char *name)
85 {
86 	struct gbaudio_control *control;
87 
88 	list_for_each_entry(control, &module->ctl_list, list) {
89 		if (!strncmp(control->name, name, NAME_SIZE))
90 			return control->id;
91 	}
92 
93 	dev_warn(module->dev, "%s: missing in modules controls list\n", name);
94 
95 	return -EINVAL;
96 }
97 
gbaudio_map_wcontrolname(struct gbaudio_module_info * module,const char * name)98 static int gbaudio_map_wcontrolname(struct gbaudio_module_info *module,
99 				    const char *name)
100 {
101 	struct gbaudio_control *control;
102 
103 	list_for_each_entry(control, &module->widget_ctl_list, list) {
104 		if (!strncmp(control->wname, name, NAME_SIZE))
105 			return control->id;
106 	}
107 	dev_warn(module->dev, "%s: missing in modules controls list\n", name);
108 
109 	return -EINVAL;
110 }
111 
gbaudio_map_widgetname(struct gbaudio_module_info * module,const char * name)112 static int gbaudio_map_widgetname(struct gbaudio_module_info *module,
113 				  const char *name)
114 {
115 	struct gbaudio_widget *widget;
116 
117 	list_for_each_entry(widget, &module->widget_list, list) {
118 		if (!strncmp(widget->name, name, NAME_SIZE))
119 			return widget->id;
120 	}
121 	dev_warn(module->dev, "%s: missing in modules widgets list\n", name);
122 
123 	return -EINVAL;
124 }
125 
gbaudio_map_widgetid(struct gbaudio_module_info * module,__u8 widget_id)126 static const char *gbaudio_map_widgetid(struct gbaudio_module_info *module,
127 					__u8 widget_id)
128 {
129 	struct gbaudio_widget *widget;
130 
131 	list_for_each_entry(widget, &module->widget_list, list) {
132 		if (widget->id == widget_id)
133 			return widget->name;
134 	}
135 	return NULL;
136 }
137 
gb_generate_enum_strings(struct gbaudio_module_info * gb,struct gb_audio_enumerated * gbenum)138 static const char **gb_generate_enum_strings(struct gbaudio_module_info *gb,
139 					     struct gb_audio_enumerated *gbenum)
140 {
141 	const char **strings;
142 	int i;
143 	unsigned int items;
144 	__u8 *data;
145 
146 	items = le32_to_cpu(gbenum->items);
147 	strings = devm_kcalloc(gb->dev, items, sizeof(char *), GFP_KERNEL);
148 	data = gbenum->names;
149 
150 	for (i = 0; i < items; i++) {
151 		strings[i] = (const char *)data;
152 		while (*data != '\0')
153 			data++;
154 		data++;
155 	}
156 
157 	return strings;
158 }
159 
gbcodec_mixer_ctl_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)160 static int gbcodec_mixer_ctl_info(struct snd_kcontrol *kcontrol,
161 		     struct snd_ctl_elem_info *uinfo)
162 {
163 	unsigned int max;
164 	const char *name;
165 	struct gbaudio_ctl_pvt *data;
166 	struct gb_audio_ctl_elem_info *info;
167 	struct gbaudio_module_info *module;
168 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
169 	struct gbaudio_codec_info *gbcodec = snd_soc_codec_get_drvdata(codec);
170 
171 	dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
172 	data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
173 	info = (struct gb_audio_ctl_elem_info *)data->info;
174 
175 	if (!info) {
176 		dev_err(codec->dev, "NULL info for %s\n", uinfo->id.name);
177 		return -EINVAL;
178 	}
179 
180 	/* update uinfo */
181 	uinfo->access = data->access;
182 	uinfo->count = data->vcount;
183 	uinfo->type = (snd_ctl_elem_type_t)info->type;
184 
185 	switch (info->type) {
186 	case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN:
187 	case GB_AUDIO_CTL_ELEM_TYPE_INTEGER:
188 		uinfo->value.integer.min = le32_to_cpu(info->value.integer.min);
189 		uinfo->value.integer.max = le32_to_cpu(info->value.integer.max);
190 		break;
191 	case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
192 		max = le32_to_cpu(info->value.enumerated.items);
193 		uinfo->value.enumerated.items = max;
194 		if (uinfo->value.enumerated.item > max - 1)
195 			uinfo->value.enumerated.item = max - 1;
196 		module = find_gb_module(gbcodec, kcontrol->id.name);
197 		if (!module)
198 			return -EINVAL;
199 		name = gbaudio_map_controlid(module, data->ctl_id,
200 					     uinfo->value.enumerated.item);
201 		strlcpy(uinfo->value.enumerated.name, name, NAME_SIZE);
202 		break;
203 	default:
204 		dev_err(codec->dev, "Invalid type: %d for %s:kcontrol\n",
205 			info->type, kcontrol->id.name);
206 		break;
207 	}
208 	return 0;
209 }
210 
gbcodec_mixer_ctl_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)211 static int gbcodec_mixer_ctl_get(struct snd_kcontrol *kcontrol,
212 	struct snd_ctl_elem_value *ucontrol)
213 {
214 	int ret;
215 	struct gb_audio_ctl_elem_info *info;
216 	struct gbaudio_ctl_pvt *data;
217 	struct gb_audio_ctl_elem_value gbvalue;
218 	struct gbaudio_module_info *module;
219 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
220 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
221 	struct gb_bundle *bundle;
222 
223 	dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
224 	module = find_gb_module(gb, kcontrol->id.name);
225 	if (!module)
226 		return -EINVAL;
227 
228 	data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
229 	info = (struct gb_audio_ctl_elem_info *)data->info;
230 	bundle = to_gb_bundle(module->dev);
231 
232 	ret = gb_pm_runtime_get_sync(bundle);
233 	if (ret)
234 		return ret;
235 
236 	ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
237 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
238 
239 	gb_pm_runtime_put_autosuspend(bundle);
240 
241 	if (ret) {
242 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
243 				    __func__, kcontrol->id.name);
244 		return ret;
245 	}
246 
247 	/* update ucontrol */
248 	switch (info->type) {
249 	case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN:
250 	case GB_AUDIO_CTL_ELEM_TYPE_INTEGER:
251 		ucontrol->value.integer.value[0] =
252 			le32_to_cpu(gbvalue.value.integer_value[0]);
253 		if (data->vcount == 2)
254 			ucontrol->value.integer.value[1] =
255 				le32_to_cpu(gbvalue.value.integer_value[1]);
256 		break;
257 	case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
258 		ucontrol->value.enumerated.item[0] =
259 			le32_to_cpu(gbvalue.value.enumerated_item[0]);
260 		if (data->vcount == 2)
261 			ucontrol->value.enumerated.item[1] =
262 				le32_to_cpu(gbvalue.value.enumerated_item[1]);
263 		break;
264 	default:
265 		dev_err(codec->dev, "Invalid type: %d for %s:kcontrol\n",
266 			info->type, kcontrol->id.name);
267 		ret = -EINVAL;
268 		break;
269 	}
270 	return ret;
271 }
272 
gbcodec_mixer_ctl_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)273 static int gbcodec_mixer_ctl_put(struct snd_kcontrol *kcontrol,
274 			      struct snd_ctl_elem_value *ucontrol)
275 {
276 	int ret = 0;
277 	struct gb_audio_ctl_elem_info *info;
278 	struct gbaudio_ctl_pvt *data;
279 	struct gb_audio_ctl_elem_value gbvalue;
280 	struct gbaudio_module_info *module;
281 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
282 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
283 	struct gb_bundle *bundle;
284 
285 	dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
286 	module = find_gb_module(gb, kcontrol->id.name);
287 	if (!module)
288 		return -EINVAL;
289 
290 	data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
291 	info = (struct gb_audio_ctl_elem_info *)data->info;
292 	bundle = to_gb_bundle(module->dev);
293 
294 	/* update ucontrol */
295 	switch (info->type) {
296 	case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN:
297 	case GB_AUDIO_CTL_ELEM_TYPE_INTEGER:
298 		gbvalue.value.integer_value[0] =
299 			cpu_to_le32(ucontrol->value.integer.value[0]);
300 		if (data->vcount == 2)
301 			gbvalue.value.integer_value[1] =
302 				cpu_to_le32(ucontrol->value.integer.value[1]);
303 		break;
304 	case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
305 		gbvalue.value.enumerated_item[0] =
306 			cpu_to_le32(ucontrol->value.enumerated.item[0]);
307 		if (data->vcount == 2)
308 			gbvalue.value.enumerated_item[1] =
309 				cpu_to_le32(ucontrol->value.enumerated.item[1]);
310 		break;
311 	default:
312 		dev_err(codec->dev, "Invalid type: %d for %s:kcontrol\n",
313 			info->type, kcontrol->id.name);
314 		ret = -EINVAL;
315 		break;
316 	}
317 
318 	if (ret)
319 		return ret;
320 
321 	ret = gb_pm_runtime_get_sync(bundle);
322 	if (ret)
323 		return ret;
324 
325 	ret = gb_audio_gb_set_control(module->mgmt_connection, data->ctl_id,
326 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
327 
328 	gb_pm_runtime_put_autosuspend(bundle);
329 
330 	if (ret) {
331 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
332 				    __func__, kcontrol->id.name);
333 	}
334 
335 	return ret;
336 }
337 
338 #define SOC_MIXER_GB(xname, kcount, data) \
339 {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
340 	.count = kcount, .info = gbcodec_mixer_ctl_info, \
341 	.get = gbcodec_mixer_ctl_get, .put = gbcodec_mixer_ctl_put, \
342 	.private_value = (unsigned long)data }
343 
344 /*
345  * although below callback functions seems redundant to above functions.
346  * same are kept to allow provision for different handling in case
347  * of DAPM related sequencing, etc.
348  */
gbcodec_mixer_dapm_ctl_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)349 static int gbcodec_mixer_dapm_ctl_info(struct snd_kcontrol *kcontrol,
350 		     struct snd_ctl_elem_info *uinfo)
351 {
352 	int platform_max, platform_min;
353 	struct gbaudio_ctl_pvt *data;
354 	struct gb_audio_ctl_elem_info *info;
355 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
356 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
357 	struct snd_soc_codec *codec = widget->codec;
358 
359 	dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
360 	data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
361 	info = (struct gb_audio_ctl_elem_info *)data->info;
362 
363 	/* update uinfo */
364 	platform_max = le32_to_cpu(info->value.integer.max);
365 	platform_min = le32_to_cpu(info->value.integer.min);
366 
367 	if (platform_max == 1 &&
368 	    !strnstr(kcontrol->id.name, " Volume", NAME_SIZE))
369 		uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
370 	else
371 		uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
372 
373 	uinfo->count = data->vcount;
374 	uinfo->value.integer.min = platform_min;
375 	uinfo->value.integer.max = platform_max;
376 
377 	return 0;
378 }
379 
gbcodec_mixer_dapm_ctl_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)380 static int gbcodec_mixer_dapm_ctl_get(struct snd_kcontrol *kcontrol,
381 	struct snd_ctl_elem_value *ucontrol)
382 {
383 	int ret;
384 	struct gb_audio_ctl_elem_info *info;
385 	struct gbaudio_ctl_pvt *data;
386 	struct gb_audio_ctl_elem_value gbvalue;
387 	struct gbaudio_module_info *module;
388 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
389 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
390 	struct snd_soc_codec *codec = widget->codec;
391 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
392 	struct gb_bundle *bundle;
393 
394 	dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
395 	module = find_gb_module(gb, kcontrol->id.name);
396 	if (!module)
397 		return -EINVAL;
398 
399 	data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
400 	info = (struct gb_audio_ctl_elem_info *)data->info;
401 	bundle = to_gb_bundle(module->dev);
402 
403 	if (data->vcount == 2)
404 		dev_warn(widget->dapm->dev,
405 			 "GB: Control '%s' is stereo, which is not supported\n",
406 			 kcontrol->id.name);
407 
408 	ret = gb_pm_runtime_get_sync(bundle);
409 	if (ret)
410 		return ret;
411 
412 	ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
413 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
414 
415 	gb_pm_runtime_put_autosuspend(bundle);
416 
417 	if (ret) {
418 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
419 				    __func__, kcontrol->id.name);
420 		return ret;
421 	}
422 	/* update ucontrol */
423 	ucontrol->value.integer.value[0] =
424 		le32_to_cpu(gbvalue.value.integer_value[0]);
425 
426 	return ret;
427 }
428 
gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)429 static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
430 			      struct snd_ctl_elem_value *ucontrol)
431 {
432 	int ret, wi, max, connect;
433 	unsigned int mask, val;
434 	struct gb_audio_ctl_elem_info *info;
435 	struct gbaudio_ctl_pvt *data;
436 	struct gb_audio_ctl_elem_value gbvalue;
437 	struct gbaudio_module_info *module;
438 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
439 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
440 	struct snd_soc_codec *codec = widget->codec;
441 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
442 	struct gb_bundle *bundle;
443 
444 	dev_dbg(codec->dev, "Entered %s:%s\n", __func__, kcontrol->id.name);
445 	module = find_gb_module(gb, kcontrol->id.name);
446 	if (!module)
447 		return -EINVAL;
448 
449 	data = (struct gbaudio_ctl_pvt *)kcontrol->private_value;
450 	info = (struct gb_audio_ctl_elem_info *)data->info;
451 	bundle = to_gb_bundle(module->dev);
452 
453 	if (data->vcount == 2)
454 		dev_warn(widget->dapm->dev,
455 			 "GB: Control '%s' is stereo, which is not supported\n",
456 			 kcontrol->id.name);
457 
458 	max = le32_to_cpu(info->value.integer.max);
459 	mask = (1 << fls(max)) - 1;
460 	val = ucontrol->value.integer.value[0] & mask;
461 	connect = !!val;
462 
463 	/* update ucontrol */
464 	if (gbvalue.value.integer_value[0] != val) {
465 		for (wi = 0; wi < wlist->num_widgets; wi++) {
466 			widget = wlist->widgets[wi];
467 
468 			widget->value = val;
469 			widget->dapm->update = NULL;
470 			snd_soc_dapm_mixer_update_power(widget, kcontrol,
471 							connect);
472 		}
473 		gbvalue.value.integer_value[0] =
474 			cpu_to_le32(ucontrol->value.integer.value[0]);
475 
476 		ret = gb_pm_runtime_get_sync(bundle);
477 		if (ret)
478 			return ret;
479 
480 		ret = gb_audio_gb_set_control(module->mgmt_connection,
481 					      data->ctl_id,
482 					      GB_AUDIO_INVALID_INDEX, &gbvalue);
483 
484 		gb_pm_runtime_put_autosuspend(bundle);
485 
486 		if (ret) {
487 			dev_err_ratelimited(codec->dev,
488 					    "%d:Error in %s for %s\n", ret,
489 					    __func__, kcontrol->id.name);
490 			return ret;
491 		}
492 	}
493 
494 	return 0;
495 }
496 
497 #define SOC_DAPM_MIXER_GB(xname, kcount, data) \
498 {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
499 	.count = kcount, .info = gbcodec_mixer_dapm_ctl_info, \
500 	.get = gbcodec_mixer_dapm_ctl_get, .put = gbcodec_mixer_dapm_ctl_put, \
501 	.private_value = (unsigned long)data}
502 
gbcodec_event_spk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * k,int event)503 static int gbcodec_event_spk(struct snd_soc_dapm_widget *w,
504 					struct snd_kcontrol *k, int event)
505 {
506 	/* Ensure GB speaker is connected */
507 
508 	return 0;
509 }
510 
gbcodec_event_hp(struct snd_soc_dapm_widget * w,struct snd_kcontrol * k,int event)511 static int gbcodec_event_hp(struct snd_soc_dapm_widget *w,
512 					struct snd_kcontrol *k, int event)
513 {
514 	/* Ensure GB module supports jack slot */
515 
516 	return 0;
517 }
518 
gbcodec_event_int_mic(struct snd_soc_dapm_widget * w,struct snd_kcontrol * k,int event)519 static int gbcodec_event_int_mic(struct snd_soc_dapm_widget *w,
520 					struct snd_kcontrol *k, int event)
521 {
522 	/* Ensure GB module supports jack slot */
523 
524 	return 0;
525 }
526 
gbaudio_validate_kcontrol_count(struct gb_audio_widget * w)527 static int gbaudio_validate_kcontrol_count(struct gb_audio_widget *w)
528 {
529 	int ret = 0;
530 
531 	switch (w->type) {
532 	case snd_soc_dapm_spk:
533 	case snd_soc_dapm_hp:
534 	case snd_soc_dapm_mic:
535 	case snd_soc_dapm_output:
536 	case snd_soc_dapm_input:
537 		if (w->ncontrols)
538 			ret = -EINVAL;
539 		break;
540 	case snd_soc_dapm_switch:
541 	case snd_soc_dapm_mux:
542 		if (w->ncontrols != 1)
543 			ret = -EINVAL;
544 		break;
545 	default:
546 		break;
547 	}
548 
549 	return ret;
550 }
551 
gbcodec_enum_ctl_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)552 static int gbcodec_enum_ctl_get(struct snd_kcontrol *kcontrol,
553 				struct snd_ctl_elem_value *ucontrol)
554 {
555 	int ret, ctl_id;
556 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
557 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
558 	struct gb_audio_ctl_elem_value gbvalue;
559 	struct gbaudio_module_info *module;
560 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
561 	struct gb_bundle *bundle;
562 
563 	module = find_gb_module(gb, kcontrol->id.name);
564 	if (!module)
565 		return -EINVAL;
566 
567 	ctl_id = gbaudio_map_controlname(module, kcontrol->id.name);
568 	if (ctl_id < 0)
569 		return -EINVAL;
570 
571 	bundle = to_gb_bundle(module->dev);
572 
573 	ret = gb_pm_runtime_get_sync(bundle);
574 	if (ret)
575 		return ret;
576 
577 	ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id,
578 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
579 
580 	gb_pm_runtime_put_autosuspend(bundle);
581 
582 	if (ret) {
583 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
584 				    __func__, kcontrol->id.name);
585 		return ret;
586 	}
587 
588 	ucontrol->value.enumerated.item[0] =
589 		le32_to_cpu(gbvalue.value.enumerated_item[0]);
590 	if (e->shift_l != e->shift_r)
591 		ucontrol->value.enumerated.item[1] =
592 			le32_to_cpu(gbvalue.value.enumerated_item[1]);
593 
594 	return 0;
595 }
596 
gbcodec_enum_ctl_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)597 static int gbcodec_enum_ctl_put(struct snd_kcontrol *kcontrol,
598 				struct snd_ctl_elem_value *ucontrol)
599 {
600 	int ret, ctl_id;
601 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
602 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
603 	struct gb_audio_ctl_elem_value gbvalue;
604 	struct gbaudio_module_info *module;
605 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
606 	struct gb_bundle *bundle;
607 
608 	module = find_gb_module(gb, kcontrol->id.name);
609 	if (!module)
610 		return -EINVAL;
611 
612 	ctl_id = gbaudio_map_controlname(module, kcontrol->id.name);
613 	if (ctl_id < 0)
614 		return -EINVAL;
615 
616 	if (ucontrol->value.enumerated.item[0] > e->max - 1)
617 		return -EINVAL;
618 	gbvalue.value.enumerated_item[0] =
619 		cpu_to_le32(ucontrol->value.enumerated.item[0]);
620 
621 	if (e->shift_l != e->shift_r) {
622 		if (ucontrol->value.enumerated.item[1] > e->max - 1)
623 			return -EINVAL;
624 		gbvalue.value.enumerated_item[1] =
625 			cpu_to_le32(ucontrol->value.enumerated.item[1]);
626 	}
627 
628 	bundle = to_gb_bundle(module->dev);
629 
630 	ret = gb_pm_runtime_get_sync(bundle);
631 	if (ret)
632 		return ret;
633 
634 	ret = gb_audio_gb_set_control(module->mgmt_connection, ctl_id,
635 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
636 
637 	gb_pm_runtime_put_autosuspend(bundle);
638 
639 	if (ret) {
640 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
641 				    __func__, kcontrol->id.name);
642 	}
643 
644 	return ret;
645 }
646 
gbaudio_tplg_create_enum_kctl(struct gbaudio_module_info * gb,struct snd_kcontrol_new * kctl,struct gb_audio_control * ctl)647 static int gbaudio_tplg_create_enum_kctl(struct gbaudio_module_info *gb,
648 					 struct snd_kcontrol_new *kctl,
649 					 struct gb_audio_control *ctl)
650 {
651 	struct soc_enum *gbe;
652 	struct gb_audio_enumerated *gb_enum;
653 	int i;
654 
655 	gbe = devm_kzalloc(gb->dev, sizeof(*gbe), GFP_KERNEL);
656 	if (!gbe)
657 		return -ENOMEM;
658 
659 	gb_enum = &ctl->info.value.enumerated;
660 
661 	/* since count=1, and reg is dummy */
662 	gbe->max = le32_to_cpu(gb_enum->items);
663 	gbe->texts = gb_generate_enum_strings(gb, gb_enum);
664 
665 	/* debug enum info */
666 	dev_dbg(gb->dev, "Max:%d, name_length:%d\n", gbe->max,
667 		 le16_to_cpu(gb_enum->names_length));
668 	for (i = 0; i < gbe->max; i++)
669 		dev_dbg(gb->dev, "src[%d]: %s\n", i, gbe->texts[i]);
670 
671 	*kctl = (struct snd_kcontrol_new)
672 		SOC_ENUM_EXT(ctl->name, *gbe, gbcodec_enum_ctl_get,
673 			     gbcodec_enum_ctl_put);
674 	return 0;
675 }
676 
gbaudio_tplg_create_kcontrol(struct gbaudio_module_info * gb,struct snd_kcontrol_new * kctl,struct gb_audio_control * ctl)677 static int gbaudio_tplg_create_kcontrol(struct gbaudio_module_info *gb,
678 					struct snd_kcontrol_new *kctl,
679 					struct gb_audio_control *ctl)
680 {
681 	int ret = 0;
682 	struct gbaudio_ctl_pvt *ctldata;
683 
684 	switch (ctl->iface) {
685 	case SNDRV_CTL_ELEM_IFACE_MIXER:
686 		switch (ctl->info.type) {
687 		case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
688 			ret = gbaudio_tplg_create_enum_kctl(gb, kctl, ctl);
689 			break;
690 		default:
691 			ctldata = devm_kzalloc(gb->dev,
692 					       sizeof(struct gbaudio_ctl_pvt),
693 					       GFP_KERNEL);
694 			if (!ctldata)
695 				return -ENOMEM;
696 			ctldata->ctl_id = ctl->id;
697 			ctldata->data_cport = le16_to_cpu(ctl->data_cport);
698 			ctldata->access = ctl->access;
699 			ctldata->vcount = ctl->count_values;
700 			ctldata->info = &ctl->info;
701 			*kctl = (struct snd_kcontrol_new)
702 				SOC_MIXER_GB(ctl->name, ctl->count, ctldata);
703 			ctldata = NULL;
704 			break;
705 		}
706 		break;
707 	default:
708 		return -EINVAL;
709 	}
710 
711 	dev_dbg(gb->dev, "%s:%d control created\n", ctl->name, ctl->id);
712 	return ret;
713 }
714 
gbcodec_enum_dapm_ctl_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)715 static int gbcodec_enum_dapm_ctl_get(struct snd_kcontrol *kcontrol,
716 				     struct snd_ctl_elem_value *ucontrol)
717 {
718 	int ret, ctl_id;
719 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
720 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
721 	struct gbaudio_module_info *module;
722 	struct gb_audio_ctl_elem_value gbvalue;
723 	struct snd_soc_codec *codec = widget->codec;
724 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
725 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
726 	struct gb_bundle *bundle;
727 
728 	module = find_gb_module(gb, kcontrol->id.name);
729 	if (!module)
730 		return -EINVAL;
731 
732 	ctl_id = gbaudio_map_wcontrolname(module, kcontrol->id.name);
733 	if (ctl_id < 0)
734 		return -EINVAL;
735 
736 	bundle = to_gb_bundle(module->dev);
737 
738 	ret = gb_pm_runtime_get_sync(bundle);
739 	if (ret)
740 		return ret;
741 
742 	ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id,
743 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
744 
745 	gb_pm_runtime_put_autosuspend(bundle);
746 
747 	if (ret) {
748 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
749 				    __func__, kcontrol->id.name);
750 		return ret;
751 	}
752 
753 	ucontrol->value.enumerated.item[0] = gbvalue.value.enumerated_item[0];
754 	if (e->shift_l != e->shift_r)
755 		ucontrol->value.enumerated.item[1] =
756 			gbvalue.value.enumerated_item[1];
757 
758 	return 0;
759 }
760 
gbcodec_enum_dapm_ctl_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)761 static int gbcodec_enum_dapm_ctl_put(struct snd_kcontrol *kcontrol,
762 				     struct snd_ctl_elem_value *ucontrol)
763 {
764 	int ret, wi, ctl_id;
765 	unsigned int val, mux, change;
766 	unsigned int mask;
767 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
768 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
769 	struct gb_audio_ctl_elem_value gbvalue;
770 	struct gbaudio_module_info *module;
771 	struct snd_soc_codec *codec = widget->codec;
772 	struct gbaudio_codec_info *gb = snd_soc_codec_get_drvdata(codec);
773 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
774 	struct gb_bundle *bundle;
775 
776 	if (ucontrol->value.enumerated.item[0] > e->max - 1)
777 		return -EINVAL;
778 
779 	module = find_gb_module(gb, kcontrol->id.name);
780 	if (!module)
781 		return -EINVAL;
782 
783 	ctl_id = gbaudio_map_wcontrolname(module, kcontrol->id.name);
784 	if (ctl_id < 0)
785 		return -EINVAL;
786 
787 	change = 0;
788 	bundle = to_gb_bundle(module->dev);
789 
790 	ret = gb_pm_runtime_get_sync(bundle);
791 	if (ret)
792 		return ret;
793 
794 	ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id,
795 				      GB_AUDIO_INVALID_INDEX, &gbvalue);
796 
797 	gb_pm_runtime_put_autosuspend(bundle);
798 
799 	if (ret) {
800 		dev_err_ratelimited(codec->dev, "%d:Error in %s for %s\n", ret,
801 				    __func__, kcontrol->id.name);
802 		return ret;
803 	}
804 
805 	mux = ucontrol->value.enumerated.item[0];
806 	val = mux << e->shift_l;
807 	mask = e->mask << e->shift_l;
808 
809 	if (gbvalue.value.enumerated_item[0] !=
810 	    ucontrol->value.enumerated.item[0]) {
811 		change = 1;
812 		gbvalue.value.enumerated_item[0] =
813 			ucontrol->value.enumerated.item[0];
814 	}
815 
816 	if (e->shift_l != e->shift_r) {
817 		if (ucontrol->value.enumerated.item[1] > e->max - 1)
818 			return -EINVAL;
819 		val |= ucontrol->value.enumerated.item[1] << e->shift_r;
820 		mask |= e->mask << e->shift_r;
821 		if (gbvalue.value.enumerated_item[1] !=
822 		    ucontrol->value.enumerated.item[1]) {
823 			change = 1;
824 			gbvalue.value.enumerated_item[1] =
825 				ucontrol->value.enumerated.item[1];
826 		}
827 	}
828 
829 	if (change) {
830 		ret = gb_pm_runtime_get_sync(bundle);
831 		if (ret)
832 			return ret;
833 
834 		ret = gb_audio_gb_set_control(module->mgmt_connection, ctl_id,
835 					      GB_AUDIO_INVALID_INDEX, &gbvalue);
836 
837 		gb_pm_runtime_put_autosuspend(bundle);
838 
839 		if (ret) {
840 			dev_err_ratelimited(codec->dev,
841 					    "%d:Error in %s for %s\n", ret,
842 					    __func__, kcontrol->id.name);
843 		}
844 		for (wi = 0; wi < wlist->num_widgets; wi++) {
845 			widget = wlist->widgets[wi];
846 
847 			widget->value = val;
848 			widget->dapm->update = NULL;
849 			snd_soc_dapm_mux_update_power(widget, kcontrol, mux, e);
850 		}
851 	}
852 
853 	return change;
854 }
855 
gbaudio_tplg_create_enum_ctl(struct gbaudio_module_info * gb,struct snd_kcontrol_new * kctl,struct gb_audio_control * ctl)856 static int gbaudio_tplg_create_enum_ctl(struct gbaudio_module_info *gb,
857 					struct snd_kcontrol_new *kctl,
858 					struct gb_audio_control *ctl)
859 {
860 	struct soc_enum *gbe;
861 	struct gb_audio_enumerated *gb_enum;
862 	int i;
863 
864 	gbe = devm_kzalloc(gb->dev, sizeof(*gbe), GFP_KERNEL);
865 	if (!gbe)
866 		return -ENOMEM;
867 
868 	gb_enum = &ctl->info.value.enumerated;
869 
870 	/* since count=1, and reg is dummy */
871 	gbe->max = le32_to_cpu(gb_enum->items);
872 	gbe->texts = gb_generate_enum_strings(gb, gb_enum);
873 
874 	/* debug enum info */
875 	dev_dbg(gb->dev, "Max:%d, name_length:%d\n", gbe->max,
876 		 le16_to_cpu(gb_enum->names_length));
877 	for (i = 0; i < gbe->max; i++)
878 		dev_dbg(gb->dev, "src[%d]: %s\n", i, gbe->texts[i]);
879 
880 	*kctl = (struct snd_kcontrol_new)
881 		SOC_DAPM_ENUM_EXT(ctl->name, *gbe, gbcodec_enum_dapm_ctl_get,
882 				  gbcodec_enum_dapm_ctl_put);
883 	return 0;
884 }
885 
gbaudio_tplg_create_mixer_ctl(struct gbaudio_module_info * gb,struct snd_kcontrol_new * kctl,struct gb_audio_control * ctl)886 static int gbaudio_tplg_create_mixer_ctl(struct gbaudio_module_info *gb,
887 					     struct snd_kcontrol_new *kctl,
888 					     struct gb_audio_control *ctl)
889 {
890 	struct gbaudio_ctl_pvt *ctldata;
891 
892 	ctldata = devm_kzalloc(gb->dev, sizeof(struct gbaudio_ctl_pvt),
893 			       GFP_KERNEL);
894 	if (!ctldata)
895 		return -ENOMEM;
896 	ctldata->ctl_id = ctl->id;
897 	ctldata->data_cport = le16_to_cpu(ctl->data_cport);
898 	ctldata->access = ctl->access;
899 	ctldata->vcount = ctl->count_values;
900 	ctldata->info = &ctl->info;
901 	*kctl = (struct snd_kcontrol_new)
902 		SOC_DAPM_MIXER_GB(ctl->name, ctl->count, ctldata);
903 
904 	return 0;
905 }
906 
gbaudio_tplg_create_wcontrol(struct gbaudio_module_info * gb,struct snd_kcontrol_new * kctl,struct gb_audio_control * ctl)907 static int gbaudio_tplg_create_wcontrol(struct gbaudio_module_info *gb,
908 					     struct snd_kcontrol_new *kctl,
909 					     struct gb_audio_control *ctl)
910 {
911 	int ret;
912 
913 	switch (ctl->iface) {
914 	case SNDRV_CTL_ELEM_IFACE_MIXER:
915 		switch (ctl->info.type) {
916 		case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED:
917 			ret = gbaudio_tplg_create_enum_ctl(gb, kctl, ctl);
918 			break;
919 		default:
920 			ret = gbaudio_tplg_create_mixer_ctl(gb, kctl, ctl);
921 			break;
922 		}
923 		break;
924 	default:
925 		return -EINVAL;
926 
927 	}
928 
929 	dev_dbg(gb->dev, "%s:%d DAPM control created, ret:%d\n", ctl->name,
930 		ctl->id, ret);
931 	return ret;
932 }
933 
gbaudio_widget_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)934 static int gbaudio_widget_event(struct snd_soc_dapm_widget *w,
935 				struct snd_kcontrol *kcontrol, int event)
936 {
937 	int wid;
938 	int ret;
939 	struct snd_soc_codec *codec = w->codec;
940 	struct gbaudio_codec_info *gbcodec = snd_soc_codec_get_drvdata(codec);
941 	struct gbaudio_module_info *module;
942 	struct gb_bundle *bundle;
943 
944 	dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
945 
946 	/* Find relevant module */
947 	module = find_gb_module(gbcodec, w->name);
948 	if (!module)
949 		return -EINVAL;
950 
951 	/* map name to widget id */
952 	wid = gbaudio_map_widgetname(module, w->name);
953 	if (wid < 0) {
954 		dev_err(codec->dev, "Invalid widget name:%s\n", w->name);
955 		return -EINVAL;
956 	}
957 
958 	bundle = to_gb_bundle(module->dev);
959 
960 	ret = gb_pm_runtime_get_sync(bundle);
961 	if (ret)
962 		return ret;
963 
964 	switch (event) {
965 	case SND_SOC_DAPM_PRE_PMU:
966 		ret = gb_audio_gb_enable_widget(module->mgmt_connection, wid);
967 		if (!ret)
968 			ret = gbaudio_module_update(gbcodec, w, module, 1);
969 		break;
970 	case SND_SOC_DAPM_POST_PMD:
971 		ret = gb_audio_gb_disable_widget(module->mgmt_connection, wid);
972 		if (!ret)
973 			ret = gbaudio_module_update(gbcodec, w, module, 0);
974 		break;
975 	}
976 	if (ret)
977 		dev_err_ratelimited(codec->dev,
978 				    "%d: widget, event:%d failed:%d\n", wid,
979 				    event, ret);
980 
981 	gb_pm_runtime_put_autosuspend(bundle);
982 
983 	return ret;
984 }
985 
gbaudio_tplg_create_widget(struct gbaudio_module_info * module,struct snd_soc_dapm_widget * dw,struct gb_audio_widget * w,int * w_size)986 static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
987 				      struct snd_soc_dapm_widget *dw,
988 				      struct gb_audio_widget *w, int *w_size)
989 {
990 	int i, ret, csize;
991 	struct snd_kcontrol_new *widget_kctls;
992 	struct gb_audio_control *curr;
993 	struct gbaudio_control *control, *_control;
994 	size_t size;
995 	char temp_name[NAME_SIZE];
996 
997 	ret = gbaudio_validate_kcontrol_count(w);
998 	if (ret) {
999 		dev_err(module->dev, "Invalid kcontrol count=%d for %s\n",
1000 			w->ncontrols, w->name);
1001 		return ret;
1002 	}
1003 
1004 	/* allocate memory for kcontrol */
1005 	if (w->ncontrols) {
1006 		size = sizeof(struct snd_kcontrol_new) * w->ncontrols;
1007 		widget_kctls = devm_kzalloc(module->dev, size, GFP_KERNEL);
1008 		if (!widget_kctls)
1009 			return -ENOMEM;
1010 	}
1011 
1012 	*w_size = sizeof(struct gb_audio_widget);
1013 
1014 	/* create relevant kcontrols */
1015 	curr = w->ctl;
1016 	for (i = 0; i < w->ncontrols; i++) {
1017 		ret = gbaudio_tplg_create_wcontrol(module, &widget_kctls[i],
1018 						   curr);
1019 		if (ret) {
1020 			dev_err(module->dev,
1021 				"%s:%d type widget_ctl not supported\n",
1022 				curr->name, curr->iface);
1023 			goto error;
1024 		}
1025 		control = devm_kzalloc(module->dev,
1026 				       sizeof(struct gbaudio_control),
1027 				       GFP_KERNEL);
1028 		if (!control) {
1029 			ret = -ENOMEM;
1030 			goto error;
1031 		}
1032 		control->id = curr->id;
1033 		control->name = curr->name;
1034 		control->wname = w->name;
1035 
1036 		if (curr->info.type == GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED) {
1037 			struct gb_audio_enumerated *gbenum =
1038 				&curr->info.value.enumerated;
1039 
1040 			csize = offsetof(struct gb_audio_control, info);
1041 			csize += offsetof(struct gb_audio_ctl_elem_info, value);
1042 			csize += offsetof(struct gb_audio_enumerated, names);
1043 			csize += le16_to_cpu(gbenum->names_length);
1044 			control->texts = (const char * const *)
1045 				gb_generate_enum_strings(module, gbenum);
1046 			control->items = le32_to_cpu(gbenum->items);
1047 		} else {
1048 			csize = sizeof(struct gb_audio_control);
1049 		}
1050 
1051 		*w_size += csize;
1052 		curr = (void *)curr + csize;
1053 		list_add(&control->list, &module->widget_ctl_list);
1054 		dev_dbg(module->dev, "%s: control of type %d created\n",
1055 			widget_kctls[i].name, widget_kctls[i].iface);
1056 	}
1057 
1058 	/* Prefix dev_id to widget control_name */
1059 	strlcpy(temp_name, w->name, NAME_SIZE);
1060 	snprintf(w->name, NAME_SIZE, "GB %d %s", module->dev_id, temp_name);
1061 
1062 	switch (w->type) {
1063 	case snd_soc_dapm_spk:
1064 		*dw = (struct snd_soc_dapm_widget)
1065 			SND_SOC_DAPM_SPK(w->name, gbcodec_event_spk);
1066 		module->op_devices |= GBAUDIO_DEVICE_OUT_SPEAKER;
1067 		break;
1068 	case snd_soc_dapm_hp:
1069 		*dw = (struct snd_soc_dapm_widget)
1070 			SND_SOC_DAPM_HP(w->name, gbcodec_event_hp);
1071 		module->op_devices |= (GBAUDIO_DEVICE_OUT_WIRED_HEADSET
1072 					| GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE);
1073 		module->ip_devices |= GBAUDIO_DEVICE_IN_WIRED_HEADSET;
1074 		break;
1075 	case snd_soc_dapm_mic:
1076 		*dw = (struct snd_soc_dapm_widget)
1077 			SND_SOC_DAPM_MIC(w->name, gbcodec_event_int_mic);
1078 		module->ip_devices |= GBAUDIO_DEVICE_IN_BUILTIN_MIC;
1079 		break;
1080 	case snd_soc_dapm_output:
1081 		*dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_OUTPUT(w->name);
1082 		break;
1083 	case snd_soc_dapm_input:
1084 		*dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_INPUT(w->name);
1085 		break;
1086 	case snd_soc_dapm_switch:
1087 		*dw = (struct snd_soc_dapm_widget)
1088 			SND_SOC_DAPM_SWITCH_E(w->name, SND_SOC_NOPM, 0, 0,
1089 					    widget_kctls, gbaudio_widget_event,
1090 					    SND_SOC_DAPM_PRE_PMU |
1091 					    SND_SOC_DAPM_POST_PMD);
1092 		break;
1093 	case snd_soc_dapm_pga:
1094 		*dw = (struct snd_soc_dapm_widget)
1095 			SND_SOC_DAPM_PGA_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 0,
1096 					   gbaudio_widget_event,
1097 					   SND_SOC_DAPM_PRE_PMU |
1098 					   SND_SOC_DAPM_POST_PMD);
1099 		break;
1100 	case snd_soc_dapm_mixer:
1101 		*dw = (struct snd_soc_dapm_widget)
1102 			SND_SOC_DAPM_MIXER_E(w->name, SND_SOC_NOPM, 0, 0, NULL,
1103 					   0, gbaudio_widget_event,
1104 					   SND_SOC_DAPM_PRE_PMU |
1105 					   SND_SOC_DAPM_POST_PMD);
1106 		break;
1107 	case snd_soc_dapm_mux:
1108 		*dw = (struct snd_soc_dapm_widget)
1109 			SND_SOC_DAPM_MUX_E(w->name, SND_SOC_NOPM, 0, 0,
1110 					 widget_kctls, gbaudio_widget_event,
1111 					 SND_SOC_DAPM_PRE_PMU |
1112 					 SND_SOC_DAPM_POST_PMD);
1113 		break;
1114 	case snd_soc_dapm_aif_in:
1115 		*dw = (struct snd_soc_dapm_widget)
1116 			SND_SOC_DAPM_AIF_IN_E(w->name, w->sname, 0,
1117 					      SND_SOC_NOPM,
1118 					      0, 0, gbaudio_widget_event,
1119 					      SND_SOC_DAPM_PRE_PMU |
1120 					      SND_SOC_DAPM_POST_PMD);
1121 		break;
1122 	case snd_soc_dapm_aif_out:
1123 		*dw = (struct snd_soc_dapm_widget)
1124 			SND_SOC_DAPM_AIF_OUT_E(w->name, w->sname, 0,
1125 					       SND_SOC_NOPM,
1126 					       0, 0, gbaudio_widget_event,
1127 					       SND_SOC_DAPM_PRE_PMU |
1128 					       SND_SOC_DAPM_POST_PMD);
1129 		break;
1130 	default:
1131 		ret = -EINVAL;
1132 		goto error;
1133 	}
1134 
1135 	dev_dbg(module->dev, "%s: widget of type %d created\n", dw->name,
1136 		dw->id);
1137 	return 0;
1138 error:
1139 	list_for_each_entry_safe(control, _control, &module->widget_ctl_list,
1140 				 list) {
1141 		list_del(&control->list);
1142 		devm_kfree(module->dev, control);
1143 	}
1144 	return ret;
1145 }
1146 
gbaudio_tplg_process_kcontrols(struct gbaudio_module_info * module,struct gb_audio_control * controls)1147 static int gbaudio_tplg_process_kcontrols(struct gbaudio_module_info *module,
1148 				   struct gb_audio_control *controls)
1149 {
1150 	int i, csize, ret;
1151 	struct snd_kcontrol_new *dapm_kctls;
1152 	struct gb_audio_control *curr;
1153 	struct gbaudio_control *control, *_control;
1154 	size_t size;
1155 	char temp_name[NAME_SIZE];
1156 
1157 	size = sizeof(struct snd_kcontrol_new) * module->num_controls;
1158 	dapm_kctls = devm_kzalloc(module->dev, size, GFP_KERNEL);
1159 	if (!dapm_kctls)
1160 		return -ENOMEM;
1161 
1162 	curr = controls;
1163 	for (i = 0; i < module->num_controls; i++) {
1164 		ret = gbaudio_tplg_create_kcontrol(module, &dapm_kctls[i],
1165 						   curr);
1166 		if (ret) {
1167 			dev_err(module->dev, "%s:%d type not supported\n",
1168 				curr->name, curr->iface);
1169 			goto error;
1170 		}
1171 		control = devm_kzalloc(module->dev, sizeof(struct
1172 							   gbaudio_control),
1173 				      GFP_KERNEL);
1174 		if (!control) {
1175 			ret = -ENOMEM;
1176 			goto error;
1177 		}
1178 		control->id = curr->id;
1179 		/* Prefix dev_id to widget_name */
1180 		strlcpy(temp_name, curr->name, NAME_SIZE);
1181 		snprintf(curr->name, NAME_SIZE, "GB %d %s", module->dev_id,
1182 			 temp_name);
1183 		control->name = curr->name;
1184 		if (curr->info.type == GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED) {
1185 			struct gb_audio_enumerated *gbenum =
1186 				&curr->info.value.enumerated;
1187 
1188 			csize = offsetof(struct gb_audio_control, info);
1189 			csize += offsetof(struct gb_audio_ctl_elem_info, value);
1190 			csize += offsetof(struct gb_audio_enumerated, names);
1191 			csize += le16_to_cpu(gbenum->names_length);
1192 			control->texts = (const char * const *)
1193 				gb_generate_enum_strings(module, gbenum);
1194 			control->items = le32_to_cpu(gbenum->items);
1195 		} else {
1196 			csize = sizeof(struct gb_audio_control);
1197 		}
1198 
1199 		list_add(&control->list, &module->ctl_list);
1200 		dev_dbg(module->dev, "%d:%s created of type %d\n", curr->id,
1201 			curr->name, curr->info.type);
1202 		curr = (void *)curr + csize;
1203 	}
1204 	module->controls = dapm_kctls;
1205 
1206 	return 0;
1207 error:
1208 	list_for_each_entry_safe(control, _control, &module->ctl_list,
1209 				 list) {
1210 		list_del(&control->list);
1211 		devm_kfree(module->dev, control);
1212 	}
1213 	devm_kfree(module->dev, dapm_kctls);
1214 	return ret;
1215 }
1216 
gbaudio_tplg_process_widgets(struct gbaudio_module_info * module,struct gb_audio_widget * widgets)1217 static int gbaudio_tplg_process_widgets(struct gbaudio_module_info *module,
1218 				   struct gb_audio_widget *widgets)
1219 {
1220 	int i, ret, w_size;
1221 	struct snd_soc_dapm_widget *dapm_widgets;
1222 	struct gb_audio_widget *curr;
1223 	struct gbaudio_widget *widget, *_widget;
1224 	size_t size;
1225 
1226 	size = sizeof(struct snd_soc_dapm_widget) * module->num_dapm_widgets;
1227 	dapm_widgets = devm_kzalloc(module->dev, size, GFP_KERNEL);
1228 	if (!dapm_widgets)
1229 		return -ENOMEM;
1230 
1231 	curr = widgets;
1232 	for (i = 0; i < module->num_dapm_widgets; i++) {
1233 		ret = gbaudio_tplg_create_widget(module, &dapm_widgets[i],
1234 						 curr, &w_size);
1235 		if (ret) {
1236 			dev_err(module->dev, "%s:%d type not supported\n",
1237 				curr->name, curr->type);
1238 			goto error;
1239 		}
1240 		widget = devm_kzalloc(module->dev, sizeof(struct
1241 							   gbaudio_widget),
1242 				      GFP_KERNEL);
1243 		if (!widget) {
1244 			ret = -ENOMEM;
1245 			goto error;
1246 		}
1247 		widget->id = curr->id;
1248 		widget->name = curr->name;
1249 		list_add(&widget->list, &module->widget_list);
1250 		curr = (void *)curr + w_size;
1251 	}
1252 	module->dapm_widgets = dapm_widgets;
1253 
1254 	return 0;
1255 
1256 error:
1257 	list_for_each_entry_safe(widget, _widget, &module->widget_list,
1258 				 list) {
1259 		list_del(&widget->list);
1260 		devm_kfree(module->dev, widget);
1261 	}
1262 	devm_kfree(module->dev, dapm_widgets);
1263 	return ret;
1264 }
1265 
gbaudio_tplg_process_routes(struct gbaudio_module_info * module,struct gb_audio_route * routes)1266 static int gbaudio_tplg_process_routes(struct gbaudio_module_info *module,
1267 				   struct gb_audio_route *routes)
1268 {
1269 	int i, ret;
1270 	struct snd_soc_dapm_route *dapm_routes;
1271 	struct gb_audio_route *curr;
1272 	size_t size;
1273 
1274 	size = sizeof(struct snd_soc_dapm_route) * module->num_dapm_routes;
1275 	dapm_routes = devm_kzalloc(module->dev, size, GFP_KERNEL);
1276 	if (!dapm_routes)
1277 		return -ENOMEM;
1278 
1279 	module->dapm_routes = dapm_routes;
1280 	curr = routes;
1281 
1282 	for (i = 0; i < module->num_dapm_routes; i++) {
1283 		dapm_routes->sink =
1284 			gbaudio_map_widgetid(module, curr->destination_id);
1285 		if (!dapm_routes->sink) {
1286 			dev_err(module->dev, "%d:%d:%d:%d - Invalid sink\n",
1287 				curr->source_id, curr->destination_id,
1288 				curr->control_id, curr->index);
1289 			ret = -EINVAL;
1290 			goto error;
1291 		}
1292 		dapm_routes->source =
1293 			gbaudio_map_widgetid(module, curr->source_id);
1294 		if (!dapm_routes->source) {
1295 			dev_err(module->dev, "%d:%d:%d:%d - Invalid source\n",
1296 				curr->source_id, curr->destination_id,
1297 				curr->control_id, curr->index);
1298 			ret = -EINVAL;
1299 			goto error;
1300 		}
1301 		dapm_routes->control =
1302 			gbaudio_map_controlid(module,
1303 						      curr->control_id,
1304 						      curr->index);
1305 		if ((curr->control_id !=  GBAUDIO_INVALID_ID) &&
1306 		    !dapm_routes->control) {
1307 			dev_err(module->dev, "%d:%d:%d:%d - Invalid control\n",
1308 				curr->source_id, curr->destination_id,
1309 				curr->control_id, curr->index);
1310 			ret = -EINVAL;
1311 			goto error;
1312 		}
1313 		dev_dbg(module->dev, "Route {%s, %s, %s}\n", dapm_routes->sink,
1314 			(dapm_routes->control) ? dapm_routes->control : "NULL",
1315 			dapm_routes->source);
1316 		dapm_routes++;
1317 		curr++;
1318 	}
1319 
1320 	return 0;
1321 
1322 error:
1323 	devm_kfree(module->dev, module->dapm_routes);
1324 	return ret;
1325 }
1326 
gbaudio_tplg_process_header(struct gbaudio_module_info * module,struct gb_audio_topology * tplg_data)1327 static int gbaudio_tplg_process_header(struct gbaudio_module_info *module,
1328 				 struct gb_audio_topology *tplg_data)
1329 {
1330 	/* fetch no. of kcontrols, widgets & routes */
1331 	module->num_controls = tplg_data->num_controls;
1332 	module->num_dapm_widgets = tplg_data->num_widgets;
1333 	module->num_dapm_routes = tplg_data->num_routes;
1334 
1335 	/* update block offset */
1336 	module->dai_offset = (unsigned long)&tplg_data->data;
1337 	module->control_offset = module->dai_offset +
1338 					le32_to_cpu(tplg_data->size_dais);
1339 	module->widget_offset = module->control_offset +
1340 					le32_to_cpu(tplg_data->size_controls);
1341 	module->route_offset = module->widget_offset +
1342 					le32_to_cpu(tplg_data->size_widgets);
1343 
1344 	dev_dbg(module->dev, "DAI offset is 0x%lx\n", module->dai_offset);
1345 	dev_dbg(module->dev, "control offset is %lx\n",
1346 		module->control_offset);
1347 	dev_dbg(module->dev, "widget offset is %lx\n", module->widget_offset);
1348 	dev_dbg(module->dev, "route offset is %lx\n", module->route_offset);
1349 
1350 	return 0;
1351 }
1352 
gbaudio_tplg_parse_data(struct gbaudio_module_info * module,struct gb_audio_topology * tplg_data)1353 int gbaudio_tplg_parse_data(struct gbaudio_module_info *module,
1354 			       struct gb_audio_topology *tplg_data)
1355 {
1356 	int ret;
1357 	struct gb_audio_control *controls;
1358 	struct gb_audio_widget *widgets;
1359 	struct gb_audio_route *routes;
1360 	unsigned int jack_type;
1361 
1362 	if (!tplg_data)
1363 		return -EINVAL;
1364 
1365 	ret = gbaudio_tplg_process_header(module, tplg_data);
1366 	if (ret) {
1367 		dev_err(module->dev, "%d: Error in parsing topology header\n",
1368 			ret);
1369 		return ret;
1370 	}
1371 
1372 	/* process control */
1373 	controls = (struct gb_audio_control *)module->control_offset;
1374 	ret = gbaudio_tplg_process_kcontrols(module, controls);
1375 	if (ret) {
1376 		dev_err(module->dev,
1377 			"%d: Error in parsing controls data\n", ret);
1378 		return ret;
1379 	}
1380 	dev_dbg(module->dev, "Control parsing finished\n");
1381 
1382 	/* process widgets */
1383 	widgets = (struct gb_audio_widget *)module->widget_offset;
1384 	ret = gbaudio_tplg_process_widgets(module, widgets);
1385 	if (ret) {
1386 		dev_err(module->dev,
1387 			"%d: Error in parsing widgets data\n", ret);
1388 		return ret;
1389 	}
1390 	dev_dbg(module->dev, "Widget parsing finished\n");
1391 
1392 	/* process route */
1393 	routes = (struct gb_audio_route *)module->route_offset;
1394 	ret = gbaudio_tplg_process_routes(module, routes);
1395 	if (ret) {
1396 		dev_err(module->dev,
1397 			"%d: Error in parsing routes data\n", ret);
1398 		return ret;
1399 	}
1400 	dev_dbg(module->dev, "Route parsing finished\n");
1401 
1402 	/* parse jack capabilities */
1403 	jack_type = le32_to_cpu(tplg_data->jack_type);
1404 	if (jack_type) {
1405 		module->jack_mask = jack_type & GBCODEC_JACK_MASK;
1406 		module->button_mask = jack_type & GBCODEC_JACK_BUTTON_MASK;
1407 	}
1408 
1409 	return ret;
1410 }
1411 
gbaudio_tplg_release(struct gbaudio_module_info * module)1412 void gbaudio_tplg_release(struct gbaudio_module_info *module)
1413 {
1414 	struct gbaudio_control *control, *_control;
1415 	struct gbaudio_widget *widget, *_widget;
1416 
1417 	if (!module->topology)
1418 		return;
1419 
1420 	/* release kcontrols */
1421 	list_for_each_entry_safe(control, _control, &module->ctl_list,
1422 				 list) {
1423 		list_del(&control->list);
1424 		devm_kfree(module->dev, control);
1425 	}
1426 	if (module->controls)
1427 		devm_kfree(module->dev, module->controls);
1428 
1429 	/* release widget controls */
1430 	list_for_each_entry_safe(control, _control, &module->widget_ctl_list,
1431 				 list) {
1432 		list_del(&control->list);
1433 		devm_kfree(module->dev, control);
1434 	}
1435 
1436 	/* release widgets */
1437 	list_for_each_entry_safe(widget, _widget, &module->widget_list,
1438 				 list) {
1439 		list_del(&widget->list);
1440 		devm_kfree(module->dev, widget);
1441 	}
1442 	if (module->dapm_widgets)
1443 		devm_kfree(module->dev, module->dapm_widgets);
1444 
1445 	/* release routes */
1446 	if (module->dapm_routes)
1447 		devm_kfree(module->dev, module->dapm_routes);
1448 }
1449