return 0;
 }
 
-static const struct file_operations omapdriver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .unlocked_ioctl = drm_ioctl,
-       .compat_ioctl = drm_compat_ioctl,
-       .release = drm_release,
-       .mmap = omap_gem_mmap,
-       .poll = drm_poll,
-       .read = drm_read,
-       .llseek = noop_llseek,
-};
+DEFINE_DRM_GEM_FOPS(omapdriver_fops);
 
 static const struct drm_driver omap_drm_driver = {
        .driver_features = DRIVER_MODESET | DRIVER_GEM  |
 
        return ret;
 }
 
-/** We override mainly to fix up some of the vm mapping flags.. */
-int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma)
-{
-       int ret;
-
-       ret = drm_gem_mmap(filp, vma);
-       if (ret) {
-               DBG("mmap failed: %d", ret);
-               return ret;
-       }
-
-       return omap_gem_mmap_obj(vma->vm_private_data, vma);
-}
-
-int omap_gem_mmap_obj(struct drm_gem_object *obj,
-               struct vm_area_struct *vma)
+static int omap_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 {
        struct omap_gem_object *omap_obj = to_omap_bo(obj);
 
-       vm_flags_mod(vma, VM_MIXEDMAP, VM_PFNMAP);
+       vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP | VM_IO | VM_MIXEDMAP);
 
        if (omap_obj->flags & OMAP_BO_WC) {
                vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
                 * address_space (so unmap_mapping_range does what we want,
                 * in particular in the case of mmap'd dmabufs)
                 */
-               vma->vm_pgoff = 0;
+               vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
                vma_set_file(vma, obj->filp);
 
                vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
        }
 
+       vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
+
        return 0;
 }
 
 static const struct drm_gem_object_funcs omap_gem_object_funcs = {
        .free = omap_gem_free_object,
        .export = omap_gem_prime_export,
+       .mmap = omap_gem_object_mmap,
        .vm_ops = &omap_gem_vm_ops,
 };
 
 
                struct drm_mode_create_dumb *args);
 
 /* mmap() Interface */
-int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma);
-int omap_gem_mmap_obj(struct drm_gem_object *obj,
-               struct vm_area_struct *vma);
 u64 omap_gem_mmap_offset(struct drm_gem_object *obj);
 size_t omap_gem_mmap_size(struct drm_gem_object *obj);
 
 
                struct vm_area_struct *vma)
 {
        struct drm_gem_object *obj = buffer->priv;
-       int ret = 0;
 
-       ret = drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma);
-       if (ret < 0)
-               return ret;
-
-       return omap_gem_mmap_obj(obj, vma);
+       return drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma);
 }
 
 static const struct dma_buf_ops omap_dmabuf_ops = {