if (!sps || !sdev->stream_box.size) {
                snd_sof_dsp_mailbox_read(sdev, sdev->dsp_box.offset, p, sz);
        } else {
-               struct snd_pcm_substream *substream = sps->substream;
-               struct sof_stream *stream = substream->runtime->private_data;
+               size_t posn_offset;
 
-               /* The stream might already be closed */
-               if (!stream)
-                       return -ESTRPIPE;
+               if (sps->substream) {
+                       struct sof_stream *stream = sps->substream->runtime->private_data;
 
-               snd_sof_dsp_mailbox_read(sdev, stream->posn_offset, p, sz);
+                       /* The stream might already be closed */
+                       if (!stream)
+                               return -ESTRPIPE;
+
+                       posn_offset = stream->posn_offset;
+               } else {
+
+                       struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;
+
+                       if (!sstream)
+                               return -ESTRPIPE;
+
+                       posn_offset = sstream->posn_offset;
+               }
+
+               snd_sof_dsp_mailbox_read(sdev, posn_offset, p, sz);
        }
 
        return 0;
                               struct snd_sof_pcm_stream *sps,
                               size_t posn_offset)
 {
-       struct snd_pcm_substream *substream = sps->substream;
-       struct sof_stream *stream = substream->runtime->private_data;
-
        /* check if offset is overflow or it is not aligned */
        if (posn_offset > sdev->stream_box.size ||
            posn_offset % sizeof(struct sof_ipc_stream_posn) != 0)
                return -EINVAL;
 
-       stream->posn_offset = sdev->stream_box.offset + posn_offset;
+       posn_offset += sdev->stream_box.offset;
+
+       if (sps->substream) {
+               struct sof_stream *stream = sps->substream->runtime->private_data;
+
+               stream->posn_offset = posn_offset;
+               dev_dbg(sdev->dev, "pcm: stream dir %d, posn mailbox offset is %zu",
+                       sps->substream->stream, posn_offset);
+       } else if (sps->cstream) {
+               struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;
 
-       dev_dbg(sdev->dev, "pcm: stream dir %d, posn mailbox offset is %zu",
-               substream->stream, stream->posn_offset);
+               sstream->posn_offset = posn_offset;
+               dev_dbg(sdev->dev, "compr: stream dir %d, posn mailbox offset is %zu",
+                       sps->cstream->direction, posn_offset);
+       } else {
+               dev_err(sdev->dev, "No stream opened");
+               return -EINVAL;
+       }
 
        return 0;
 }