Commit b4bbc134 authored by Russell King's avatar Russell King

[ARM] Add CLCD driver mmap method and callbacks.

Convert CLCD driver such that boards can use the dma_mmap_*()
interfaces where appropriate.
Signed-off-by: default avatarRussell King <rmk@arm.linux.org.uk>
parent 4711b248
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/mm.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/hardware/icst525.h> #include <asm/hardware/icst525.h>
...@@ -259,6 +260,17 @@ static int impd1fb_clcd_setup(struct clcd_fb *fb) ...@@ -259,6 +260,17 @@ static int impd1fb_clcd_setup(struct clcd_fb *fb)
return ret; return ret;
} }
static int impd1fb_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma)
{
unsigned long start, size;
start = vma->vm_pgoff + (fb->fb.fix.smem_start >> PAGE_SHIFT);
size = vma->vm_end - vma->vm_start;
return remap_pfn_range(vma, vma->vm_start, start, size,
vma->vm_page_prot);
}
static void impd1fb_clcd_remove(struct clcd_fb *fb) static void impd1fb_clcd_remove(struct clcd_fb *fb)
{ {
iounmap(fb->fb.screen_base); iounmap(fb->fb.screen_base);
...@@ -272,6 +284,7 @@ static struct clcd_board impd1_clcd_data = { ...@@ -272,6 +284,7 @@ static struct clcd_board impd1_clcd_data = {
.disable = impd1fb_clcd_disable, .disable = impd1fb_clcd_disable,
.enable = impd1fb_clcd_enable, .enable = impd1fb_clcd_enable,
.setup = impd1fb_clcd_setup, .setup = impd1fb_clcd_setup,
.mmap = impd1fb_clcd_mmap,
.remove = impd1fb_clcd_remove, .remove = impd1fb_clcd_remove,
}; };
......
...@@ -444,6 +444,14 @@ static int cp_clcd_setup(struct clcd_fb *fb) ...@@ -444,6 +444,14 @@ static int cp_clcd_setup(struct clcd_fb *fb)
return 0; return 0;
} }
static int cp_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma)
{
return dma_mmap_writecombine(&fb->dev->dev, vma,
fb->fb.screen_base,
fb->fb.fix.smem_start,
fb->fb.fix.smem_len);
}
static void cp_clcd_remove(struct clcd_fb *fb) static void cp_clcd_remove(struct clcd_fb *fb)
{ {
dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
...@@ -456,6 +464,7 @@ static struct clcd_board clcd_data = { ...@@ -456,6 +464,7 @@ static struct clcd_board clcd_data = {
.decode = clcdfb_decode, .decode = clcdfb_decode,
.enable = cp_clcd_enable, .enable = cp_clcd_enable,
.setup = cp_clcd_setup, .setup = cp_clcd_setup,
.mmap = cp_clcd_mmap,
.remove = cp_clcd_remove, .remove = cp_clcd_remove,
}; };
......
...@@ -597,6 +597,14 @@ static int versatile_clcd_setup(struct clcd_fb *fb) ...@@ -597,6 +597,14 @@ static int versatile_clcd_setup(struct clcd_fb *fb)
return 0; return 0;
} }
static int versatile_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma)
{
return dma_mmap_writecombine(&fb->dev->dev, vma,
fb->fb.screen_base,
fb->fb.fix.smem_start,
fb->fb.fix.smem_len);
}
static void versatile_clcd_remove(struct clcd_fb *fb) static void versatile_clcd_remove(struct clcd_fb *fb)
{ {
dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
...@@ -610,6 +618,7 @@ static struct clcd_board clcd_plat_data = { ...@@ -610,6 +618,7 @@ static struct clcd_board clcd_plat_data = {
.disable = versatile_clcd_disable, .disable = versatile_clcd_disable,
.enable = versatile_clcd_enable, .enable = versatile_clcd_enable,
.setup = versatile_clcd_setup, .setup = versatile_clcd_setup,
.mmap = versatile_clcd_mmap,
.remove = versatile_clcd_remove, .remove = versatile_clcd_remove,
}; };
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mm.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
...@@ -300,6 +301,22 @@ static int clcdfb_blank(int blank_mode, struct fb_info *info) ...@@ -300,6 +301,22 @@ static int clcdfb_blank(int blank_mode, struct fb_info *info)
return 0; return 0;
} }
static int clcdfb_mmap(struct fb_info *info, struct file *file,
struct vm_area_struct *vma)
{
struct clcd_fb *fb = to_clcd(info);
unsigned long len, off = vma->vm_pgoff << PAGE_SHIFT;
int ret = -EINVAL;
len = info->fix.smem_len;
if (off <= len && vma->vm_end - vma->vm_start <= len - off &&
fb->board->mmap)
ret = fb->board->mmap(fb, vma);
return ret;
}
static struct fb_ops clcdfb_ops = { static struct fb_ops clcdfb_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = clcdfb_check_var, .fb_check_var = clcdfb_check_var,
...@@ -310,6 +327,7 @@ static struct fb_ops clcdfb_ops = { ...@@ -310,6 +327,7 @@ static struct fb_ops clcdfb_ops = {
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit, .fb_imageblit = cfb_imageblit,
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
.fb_mmap = clcdfb_mmap,
}; };
static int clcdfb_register(struct clcd_fb *fb) static int clcdfb_register(struct clcd_fb *fb)
......
...@@ -124,6 +124,11 @@ struct clcd_board { ...@@ -124,6 +124,11 @@ struct clcd_board {
*/ */
int (*setup)(struct clcd_fb *); int (*setup)(struct clcd_fb *);
/*
* mmap the framebuffer memory
*/
int (*mmap)(struct clcd_fb *, struct vm_area_struct *);
/* /*
* Remove platform specific parts of CLCD driver * Remove platform specific parts of CLCD driver
*/ */
......
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