dmaengine: at_xdmac: introduce save_cc field
authorLudovic Desroches <ludovic.desroches@atmel.com>
Tue, 27 Jan 2015 15:30:30 +0000 (16:30 +0100)
committerVinod Koul <vinod.koul@intel.com>
Thu, 5 Feb 2015 07:12:28 +0000 (23:12 -0800)
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: Ludovic Desroches <ludovic.desroches@atmel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/at_xdmac.c

index ed8a576cee7bd8db56f3bcbf5943e7f2bfd3b9b7..8aebf183328455667b31dc1de4608181bcf1ddb3 100644 (file)
@@ -200,6 +200,7 @@ struct at_xdmac_chan {
        u8                              memif;          /* Memory Interface */
        u32                             per_src_addr;
        u32                             per_dst_addr;
+       u32                             save_cc;
        u32                             save_cim;
        u32                             save_cnda;
        u32                             save_cndc;
@@ -1276,6 +1277,7 @@ static int atmel_xdmac_suspend(struct device *dev)
        list_for_each_entry_safe(chan, _chan, &atxdmac->dma.channels, device_node) {
                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_paused(atchan))
                                at_xdmac_device_pause(chan);
@@ -1298,7 +1300,6 @@ static int atmel_xdmac_resume(struct device *dev)
        struct at_xdmac_chan    *atchan;
        struct dma_chan         *chan, *_chan;
        int                     i;
-       u32                     cfg;
 
        clk_prepare_enable(atxdmac->clk);
 
@@ -1313,8 +1314,7 @@ static int atmel_xdmac_resume(struct device *dev)
        at_xdmac_write(atxdmac, AT_XDMAC_GE, atxdmac->save_gs);
        list_for_each_entry_safe(chan, _chan, &atxdmac->dma.channels, device_node) {
                atchan = to_at_xdmac_chan(chan);
-               cfg = atchan->cfg[AT_XDMAC_CUR_CFG];
-               at_xdmac_chan_write(atchan, AT_XDMAC_CC, cfg);
+               at_xdmac_chan_write(atchan, AT_XDMAC_CC, atchan->save_cc);
                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_CNDC, atchan->save_cndc);