Commit 734bb9a7 authored by Ludovic Desroches's avatar Ludovic Desroches Committed by Vinod Koul

dmaengine: at_xdmac: introduce save_cc field

When suspending the device, read the channel configuration directly from
the register instead of relying on a software snapshot, it will be
safer.
Signed-off-by: default avatarLudovic Desroches <ludovic.desroches@atmel.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent cbb85e67
...@@ -200,6 +200,7 @@ struct at_xdmac_chan { ...@@ -200,6 +200,7 @@ struct at_xdmac_chan {
u8 memif; /* Memory Interface */ u8 memif; /* Memory Interface */
u32 per_src_addr; u32 per_src_addr;
u32 per_dst_addr; u32 per_dst_addr;
u32 save_cc;
u32 save_cim; u32 save_cim;
u32 save_cnda; u32 save_cnda;
u32 save_cndc; u32 save_cndc;
...@@ -1276,6 +1277,7 @@ static int atmel_xdmac_suspend(struct device *dev) ...@@ -1276,6 +1277,7 @@ static int atmel_xdmac_suspend(struct device *dev)
list_for_each_entry_safe(chan, _chan, &atxdmac->dma.channels, device_node) { list_for_each_entry_safe(chan, _chan, &atxdmac->dma.channels, device_node) {
struct at_xdmac_chan *atchan = to_at_xdmac_chan(chan); struct at_xdmac_chan *atchan = to_at_xdmac_chan(chan);
atchan->save_cc = at_xdmac_chan_read(atchan, AT_XDMAC_CC);
if (at_xdmac_chan_is_cyclic(atchan)) { if (at_xdmac_chan_is_cyclic(atchan)) {
if (!at_xdmac_chan_is_paused(atchan)) if (!at_xdmac_chan_is_paused(atchan))
at_xdmac_device_pause(chan); at_xdmac_device_pause(chan);
...@@ -1298,7 +1300,6 @@ static int atmel_xdmac_resume(struct device *dev) ...@@ -1298,7 +1300,6 @@ static int atmel_xdmac_resume(struct device *dev)
struct at_xdmac_chan *atchan; struct at_xdmac_chan *atchan;
struct dma_chan *chan, *_chan; struct dma_chan *chan, *_chan;
int i; int i;
u32 cfg;
clk_prepare_enable(atxdmac->clk); clk_prepare_enable(atxdmac->clk);
...@@ -1313,8 +1314,7 @@ static int atmel_xdmac_resume(struct device *dev) ...@@ -1313,8 +1314,7 @@ static int atmel_xdmac_resume(struct device *dev)
at_xdmac_write(atxdmac, AT_XDMAC_GE, atxdmac->save_gs); at_xdmac_write(atxdmac, AT_XDMAC_GE, atxdmac->save_gs);
list_for_each_entry_safe(chan, _chan, &atxdmac->dma.channels, device_node) { list_for_each_entry_safe(chan, _chan, &atxdmac->dma.channels, device_node) {
atchan = to_at_xdmac_chan(chan); atchan = to_at_xdmac_chan(chan);
cfg = atchan->cfg[AT_XDMAC_CUR_CFG]; at_xdmac_chan_write(atchan, AT_XDMAC_CC, atchan->save_cc);
at_xdmac_chan_write(atchan, AT_XDMAC_CC, cfg);
if (at_xdmac_chan_is_cyclic(atchan)) { if (at_xdmac_chan_is_cyclic(atchan)) {
at_xdmac_chan_write(atchan, AT_XDMAC_CNDA, atchan->save_cnda); at_xdmac_chan_write(atchan, AT_XDMAC_CNDA, atchan->save_cnda);
at_xdmac_chan_write(atchan, AT_XDMAC_CNDC, atchan->save_cndc); at_xdmac_chan_write(atchan, AT_XDMAC_CNDC, atchan->save_cndc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment