static int s3cfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fb) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; struct s3cfb_global *fbdev = platform_get_drvdata(to_platform_device(fb->device)); if (var->yoffset + var->yres > var->yres_virtual) { dev_err(fbdev->dev, "invalid yoffset value\n"); return -EINVAL; } if (win->owner == DMA_MEM_OTHER) fix->smem_start = win->other_mem_addr; fb->var.yoffset = var->yoffset; dev_dbg(fbdev->dev, "[fb%d] yoffset for pan display: %d\n", win->id, var->yoffset); s3cfb_set_buffer_address(fbdev, win->id); 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; }
void s3cfb_set_win_params(struct s3cfb_global *fbdev, int id) { s3cfb_set_window_control(fbdev, id); s3cfb_set_window_position(fbdev, id); s3cfb_set_window_size(fbdev, id); s3cfb_set_buffer_address(fbdev, id); s3cfb_set_buffer_size(fbdev, id); if (id > 0) { s3cfb_set_alpha_blending(fbdev, id); s3cfb_set_chroma_key(fbdev, id); } }
static void s3cfb_set_win_params(struct s3cfb_global *ctrl, int id) { s3cfb_set_window_control(ctrl, id); s3cfb_set_window_position(ctrl, id); s3cfb_set_window_size(ctrl, id); s3cfb_set_buffer_address(ctrl, id); s3cfb_set_buffer_size(ctrl, id); if (id > 0) { s3cfb_set_alpha_blending(ctrl, id); s3cfb_set_chroma_key(ctrl, id); } }
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; }
void s3cfb_set_win_params(struct s3cfb_global *fbdev, int id) { s3cfb_set_window_control(fbdev, id); s3cfb_set_window_position(fbdev, id); s3cfb_set_window_size(fbdev, id); s3cfb_set_buffer_address(fbdev, id); s3cfb_set_buffer_size(fbdev, id); if (id > 0) { s3cfb_set_alpha_blending(fbdev, id); s3cfb_set_chroma_key(fbdev, id); s3cfb_set_alpha_value_width(fbdev, id); /* Set to premultiplied mode as default */ s3cfb_set_alpha_mode(fbdev, id, BLENDING_PREMULT); } }
static int s3cfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fb) { struct s3cfb_window *win = fb->par; if (var->yoffset + var->yres > var->yres_virtual) { dev_err(fbdev->dev, "invalid yoffset value\n"); return -EINVAL; } fb->var.yoffset = var->yoffset; dev_dbg(fbdev->dev, "[fb%d] yoffset for pan display: %d\n", win->id, var->yoffset); s3cfb_set_buffer_address(fbdev, win->id); 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; }
void s3cfb_set_win_params(struct s3cfb_global *fbdev, int id) { s3cfb_set_window_control(fbdev, id); #if defined(CONFIG_CPU_EXYNOS4212) || defined(CONFIG_CPU_EXYNOS4412) s3cfb_set_oneshot(fbdev, id); #else s3cfb_set_window_position(fbdev, id); s3cfb_set_window_size(fbdev, id); s3cfb_set_buffer_address(fbdev, id); s3cfb_set_buffer_size(fbdev, id); #endif if (id > 0) { s3cfb_set_alpha_blending(fbdev, id); s3cfb_set_chroma_key(fbdev, id); s3cfb_set_alpha_value_width(fbdev, id); /* Set to premultiplied mode as default */ s3cfb_set_alpha_mode(fbdev, id, BLENDING_PREMULT); } }
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_direct_ioctl(int id, unsigned int cmd, unsigned long arg) { struct s3cfb_global *fbdev = get_fimd_global(id); struct fb_info *fb = fbdev->fb[id]; struct fb_var_screeninfo *var = &fb->var; struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; struct s3cfb_lcd *lcd = fbdev->lcd; struct s3cfb_user_window user_win; void *argp = (void *)arg; int ret = 0; switch (cmd) { case FBIOGET_FSCREENINFO: ret = memcpy(argp, &fb->fix, sizeof(fb->fix)) ? 0 : -EFAULT; break; case FBIOGET_VSCREENINFO: ret = memcpy(argp, &fb->var, sizeof(fb->var)) ? 0 : -EFAULT; break; case FBIOPUT_VSCREENINFO: ret = s3cfb_check_var((struct fb_var_screeninfo *)argp, fb); if (ret) { dev_err(fbdev->dev, "invalid vscreeninfo\n"); break; } ret = memcpy(&fb->var, (struct fb_var_screeninfo *)argp, sizeof(fb->var)) ? 0 : -EFAULT; if (ret) { dev_err(fbdev->dev, "failed to put new vscreeninfo\n"); break; } fix->line_length = var->xres_virtual * var->bits_per_pixel / 8; fix->smem_len = fix->line_length * var->yres_virtual; s3cfb_set_win_params(fbdev, id); break; case S3CFB_WIN_POSITION: ret = memcpy(&user_win, (struct s3cfb_user_window __user *)arg, sizeof(user_win)) ? 0 : -EFAULT; if (ret) { dev_err(fbdev->dev, "failed to S3CFB_WIN_POSITION\n"); break; } if (user_win.x < 0) user_win.x = 0; if (user_win.y < 0) user_win.y = 0; if (user_win.x + var->xres > lcd->width) win->x = lcd->width - var->xres; else win->x = user_win.x; if (user_win.y + var->yres > lcd->height) win->y = lcd->height - var->yres; else win->y = user_win.y; s3cfb_set_window_position(fbdev, win->id); break; case S3CFB_GET_LCD_WIDTH: ret = memcpy(argp, &lcd->width, sizeof(int)) ? 0 : -EFAULT; if (ret) { dev_err(fbdev->dev, "failed to S3CFB_GET_LCD_WIDTH\n"); break; } break; case S3CFB_GET_LCD_HEIGHT: ret = memcpy(argp, &lcd->height, sizeof(int)) ? 0 : -EFAULT; if (ret) { dev_err(fbdev->dev, "failed to S3CFB_GET_LCD_HEIGHT\n"); break; } break; case S3CFB_SET_WRITEBACK: if ((u32)argp == 1) fbdev->output = OUTPUT_WB_RGB; else fbdev->output = OUTPUT_RGB; s3cfb_set_output(fbdev); break; case S3CFB_SET_WIN_ON: s3cfb_enable_window(fbdev, id); break; case S3CFB_SET_WIN_OFF: s3cfb_disable_window(fbdev, id); break; case S3CFB_SET_WIN_PATH: win->path = (enum s3cfb_data_path_t)argp; break; case S3CFB_SET_WIN_ADDR: fix->smem_start = (unsigned long)argp; s3cfb_set_buffer_address(fbdev, id); break; case S3CFB_SET_WIN_MEM: win->owner = (enum s3cfb_mem_owner_t)argp; break; case S3CFB_SET_VSYNC_INT: if (argp) s3cfb_set_global_interrupt(fbdev, 1); s3cfb_set_vsync_interrupt(fbdev, (int)argp); break; case S3CFB_GET_VSYNC_INT_STATUS: ret = s3cfb_get_vsync_interrupt(fbdev); break; default: ret = s3cfb_ioctl(fb, cmd, arg); break; } return ret; }