diff options
Diffstat (limited to 'sound/core/vmaster.c')
-rw-r--r-- | sound/core/vmaster.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/sound/core/vmaster.c b/sound/core/vmaster.c index 6c58e6f73a01..e43af18d4383 100644 --- a/sound/core/vmaster.c +++ b/sound/core/vmaster.c | |||
@@ -484,3 +484,34 @@ void snd_ctl_sync_vmaster(struct snd_kcontrol *kcontrol, bool hook_only) | |||
484 | master->hook(master->hook_private_data, master->val); | 484 | master->hook(master->hook_private_data, master->val); |
485 | } | 485 | } |
486 | EXPORT_SYMBOL_GPL(snd_ctl_sync_vmaster); | 486 | EXPORT_SYMBOL_GPL(snd_ctl_sync_vmaster); |
487 | |||
488 | /** | ||
489 | * snd_ctl_apply_vmaster_slaves - Apply function to each vmaster slave | ||
490 | * @kctl: vmaster kctl element | ||
491 | * @func: function to apply | ||
492 | * @arg: optional function argument | ||
493 | * | ||
494 | * Apply the function @func to each slave kctl of the given vmaster kctl. | ||
495 | * Returns 0 if successful, or a negative error code. | ||
496 | */ | ||
497 | int snd_ctl_apply_vmaster_slaves(struct snd_kcontrol *kctl, | ||
498 | int (*func)(struct snd_kcontrol *, void *), | ||
499 | void *arg) | ||
500 | { | ||
501 | struct link_master *master; | ||
502 | struct link_slave *slave; | ||
503 | int err; | ||
504 | |||
505 | master = snd_kcontrol_chip(kctl); | ||
506 | err = master_init(master); | ||
507 | if (err < 0) | ||
508 | return err; | ||
509 | list_for_each_entry(slave, &master->slaves, list) { | ||
510 | err = func(&slave->slave, arg); | ||
511 | if (err < 0) | ||
512 | return err; | ||
513 | } | ||
514 | |||
515 | return 0; | ||
516 | } | ||
517 | EXPORT_SYMBOL_GPL(snd_ctl_apply_vmaster_slaves); | ||