static int __init pxafb_map_video_memory(struct pxafb_info *fbi)
{
  ...
  fbi->map_size = PAGE_ALIGN(fbi->fb.fix.smem_len + PAGE_SIZE);
  fbi->map_cpu = dma_alloc_writecombine(fbi->dev, fbi->map_size,
                                        &fbi->map_dma, GFP_KERNEL);
  if (fbi->map_cpu) {
    memset(fbi->map_cpu, 0, fbi->map_size);
    fbi->fb.screen_base = fbi->map_cpu + PAGE_SIZE;
    fbi->screen_dma = fbi->map_dma + PAGE_SIZE;

    fbi->fb.fix.smem_start = fbi->screen_dma;
    ...
  }
  ...
}

static int pxa_mmap(struct fb_info *info,
                    struct vm_area_struct *vma)
{
  struct pxafb_info *fbi = (struct pxafb_info *)info;
  unsigned long off = vma->vm_pgoff << PAGE_SHIFT;

  if (off < info->fix.smem_len) {
    vma->vm_pgoff += 1;
    return dma_mmap_writecombine(fbi->dev, vma, fbi->map_cpu,
                                 fbi->map_dma, fbi->map_size);
  }
  return -EINVAL;
}