[alsa-devel] [PATCH 1/3] ASoC: Intel: Hsw: Move driver to use SND_SOC_BYTES_TLV
Vinod Koul
vinod.koul at intel.com
Wed Nov 18 14:39:10 CET 2015
Haswell driver was using SND_SOC_BYTES_EXT. Since we want to
remove this, convert it to use SND_SOC_BYTES_TLV
Signed-off-by: Vinod Koul <vinod.koul at intel.com>
Cc: Jie Yang <yang.jie at linux.intel.com>
Cc: Liam Girdwood <lgirdwood at gmail.com>
---
sound/soc/intel/haswell/sst-haswell-pcm.c | 50 ++++++++++++++++++++++++-------
1 file changed, 40 insertions(+), 10 deletions(-)
diff --git a/sound/soc/intel/haswell/sst-haswell-pcm.c b/sound/soc/intel/haswell/sst-haswell-pcm.c
index 1aa819c7e09b..65594dff291a 100644
--- a/sound/soc/intel/haswell/sst-haswell-pcm.c
+++ b/sound/soc/intel/haswell/sst-haswell-pcm.c
@@ -368,41 +368,71 @@ static int hsw_waves_switch_put(struct snd_kcontrol *kcontrol,
}
static int hsw_waves_param_get(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol)
+ unsigned int __user *data, unsigned int size)
{
struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol);
struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform);
struct sst_hsw *hsw = pdata->hsw;
+ u8 *buffer;
+ int ret;
+
+ buffer = kzalloc(size, GFP_KERNEL);
+ if (!buffer)
+ return -ENOMEM;
/* return a matching line from param buffer */
- return sst_hsw_load_param_line(hsw, ucontrol->value.bytes.data);
+ ret = sst_hsw_load_param_line(hsw, buffer);
+ if (ret)
+ goto err;
+
+ if (copy_to_user(data, buffer, size))
+ ret = -EFAULT;
+
+err:
+ kfree(buffer);
+ return ret;
}
static int hsw_waves_param_put(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol)
+ const unsigned int __user *data, unsigned int size)
{
struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol);
struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform);
struct sst_hsw *hsw = pdata->hsw;
- int ret;
+ int ret = 0;
enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES;
- int param_id = ucontrol->value.bytes.data[0];
+ int param_id;
int param_size = WAVES_PARAM_COUNT;
+ u8 *buffer;
+
+ buffer = kzalloc(size, GFP_KERNEL);
+ if (!buffer)
+ return -ENOMEM;
+
+ if (copy_from_user(buffer, data, size)) {
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ param_id = *buffer;
/* clear param buffer and reset buffer index */
if (param_id == 0xFF) {
sst_hsw_reset_param_buf(hsw);
- return 0;
+ goto exit;
}
/* store params into buffer */
- ret = sst_hsw_store_param_line(hsw, ucontrol->value.bytes.data);
+ ret = sst_hsw_store_param_line(hsw, buffer);
if (ret < 0)
- return ret;
+ goto exit;
if (sst_hsw_is_module_active(hsw, id))
ret = sst_hsw_module_set_param(hsw, id, 0, param_id,
- param_size, ucontrol->value.bytes.data);
+ param_size, buffer);
+
+exit:
+ kfree(buffer);
return ret;
}
@@ -431,7 +461,7 @@ static const struct snd_kcontrol_new hsw_volume_controls[] = {
SOC_SINGLE_BOOL_EXT("Waves Switch", 0,
hsw_waves_switch_get, hsw_waves_switch_put),
/* set parameters to module waves */
- SND_SOC_BYTES_EXT("Waves Set Param", WAVES_PARAM_COUNT,
+ SND_SOC_BYTES_TLV("Waves Set Param", WAVES_PARAM_COUNT,
hsw_waves_param_get, hsw_waves_param_put),
};
--
1.9.1
More information about the Alsa-devel
mailing list