ASoC: SOF: ipc3-control: Merge functions to handle bytes_ext get variants
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Mon, 13 Mar 2023 11:03:39 +0000 (13:03 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 13 Mar 2023 14:06:49 +0000 (14:06 +0000)
The code for bytes_ext_get and bytes_ext_volatile_get is identical with
the only difference is that in case of volatile_get we refresh the data
from the DSP before returning it to user space.

Convert the callbacks to a simple wrapper for the same function.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20230313110344.16644-3-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc3-control.c

index 4e9d041..ad040e7 100644 (file)
@@ -343,55 +343,6 @@ static int sof_ipc3_bytes_put(struct snd_sof_control *scontrol,
        return 0;
 }
 
-static int sof_ipc3_bytes_ext_get(struct snd_sof_control *scontrol,
-                                 const unsigned int __user *binary_data, unsigned int size)
-{
-       struct snd_ctl_tlv __user *tlvd = (struct snd_ctl_tlv __user *)binary_data;
-       struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
-       struct snd_soc_component *scomp = scontrol->scomp;
-       struct snd_ctl_tlv header;
-       size_t data_size;
-
-       sof_ipc3_refresh_control(scontrol);
-
-       /*
-        * Decrement the limit by ext bytes header size to
-        * ensure the user space buffer is not exceeded.
-        */
-       if (size < sizeof(struct snd_ctl_tlv))
-               return -ENOSPC;
-
-       size -= sizeof(struct snd_ctl_tlv);
-
-       /* set the ABI header values */
-       cdata->data->magic = SOF_ABI_MAGIC;
-       cdata->data->abi = SOF_ABI_VERSION;
-
-       /* check data size doesn't exceed max coming from topology */
-       if (cdata->data->size > scontrol->max_size - sizeof(struct sof_abi_hdr)) {
-               dev_err_ratelimited(scomp->dev, "User data size %d exceeds max size %zu\n",
-                                   cdata->data->size,
-                                   scontrol->max_size - sizeof(struct sof_abi_hdr));
-               return -EINVAL;
-       }
-
-       data_size = cdata->data->size + sizeof(struct sof_abi_hdr);
-
-       /* make sure we don't exceed size provided by user space for data */
-       if (data_size > size)
-               return -ENOSPC;
-
-       header.numid = cdata->cmd;
-       header.length = data_size;
-       if (copy_to_user(tlvd, &header, sizeof(struct snd_ctl_tlv)))
-               return -EFAULT;
-
-       if (copy_to_user(tlvd->tlv, cdata->data, data_size))
-               return -EFAULT;
-
-       return 0;
-}
-
 static int sof_ipc3_bytes_ext_put(struct snd_sof_control *scontrol,
                                  const unsigned int __user *binary_data,
                                  unsigned int size)
@@ -457,16 +408,15 @@ static int sof_ipc3_bytes_ext_put(struct snd_sof_control *scontrol,
        return 0;
 }
 
-static int sof_ipc3_bytes_ext_volatile_get(struct snd_sof_control *scontrol,
-                                          const unsigned int __user *binary_data,
-                                          unsigned int size)
+static int _sof_ipc3_bytes_ext_get(struct snd_sof_control *scontrol,
+                                  const unsigned int __user *binary_data,
+                                  unsigned int size, bool from_dsp)
 {
        struct snd_ctl_tlv __user *tlvd = (struct snd_ctl_tlv __user *)binary_data;
        struct sof_ipc_ctrl_data *cdata = scontrol->ipc_control_data;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_ctl_tlv header;
        size_t data_size;
-       int ret;
 
        /*
         * Decrement the limit by ext bytes header size to
@@ -482,9 +432,12 @@ static int sof_ipc3_bytes_ext_volatile_get(struct snd_sof_control *scontrol,
        cdata->data->abi = SOF_ABI_VERSION;
 
        /* get all the component data from DSP */
-       ret = sof_ipc3_set_get_kcontrol_data(scontrol, false, true);
-       if (ret < 0)
-               return ret;
+       if (from_dsp) {
+               int ret = sof_ipc3_set_get_kcontrol_data(scontrol, false, true);
+
+               if (ret < 0)
+                       return ret;
+       }
 
        /* check data size doesn't exceed max coming from topology */
        if (cdata->data->size > scontrol->max_size - sizeof(struct sof_abi_hdr)) {
@@ -508,7 +461,20 @@ static int sof_ipc3_bytes_ext_volatile_get(struct snd_sof_control *scontrol,
        if (copy_to_user(tlvd->tlv, cdata->data, data_size))
                return -EFAULT;
 
-       return ret;
+       return 0;
+}
+
+static int sof_ipc3_bytes_ext_get(struct snd_sof_control *scontrol,
+                                 const unsigned int __user *binary_data, unsigned int size)
+{
+       return _sof_ipc3_bytes_ext_get(scontrol, binary_data, size, false);
+}
+
+static int sof_ipc3_bytes_ext_volatile_get(struct snd_sof_control *scontrol,
+                                          const unsigned int __user *binary_data,
+                                          unsigned int size)
+{
+       return _sof_ipc3_bytes_ext_get(scontrol, binary_data, size, true);
 }
 
 static void snd_sof_update_control(struct snd_sof_control *scontrol,