in qcom-ngd-ctrl.c [567:601]
static int qcom_slim_ngd_tx_msg_post(struct qcom_slim_ngd_ctrl *ctrl,
void *buf, int len)
{
struct qcom_slim_ngd_dma_desc *desc;
unsigned long flags;
int index, offset;
spin_lock_irqsave(&ctrl->tx_buf_lock, flags);
offset = buf - ctrl->tx_base;
index = offset/SLIM_MSGQ_BUF_LEN;
desc = &ctrl->txdesc[index];
desc->phys = ctrl->tx_phys_base + offset;
desc->base = ctrl->tx_base + offset;
desc->ctrl = ctrl;
len = (len + 3) & 0xfc;
desc->desc = dmaengine_prep_slave_single(ctrl->dma_tx_channel,
desc->phys, len,
DMA_MEM_TO_DEV,
DMA_PREP_INTERRUPT);
if (!desc->desc) {
dev_err(ctrl->dev, "unable to prepare channel\n");
spin_unlock_irqrestore(&ctrl->tx_buf_lock, flags);
return -EINVAL;
}
desc->desc->callback = qcom_slim_ngd_tx_msg_dma_cb;
desc->desc->callback_param = desc;
desc->desc->cookie = dmaengine_submit(desc->desc);
dma_async_issue_pending(ctrl->dma_tx_channel);
spin_unlock_irqrestore(&ctrl->tx_buf_lock, flags);
return 0;
}