in clients/cmt_speech.c [526:571]
static int cs_hsi_write_on_control(struct cs_hsi_iface *hi, u32 message)
{
struct hsi_msg *msg;
int ret;
spin_lock(&hi->lock);
if (hi->control_state & SSI_CHANNEL_STATE_ERROR) {
spin_unlock(&hi->lock);
return -EIO;
}
if (hi->control_state & SSI_CHANNEL_STATE_WRITING) {
dev_err(&hi->cl->device,
"Write still pending on control channel.\n");
spin_unlock(&hi->lock);
return -EBUSY;
}
hi->control_state |= SSI_CHANNEL_STATE_WRITING;
msg = cs_claim_cmd(hi);
spin_unlock(&hi->lock);
cs_set_cmd(msg, message);
msg->sgt.nents = 1;
msg->complete = cs_hsi_write_on_control_complete;
dev_dbg(&hi->cl->device,
"Sending control message %08X\n", message);
ret = hsi_async_write(hi->cl, msg);
if (ret) {
dev_err(&hi->cl->device,
"async_write failed with %d\n", ret);
cs_hsi_control_write_error(hi, msg);
}
/*
* Make sure control read is always pending when issuing
* new control writes. This is needed as the controller
* may flush our messages if e.g. the peer device reboots
* unexpectedly (and we cannot directly resubmit a new read from
* the message destructor; see cs_cmd_destructor()).
*/
if (!(hi->control_state & SSI_CHANNEL_STATE_READING)) {
dev_err(&hi->cl->device, "Restarting control reads\n");
cs_hsi_read_on_control(hi);
}
return 0;
}