aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vme/vme.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/vme/vme.c')
-rw-r--r--drivers/vme/vme.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/vme/vme.c b/drivers/vme/vme.c
index d95fb848dd03..6bab2c4ed77c 100644
--- a/drivers/vme/vme.c
+++ b/drivers/vme/vme.c
@@ -609,6 +609,32 @@ unsigned int vme_master_rmw(struct vme_resource *resource, unsigned int mask,
609} 609}
610EXPORT_SYMBOL(vme_master_rmw); 610EXPORT_SYMBOL(vme_master_rmw);
611 611
612int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma)
613{
614 struct vme_master_resource *image;
615 phys_addr_t phys_addr;
616 unsigned long vma_size;
617
618 if (resource->type != VME_MASTER) {
619 pr_err("Not a master resource\n");
620 return -EINVAL;
621 }
622
623 image = list_entry(resource->entry, struct vme_master_resource, list);
624 phys_addr = image->bus_resource.start + (vma->vm_pgoff << PAGE_SHIFT);
625 vma_size = vma->vm_end - vma->vm_start;
626
627 if (phys_addr + vma_size > image->bus_resource.end + 1) {
628 pr_err("Map size cannot exceed the window size\n");
629 return -EFAULT;
630 }
631
632 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
633
634 return vm_iomap_memory(vma, phys_addr, vma->vm_end - vma->vm_start);
635}
636EXPORT_SYMBOL(vme_master_mmap);
637
612void vme_master_free(struct vme_resource *resource) 638void vme_master_free(struct vme_resource *resource)
613{ 639{
614 struct vme_master_resource *master_image; 640 struct vme_master_resource *master_image;