aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/soc-core.c45
-rw-r--r--sound/soc/soc-dapm.c16
2 files changed, 45 insertions, 16 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index db3075dd11fe..17efacdb248a 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2344,22 +2344,45 @@ EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);
2344 * @_template: control template 2344 * @_template: control template
2345 * @data: control private data 2345 * @data: control private data
2346 * @long_name: control long name 2346 * @long_name: control long name
2347 * @prefix: control name prefix
2347 * 2348 *
2348 * Create a new mixer control from a template control. 2349 * Create a new mixer control from a template control.
2349 * 2350 *
2350 * Returns 0 for success, else error. 2351 * Returns 0 for success, else error.
2351 */ 2352 */
2352struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, 2353struct 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 struct snd_kcontrol_new template; 2357 struct snd_kcontrol_new template;
2358 struct snd_kcontrol *kcontrol;
2359 char *name = NULL;
2360 int name_len;
2356 2361
2357 memcpy(&template, _template, sizeof(template)); 2362 memcpy(&template, _template, sizeof(template));
2358 if (long_name)
2359 template.name = long_name;
2360 template.index = 0; 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}
2364EXPORT_SYMBOL_GPL(snd_soc_cnew); 2387EXPORT_SYMBOL_GPL(snd_soc_cnew);
2365 2388
@@ -2378,22 +2401,16 @@ int snd_soc_add_controls(struct snd_soc_codec *codec,
2378 const struct snd_kcontrol_new *controls, int num_controls) 2401 const struct snd_kcontrol_new *controls, int num_controls)
2379{ 2402{
2380 struct snd_card *card = codec->card->snd_card; 2403 struct snd_card *card = codec->card->snd_card;
2381 char prefixed_name[44], *name;
2382 int err, i; 2404 int err, i;
2383 2405
2384 for (i = 0; i < num_controls; i++) { 2406 for (i = 0; i < num_controls; i++) {
2385 const struct snd_kcontrol_new *control = &controls[i]; 2407 const struct snd_kcontrol_new *control = &controls[i];
2386 if (codec->name_prefix) { 2408 err = snd_ctl_add(card, snd_soc_cnew(control, codec,
2387 snprintf(prefixed_name, sizeof(prefixed_name), "%s %s", 2409 control->name,
2388 codec->name_prefix, control->name); 2410 codec->name_prefix));
2389 name = prefixed_name;
2390 } else {
2391 name = control->name;
2392 }
2393 err = snd_ctl_add(card, snd_soc_cnew(control, codec, name));
2394 if (err < 0) { 2411 if (err < 0) {
2395 dev_err(codec->dev, "%s: Failed to add %s: %d\n", 2412 dev_err(codec->dev, "%s: Failed to add %s: %d\n",
2396 codec->name, name, err); 2413 codec->name, control->name, err);
2397 return err; 2414 return err;
2398 } 2415 }
2399 } 2416 }
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 570db8819d9b..a6fb85d46416 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -369,6 +369,12 @@ static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
369 size_t name_len; 369 size_t name_len;
370 struct snd_soc_dapm_path *path; 370 struct snd_soc_dapm_path *path;
371 struct snd_card *card = dapm->card->snd_card; 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 /* add kcontrol */ 379 /* add kcontrol */
374 for (i = 0; i < w->num_kcontrols; i++) { 380 for (i = 0; i < w->num_kcontrols; i++) {
@@ -409,7 +415,7 @@ static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
409 path->long_name[name_len - 1] = '\0'; 415 path->long_name[name_len - 1] = '\0';
410 416
411 path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w, 417 path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w,
412 path->long_name); 418 path->long_name, prefix);
413 ret = snd_ctl_add(card, path->kcontrol); 419 ret = snd_ctl_add(card, path->kcontrol);
414 if (ret < 0) { 420 if (ret < 0) {
415 dev_err(dapm->dev, 421 dev_err(dapm->dev,
@@ -431,6 +437,7 @@ static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
431 struct snd_soc_dapm_path *path = NULL; 437 struct snd_soc_dapm_path *path = NULL;
432 struct snd_kcontrol *kcontrol; 438 struct snd_kcontrol *kcontrol;
433 struct snd_card *card = dapm->card->snd_card; 439 struct snd_card *card = dapm->card->snd_card;
440 const char *prefix;
434 int ret = 0; 441 int ret = 0;
435 442
436 if (!w->num_kcontrols) { 443 if (!w->num_kcontrols) {
@@ -438,7 +445,12 @@ static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
438 return -EINVAL; 445 return -EINVAL;
439 } 446 }
440 447
441 kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name); 448 if (dapm->codec)
449 prefix = dapm->codec->name_prefix;
450 else
451 prefix = NULL;
452
453 kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name, prefix);
442 ret = snd_ctl_add(card, kcontrol); 454 ret = snd_ctl_add(card, kcontrol);
443 455
444 if (ret < 0) 456 if (ret < 0)