Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;

}