in clients/cmt_speech.c [691:733]
static int cs_hsi_write_on_data(struct cs_hsi_iface *hi, unsigned int slot)
{
u32 *address;
struct hsi_msg *txmsg;
int ret;
spin_lock(&hi->lock);
if (hi->iface_state != CS_STATE_CONFIGURED) {
dev_err(&hi->cl->device, "Not configured, aborting\n");
ret = -EINVAL;
goto error;
}
if (hi->data_state & SSI_CHANNEL_STATE_ERROR) {
dev_err(&hi->cl->device, "HSI error, aborting\n");
ret = -EIO;
goto error;
}
if (hi->data_state & SSI_CHANNEL_STATE_WRITING) {
dev_err(&hi->cl->device, "Write pending on data channel.\n");
ret = -EBUSY;
goto error;
}
hi->data_state |= SSI_CHANNEL_STATE_WRITING;
spin_unlock(&hi->lock);
hi->tx_slot = slot;
address = (u32 *)(hi->mmap_base + hi->tx_offsets[hi->tx_slot]);
txmsg = hi->data_tx_msg;
sg_init_one(txmsg->sgt.sgl, address, hi->buf_size);
txmsg->complete = cs_hsi_write_on_data_complete;
ret = hsi_async_write(hi->cl, txmsg);
if (ret)
cs_hsi_data_write_error(hi, txmsg);
return ret;
error:
spin_unlock(&hi->lock);
if (ret == -EIO)
cs_hsi_data_write_error(hi, hi->data_tx_msg);
return ret;
}