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