static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma)
{
  struct video_device *vdev = file->private_data;
  struct pwc_device *pdev;
  unsigned long start = vma->vm_start;
  unsigned long size = vma->vm_end - vma->vm_start;
  unsigned long page, pos;

  pdev = fdev->priv;

  vma->vm_flags |= VM_IO;

  pos = (unsigned long)pdev->image_data;
  while (size > 0) {
    page = vmalloc_to_pfn((void *)pos);
    if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
      return -EAGAIN;

    start += PAGE_SIZE;
    pos += PAGE_SIZE;
    if (size > PAGE_SIZE)
      size -= PAGE_SIZE;
    else
      size = 0;
  }
  return 0;
}