Merge tag 'driver-core-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / uio / uio.c
index 170a178d661ad491c4161e9499606003af7d7191..ba475632c5fa2aea166efa3b03985139e071db2f 100644 (file)
@@ -35,7 +35,6 @@ struct uio_device {
        atomic_t                event;
        struct fasync_struct    *async_queue;
        wait_queue_head_t       wait;
-       int                     vma_count;
        struct uio_info         *info;
        struct kobject          *map_dir;
        struct kobject          *portio_dir;
@@ -597,18 +596,6 @@ static int uio_find_mem_index(struct vm_area_struct *vma)
        return -1;
 }
 
-static void uio_vma_open(struct vm_area_struct *vma)
-{
-       struct uio_device *idev = vma->vm_private_data;
-       idev->vma_count++;
-}
-
-static void uio_vma_close(struct vm_area_struct *vma)
-{
-       struct uio_device *idev = vma->vm_private_data;
-       idev->vma_count--;
-}
-
 static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        struct uio_device *idev = vma->vm_private_data;
@@ -634,12 +621,23 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        return 0;
 }
 
-static const struct vm_operations_struct uio_vm_ops = {
-       .open = uio_vma_open,
-       .close = uio_vma_close,
+static const struct vm_operations_struct uio_logical_vm_ops = {
        .fault = uio_vma_fault,
 };
 
+static int uio_mmap_logical(struct vm_area_struct *vma)
+{
+       vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
+       vma->vm_ops = &uio_logical_vm_ops;
+       return 0;
+}
+
+static const struct vm_operations_struct uio_physical_vm_ops = {
+#ifdef CONFIG_HAVE_IOREMAP_PROT
+       .access = generic_access_phys,
+#endif
+};
+
 static int uio_mmap_physical(struct vm_area_struct *vma)
 {
        struct uio_device *idev = vma->vm_private_data;
@@ -647,6 +645,8 @@ static int uio_mmap_physical(struct vm_area_struct *vma)
        if (mi < 0)
                return -EINVAL;
 
+       vma->vm_ops = &uio_physical_vm_ops;
+
        vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 
        return remap_pfn_range(vma,
@@ -656,14 +656,6 @@ static int uio_mmap_physical(struct vm_area_struct *vma)
                               vma->vm_page_prot);
 }
 
-static int uio_mmap_logical(struct vm_area_struct *vma)
-{
-       vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
-       vma->vm_ops = &uio_vm_ops;
-       uio_vma_open(vma);
-       return 0;
-}
-
 static int uio_mmap(struct file *filep, struct vm_area_struct *vma)
 {
        struct uio_listener *listener = filep->private_data;