ASoC: Fix prefixing of DAPM controls by factoring prefix into snd_soc_cnew()

Currently will ignore prefixes when creating DAPM controls. Since currently
all control creation goes through snd_soc_cnew() we can fix this by factoring
the prefixing into that function.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>

+47 -17
+2 -1
include/sound/soc.h
··· 340 340 *Controls 341 341 */ 342 342 struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, 343 - void *data, char *long_name); 343 + void *data, char *long_name, 344 + const char *prefix); 344 345 int snd_soc_add_controls(struct snd_soc_codec *codec, 345 346 const struct snd_kcontrol_new *controls, int num_controls); 346 347 int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
+31 -14
sound/soc/soc-core.c
··· 2344 2344 * @_template: control template 2345 2345 * @data: control private data 2346 2346 * @long_name: control long name 2347 + * @prefix: control name prefix 2347 2348 * 2348 2349 * Create a new mixer control from a template control. 2349 2350 * 2350 2351 * Returns 0 for success, else error. 2351 2352 */ 2352 2353 struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, 2353 - void *data, char *long_name) 2354 + void *data, char *long_name, 2355 + const char *prefix) 2354 2356 { 2355 2357 struct snd_kcontrol_new template; 2358 + struct snd_kcontrol *kcontrol; 2359 + char *name = NULL; 2360 + int name_len; 2356 2361 2357 2362 memcpy(&template, _template, sizeof(template)); 2358 - if (long_name) 2359 - template.name = long_name; 2360 2363 template.index = 0; 2361 2364 2362 - return snd_ctl_new1(&template, data); 2365 + if (!long_name) 2366 + long_name = template.name; 2367 + 2368 + if (prefix) { 2369 + name_len = strlen(long_name) + strlen(prefix) + 2; 2370 + name = kmalloc(name_len, GFP_ATOMIC); 2371 + if (!name) 2372 + return NULL; 2373 + 2374 + snprintf(name, name_len, "%s %s", prefix, long_name); 2375 + 2376 + template.name = name; 2377 + } else { 2378 + template.name = long_name; 2379 + } 2380 + 2381 + kcontrol = snd_ctl_new1(&template, data); 2382 + 2383 + kfree(name); 2384 + 2385 + return kcontrol; 2363 2386 } 2364 2387 EXPORT_SYMBOL_GPL(snd_soc_cnew); 2365 2388 ··· 2401 2378 const struct snd_kcontrol_new *controls, int num_controls) 2402 2379 { 2403 2380 struct snd_card *card = codec->card->snd_card; 2404 - char prefixed_name[44], *name; 2405 2381 int err, i; 2406 2382 2407 2383 for (i = 0; i < num_controls; i++) { 2408 2384 const struct snd_kcontrol_new *control = &controls[i]; 2409 - if (codec->name_prefix) { 2410 - snprintf(prefixed_name, sizeof(prefixed_name), "%s %s", 2411 - codec->name_prefix, control->name); 2412 - name = prefixed_name; 2413 - } else { 2414 - name = control->name; 2415 - } 2416 - err = snd_ctl_add(card, snd_soc_cnew(control, codec, name)); 2385 + err = snd_ctl_add(card, snd_soc_cnew(control, codec, 2386 + control->name, 2387 + codec->name_prefix)); 2417 2388 if (err < 0) { 2418 2389 dev_err(codec->dev, "%s: Failed to add %s: %d\n", 2419 - codec->name, name, err); 2390 + codec->name, control->name, err); 2420 2391 return err; 2421 2392 } 2422 2393 }
+14 -2
sound/soc/soc-dapm.c
··· 369 369 size_t name_len; 370 370 struct snd_soc_dapm_path *path; 371 371 struct snd_card *card = dapm->card->snd_card; 372 + const char *prefix; 373 + 374 + if (dapm->codec) 375 + prefix = dapm->codec->name_prefix; 376 + else 377 + prefix = NULL; 372 378 373 379 /* add kcontrol */ 374 380 for (i = 0; i < w->num_kcontrols; i++) { ··· 415 409 path->long_name[name_len - 1] = '\0'; 416 410 417 411 path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w, 418 - path->long_name); 412 + path->long_name, prefix); 419 413 ret = snd_ctl_add(card, path->kcontrol); 420 414 if (ret < 0) { 421 415 dev_err(dapm->dev, ··· 437 431 struct snd_soc_dapm_path *path = NULL; 438 432 struct snd_kcontrol *kcontrol; 439 433 struct snd_card *card = dapm->card->snd_card; 434 + const char *prefix; 440 435 int ret = 0; 441 436 442 437 if (!w->num_kcontrols) { ··· 445 438 return -EINVAL; 446 439 } 447 440 448 - kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name); 441 + if (dapm->codec) 442 + prefix = dapm->codec->name_prefix; 443 + else 444 + prefix = NULL; 445 + 446 + kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name, prefix); 449 447 ret = snd_ctl_add(card, kcontrol); 450 448 451 449 if (ret < 0)