OSDN Git Service

ASoC: SOF: ipc: Use the get_reply ops in snd_sof_ipc_get_reply()
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Tue, 5 Apr 2022 17:27:03 +0000 (10:27 -0700)
committerMark Brown <broonie@kernel.org>
Mon, 11 Apr 2022 18:17:57 +0000 (19:17 +0100)
Use the get_reply ops to allow IPC dependent handling of the reply message.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20220405172708.122168-11-ranjani.sridharan@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc.c

index d11c5e6..39ec436 100644 (file)
@@ -443,63 +443,17 @@ EXPORT_SYMBOL(sof_ipc_tx_message_no_pm);
 /* Generic helper function to retrieve the reply */
 void snd_sof_ipc_get_reply(struct snd_sof_dev *sdev)
 {
-       struct snd_sof_ipc_msg *msg = sdev->msg;
-       struct sof_ipc_reply *reply;
-       int ret = 0;
-
        /*
         * Sometimes, there is unexpected reply ipc arriving. The reply
         * ipc belongs to none of the ipcs sent from driver.
         * In this case, the driver must ignore the ipc.
         */
-       if (!msg) {
+       if (!sdev->msg) {
                dev_warn(sdev->dev, "unexpected ipc interrupt raised!\n");
                return;
        }
 
-       /* get the generic reply */
-       reply = msg->reply_data;
-       snd_sof_dsp_mailbox_read(sdev, sdev->host_box.offset, reply, sizeof(*reply));
-
-       if (reply->error < 0) {
-               ret = reply->error;
-       } else if (!reply->hdr.size) {
-               /* Reply should always be >= sizeof(struct sof_ipc_reply) */
-               if (msg->reply_size)
-                       dev_err(sdev->dev,
-                               "empty reply received, expected %zu bytes\n",
-                               msg->reply_size);
-               else
-                       dev_err(sdev->dev, "empty reply received\n");
-
-               ret = -EINVAL;
-       } else if (msg->reply_size > 0) {
-               if (reply->hdr.size == msg->reply_size) {
-                       ret = 0;
-               } else if (reply->hdr.size < msg->reply_size) {
-                       dev_dbg(sdev->dev,
-                               "reply size (%u) is less than expected (%zu)\n",
-                               reply->hdr.size, msg->reply_size);
-
-                       msg->reply_size = reply->hdr.size;
-                       ret = 0;
-               } else {
-                       dev_err(sdev->dev,
-                               "reply size (%u) exceeds the buffer size (%zu)\n",
-                               reply->hdr.size, msg->reply_size);
-                       ret = -EINVAL;
-               }
-
-               /*
-                * get the full message if reply->hdr.size <= msg->reply_size
-                * and the reply->hdr.size > sizeof(struct sof_ipc_reply)
-                */
-               if (!ret && msg->reply_size > sizeof(*reply))
-                       snd_sof_dsp_mailbox_read(sdev, sdev->host_box.offset,
-                                                msg->reply_data, msg->reply_size);
-       }
-
-       msg->reply_error = ret;
+       sdev->msg->reply_error = sdev->ipc->ops->get_reply(sdev);
 }
 EXPORT_SYMBOL(snd_sof_ipc_get_reply);