Blackfin arch: dma add some API and cleanup bf54x DMA definition
[powerpc.git] / arch / blackfin / kernel / bfin_dma_5xx.c
index 858cca6..503eef4 100644 (file)
@@ -420,6 +420,32 @@ unsigned short get_dma_curr_ycount(unsigned int channel)
 }
 EXPORT_SYMBOL(get_dma_curr_ycount);
 
+unsigned long get_dma_next_desc_ptr(unsigned int channel)
+{
+       BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
+             && channel < MAX_BLACKFIN_DMA_CHANNEL));
+
+       return dma_ch[channel].regs->next_desc_ptr;
+}
+EXPORT_SYMBOL(get_dma_next_desc_ptr);
+
+unsigned long get_dma_curr_desc_ptr(unsigned int channel)
+{
+       BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
+             && channel < MAX_BLACKFIN_DMA_CHANNEL));
+
+       return dma_ch[channel].regs->curr_desc_ptr;
+}
+
+unsigned long get_dma_curr_addr(unsigned int channel)
+{
+       BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
+             && channel < MAX_BLACKFIN_DMA_CHANNEL));
+
+       return dma_ch[channel].regs->curr_addr_ptr;
+}
+EXPORT_SYMBOL(get_dma_curr_addr);
+
 static void *__dma_memcpy(void *dest, const void *src, size_t size)
 {
        int direction;  /* 1 - address decrease, 0 - address increase */
@@ -436,6 +462,10 @@ static void *__dma_memcpy(void *dest, const void *src, size_t size)
                blackfin_dcache_flush_range((unsigned int)src,
                                            (unsigned int)(src + size));
 
+       if ((unsigned long)dest < memory_end)
+               blackfin_dcache_invalidate_range((unsigned int)dest,
+                                                (unsigned int)(dest + size));
+
        bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR);
 
        if ((unsigned long)src < (unsigned long)dest)
@@ -543,6 +573,8 @@ static void *__dma_memcpy(void *dest, const void *src, size_t size)
                }
        }
 
+       SSYNC();
+
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE))
                ;
 
@@ -552,9 +584,6 @@ static void *__dma_memcpy(void *dest, const void *src, size_t size)
        bfin_write_MDMA_S0_CONFIG(0);
        bfin_write_MDMA_D0_CONFIG(0);
 
-       if ((unsigned long)dest < memory_end)
-               blackfin_dcache_invalidate_range((unsigned int)dest,
-                                                (unsigned int)(dest + size));
        local_irq_restore(flags);
 
        return dest;
@@ -583,13 +612,14 @@ void *safe_dma_memcpy(void *dest, const void *src, size_t size)
 }
 EXPORT_SYMBOL(safe_dma_memcpy);
 
-void dma_outsb(const void __iomem *addr, const void *buf, unsigned short len)
+void dma_outsb(unsigned long addr, const void *buf, unsigned short len)
 {
        unsigned long flags;
 
        local_irq_save(flags);
 
-       blackfin_dcache_flush_range((unsigned int)buf, (unsigned int)(buf) + len);
+       blackfin_dcache_flush_range((unsigned int)buf,
+                        (unsigned int)(buf) + len);
 
        bfin_write_MDMA_D0_START_ADDR(addr);
        bfin_write_MDMA_D0_X_COUNT(len);
@@ -604,6 +634,8 @@ void dma_outsb(const void __iomem *addr, const void *buf, unsigned short len)
        bfin_write_MDMA_S0_CONFIG(DMAEN | WDSIZE_8);
        bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | WDSIZE_8);
 
+       SSYNC();
+
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE));
 
        bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR);
@@ -616,10 +648,13 @@ void dma_outsb(const void __iomem *addr, const void *buf, unsigned short len)
 EXPORT_SYMBOL(dma_outsb);
 
 
-void dma_insb(const void __iomem *addr, void *buf, unsigned short len)
+void dma_insb(unsigned long addr, void *buf, unsigned short len)
 {
        unsigned long flags;
 
+       blackfin_dcache_invalidate_range((unsigned int)buf,
+                        (unsigned int)(buf) + len);
+
        local_irq_save(flags);
        bfin_write_MDMA_D0_START_ADDR(buf);
        bfin_write_MDMA_D0_X_COUNT(len);
@@ -634,7 +669,7 @@ void dma_insb(const void __iomem *addr, void *buf, unsigned short len)
        bfin_write_MDMA_S0_CONFIG(DMAEN | WDSIZE_8);
        bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | WDSIZE_8);
 
-       blackfin_dcache_invalidate_range((unsigned int)buf, (unsigned int)(buf) + len);
+       SSYNC();
 
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE));
 
@@ -647,13 +682,14 @@ void dma_insb(const void __iomem *addr, void *buf, unsigned short len)
 }
 EXPORT_SYMBOL(dma_insb);
 
-void dma_outsw(const void __iomem *addr, const void  *buf, unsigned short len)
+void dma_outsw(unsigned long addr, const void  *buf, unsigned short len)
 {
        unsigned long flags;
 
        local_irq_save(flags);
 
-       blackfin_dcache_flush_range((unsigned int)buf, (unsigned int)(buf) + len);
+       blackfin_dcache_flush_range((unsigned int)buf,
+                        (unsigned int)(buf) + len * sizeof(short));
 
        bfin_write_MDMA_D0_START_ADDR(addr);
        bfin_write_MDMA_D0_X_COUNT(len);
@@ -668,6 +704,8 @@ void dma_outsw(const void __iomem *addr, const void  *buf, unsigned short len)
        bfin_write_MDMA_S0_CONFIG(DMAEN | WDSIZE_16);
        bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | WDSIZE_16);
 
+       SSYNC();
+
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE));
 
        bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR);
@@ -679,10 +717,13 @@ void dma_outsw(const void __iomem *addr, const void  *buf, unsigned short len)
 }
 EXPORT_SYMBOL(dma_outsw);
 
-void dma_insw(const void __iomem *addr, void *buf, unsigned short len)
+void dma_insw(unsigned long addr, void *buf, unsigned short len)
 {
        unsigned long flags;
 
+       blackfin_dcache_invalidate_range((unsigned int)buf,
+                        (unsigned int)(buf) + len * sizeof(short));
+
        local_irq_save(flags);
 
        bfin_write_MDMA_D0_START_ADDR(buf);
@@ -698,7 +739,7 @@ void dma_insw(const void __iomem *addr, void *buf, unsigned short len)
        bfin_write_MDMA_S0_CONFIG(DMAEN | WDSIZE_16);
        bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | WDSIZE_16);
 
-       blackfin_dcache_invalidate_range((unsigned int)buf, (unsigned int)(buf) + len);
+       SSYNC();
 
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE));
 
@@ -711,13 +752,14 @@ void dma_insw(const void __iomem *addr, void *buf, unsigned short len)
 }
 EXPORT_SYMBOL(dma_insw);
 
-void dma_outsl(const void __iomem *addr, const void *buf, unsigned short len)
+void dma_outsl(unsigned long addr, const void *buf, unsigned short len)
 {
        unsigned long flags;
 
        local_irq_save(flags);
 
-       blackfin_dcache_flush_range((unsigned int)buf, (unsigned int)(buf) + len);
+       blackfin_dcache_flush_range((unsigned int)buf,
+                        (unsigned int)(buf) + len * sizeof(long));
 
        bfin_write_MDMA_D0_START_ADDR(addr);
        bfin_write_MDMA_D0_X_COUNT(len);
@@ -732,6 +774,8 @@ void dma_outsl(const void __iomem *addr, const void *buf, unsigned short len)
        bfin_write_MDMA_S0_CONFIG(DMAEN | WDSIZE_32);
        bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | WDSIZE_32);
 
+       SSYNC();
+
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE));
 
        bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR);
@@ -743,10 +787,13 @@ void dma_outsl(const void __iomem *addr, const void *buf, unsigned short len)
 }
 EXPORT_SYMBOL(dma_outsl);
 
-void dma_insl(const void __iomem *addr, void *buf, unsigned short len)
+void dma_insl(unsigned long addr, void *buf, unsigned short len)
 {
        unsigned long flags;
 
+       blackfin_dcache_invalidate_range((unsigned int)buf,
+                        (unsigned int)(buf) + len * sizeof(long));
+
        local_irq_save(flags);
 
        bfin_write_MDMA_D0_START_ADDR(buf);
@@ -762,7 +809,7 @@ void dma_insl(const void __iomem *addr, void *buf, unsigned short len)
        bfin_write_MDMA_S0_CONFIG(DMAEN | WDSIZE_32);
        bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | WDSIZE_32);
 
-       blackfin_dcache_invalidate_range((unsigned int)buf, (unsigned int)(buf) + len);
+       SSYNC();
 
        while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE));