summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorOmair Mohammed Abdullah <omair.m.abdullah@intel.com>2014-07-15 16:04:48 (GMT)
committerMark Brown <broonie@linaro.org>2014-07-16 21:43:59 (GMT)
commit7523a271682fc1f35355da344249ce8f8c8b8cb9 (patch)
tree5e1c50131b61909dddd438ad40a63cfb3789d646 /sound
parent0cea76f3393782d67ccea8f07e9abf341bc4f60e (diff)
downloadlinux-7523a271682fc1f35355da344249ce8f8c8b8cb9.tar.xz
ASoC: core: add a helper for extended byte controls using TLV
ALSA supports arbitrary length TLVs for each kcontrol that can be used to pass metadata about the control (e.g. volumes, enum information). The same transport mechanism is now used for arbitrary length data by defining a new helper. Signed-off-by: Omair Mohammed Abdullah <omair.m.abdullah@intel.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/soc-core.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index b87d7d8..a9ce63f 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3267,6 +3267,27 @@ int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
}
EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext);
+int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
+ unsigned int size, unsigned int __user *tlv)
+{
+ struct soc_bytes_ext *params = (void *)kcontrol->private_value;
+ unsigned int count = size < params->max ? size : params->max;
+ int ret = -ENXIO;
+
+ switch (op_flag) {
+ case SNDRV_CTL_TLV_OP_READ:
+ if (params->get)
+ ret = params->get(tlv, count);
+ break;
+ case SNDRV_CTL_TLV_OP_WRITE:
+ if (params->put)
+ ret = params->put(tlv, count);
+ break;
+ }
+ return ret;
+}
+EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback);
+
/**
* snd_soc_info_xr_sx - signed multi register info callback
* @kcontrol: mreg control