in clients/cmt_speech.c [833:877]
static int cs_hsi_data_sync(struct cs_hsi_iface *hi)
{
int r = 0;
spin_lock_bh(&hi->lock);
if (!cs_state_xfer_active(hi->data_state)) {
dev_dbg(&hi->cl->device, "hsi_data_sync break, idle\n");
goto out;
}
for (;;) {
int s;
DEFINE_WAIT(wait);
if (!cs_state_xfer_active(hi->data_state))
goto out;
if (signal_pending(current)) {
r = -ERESTARTSYS;
goto out;
}
/*
* prepare_to_wait must be called with hi->lock held
* so that callbacks can check for waitqueue_active()
*/
prepare_to_wait(&hi->datawait, &wait, TASK_INTERRUPTIBLE);
spin_unlock_bh(&hi->lock);
s = schedule_timeout(
msecs_to_jiffies(CS_HSI_TRANSFER_TIMEOUT_MS));
spin_lock_bh(&hi->lock);
finish_wait(&hi->datawait, &wait);
if (!s) {
dev_dbg(&hi->cl->device,
"hsi_data_sync timeout after %d ms\n",
CS_HSI_TRANSFER_TIMEOUT_MS);
r = -EIO;
goto out;
}
}
out:
spin_unlock_bh(&hi->lock);
dev_dbg(&hi->cl->device, "hsi_data_sync done with res %d\n", r);
return r;
}