aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/samsung/s3cfb.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/video/samsung/s3cfb.c b/drivers/video/samsung/s3cfb.c
index b194e0f..f73dfeb 100644
--- a/drivers/video/samsung/s3cfb.c
+++ b/drivers/video/samsung/s3cfb.c
@@ -147,6 +147,7 @@ static int s3cfb_map_video_memory(struct fb_info *fb)
struct s3cfb_window *win = fb->par;
struct s3cfb_global *fbdev =
platform_get_drvdata(to_platform_device(fb->device));
+ struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);
if (win->owner == DMA_MEM_OTHER) {
fix->smem_start = win->other_mem_addr;
@@ -157,7 +158,11 @@ static int s3cfb_map_video_memory(struct fb_info *fb)
if (fb->screen_base)
return 0;
- fb->screen_base = dma_alloc_writecombine(fbdev->dev,
+ if (pdata && pdata->pmem_start && (pdata->pmem_size >= fix->smem_len)) {
+ fix->smem_start = pdata->pmem_start;
+ fb->screen_base = ioremap_wc(fix->smem_start, pdata->pmem_size);
+ } else
+ fb->screen_base = dma_alloc_writecombine(fbdev->dev,
PAGE_ALIGN(fix->smem_len),
(unsigned int *)
&fix->smem_start, GFP_KERNEL);
@@ -209,13 +214,19 @@ static int s3cfb_unmap_video_memory(struct fb_info *fb)
{
struct s3cfb_global *fbdev =
platform_get_drvdata(to_platform_device(fb->device));
+ struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);
struct fb_fix_screeninfo *fix = &fb->fix;
struct s3cfb_window *win = fb->par;
if (fix->smem_start) {
- if (win->owner == DMA_MEM_FIMD)
- dma_free_writecombine(fbdev->dev, fix->smem_len,
+ if (win->owner == DMA_MEM_FIMD) {
+ if (pdata && pdata->pmem_start &&
+ (pdata->pmem_size >= fix->smem_len))
+ iounmap(fb->screen_base);
+ else
+ dma_free_writecombine(fbdev->dev, fix->smem_len,
fb->screen_base, fix->smem_start);
+ }
fix->smem_start = 0;
fix->smem_len = 0;
dev_info(fbdev->dev,