in clients/cmt_speech.c [600:630]
static void cs_hsi_peek_on_data_complete(struct hsi_msg *msg)
{
struct cs_hsi_iface *hi = msg->context;
u32 *address;
int ret;
if (unlikely(msg->status == HSI_STATUS_ERROR)) {
cs_hsi_data_read_error(hi, msg);
return;
}
if (unlikely(hi->iface_state != CS_STATE_CONFIGURED)) {
dev_err(&hi->cl->device, "Data received in invalid state\n");
cs_hsi_data_read_error(hi, msg);
return;
}
spin_lock(&hi->lock);
WARN_ON(!(hi->data_state & SSI_CHANNEL_STATE_POLL));
hi->data_state &= ~SSI_CHANNEL_STATE_POLL;
hi->data_state |= SSI_CHANNEL_STATE_READING;
spin_unlock(&hi->lock);
address = (u32 *)(hi->mmap_base +
hi->rx_offsets[hi->rx_slot % hi->rx_bufs]);
sg_init_one(msg->sgt.sgl, address, hi->buf_size);
msg->sgt.nents = 1;
msg->complete = cs_hsi_read_on_data_complete;
ret = hsi_async_read(hi->cl, msg);
if (ret)
cs_hsi_data_read_error(hi, msg);
}