diff options
author | Nicolas Ferre <nicolas.ferre@microchip.com> | 2019-04-03 06:23:59 -0400 |
---|---|---|
committer | Vinod Koul <vkoul@kernel.org> | 2019-04-23 01:08:56 -0400 |
commit | 38a829a389e33d571a3c599fa762d88b3d1f72c4 (patch) | |
tree | 8eb5385f7490a6322454b6c4ffaa564a6cd2a071 | |
parent | 223a4f4cfe93de2fce47a8f1f719cf4d0da4e3e6 (diff) |
dmaengine: at_xdmac: only monitor overflow errors for peripheral xfer
The overflow error flag (ROI: Request Overflow Error) is only relevant
for the case when the channel handles a peripheral synchronized transfer.
Not in the case of memory to memory transfer where there is no hardware
request signal.
Remove the use of this interrupt source in such a case. It's based on
the first descriptor which holds the configuration for the whole
linked list transfer.
Signed-off-by: Nicolas Ferre <nicolas.ferre@microchip.com>
Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
-rw-r--r-- | drivers/dma/at_xdmac.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c index 1dd7edaefbdc..06cbe54e4c30 100644 --- a/drivers/dma/at_xdmac.c +++ b/drivers/dma/at_xdmac.c | |||
@@ -308,6 +308,11 @@ static inline int at_xdmac_csize(u32 maxburst) | |||
308 | return csize; | 308 | return csize; |
309 | }; | 309 | }; |
310 | 310 | ||
311 | static inline bool at_xdmac_chan_is_peripheral_xfer(u32 cfg) | ||
312 | { | ||
313 | return cfg & AT_XDMAC_CC_TYPE_PER_TRAN; | ||
314 | } | ||
315 | |||
311 | static inline u8 at_xdmac_get_dwidth(u32 cfg) | 316 | static inline u8 at_xdmac_get_dwidth(u32 cfg) |
312 | { | 317 | { |
313 | return (cfg & AT_XDMAC_CC_DWIDTH_MASK) >> AT_XDMAC_CC_DWIDTH_OFFSET; | 318 | return (cfg & AT_XDMAC_CC_DWIDTH_MASK) >> AT_XDMAC_CC_DWIDTH_OFFSET; |
@@ -389,7 +394,13 @@ static void at_xdmac_start_xfer(struct at_xdmac_chan *atchan, | |||
389 | at_xdmac_chan_read(atchan, AT_XDMAC_CUBC)); | 394 | at_xdmac_chan_read(atchan, AT_XDMAC_CUBC)); |
390 | 395 | ||
391 | at_xdmac_chan_write(atchan, AT_XDMAC_CID, 0xffffffff); | 396 | at_xdmac_chan_write(atchan, AT_XDMAC_CID, 0xffffffff); |
392 | reg = AT_XDMAC_CIE_RBEIE | AT_XDMAC_CIE_WBEIE | AT_XDMAC_CIE_ROIE; | 397 | reg = AT_XDMAC_CIE_RBEIE | AT_XDMAC_CIE_WBEIE; |
398 | /* | ||
399 | * Request Overflow Error is only for peripheral synchronized transfers | ||
400 | */ | ||
401 | if (at_xdmac_chan_is_peripheral_xfer(first->lld.mbr_cfg)) | ||
402 | reg |= AT_XDMAC_CIE_ROIE; | ||
403 | |||
393 | /* | 404 | /* |
394 | * There is no end of list when doing cyclic dma, we need to get | 405 | * There is no end of list when doing cyclic dma, we need to get |
395 | * an interrupt after each periods. | 406 | * an interrupt after each periods. |