Commit 67f30ad1 authored by Christoph Hellwig's avatar Christoph Hellwig

au1100fb: fix DMA API abuse

Virtual addresses return from dma(m)_alloc_coherent are opaque in what
backs then, and drivers must not poke into them.  Switch the driver
to use the generic DMA API mmap helper to avoid these games.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
parent e58cfbfb
...@@ -340,14 +340,12 @@ int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi) ...@@ -340,14 +340,12 @@ int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi)
*/ */
int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
{ {
struct au1100fb_device *fbdev; struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
fbdev = to_au1100fb_device(fbi);
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
pgprot_val(vma->vm_page_prot) |= (6 << 9); //CCA=6 pgprot_val(vma->vm_page_prot) |= (6 << 9); //CCA=6
return vm_iomap_memory(vma, fbdev->fb_phys, fbdev->fb_len); return dma_mmap_coherent(fbdev->dev, vma, fbdev->fb_mem, fbdev->fb_phys,
fbdev->fb_len);
} }
static struct fb_ops au1100fb_ops = static struct fb_ops au1100fb_ops =
...@@ -412,7 +410,6 @@ static int au1100fb_drv_probe(struct platform_device *dev) ...@@ -412,7 +410,6 @@ static int au1100fb_drv_probe(struct platform_device *dev)
{ {
struct au1100fb_device *fbdev; struct au1100fb_device *fbdev;
struct resource *regs_res; struct resource *regs_res;
unsigned long page;
struct clk *c; struct clk *c;
/* Allocate new device private */ /* Allocate new device private */
...@@ -424,6 +421,7 @@ static int au1100fb_drv_probe(struct platform_device *dev) ...@@ -424,6 +421,7 @@ static int au1100fb_drv_probe(struct platform_device *dev)
goto failed; goto failed;
platform_set_drvdata(dev, (void *)fbdev); platform_set_drvdata(dev, (void *)fbdev);
fbdev->dev = &dev->dev;
/* Allocate region for our registers and map them */ /* Allocate region for our registers and map them */
regs_res = platform_get_resource(dev, IORESOURCE_MEM, 0); regs_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
...@@ -472,20 +470,6 @@ static int au1100fb_drv_probe(struct platform_device *dev) ...@@ -472,20 +470,6 @@ static int au1100fb_drv_probe(struct platform_device *dev)
au1100fb_fix.smem_start = fbdev->fb_phys; au1100fb_fix.smem_start = fbdev->fb_phys;
au1100fb_fix.smem_len = fbdev->fb_len; au1100fb_fix.smem_len = fbdev->fb_len;
/*
* Set page reserved so that mmap will work. This is necessary
* since we'll be remapping normal memory.
*/
for (page = (unsigned long)fbdev->fb_mem;
page < PAGE_ALIGN((unsigned long)fbdev->fb_mem + fbdev->fb_len);
page += PAGE_SIZE) {
#ifdef CONFIG_DMA_NONCOHERENT
SetPageReserved(virt_to_page(CAC_ADDR((void *)page)));
#else
SetPageReserved(virt_to_page(page));
#endif
}
print_dbg("Framebuffer memory map at %p", fbdev->fb_mem); print_dbg("Framebuffer memory map at %p", fbdev->fb_mem);
print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024); print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024);
......
...@@ -110,6 +110,7 @@ struct au1100fb_device { ...@@ -110,6 +110,7 @@ struct au1100fb_device {
dma_addr_t fb_phys; dma_addr_t fb_phys;
int panel_idx; int panel_idx;
struct clk *lcdclk; struct clk *lcdclk;
struct device *dev;
}; };
/********************************************************************/ /********************************************************************/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment