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_map_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; if (win->owner == DMA_MEM_OTHER) return 0; fb->screen_base = dma_alloc_writecombine(fbdev->dev, PAGE_ALIGN(fix->smem_len), (unsigned int *) &fix->smem_start, GFP_KERNEL); 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; #if MALI_USE_UNIFIED_MEMORY_PROVIDER if (s3cfb_ump_wrapper(win, fix, 0)) { dev_info(fbdev->dev, "[fb%d] Wrapped UMP memory : %x\n", win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif return 0; }
static int s3cfb_remove(struct platform_device *pdev) { struct s3c_platform_fb *pdata = to_fb_plat(&pdev->dev); struct fb_info *fb; int i; free_irq(ctrl->irq, ctrl); iounmap(ctrl->regs); clk_disable(ctrl->clock); clk_put(ctrl->clock); for (i = 0; i < pdata->nr_wins; i++) { fb = ctrl->fb[i]; /* free if exists */ if (fb) { s3cfb_unmap_video_memory(fb); s3cfb_set_buffer_address(ctrl, i); framebuffer_release(fb); } } kfree(ctrl->fb); kfree(ctrl); 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 __devexit s3cfb_remove(struct platform_device *pdev) { struct s3c_platform_fb *pdata = to_fb_plat(&pdev->dev); struct s3cfb_global *fbdev = platform_get_drvdata(pdev); struct s3cfb_window *win; struct resource *res; struct fb_info *fb; int i; device_remove_file(&(pdev->dev), &dev_attr_win_power); #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&fbdev->early_suspend); #endif free_irq(fbdev->irq, fbdev); iounmap(fbdev->regs); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res) release_mem_region(res->start, res->end - res->start + 1); pdata->clk_off(pdev, &fbdev->clock); for (i = 0; i < pdata->nr_wins; i++) { fb = fbdev->fb[i]; if (fb) { win = fb->par; if (win->id == pdata->default_win) s3cfb_unmap_default_video_memory(fb); else s3cfb_unmap_video_memory(fb); s3cfb_set_buffer_address(fbdev, i); framebuffer_release(fb); } } regulator_disable(fbdev->regulator); if (fbdev->vsync_thread) kthread_stop(fbdev->vsync_thread); kfree(fbdev->fb); kfree(fbdev); return 0; }
static int s3cfb_release_window(struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); struct s3cfb_window *win = fb->par; if (win->id != pdata->default_win) { s3cfb_disable_window(win->id); s3cfb_unmap_video_memory(fb); s3cfb_set_buffer_address(fbdev, win->id); } win->x = 0; win->y = 0; return 0; }
int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb, int fimd_id) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; unsigned int reserved_size; int err; #endif #if MALI_USE_UNIFIED_MEMORY_PROVIDER unsigned int arg = 0; #endif if (win->owner == DMA_MEM_OTHER) return 0; #ifdef CONFIG_S5P_MEM_CMA err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = mem_info.total_size; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); #elif defined(CONFIG_S5P_MEM_BOOTMEM) fix->smem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 0); fix->smem_len = s5p_get_media_memsize_bank(S5P_MDEV_FIMD, 0); fb->screen_base = phys_to_virt(fix->smem_start); #endif memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #if MALI_USE_UNIFIED_MEMORY_PROVIDER if (s3cfb_ump_wrapper(win, fix, arg)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif return 0; }
static int s3cfb_remove(struct platform_device *pdev) { struct s3c_platform_fb *pdata = to_fb_plat(&pdev->dev); struct s3cfb_window *win; struct fb_info *fb; int i; #ifdef CONFIG_HAS_WAKELOCK #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&fbdev->early_suspend); #endif #endif free_irq(fbdev->irq, fbdev); iounmap(fbdev->regs); if (pdata->clk_off) pdata->clk_off(pdev, &fbdev->clock); for (i = 0; i < pdata->nr_wins; i++) { fb = fbdev->fb[i]; /* free if exists */ if (fb) { win = fb->par; if (win->id == pdata->default_win) s3cfb_unmap_default_video_memory(fb); else s3cfb_unmap_video_memory(fb); s3cfb_set_buffer_address(fbdev, i); framebuffer_release(fb); } } kfree(fbdev->fb); kfree(fbdev); #ifdef ENABLE_SMDKV210_REGULATOR //urbetter /* ldo6 regulator off */ regulator_disable(lcd_regulator); regulator_put(lcd_regulator); #endif return 0; }
int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb, int fimd_id) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_VCM struct cma_info mem_info; unsigned int reserved_size; int err; struct vcm_phys *phys = NULL; ump_dd_physical_block ump_memory_description; unsigned int device_virt_start = 0; int frame_size = fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS; struct vcm_res *fb_dev_vcm_res[CONFIG_FB_S3C_NR_BUFFERS]; enum vcm_dev_id id; #else #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; unsigned int reserved_size; int err; #endif #endif #ifdef MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM int i; unsigned int arg = 0; #ifdef CONFIG_UMP_VCM_ALLOC struct ump_vcm ump_vcm; #endif unsigned int arg = 0; #endif #endif if (win->owner == DMA_MEM_OTHER) return 0; #ifdef CONFIG_VCM phys = kmalloc(sizeof(*phys) + sizeof(*phys->parts), GFP_KERNEL); memset(phys, 0, sizeof(*phys) + sizeof(*phys->parts)); if (fimd_id == 0) id = VCM_DEV_FIMD0; else id = VCM_DEV_FIMD1; err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = fix->smem_len; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); fbdev->s5p_vcm = vcm_create_unified((SZ_64M), id, &s3cfb_vcm_driver); if (IS_ERR(fbdev->s5p_vcm)) return PTR_ERR(fbdev->s5p_vcm); if (vcm_activate(fbdev->s5p_vcm)) dev_info(fbdev->dev, "[fb%d] : VCM activated", win->id); phys->count = 1; phys->size = fix->smem_len; phys->free = NULL; phys->parts[0].size = fix->smem_len; phys->parts[0].start = fix->smem_start; win->s5p_vcm_res = vcm_map(fbdev->s5p_vcm, phys, 0); device_virt_start = win->s5p_vcm_res->start; for (i = 0; i < CONFIG_FB_S3C_NR_BUFFERS; i++) { fb_dev_vcm_res[i] = kzalloc(sizeof(struct vcm_res), GFP_KERNEL); win->s3cfb_vcm[i].dev_vcm_res = fb_dev_vcm_res[i]; win->s3cfb_vcm[i].dev_vcm_res->start = device_virt_start + frame_size * i; win->s3cfb_vcm[i].dev_vcm_res->bound_size = frame_size; win->s3cfb_vcm[i].dev_vcm_res->res_size = frame_size; win->s3cfb_vcm[i].dev_vcm = fbdev->s5p_vcm; win->s3cfb_vcm[i].dev_vcm_res->vcm = fbdev->s5p_vcm; if (IS_ERR(win->s3cfb_vcm[i].dev_vcm_res)) return -ENOMEM; } #else #ifdef CONFIG_S5P_MEM_CMA err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = mem_info.total_size; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); #elif defined(CONFIG_S5P_MEM_BOOTMEM) fix->smem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 1); fix->smem_len = s5p_get_media_memsize_bank(S5P_MDEV_FIMD, 1); fb->screen_base = ioremap_wc(fix->smem_start, fix->smem_len); #endif #endif memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #if MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM #ifdef CONFIG_UMP_VCM_ALLOC for (i = 0; i < CONFIG_FB_S3C_NR_BUFFERS; i++) { ump_vcm.vcm = win->s3cfb_vcm[i].dev_vcm; ump_vcm.vcm_res = win->s3cfb_vcm[i].dev_vcm_res; ump_vcm.dev_id = id; arg = (unsigned int)&ump_vcm; ump_memory_description.addr = fix->smem_start + ((fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS) * i); ump_memory_description.size = fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS; win->ump_wrapped_buffer[i] = ump_dd_handle_create_from_phys_blocks (&ump_memory_description, 1); if (ump_dd_vcm_attribute_set(win->ump_wrapped_buffer[i], arg)) return -ENOMEM; } #else if (s3cfb_ump_wrapper(fix, arg, 0, win)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif #endif #endif return 0; }
int s3cfb_map_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_VCM struct fb_var_screeninfo *var = &fb->var; struct cma_info mem_info; unsigned int reserved_size; int err; struct vcm_phys *phys = NULL; unsigned int device_virt_start = 0; int frame_num = var->yres_virtual / var->yres; int frame_size = fix->smem_len / frame_num; struct vcm_res *fb_dev_vcm_res[frame_num]; enum vcm_dev_id id; struct ump_vcm ump_vcm; unsigned int arg = 0; int i; ump_dd_physical_block ump_memory_description; if (win->owner == DMA_MEM_OTHER) return 0; phys = kmalloc(sizeof(*phys) + sizeof(*phys->parts), GFP_KERNEL); memset(phys, 0, sizeof(*phys) + sizeof(*phys->parts)); if (win->id < 5) id = VCM_DEV_FIMD0; else id = VCM_DEV_FIMD1; err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = fix->smem_len; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); phys->count = 1; phys->size = fix->smem_len; phys->free = NULL; phys->parts[0].size = fix->smem_len; phys->parts[0].start = fix->smem_start; win->s5p_vcm_res = vcm_map(fbdev->s5p_vcm, phys, 0); device_virt_start = win->s5p_vcm_res->start; for (i = 0; i < frame_num; i++) { fb_dev_vcm_res[i] = kzalloc(sizeof(struct vcm_res), GFP_KERNEL); win->s3cfb_vcm[i].dev_vcm_res = fb_dev_vcm_res[i]; win->s3cfb_vcm[i].dev_vcm_res->start = device_virt_start + frame_size * i; win->s3cfb_vcm[i].dev_vcm_res->bound_size = frame_size; win->s3cfb_vcm[i].dev_vcm_res->res_size = frame_size; win->s3cfb_vcm[i].dev_vcm = fbdev->s5p_vcm; win->s3cfb_vcm[i].dev_vcm_res->vcm = fbdev->s5p_vcm; if (IS_ERR(win->s3cfb_vcm[i].dev_vcm_res)) return -ENOMEM; } memset(fb->screen_base, 0, (fix->smem_len / frame_num)); win->owner = DMA_MEM_FIMD; #else if (win->owner == DMA_MEM_OTHER) return 0; fb->screen_base = dma_alloc_writecombine(fbdev->dev, PAGE_ALIGN(fix->smem_len), (unsigned int *) &fix->smem_start, GFP_KERNEL); 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; #endif #if MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM #ifdef CONFIG_UMP_VCM_ALLOC for (i = 0; i < frame_num; i++) { ump_vcm.vcm = win->s3cfb_vcm[i].dev_vcm; ump_vcm.vcm_res = win->s3cfb_vcm[i].dev_vcm_res; ump_vcm.dev_id = id; arg = (unsigned int)&ump_vcm; ump_memory_description.addr = fix->smem_start + ((fix->smem_len / frame_num) * i); ump_memory_description.size = fix->smem_len / frame_num; win->ump_wrapped_buffer[i] = ump_dd_handle_create_from_phys_blocks (&ump_memory_description, 1); if (ump_dd_vcm_attribute_set(win->ump_wrapped_buffer[i], arg)) return -ENOMEM; } #else if (s3cfb_ump_wrapper(fix, arg, 0, win)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif #endif #endif return 0; }