[alsa-devel] [PATCH 1/3] ASoC: Intel: Hsw: Move driver to use SND_SOC_BYTES_TLV

Han Lu han.lu at linux.intel.com
Thu Nov 19 07:56:47 CET 2015


There was no special reason for me to use SND_SOC_BYTES_EXT here. But 
will this patch
influences user space, since the parameter list of hsw_waves_param_get() 
be modified?

Regards,
Han Lu

On 11/18/2015 09:39 PM, Vinod Koul wrote:
> 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),
>   };
>   



More information about the Alsa-devel mailing list