in clients/cmt_speech.c [984:1057]
static int cs_hsi_start(struct cs_hsi_iface **hi, struct hsi_client *cl,
unsigned long mmap_base, unsigned long mmap_size)
{
int err = 0;
struct cs_hsi_iface *hsi_if = kzalloc(sizeof(*hsi_if), GFP_KERNEL);
dev_dbg(&cl->device, "cs_hsi_start\n");
if (!hsi_if) {
err = -ENOMEM;
goto leave0;
}
spin_lock_init(&hsi_if->lock);
hsi_if->cl = cl;
hsi_if->iface_state = CS_STATE_CLOSED;
hsi_if->mmap_cfg = (struct cs_mmap_config_block *)mmap_base;
hsi_if->mmap_base = mmap_base;
hsi_if->mmap_size = mmap_size;
memset(hsi_if->mmap_cfg, 0, sizeof(*hsi_if->mmap_cfg));
init_waitqueue_head(&hsi_if->datawait);
err = cs_alloc_cmds(hsi_if);
if (err < 0) {
dev_err(&cl->device, "Unable to alloc HSI messages\n");
goto leave1;
}
err = cs_hsi_alloc_data(hsi_if);
if (err < 0) {
dev_err(&cl->device, "Unable to alloc HSI messages for data\n");
goto leave2;
}
err = hsi_claim_port(cl, 1);
if (err < 0) {
dev_err(&cl->device,
"Could not open, HSI port already claimed\n");
goto leave3;
}
hsi_if->master = ssip_slave_get_master(cl);
if (IS_ERR(hsi_if->master)) {
err = PTR_ERR(hsi_if->master);
dev_err(&cl->device, "Could not get HSI master client\n");
goto leave4;
}
if (!ssip_slave_running(hsi_if->master)) {
err = -ENODEV;
dev_err(&cl->device,
"HSI port not initialized\n");
goto leave4;
}
hsi_if->iface_state = CS_STATE_OPENED;
local_bh_disable();
cs_hsi_read_on_control(hsi_if);
local_bh_enable();
dev_dbg(&cl->device, "cs_hsi_start...done\n");
BUG_ON(!hi);
*hi = hsi_if;
return 0;
leave4:
hsi_release_port(cl);
leave3:
cs_hsi_free_data(hsi_if);
leave2:
cs_free_cmds(hsi_if);
leave1:
kfree(hsi_if);
leave0:
dev_dbg(&cl->device, "cs_hsi_start...done/error\n\n");
return err;
}