static struct dma_chan *tegra_dma_of_xlate(struct of_phandle_args *dma_spec, struct of_dma *ofdma) { struct tegra_adma *tdma = ofdma->of_dma_data; struct tegra_adma_chan *tdc; struct dma_chan *chan; unsigned int sreq_index; if (dma_spec->args_count != 1) return NULL; sreq_index = dma_spec->args[0]; if (sreq_index == 0) { dev_err(tdma->dev, "DMA request must not be 0\n"); return NULL; } chan = dma_get_any_slave_channel(&tdma->dma_dev); if (!chan) return NULL; tdc = to_tegra_adma_chan(chan); tdc->sreq_index = sreq_index; return chan; }
static struct dma_chan *at_xdmac_xlate(struct of_phandle_args *dma_spec, struct of_dma *of_dma) { struct at_xdmac *atxdmac = of_dma->of_dma_data; struct at_xdmac_chan *atchan; struct dma_chan *chan; struct device *dev = atxdmac->dma.dev; if (dma_spec->args_count != 1) { dev_err(dev, "dma phandler args: bad number of args\n"); return NULL; } chan = dma_get_any_slave_channel(&atxdmac->dma); if (!chan) { dev_err(dev, "can't get a dma channel\n"); return NULL; } atchan = to_at_xdmac_chan(chan); atchan->memif = AT91_XDMAC_DT_GET_MEM_IF(dma_spec->args[0]); atchan->perif = AT91_XDMAC_DT_GET_PER_IF(dma_spec->args[0]); atchan->perid = AT91_XDMAC_DT_GET_PERID(dma_spec->args[0]); dev_dbg(dev, "chan dt cfg: memif=%u perif=%u perid=%u\n", atchan->memif, atchan->perif, atchan->perid); return chan; }
static struct dma_chan *st_fdma_of_xlate(struct of_phandle_args *dma_spec, struct of_dma *ofdma) { struct st_fdma_dev *fdev = ofdma->of_dma_data; struct dma_chan *chan; struct st_fdma_chan *fchan; int ret; if (dma_spec->args_count < 1) return ERR_PTR(-EINVAL); if (fdev->dma_device.dev->of_node != dma_spec->np) return ERR_PTR(-EINVAL); ret = rproc_boot(fdev->slim_rproc->rproc); if (ret == -ENOENT) return ERR_PTR(-EPROBE_DEFER); else if (ret) return ERR_PTR(ret); chan = dma_get_any_slave_channel(&fdev->dma_device); if (!chan) goto err_chan; fchan = to_st_fdma_chan(chan); fchan->cfg.of_node = dma_spec->np; fchan->cfg.req_line = dma_spec->args[0]; fchan->cfg.req_ctrl = 0; fchan->cfg.type = ST_FDMA_TYPE_FREE_RUN; if (dma_spec->args_count > 1) fchan->cfg.req_ctrl = dma_spec->args[1] & FDMA_REQ_CTRL_CFG_MASK; if (dma_spec->args_count > 2) fchan->cfg.type = dma_spec->args[2]; if (fchan->cfg.type == ST_FDMA_TYPE_FREE_RUN) { fchan->dreq_line = 0; } else { fchan->dreq_line = st_fdma_dreq_get(fchan); if (IS_ERR_VALUE(fchan->dreq_line)) { chan = ERR_PTR(fchan->dreq_line); goto err_chan; } } dev_dbg(fdev->dev, "xlate req_line:%d type:%d req_ctrl:%#lx\n", fchan->cfg.req_line, fchan->cfg.type, fchan->cfg.req_ctrl); return chan; err_chan: rproc_shutdown(fdev->slim_rproc->rproc); return chan; }