diff options
Diffstat (limited to 'drivers/dma/at_xdmac.c')
-rw-r--r-- | drivers/dma/at_xdmac.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c index cf1213de7865..40afa2a16cfc 100644 --- a/drivers/dma/at_xdmac.c +++ b/drivers/dma/at_xdmac.c | |||
@@ -359,18 +359,19 @@ static void at_xdmac_start_xfer(struct at_xdmac_chan *atchan, | |||
359 | * descriptor view 2 since some fields of the configuration register | 359 | * descriptor view 2 since some fields of the configuration register |
360 | * depend on transfer size and src/dest addresses. | 360 | * depend on transfer size and src/dest addresses. |
361 | */ | 361 | */ |
362 | if (at_xdmac_chan_is_cyclic(atchan)) { | 362 | if (at_xdmac_chan_is_cyclic(atchan)) |
363 | reg = AT_XDMAC_CNDC_NDVIEW_NDV1; | 363 | reg = AT_XDMAC_CNDC_NDVIEW_NDV1; |
364 | at_xdmac_chan_write(atchan, AT_XDMAC_CC, first->lld.mbr_cfg); | 364 | else if (first->lld.mbr_ubc & AT_XDMAC_MBR_UBC_NDV3) |
365 | } else if (first->lld.mbr_ubc & AT_XDMAC_MBR_UBC_NDV3) { | ||
366 | reg = AT_XDMAC_CNDC_NDVIEW_NDV3; | 365 | reg = AT_XDMAC_CNDC_NDVIEW_NDV3; |
367 | } else { | 366 | else |
368 | /* | ||
369 | * No need to write AT_XDMAC_CC reg, it will be done when the | ||
370 | * descriptor is fecthed. | ||
371 | */ | ||
372 | reg = AT_XDMAC_CNDC_NDVIEW_NDV2; | 367 | reg = AT_XDMAC_CNDC_NDVIEW_NDV2; |
373 | } | 368 | /* |
369 | * Even if the register will be updated from the configuration in the | ||
370 | * descriptor when using view 2 or higher, the PROT bit won't be set | ||
371 | * properly. This bit can be modified only by using the channel | ||
372 | * configuration register. | ||
373 | */ | ||
374 | at_xdmac_chan_write(atchan, AT_XDMAC_CC, first->lld.mbr_cfg); | ||
374 | 375 | ||
375 | reg |= AT_XDMAC_CNDC_NDDUP | 376 | reg |= AT_XDMAC_CNDC_NDDUP |
376 | | AT_XDMAC_CNDC_NDSUP | 377 | | AT_XDMAC_CNDC_NDSUP |
@@ -681,15 +682,16 @@ at_xdmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
681 | desc->lld.mbr_sa = mem; | 682 | desc->lld.mbr_sa = mem; |
682 | desc->lld.mbr_da = atchan->sconfig.dst_addr; | 683 | desc->lld.mbr_da = atchan->sconfig.dst_addr; |
683 | } | 684 | } |
684 | desc->lld.mbr_cfg = atchan->cfg; | 685 | dwidth = at_xdmac_get_dwidth(atchan->cfg); |
685 | dwidth = at_xdmac_get_dwidth(desc->lld.mbr_cfg); | ||
686 | fixed_dwidth = IS_ALIGNED(len, 1 << dwidth) | 686 | fixed_dwidth = IS_ALIGNED(len, 1 << dwidth) |
687 | ? at_xdmac_get_dwidth(desc->lld.mbr_cfg) | 687 | ? dwidth |
688 | : AT_XDMAC_CC_DWIDTH_BYTE; | 688 | : AT_XDMAC_CC_DWIDTH_BYTE; |
689 | desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV2 /* next descriptor view */ | 689 | desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV2 /* next descriptor view */ |
690 | | AT_XDMAC_MBR_UBC_NDEN /* next descriptor dst parameter update */ | 690 | | AT_XDMAC_MBR_UBC_NDEN /* next descriptor dst parameter update */ |
691 | | AT_XDMAC_MBR_UBC_NSEN /* next descriptor src parameter update */ | 691 | | AT_XDMAC_MBR_UBC_NSEN /* next descriptor src parameter update */ |
692 | | (len >> fixed_dwidth); /* microblock length */ | 692 | | (len >> fixed_dwidth); /* microblock length */ |
693 | desc->lld.mbr_cfg = (atchan->cfg & ~AT_XDMAC_CC_DWIDTH_MASK) | | ||
694 | AT_XDMAC_CC_DWIDTH(fixed_dwidth); | ||
693 | dev_dbg(chan2dev(chan), | 695 | dev_dbg(chan2dev(chan), |
694 | "%s: lld: mbr_sa=%pad, mbr_da=%pad, mbr_ubc=0x%08x\n", | 696 | "%s: lld: mbr_sa=%pad, mbr_da=%pad, mbr_ubc=0x%08x\n", |
695 | __func__, &desc->lld.mbr_sa, &desc->lld.mbr_da, desc->lld.mbr_ubc); | 697 | __func__, &desc->lld.mbr_sa, &desc->lld.mbr_da, desc->lld.mbr_ubc); |