Skip to content

Commit

Permalink
DMAENGINE: ste_dma40: fix bug related to callback handling
Browse files Browse the repository at this point in the history
The callback got called even when it was not supposed to. Also
removed some not needed interrupt trigger on/off code.

Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Jonas Aaberg authored and Dan Williams committed Sep 22, 2010
1 parent b55912c commit 0246e77
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 23 deletions.
17 changes: 5 additions & 12 deletions drivers/dma/ste_dma40.c
Original file line number Diff line number Diff line change
Expand Up @@ -878,7 +878,7 @@ static void dma_tasklet(unsigned long data)

spin_unlock_irqrestore(&d40c->lock, flags);

if (callback)
if (callback && (d40d_fin->txd.flags & DMA_PREP_INTERRUPT))
callback(callback_param);

return;
Expand Down Expand Up @@ -1583,7 +1583,6 @@ struct dma_async_tx_descriptor *stedma40_memcpy_sg(struct dma_chan *chan,
d40d->lli_log.src,
d40c->log_def.lcsp1,
d40c->dma_cfg.src_info.data_width,
dma_flags & DMA_PREP_INTERRUPT,
d40d->lli_tx_len,
d40c->base->plat_data->llis_per_log);

Expand All @@ -1593,7 +1592,6 @@ struct dma_async_tx_descriptor *stedma40_memcpy_sg(struct dma_chan *chan,
d40d->lli_log.dst,
d40c->log_def.lcsp3,
d40c->dma_cfg.dst_info.data_width,
dma_flags & DMA_PREP_INTERRUPT,
d40d->lli_tx_len,
d40c->base->plat_data->llis_per_log);

Expand All @@ -1612,8 +1610,7 @@ struct dma_async_tx_descriptor *stedma40_memcpy_sg(struct dma_chan *chan,
d40d->lli_phy.src_addr,
d40c->src_def_cfg,
d40c->dma_cfg.src_info.data_width,
d40c->dma_cfg.src_info.psize,
true);
d40c->dma_cfg.src_info.psize);

if (res < 0)
goto err;
Expand All @@ -1625,8 +1622,7 @@ struct dma_async_tx_descriptor *stedma40_memcpy_sg(struct dma_chan *chan,
d40d->lli_phy.dst_addr,
d40c->dst_def_cfg,
d40c->dma_cfg.dst_info.data_width,
d40c->dma_cfg.dst_info.psize,
true);
d40c->dma_cfg.dst_info.psize);

if (res < 0)
goto err;
Expand Down Expand Up @@ -1913,7 +1909,6 @@ static int d40_prep_slave_sg_log(struct d40_desc *d40d,
d40c->dma_cfg.src_info.data_width,
d40c->dma_cfg.dst_info.data_width,
direction,
dma_flags & DMA_PREP_INTERRUPT,
dev_addr, d40d->lli_tx_len,
d40c->base->plat_data->llis_per_log);

Expand Down Expand Up @@ -1965,8 +1960,7 @@ static int d40_prep_slave_sg_phy(struct d40_desc *d40d,
d40d->lli_phy.src_addr,
d40c->src_def_cfg,
d40c->dma_cfg.src_info.data_width,
d40c->dma_cfg.src_info.psize,
true);
d40c->dma_cfg.src_info.psize);
if (res < 0)
return res;

Expand All @@ -1977,8 +1971,7 @@ static int d40_prep_slave_sg_phy(struct d40_desc *d40d,
d40d->lli_phy.dst_addr,
d40c->dst_def_cfg,
d40c->dma_cfg.dst_info.data_width,
d40c->dma_cfg.dst_info.psize,
true);
d40c->dma_cfg.dst_info.psize);
if (res < 0)
return res;

Expand Down
13 changes: 6 additions & 7 deletions drivers/dma/ste_dma40_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,7 @@ int d40_phy_sg_to_lli(struct scatterlist *sg,
dma_addr_t lli_phys,
u32 reg_cfg,
u32 data_width,
int psize,
bool term_int)
int psize)
{
int total_size = 0;
int i;
Expand Down Expand Up @@ -309,7 +308,7 @@ int d40_log_sg_to_dev(struct d40_lcla_elem *lcla,
u32 src_data_width,
u32 dst_data_width,
enum dma_data_direction direction,
bool term_int, dma_addr_t dev_addr, int max_len,
dma_addr_t dev_addr, int max_len,
int llis_per_log)
{
int total_size = 0;
Expand Down Expand Up @@ -356,7 +355,7 @@ int d40_log_sg_to_dev(struct d40_lcla_elem *lcla,
next_lli_off_dst,
lcsp->lcsp3, dst_data_width,
/* No next == terminal interrupt */
term_int && !next_lli_off_dst,
!next_lli_off_dst,
false);
} else {
d40_log_fill_lli(&lli->dst[i],
Expand All @@ -365,7 +364,7 @@ int d40_log_sg_to_dev(struct d40_lcla_elem *lcla,
next_lli_off_dst,
lcsp->lcsp3, dst_data_width,
/* No next == terminal interrupt */
term_int && !next_lli_off_dst,
!next_lli_off_dst,
true);
d40_log_fill_lli(&lli->src[i],
dev_addr,
Expand All @@ -385,7 +384,7 @@ int d40_log_sg_to_lli(int lcla_id,
struct d40_log_lli *lli_sg,
u32 lcsp13, /* src or dst*/
u32 data_width,
bool term_int, int max_len, int llis_per_log)
int max_len, int llis_per_log)
{
int total_size = 0;
struct scatterlist *current_sg = sg;
Expand Down Expand Up @@ -414,7 +413,7 @@ int d40_log_sg_to_lli(int lcla_id,
sg_dma_len(current_sg),
next_lli_off,
lcsp13, data_width,
term_int && !next_lli_off,
!next_lli_off,
true);
}
return total_size;
Expand Down
7 changes: 3 additions & 4 deletions drivers/dma/ste_dma40_ll.h
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,7 @@ int d40_phy_sg_to_lli(struct scatterlist *sg,
dma_addr_t lli_phys,
u32 reg_cfg,
u32 data_width,
int psize,
bool term_int);
int psize);

int d40_phy_fill_lli(struct d40_phy_lli *lli,
dma_addr_t data,
Expand Down Expand Up @@ -336,7 +335,7 @@ int d40_log_sg_to_dev(struct d40_lcla_elem *lcla,
u32 src_data_width,
u32 dst_data_width,
enum dma_data_direction direction,
bool term_int, dma_addr_t dev_addr, int max_len,
dma_addr_t dev_addr, int max_len,
int llis_per_log);

int d40_log_lli_write(struct d40_log_lli_full *lcpa,
Expand All @@ -352,6 +351,6 @@ int d40_log_sg_to_lli(int lcla_id,
struct d40_log_lli *lli_sg,
u32 lcsp13, /* src or dst*/
u32 data_width,
bool term_int, int max_len, int llis_per_log);
int max_len, int llis_per_log);

#endif /* STE_DMA40_LLI_H */

0 comments on commit 0246e77

Please sign in to comment.