in clients/cmt_speech.c [924:982]
static int cs_hsi_buf_config(struct cs_hsi_iface *hi,
struct cs_buffer_config *buf_cfg)
{
int r = 0;
unsigned int old_state = hi->iface_state;
spin_lock_bh(&hi->lock);
/* Prevent new transactions during buffer reconfig */
if (old_state == CS_STATE_CONFIGURED)
hi->iface_state = CS_STATE_OPENED;
spin_unlock_bh(&hi->lock);
/*
* make sure that no non-zero data reads are ongoing before
* proceeding to change the buffer layout
*/
r = cs_hsi_data_sync(hi);
if (r < 0)
return r;
WARN_ON(cs_state_xfer_active(hi->data_state));
spin_lock_bh(&hi->lock);
r = check_buf_params(hi, buf_cfg);
if (r < 0)
goto error;
hi->buf_size = buf_cfg->buf_size;
hi->mmap_cfg->buf_size = hi->buf_size;
hi->flags = buf_cfg->flags;
hi->rx_slot = 0;
hi->tx_slot = 0;
hi->slot_size = 0;
if (hi->buf_size)
cs_hsi_data_enable(hi, buf_cfg);
else
cs_hsi_data_disable(hi, old_state);
spin_unlock_bh(&hi->lock);
if (old_state != hi->iface_state) {
if (hi->iface_state == CS_STATE_CONFIGURED) {
cpu_latency_qos_add_request(&hi->pm_qos_req,
CS_QOS_LATENCY_FOR_DATA_USEC);
local_bh_disable();
cs_hsi_read_on_data(hi);
local_bh_enable();
} else if (old_state == CS_STATE_CONFIGURED) {
cpu_latency_qos_remove_request(&hi->pm_qos_req);
}
}
return r;
error:
spin_unlock_bh(&hi->lock);
return r;
}