Pull button into test branch
[linux-drm-fsl-dcu.git] / arch / powerpc / mm / imalloc.c
index f4ca29cf53649b6c35941b1c942c9cecac7c6439..c831815c31f0e5a1c572e19a5a3c706721ee8b9a 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
-#include <asm/semaphore.h>
-#include <asm/imalloc.h>
+#include <linux/mutex.h>
 #include <asm/cacheflush.h>
 
-static DECLARE_MUTEX(imlist_sem);
+#include "mmu_decl.h"
+
+static DEFINE_MUTEX(imlist_mutex);
 struct vm_struct * imlist = NULL;
 
 static int get_free_im_addr(unsigned long size, unsigned long *im_addr)
@@ -106,6 +107,7 @@ static int im_region_status(unsigned long v_addr, unsigned long size,
                if (v_addr < (unsigned long) tmp->addr + tmp->size)
                        break;
 
+       *vm = NULL;
        if (tmp) {
                if (im_region_overlaps(v_addr, size, tmp))
                        return IM_REGION_OVERLAP;
@@ -126,7 +128,6 @@ static int im_region_status(unsigned long v_addr, unsigned long size,
                }
        }
 
-       *vm = NULL;
        return IM_REGION_UNUSED;
 }
 
@@ -137,7 +138,7 @@ static struct vm_struct * split_im_region(unsigned long v_addr,
        struct vm_struct *vm2 = NULL;
        struct vm_struct *new_vm = NULL;
        
-       vm1 = (struct vm_struct *) kmalloc(sizeof(*vm1), GFP_KERNEL);
+       vm1 = kmalloc(sizeof(*vm1), GFP_KERNEL);
        if (vm1 == NULL) {
                printk(KERN_ERR "%s() out of memory\n", __FUNCTION__);
                return NULL;
@@ -171,7 +172,7 @@ static struct vm_struct * split_im_region(unsigned long v_addr,
                 * uppermost remainder, and use existing parent one for the
                 * lower remainder of parent range
                 */
-               vm2 = (struct vm_struct *) kmalloc(sizeof(*vm2), GFP_KERNEL);
+               vm2 = kmalloc(sizeof(*vm2), GFP_KERNEL);
                if (vm2 == NULL) {
                        printk(KERN_ERR "%s() out of memory\n", __FUNCTION__);
                        kfree(vm1);
@@ -205,7 +206,7 @@ static struct vm_struct * __add_new_im_area(unsigned long req_addr,
                        break;
        }
        
-       area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
+       area = kmalloc(sizeof(*area), GFP_KERNEL);
        if (!area)
                return NULL;
        area->flags = 0;
@@ -256,7 +257,7 @@ struct vm_struct * im_get_free_area(unsigned long size)
        struct vm_struct *area;
        unsigned long addr;
        
-       down(&imlist_sem);
+       mutex_lock(&imlist_mutex);
        if (get_free_im_addr(size, &addr)) {
                printk(KERN_ERR "%s() cannot obtain addr for size 0x%lx\n",
                                __FUNCTION__, size);
@@ -271,7 +272,7 @@ struct vm_struct * im_get_free_area(unsigned long size)
                        __FUNCTION__, addr, size);
        }
 next_im_done:
-       up(&imlist_sem);
+       mutex_unlock(&imlist_mutex);
        return area;
 }
 
@@ -280,9 +281,9 @@ struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size,
 {
        struct vm_struct *area;
 
-       down(&imlist_sem);
+       mutex_lock(&imlist_mutex);
        area = __im_get_area(v_addr, size, criteria);
-       up(&imlist_sem);
+       mutex_unlock(&imlist_mutex);
        return area;
 }
 
@@ -296,17 +297,17 @@ void im_free(void * addr)
                printk(KERN_ERR "Trying to %s bad address (%p)\n", __FUNCTION__,                        addr);
                return;
        }
-       down(&imlist_sem);
+       mutex_lock(&imlist_mutex);
        for (p = &imlist ; (tmp = *p) ; p = &tmp->next) {
                if (tmp->addr == addr) {
                        *p = tmp->next;
                        unmap_vm_area(tmp);
                        kfree(tmp);
-                       up(&imlist_sem);
+                       mutex_unlock(&imlist_mutex);
                        return;
                }
        }
-       up(&imlist_sem);
+       mutex_unlock(&imlist_mutex);
        printk(KERN_ERR "Trying to %s nonexistent area (%p)\n", __FUNCTION__,
                        addr);
 }