Merge branch 'akpm' (patches from Andrew)
[linux-drm-fsl-dcu.git] / drivers / gpu / drm / gma500 / framebuffer.c
index 2eaf1b31c7bd8c76d8d69d60a0dd43343466e9ec..cb95765050cc0aade141941dfde9e77993373179 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/string.h>
+#include <linux/pfn_t.h>
 #include <linux/mm.h>
 #include <linux/tty.h>
 #include <linux/slab.h>
@@ -132,7 +133,8 @@ static int psbfb_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        for (i = 0; i < page_num; i++) {
                pfn = (phys_addr >> PAGE_SHIFT);
 
-               ret = vm_insert_mixed(vma, address, pfn);
+               ret = vm_insert_mixed(vma, address,
+                               __pfn_to_pfn_t(pfn, PFN_DEV));
                if (unlikely((ret == -EBUSY) || (ret != 0 && i > 0)))
                        break;
                else if (unlikely(ret != 0)) {
@@ -241,7 +243,7 @@ static struct fb_ops psbfb_unaccel_ops = {
  */
 static int psb_framebuffer_init(struct drm_device *dev,
                                        struct psb_framebuffer *fb,
-                                       struct drm_mode_fb_cmd2 *mode_cmd,
+                                       const struct drm_mode_fb_cmd2 *mode_cmd,
                                        struct gtt_range *gt)
 {
        u32 bpp, depth;
@@ -284,7 +286,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
 
 static struct drm_framebuffer *psb_framebuffer_create
                        (struct drm_device *dev,
-                        struct drm_mode_fb_cmd2 *mode_cmd,
+                        const struct drm_mode_fb_cmd2 *mode_cmd,
                         struct gtt_range *gt)
 {
        struct psb_framebuffer *fb;
@@ -406,8 +408,6 @@ static int psbfb_create(struct psb_fbdev *fbdev,
 
        memset(dev_priv->vram_addr + backing->offset, 0, size);
 
-       mutex_lock(&dev->struct_mutex);
-
        info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper);
        if (IS_ERR(info)) {
                ret = PTR_ERR(info);
@@ -463,17 +463,15 @@ static int psbfb_create(struct psb_fbdev *fbdev,
        dev_dbg(dev->dev, "allocated %dx%d fb\n",
                                        psbfb->base.width, psbfb->base.height);
 
-       mutex_unlock(&dev->struct_mutex);
        return 0;
 out_unref:
        if (backing->stolen)
                psb_gtt_free_range(dev, backing);
        else
-               drm_gem_object_unreference(&backing->gem);
+               drm_gem_object_unreference_unlocked(&backing->gem);
 
        drm_fb_helper_release_fbi(&fbdev->psb_fb_helper);
 out_err1:
-       mutex_unlock(&dev->struct_mutex);
        psb_gtt_free_range(dev, backing);
        return ret;
 }
@@ -488,7 +486,7 @@ out_err1:
  */
 static struct drm_framebuffer *psb_user_framebuffer_create
                        (struct drm_device *dev, struct drm_file *filp,
-                        struct drm_mode_fb_cmd2 *cmd)
+                        const struct drm_mode_fb_cmd2 *cmd)
 {
        struct gtt_range *r;
        struct drm_gem_object *obj;
@@ -569,7 +567,7 @@ static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev)
        drm_framebuffer_cleanup(&psbfb->base);
 
        if (psbfb->gtt)
-               drm_gem_object_unreference(&psbfb->gtt->gem);
+               drm_gem_object_unreference_unlocked(&psbfb->gtt->gem);
        return 0;
 }
 
@@ -784,12 +782,8 @@ void psb_modeset_cleanup(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv = dev->dev_private;
        if (dev_priv->modeset) {
-               mutex_lock(&dev->struct_mutex);
-
                drm_kms_helper_poll_fini(dev);
                psb_fbdev_fini(dev);
                drm_mode_config_cleanup(dev);
-
-               mutex_unlock(&dev->struct_mutex);
        }
 }