static int s3cfb_map_default_video_memory(struct fb_info *fb) { #if defined(CONFIG_FB_S3C_VIRTUAL) struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); if (win->owner == DMA_MEM_OTHER) return 0; fix->smem_start = pdata->pmem_start[win->id]; fb->screen_base = ioremap_wc(fix->smem_start, pdata->pmem_size[win->id]); if (!fb->screen_base) return -ENOMEM; else dev_info(fbdev->dev, "[fb%d] dma: 0x%08x, cpu: 0x%08x, " "size: 0x%08x\n", win->id, (unsigned int)fix->smem_start, (unsigned int)fb->screen_base, fix->smem_len); memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #else s3cfb_map_video_memory(fb); #endif return 0; }
int s3cfb_set_par_window(struct s3cfb_global *fbdev, struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); struct s3cfb_window *win = fb->par; dev_dbg(fbdev->dev, "[fb%d] set_par\n", win->id); #if 0 /* In android scenario, this routine is not required */ if ((win->id != pdata->default_win) && fb->fix.smem_start) s3cfb_unmap_video_memory(fbdev, fb); #endif /* modify the fix info */ if (win->id != pdata->default_win) { fb->fix.line_length = fb->var.xres_virtual * fb->var.bits_per_pixel / 8; fb->fix.smem_len = fb->fix.line_length * fb->var.yres_virtual; } #if 0 /* In android scenario, this routine is not required */ if (win->id != pdata->default_win) s3cfb_map_video_memory(fbdev, fb); #endif s3cfb_set_win_params(fbdev, win->id); return 0; }
int s3cfb_set_par_window(struct s3cfb_global *fbdev, struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); struct s3cfb_window *win = fb->par; int ret; dev_dbg(fbdev->dev, "[fb%d] set_par\n", win->id); #if (!defined(CONFIG_CPU_EXYNOS4210)) if ((win->id != pdata->default_win) && fb->fix.smem_start) s3cfb_unmap_video_memory(fbdev, fb); #endif /* modify the fix info */ if (win->id != pdata->default_win) { fb->fix.line_length = fb->var.xres_virtual * fb->var.bits_per_pixel / 8; fb->fix.smem_len = fb->fix.line_length * fb->var.yres_virtual; } if (win->id != pdata->default_win && !fb->fix.smem_start) { ret = s3cfb_map_video_memory(fbdev, fb); if (ret != 0) return ret; } s3cfb_set_win_params(fbdev, win->id); return 0; }
static int s3cfb_alloc_framebuffer(void) { struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev); int ret, i; /* alloc for framebuffers */ ctrl->fb = (struct fb_info **) kmalloc(pdata->nr_wins * sizeof(struct fb_info *), GFP_KERNEL); if (!ctrl->fb) { dev_err(ctrl->dev, "not enough memory\n"); ret = -ENOMEM; goto err_alloc; } /* alloc for each framebuffer */ for (i = 0; i < pdata->nr_wins; i++) { ctrl->fb[i] = framebuffer_alloc(sizeof(struct s3cfb_window), ctrl->dev); if (!ctrl->fb[i]) { dev_err(ctrl->dev, "not enough memory\n"); ret = -ENOMEM; goto err_alloc_fb; } ret = s3cfb_init_fbinfo(i); if (ret) { dev_err(ctrl->dev, "failed to allocate memory for fb%d\n", i); ret = -ENOMEM; goto err_alloc_fb; } if (i == pdata->default_win) { if (s3cfb_map_video_memory(ctrl->fb[i])) { dev_err(ctrl->dev, "failed to map video memory " "for default window (%d)\n", i); ret = -ENOMEM; goto err_alloc_fb; } } } return 0; err_alloc_fb: for (i = 0; i < pdata->nr_wins; i++) { if (ctrl->fb[i]) framebuffer_release(ctrl->fb[i]); } kfree(ctrl->fb); err_alloc: return ret; }
static int s3cfb_alloc_framebuffer(struct s3cfb_global *ctrl) { struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev); int ret, i; ctrl->fb = kmalloc(pdata->nr_wins * sizeof(*(ctrl->fb)), GFP_KERNEL); if (!ctrl->fb) { dev_err(ctrl->dev, "not enough memory\n"); ret = -ENOMEM; goto err_alloc; } for (i = 0; i < pdata->nr_wins; i++) { ctrl->fb[i] = framebuffer_alloc(sizeof(*ctrl->fb), ctrl->dev); if (!ctrl->fb[i]) { dev_err(ctrl->dev, "not enough memory\n"); ret = -ENOMEM; goto err_alloc_fb; } s3cfb_init_fbinfo(ctrl, i); if (i == pdata->default_win) { if (s3cfb_map_video_memory(ctrl->fb[i])) { dev_err(ctrl->dev, "failed to map video memory " "for default window (%d)\n", i); ret = -ENOMEM; goto err_map_video_mem; } } } return 0; err_alloc_fb: while (--i >= 0) { if (i == pdata->default_win) s3cfb_unmap_default_video_memory(ctrl->fb[i]); err_map_video_mem: framebuffer_release(ctrl->fb[i]); } kfree(ctrl->fb); err_alloc: return ret; }
static int s3cfb_set_par(struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev); struct s3cfb_window *win = fb->par; dev_dbg(ctrl->dev, "[fb%d] set_par\n", win->id); if ((win->id != pdata->default_win) && !fb->fix.smem_start) s3cfb_map_video_memory(fb); s3cfb_set_window_control(ctrl, win->id); s3cfb_set_window_position(ctrl, win->id); s3cfb_set_window_size(ctrl, win->id); s3cfb_set_buffer_address(ctrl, win->id); s3cfb_set_buffer_size(ctrl, win->id); if (win->id > 0) s3cfb_set_alpha_blending(ctrl, win->id); return 0; }
int s3cfb_set_par_window(struct s3cfb_global *fbdev, struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); struct s3cfb_window *win = fb->par; dev_dbg(fbdev->dev, "[fb%d] set_par\n", win->id); /* modify the fix info */ if (win->id != pdata->default_win) { fb->fix.line_length = fb->var.xres_virtual * fb->var.bits_per_pixel / 8; fb->fix.smem_len = fb->fix.line_length * fb->var.yres_virtual; } if (win->id != pdata->default_win && !fb->fix.smem_start) s3cfb_map_video_memory(fbdev, fb); s3cfb_set_win_params(fbdev, win->id); return 0; }