in controllers/omap_ssi_port.c [377:416]
static int ssi_async(struct hsi_msg *msg)
{
struct hsi_port *port = hsi_get_port(msg->cl);
struct omap_ssi_port *omap_port = hsi_port_drvdata(port);
struct list_head *queue;
int err = 0;
BUG_ON(!msg);
if (msg->sgt.nents > 1)
return -ENOSYS; /* TODO: Add sg support */
if (msg->break_frame)
return ssi_async_break(msg);
if (msg->ttype) {
BUG_ON(msg->channel >= omap_port->sst.channels);
queue = &omap_port->txqueue[msg->channel];
} else {
BUG_ON(msg->channel >= omap_port->ssr.channels);
queue = &omap_port->rxqueue[msg->channel];
}
msg->status = HSI_STATUS_QUEUED;
pm_runtime_get_sync(omap_port->pdev);
spin_lock_bh(&omap_port->lock);
list_add_tail(&msg->link, queue);
err = ssi_start_transfer(queue);
if (err < 0) {
list_del(&msg->link);
msg->status = HSI_STATUS_ERROR;
}
spin_unlock_bh(&omap_port->lock);
pm_runtime_mark_last_busy(omap_port->pdev);
pm_runtime_put_autosuspend(omap_port->pdev);
dev_dbg(&port->device, "msg status %d ttype %d ch %d\n",
msg->status, msg->ttype, msg->channel);
return err;
}