blackfin: use bitmap library functions
[~shefty/rdma-dev.git] / arch / blackfin / kernel / dma-mapping.c
index e7be6532d6a04f00cf7d6d1de5d035e4f3b565a9..df437e52d9df20b9f3369d12a2939a9277687c0d 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/scatterlist.h>
 #include <linux/export.h>
+#include <linux/bitmap.h>
 
 static spinlock_t dma_page_lock;
 static unsigned long *dma_page;
@@ -46,24 +47,17 @@ static inline unsigned int get_pages(size_t size)
 static unsigned long __alloc_dma_pages(unsigned int pages)
 {
        unsigned long ret = 0, flags;
-       int i, count = 0;
+       unsigned long start;
 
        if (dma_initialized == 0)
                dma_alloc_init(_ramend - DMA_UNCACHED_REGION, _ramend);
 
        spin_lock_irqsave(&dma_page_lock, flags);
 
-       for (i = 0; i < dma_pages;) {
-               if (test_bit(i++, dma_page) == 0) {
-                       if (++count == pages) {
-                               while (count--)
-                                       __set_bit(--i, dma_page);
-
-                               ret = dma_base + (i << PAGE_SHIFT);
-                               break;
-                       }
-               } else
-                       count = 0;
+       start = bitmap_find_next_zero_area(dma_page, dma_pages, 0, pages, 0);
+       if (start < dma_pages) {
+               ret = dma_base + (start << PAGE_SHIFT);
+               bitmap_set(dma_page, start, pages);
        }
        spin_unlock_irqrestore(&dma_page_lock, flags);
        return ret;
@@ -73,7 +67,6 @@ static void __free_dma_pages(unsigned long addr, unsigned int pages)
 {
        unsigned long page = (addr - dma_base) >> PAGE_SHIFT;
        unsigned long flags;
-       int i;
 
        if ((page + pages) > dma_pages) {
                printk(KERN_ERR "%s: freeing outside range.\n", __func__);
@@ -81,9 +74,7 @@ static void __free_dma_pages(unsigned long addr, unsigned int pages)
        }
 
        spin_lock_irqsave(&dma_page_lock, flags);
-       for (i = page; i < page + pages; i++)
-               __clear_bit(i, dma_page);
-
+       bitmap_clear(dma_page, page, pages);
        spin_unlock_irqrestore(&dma_page_lock, flags);
 }