in qcom-ngd-ctrl.c [711:743]
static int qcom_slim_ngd_init_tx_msgq(struct qcom_slim_ngd_ctrl *ctrl)
{
struct device *dev = ctrl->dev;
unsigned long flags;
int ret = 0;
int size;
ctrl->dma_tx_channel = dma_request_chan(dev, "tx");
if (IS_ERR(ctrl->dma_tx_channel)) {
dev_err(dev, "Failed to request TX dma channel");
ret = PTR_ERR(ctrl->dma_tx_channel);
ctrl->dma_tx_channel = NULL;
return ret;
}
size = ((QCOM_SLIM_NGD_DESC_NUM + 1) * SLIM_MSGQ_BUF_LEN);
ctrl->tx_base = dma_alloc_coherent(dev, size, &ctrl->tx_phys_base,
GFP_KERNEL);
if (!ctrl->tx_base) {
ret = -EINVAL;
goto rel_tx;
}
spin_lock_irqsave(&ctrl->tx_buf_lock, flags);
ctrl->tx_tail = 0;
ctrl->tx_head = 0;
spin_unlock_irqrestore(&ctrl->tx_buf_lock, flags);
return 0;
rel_tx:
dma_release_channel(ctrl->dma_tx_channel);
return ret;
}