Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207359
b: refs/heads/master
c: ef1872e
h: refs/heads/master
i:
  207357: 5cbfe29
  207355: 753eb6d
  207351: fa201ac
  207343: 160e575
  207327: 0506efc
  207295: ad42920
  207231: 4d730c3
  207103: 0160380
  206847: 29db891
v: v3
  • Loading branch information
Linus Walleij authored and Dan Williams committed Jun 23, 2010
1 parent 82844ff commit 361bb93
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 941b77a3b6946dd6223a029007f695aa841b6d34
refs/heads/master: ef1872ec652b3bc472d6c0995d0b64d5058878ea
64 changes: 32 additions & 32 deletions trunk/drivers/dma/ste_dma40.c
Original file line number Diff line number Diff line change
Expand Up @@ -1210,30 +1210,6 @@ static int d40_allocate_channel(struct d40_chan *d40c)

}

static int d40_config_chan(struct d40_chan *d40c,
struct stedma40_chan_cfg *info)
{

/* Fill in basic CFG register values */
d40_phy_cfg(&d40c->dma_cfg, &d40c->src_def_cfg,
&d40c->dst_def_cfg, d40c->log_num != D40_PHY_CHAN);

if (d40c->log_num != D40_PHY_CHAN) {
d40_log_cfg(&d40c->dma_cfg,
&d40c->log_def.lcsp1, &d40c->log_def.lcsp3);

if (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM)
d40c->lcpa = d40c->base->lcpa_base +
d40c->dma_cfg.src_dev_type * 32;
else
d40c->lcpa = d40c->base->lcpa_base +
d40c->dma_cfg.dst_dev_type * 32 + 16;
}

/* Write channel configuration to the DMA */
return d40_config_write(d40c);
}

static int d40_config_memcpy(struct d40_chan *d40c)
{
dma_cap_mask_t cap = d40c->chan.device->cap_mask;
Expand Down Expand Up @@ -1691,20 +1667,21 @@ static int d40_alloc_chan_resources(struct dma_chan *chan)
unsigned long flags;
struct d40_chan *d40c =
container_of(chan, struct d40_chan, chan);

bool is_free_phy;
spin_lock_irqsave(&d40c->lock, flags);

d40c->completed = chan->cookie = 1;

/*
* If no dma configuration is set (channel_type == 0)
* use default configuration
* use default configuration (memcpy)
*/
if (d40c->dma_cfg.channel_type == 0) {
err = d40_config_memcpy(d40c);
if (err)
goto err_alloc;
}
is_free_phy = (d40c->phy_chan == NULL);

err = d40_allocate_channel(d40c);
if (err) {
Expand All @@ -1713,12 +1690,35 @@ static int d40_alloc_chan_resources(struct dma_chan *chan)
goto err_alloc;
}

err = d40_config_chan(d40c, &d40c->dma_cfg);
if (err) {
dev_err(&d40c->chan.dev->device,
"[%s] Failed to configure channel\n",
__func__);
goto err_config;
/* Fill in basic CFG register values */
d40_phy_cfg(&d40c->dma_cfg, &d40c->src_def_cfg,
&d40c->dst_def_cfg, d40c->log_num != D40_PHY_CHAN);

if (d40c->log_num != D40_PHY_CHAN) {
d40_log_cfg(&d40c->dma_cfg,
&d40c->log_def.lcsp1, &d40c->log_def.lcsp3);

if (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM)
d40c->lcpa = d40c->base->lcpa_base +
d40c->dma_cfg.src_dev_type * D40_LCPA_CHAN_SIZE;
else
d40c->lcpa = d40c->base->lcpa_base +
d40c->dma_cfg.dst_dev_type *
D40_LCPA_CHAN_SIZE + D40_LCPA_CHAN_DST_DELTA;
}

/*
* Only write channel configuration to the DMA if the physical
* resource is free. In case of multiple logical channels
* on the same physical resource, only the first write is necessary.
*/
if (is_free_phy) {
err = d40_config_write(d40c);
if (err) {
dev_err(&d40c->chan.dev->device,
"[%s] Failed to configure channel\n",
__func__);
}
}

spin_unlock_irqrestore(&d40c->lock, flags);
Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/dma/ste_dma40_ll.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
#define D40_DREG_PCDELTA (8 * 4)
#define D40_LLI_ALIGN 16 /* LLI alignment must be 16 bytes. */

#define D40_LCPA_CHAN_SIZE 32
#define D40_LCPA_CHAN_DST_DELTA 16

#define D40_TYPE_TO_GROUP(type) (type / 16)
#define D40_TYPE_TO_EVENT(type) (type % 16)

Expand Down

0 comments on commit 361bb93

Please sign in to comment.