diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2011-01-25 11:18:20 +0100 |
---|---|---|
committer | Rabin VINCENT <rabin.vincent@stericsson.com> | 2011-10-18 14:06:52 +0200 |
commit | 4cc49ee2583fa96088fb52bc4917a071ae352f9f (patch) | |
tree | 40279af3aeb5672b1e857d794ed85b962374565c /drivers/dma/ste_dma40.c | |
parent | 25731fb54d13320415c44e7de30388f2d203bbbe (diff) |
dma40: remove duplicated dev addr code
ST-Ericsson ID: 362972
ST-Ericsson FOSS-OUT ID: NA
ST-Ericsson Linux next: NA
Change-Id: If0e126c3b0705714347ab2cbde980f02f2dfb160
Acked-by: Per Forlin <per.forlin@stericsson.com>
Acked-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/34222
Tested-by: Narayanan GOPALAKRISHNAN <narayanan.gopalakrishnan@stericsson.com>
Diffstat (limited to 'drivers/dma/ste_dma40.c')
-rw-r--r-- | drivers/dma/ste_dma40.c | 99 |
1 files changed, 44 insertions, 55 deletions
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index b04ff835349..1ce4dcea264 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c @@ -2237,36 +2237,6 @@ static struct dma_async_tx_descriptor *d40_prep_memcpy(struct dma_chan *chan, return stedma40_memcpy_sg(chan, &dst_sg, &src_sg, 1, dma_flags); } -static dma_addr_t d40_dev_rx_addr(struct d40_chan *d40c) -{ - dma_addr_t dev_addr = 0; - - if (d40c->runtime_addr) - dev_addr = d40c->runtime_addr; - else if (d40c->src_dev_addr) - dev_addr = d40c->src_dev_addr; - else - dev_addr = d40c->base->plat_data-> - dev_rx[d40c->dma_cfg.src_dev_type]; - - return dev_addr; -} - -static dma_addr_t d40_dev_tx_addr(struct d40_chan *d40c) -{ - dma_addr_t dev_addr = 0; - - if (d40c->runtime_addr) - dev_addr = d40c->runtime_addr; - else if (d40c->dst_dev_addr) - dev_addr = d40c->dst_dev_addr; - else - dev_addr = d40c->base->plat_data-> - dev_tx[d40c->dma_cfg.dst_dev_type]; - - return dev_addr; -} - int stedma40_set_dev_addr(struct dma_chan *chan, dma_addr_t src_dev_addr, dma_addr_t dst_dev_addr) @@ -2290,18 +2260,10 @@ static int d40_prep_slave_sg_log(struct d40_desc *d40d, struct scatterlist *sgl, unsigned int sg_len, enum dma_data_direction direction, - unsigned long dma_flags) + dma_addr_t dev_addr) { - dma_addr_t dev_addr = 0; int total_size; - if (direction == DMA_FROM_DEVICE) - dev_addr = d40_dev_rx_addr(d40c); - else if (direction == DMA_TO_DEVICE) - dev_addr = d40_dev_tx_addr(d40c); - else - return -EINVAL; - total_size = d40_log_sg_to_dev(sgl, sg_len, &d40d->lli_log, &d40c->log_def, @@ -2320,21 +2282,12 @@ static int d40_prep_slave_sg_phy(struct d40_desc *d40d, struct scatterlist *sgl, unsigned int sgl_len, enum dma_data_direction direction, - unsigned long dma_flags) + dma_addr_t dev_addr) { - dma_addr_t src_dev_addr; - dma_addr_t dst_dev_addr; + dma_addr_t src_dev_addr = direction == DMA_FROM_DEVICE ? dev_addr : 0; + dma_addr_t dst_dev_addr = direction == DMA_TO_DEVICE ? dev_addr : 0; int res; - if (direction == DMA_FROM_DEVICE) { - dst_dev_addr = 0; - src_dev_addr = d40_dev_rx_addr(d40c); - } else if (direction == DMA_TO_DEVICE) { - dst_dev_addr = d40_dev_tx_addr(d40c); - src_dev_addr = 0; - } else - return -EINVAL; - res = d40_phy_sg_to_lli(sgl, sgl_len, src_dev_addr, @@ -2366,6 +2319,32 @@ static int d40_prep_slave_sg_phy(struct d40_desc *d40d, return 0; } +static dma_addr_t +d40_get_dev_addr(struct d40_chan *chan, enum dma_data_direction direction) +{ + struct stedma40_platform_data *plat = chan->base->plat_data; + struct stedma40_chan_cfg *cfg = &chan->dma_cfg; + dma_addr_t addr = -EINVAL; + + if (chan->runtime_addr) + return chan->runtime_addr; + + if (direction == DMA_FROM_DEVICE) { + if (chan->src_dev_addr) + addr = chan->src_dev_addr; + else + addr = plat->dev_rx[cfg->src_dev_type]; + + } else if (direction == DMA_TO_DEVICE) { + if (chan->dst_dev_addr) + addr = chan->dst_dev_addr; + else + addr = plat->dev_tx[cfg->dst_dev_type]; + } + + return addr; +} + static struct dma_async_tx_descriptor * d40_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len, enum dma_data_direction direction, @@ -2374,6 +2353,7 @@ d40_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, struct d40_desc *d40d; struct d40_chan *d40c = container_of(chan, struct d40_chan, chan); + dma_addr_t dev_addr; unsigned long flags; int err; @@ -2383,6 +2363,9 @@ d40_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, return ERR_PTR(-EINVAL); } + if (direction != DMA_FROM_DEVICE && direction != DMA_TO_DEVICE) + return NULL; + spin_lock_irqsave(&d40c->lock, flags); d40d = d40_prep_desc(d40c, sgl, sg_len, dma_flags); @@ -2390,12 +2373,15 @@ d40_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, goto err; d40_usage_inc(d40c); + dev_addr = d40_get_dev_addr(d40c, direction); + if (chan_is_logical(d40c)) err = d40_prep_slave_sg_log(d40d, d40c, sgl, sg_len, - direction, dma_flags); + direction, dev_addr); else err = d40_prep_slave_sg_phy(d40d, d40c, sgl, sg_len, - direction, dma_flags); + direction, dev_addr); + d40_usage_dec(d40c); if (err) { @@ -2811,6 +2797,7 @@ stedma40_cyclic_prep_sg(struct dma_chan *chan, struct d40_chan *d40c = container_of(chan, struct d40_chan, chan); struct stedma40_cyclic_desc *cdesc; struct d40_desc *d40d; + dma_addr_t dev_addr; unsigned long flags; void *mem; int err; @@ -2849,12 +2836,14 @@ stedma40_cyclic_prep_sg(struct dma_chan *chan, d40_usage_inc(d40c); + dev_addr = d40_get_dev_addr(d40c, direction); + if (chan_is_logical(d40c)) err = d40_prep_slave_sg_log(d40d, d40c, sgl, sg_len, - direction, dma_flags); + direction, dev_addr); else err = d40_prep_slave_sg_phy(d40d, d40c, sgl, sg_len, - direction, dma_flags); + direction, dev_addr); if (err) { chan_err(d40c,"Failed to prepare %s slave sg job: %d\n", |