diff options
Diffstat (limited to 'drivers/vme/vme.c')
-rw-r--r-- | drivers/vme/vme.c | 26 |
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 | } |
610 | EXPORT_SYMBOL(vme_master_rmw); | 610 | EXPORT_SYMBOL(vme_master_rmw); |
611 | 611 | ||
612 | int 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 | } | ||
636 | EXPORT_SYMBOL(vme_master_mmap); | ||
637 | |||
612 | void vme_master_free(struct vme_resource *resource) | 638 | void vme_master_free(struct vme_resource *resource) |
613 | { | 639 | { |
614 | struct vme_master_resource *master_image; | 640 | struct vme_master_resource *master_image; |