struct soc_mixer_control *sm =
                (struct soc_mixer_control *)kcontrol->private_value;
        struct snd_sof_control *scontrol = sm->dobj.private;
-       struct snd_sof_dev *sdev = scontrol->sdev;
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        unsigned int i, channels = scontrol->num_channels;
-       int err, ret;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: volume get failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
-
-       /* get all the mixer data from DSP */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_GET_VALUE,
-                                     SOF_CTRL_TYPE_VALUE_CHAN_GET,
-                                     SOF_CTRL_CMD_VOLUME,
-                                     false);
 
        /* read back each channel */
        for (i = 0; i < channels; i++)
                        ipc_to_mixer(cdata->chanv[i].value,
                                     scontrol->volume_table, sm->max + 1);
 
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: volume get failed to idle %d\n",
-                                   err);
        return 0;
 }
 
        struct snd_sof_dev *sdev = scontrol->sdev;
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        unsigned int i, channels = scontrol->num_channels;
-       int ret, err;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: volume put failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
 
        /* update each channel */
        for (i = 0; i < channels; i++) {
        }
 
        /* notify DSP of mixer updates */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_SET_VALUE,
-                                     SOF_CTRL_TYPE_VALUE_CHAN_GET,
-                                     SOF_CTRL_CMD_VOLUME,
-                                     true);
-
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: volume put failed to idle %d\n",
-                                   err);
+       if (pm_runtime_active(sdev->dev))
+               snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
+                                             SOF_IPC_COMP_SET_VALUE,
+                                             SOF_CTRL_TYPE_VALUE_CHAN_GET,
+                                             SOF_CTRL_CMD_VOLUME,
+                                             true);
+
        return 0;
 }
 
        struct soc_mixer_control *sm =
                (struct soc_mixer_control *)kcontrol->private_value;
        struct snd_sof_control *scontrol = sm->dobj.private;
-       struct snd_sof_dev *sdev = scontrol->sdev;
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        unsigned int i, channels = scontrol->num_channels;
-       int err, ret;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: switch get failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
-
-       /* get all the mixer data from DSP */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_GET_VALUE,
-                                     SOF_CTRL_TYPE_VALUE_CHAN_GET,
-                                     SOF_CTRL_CMD_SWITCH,
-                                     false);
 
        /* read back each channel */
        for (i = 0; i < channels; i++)
                ucontrol->value.integer.value[i] = cdata->chanv[i].value;
 
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: switch get failed to idle %d\n",
-                                   err);
        return 0;
 }
 
        struct snd_sof_dev *sdev = scontrol->sdev;
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        unsigned int i, channels = scontrol->num_channels;
-       int ret, err;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: switch put failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
 
        /* update each channel */
        for (i = 0; i < channels; i++) {
        }
 
        /* notify DSP of mixer updates */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_SET_VALUE,
-                                     SOF_CTRL_TYPE_VALUE_CHAN_GET,
-                                     SOF_CTRL_CMD_SWITCH,
-                                     true);
-
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: switch put failed to idle %d\n",
-                                   err);
+       if (pm_runtime_active(sdev->dev))
+               snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
+                                             SOF_IPC_COMP_SET_VALUE,
+                                             SOF_CTRL_TYPE_VALUE_CHAN_GET,
+                                             SOF_CTRL_CMD_SWITCH,
+                                             true);
+
        return 0;
 }
 
        struct soc_enum *se =
                (struct soc_enum *)kcontrol->private_value;
        struct snd_sof_control *scontrol = se->dobj.private;
-       struct snd_sof_dev *sdev = scontrol->sdev;
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        unsigned int i, channels = scontrol->num_channels;
-       int err, ret;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: enum get failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
-
-       /* get all the enum data from DSP */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_GET_VALUE,
-                                     SOF_CTRL_TYPE_VALUE_CHAN_GET,
-                                     SOF_CTRL_CMD_ENUM,
-                                     false);
 
        /* read back each channel */
        for (i = 0; i < channels; i++)
                ucontrol->value.enumerated.item[i] = cdata->chanv[i].value;
 
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: enum get failed to idle %d\n",
-                                   err);
        return 0;
 }
 
        struct snd_sof_dev *sdev = scontrol->sdev;
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        unsigned int i, channels = scontrol->num_channels;
-       int ret, err;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: enum put failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
 
        /* update each channel */
        for (i = 0; i < channels; i++) {
        }
 
        /* notify DSP of enum updates */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_SET_VALUE,
-                                     SOF_CTRL_TYPE_VALUE_CHAN_GET,
-                                     SOF_CTRL_CMD_ENUM,
-                                     true);
-
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: enum put failed to idle %d\n",
-                                   err);
+       if (pm_runtime_active(sdev->dev))
+               snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
+                                             SOF_IPC_COMP_SET_VALUE,
+                                             SOF_CTRL_TYPE_VALUE_CHAN_GET,
+                                             SOF_CTRL_CMD_ENUM,
+                                             true);
+
        return 0;
 }
 
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        struct sof_abi_hdr *data = cdata->data;
        size_t size;
-       int ret, err;
+       int ret = 0;
 
        if (be->max > sizeof(ucontrol->value.bytes.data)) {
                dev_err_ratelimited(sdev->dev,
                return -EINVAL;
        }
 
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes get failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
-
-       /* get all the binary data from DSP */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_GET_DATA,
-                                     SOF_CTRL_TYPE_DATA_GET,
-                                     scontrol->cmd,
-                                     false);
-
        size = data->size + sizeof(*data);
        if (size > be->max) {
                dev_err_ratelimited(sdev->dev,
        memcpy(ucontrol->value.bytes.data, data, size);
 
 out:
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes get failed to idle %d\n",
-                                   err);
        return ret;
 }
 
        struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
        struct sof_abi_hdr *data = cdata->data;
        size_t size = data->size + sizeof(*data);
-       int ret, err;
 
        if (be->max > sizeof(ucontrol->value.bytes.data)) {
                dev_err_ratelimited(sdev->dev,
                return -EINVAL;
        }
 
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes put failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
-
        /* copy from kcontrol */
        memcpy(data, ucontrol->value.bytes.data, size);
 
        /* notify DSP of byte control updates */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_SET_DATA,
-                                     SOF_CTRL_TYPE_DATA_SET,
-                                     scontrol->cmd,
-                                     true);
-
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes put failed to idle %d\n",
-                                   err);
-       return ret;
+       if (pm_runtime_active(sdev->dev))
+               snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
+                                             SOF_IPC_COMP_SET_DATA,
+                                             SOF_CTRL_TYPE_DATA_SET,
+                                             scontrol->cmd,
+                                             true);
+
+       return 0;
 }
 
 int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,
        struct snd_ctl_tlv header;
        const struct snd_ctl_tlv __user *tlvd =
                (const struct snd_ctl_tlv __user *)binary_data;
-       int ret;
-       int err;
 
        /*
         * The beginning of bytes data contains a header from where
                return -EINVAL;
        }
 
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes_ext put failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
-
        /* notify DSP of byte control updates */
-       snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                     SOF_IPC_COMP_SET_DATA,
-                                     SOF_CTRL_TYPE_DATA_SET,
-                                     scontrol->cmd,
-                                     true);
-
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes_ext put failed to idle %d\n",
-                                   err);
+       if (pm_runtime_active(sdev->dev))
+               snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
+                                             SOF_IPC_COMP_SET_DATA,
+                                             SOF_CTRL_TYPE_DATA_SET,
+                                             scontrol->cmd,
+                                             true);
 
-       return ret;
+       return 0;
 }
 
 int snd_sof_bytes_ext_get(struct snd_kcontrol *kcontrol,
        struct snd_ctl_tlv __user *tlvd =
                (struct snd_ctl_tlv __user *)binary_data;
        int data_size;
-       int err;
-       int ret;
-
-       ret = pm_runtime_get_sync(sdev->dev);
-       if (ret < 0) {
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes_ext get failed to resume %d\n",
-                                   ret);
-               pm_runtime_put_noidle(sdev->dev);
-               return ret;
-       }
+       int ret = 0;
 
        /*
         * Decrement the limit by ext bytes header size to
        cdata->data->magic = SOF_ABI_MAGIC;
        cdata->data->abi = SOF_ABI_VERSION;
 
-       /* get all the component data from DSP */
-       ret = snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol,
-                                           SOF_IPC_COMP_GET_DATA,
-                                           SOF_CTRL_TYPE_DATA_GET,
-                                           scontrol->cmd,
-                                           false);
-
        /* Prevent read of other kernel data or possibly corrupt response */
        data_size = cdata->data->size + sizeof(const struct sof_abi_hdr);
 
                ret = -EFAULT;
 
 out:
-       pm_runtime_mark_last_busy(sdev->dev);
-       err = pm_runtime_put_autosuspend(sdev->dev);
-       if (err < 0)
-               dev_err_ratelimited(sdev->dev,
-                                   "error: bytes_ext get failed to idle %d\n",
-                                   err);
        return ret;
 }