dw_dmac: remove unnecessary tx_list field in dw_dma_chan
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 25 Jan 2013 09:48:00 +0000 (11:48 +0200)
committerVinod Koul <vinod.koul@intel.com>
Mon, 28 Jan 2013 12:04:32 +0000 (04:04 -0800)
The soft LLP mode is working for active descriptor only. So, we do not need to
have a copy of its pointer.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/dw_dmac.c
drivers/dma/dw_dmac_regs.h

index ddd3ad2a96a3d66035558f4324b5edbc43196d61..721beafe8f7a59a335e5caf671a98179eb3d4462 100644 (file)
@@ -282,9 +282,9 @@ static void dwc_dostart(struct dw_dma_chan *dwc, struct dw_desc *first)
 
                dwc_initialize(dwc);
 
-               dwc->tx_list = &first->tx_list;
                dwc->tx_node_active = &first->tx_list;
 
+               /* Submit first block */
                dwc_do_single_block(dwc, first);
 
                return;
@@ -402,15 +402,25 @@ static void dwc_scan_descriptors(struct dw_dma *dw, struct dw_dma_chan *dwc)
                dma_writel(dw, CLEAR.XFER, dwc->mask);
 
                if (test_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags)) {
-                       if (dwc->tx_node_active != dwc->tx_list) {
-                               desc = to_dw_desc(dwc->tx_node_active);
+                       struct list_head *head, *active = dwc->tx_node_active;
+
+                       /*
+                        * We are inside first active descriptor.
+                        * Otherwise something is really wrong.
+                        */
+                       desc = dwc_first_active(dwc);
+
+                       head = &desc->tx_list;
+                       if (active != head) {
+                               child = to_dw_desc(active);
 
                                /* Submit next block */
-                               dwc_do_single_block(dwc, desc);
-                               spin_unlock_irqrestore(&dwc->lock, flags);
+                               dwc_do_single_block(dwc, child);
 
+                               spin_unlock_irqrestore(&dwc->lock, flags);
                                return;
                        }
+
                        /* We are done here */
                        clear_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags);
                }
index fef296de4af10484351565e95b561ef30fffd1d4..13000d2b335263cd08c7e06c8930915a169da53a 100644 (file)
@@ -194,7 +194,6 @@ struct dw_dma_chan {
        bool                            initialized;
 
        /* software emulation of the LLP transfers */
-       struct list_head        *tx_list;
        struct list_head        *tx_node_active;
 
        spinlock_t              lock;