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); } }
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); } }
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_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg) { struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par; struct s3cfb_global *fbdev = get_fimd_global(fb->node); struct s3cfb_lcd *lcd = fbdev->lcd; int ret = 0; union { struct s3cfb_user_window user_window; struct s3cfb_user_plane_alpha user_alpha; struct s3cfb_user_chroma user_chroma; int vsync; } p; switch (cmd) { case FBIO_WAITFORVSYNC: s3cfb_wait_for_vsync(fbdev); break; case S3CFB_WIN_POSITION: if (copy_from_user(&p.user_window, (struct s3cfb_user_window __user *)arg, sizeof(p.user_window))) ret = -EFAULT; else { if (p.user_window.x < 0) p.user_window.x = 0; if (p.user_window.y < 0) p.user_window.y = 0; if (p.user_window.x + var->xres > lcd->width) win->x = lcd->width - var->xres; else win->x = p.user_window.x; if (p.user_window.y + var->yres > lcd->height) win->y = lcd->height - var->yres; else win->y = p.user_window.y; s3cfb_set_window_position(fbdev, win->id); } break; case S3CFB_WIN_SET_PLANE_ALPHA: if (copy_from_user(&p.user_alpha, (struct s3cfb_user_plane_alpha __user *)arg, sizeof(p.user_alpha))) ret = -EFAULT; else { win->alpha.mode = PLANE_BLENDING; win->alpha.channel = p.user_alpha.channel; win->alpha.value = S3CFB_AVALUE(p.user_alpha.red, p.user_alpha.green, p.user_alpha.blue); s3cfb_set_alpha_blending(fbdev, win->id); } break; case S3CFB_WIN_SET_CHROMA: if (copy_from_user(&p.user_chroma, (struct s3cfb_user_chroma __user *)arg, sizeof(p.user_chroma))) ret = -EFAULT; else { win->chroma.enabled = p.user_chroma.enabled; win->chroma.key = S3CFB_CHROMA(p.user_chroma.red, p.user_chroma.green, p.user_chroma.blue); s3cfb_set_chroma_key(fbdev, win->id); } break; case S3CFB_SET_VSYNC_INT: if (get_user(p.vsync, (int __user *)arg)) ret = -EFAULT; else { if (p.vsync) s3cfb_set_global_interrupt(fbdev, 1); s3cfb_set_vsync_interrupt(fbdev, p.vsync); } break; #if MALI_USE_UNIFIED_MEMORY_PROVIDER case S3CFB_GET_FB_UMP_SECURE_ID_0: { u32 __user *psecureid = (u32 __user *) arg; ump_secure_id secure_id; dev_info(fbdev->dev, "ump_dd_secure_id_get\n"); secure_id = ump_dd_secure_id_get(ump_wrapped_buffer); dev_info(fbdev->dev, "Saving secure id 0x%x in userptr %p\n" , (unsigned int)secure_id, psecureid); dev_dbg(fbdev->dev, "Saving secure id 0x%x in userptr %p\n" , (unsigned int)secure_id, psecureid); return put_user((unsigned int)secure_id, psecureid); } break; #endif } return ret; }
static int s3cfb_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg) { struct s3cfb_global *fbdev = platform_get_drvdata(to_platform_device(fb->device)); struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par; struct s3cfb_lcd *lcd = fbdev->lcd; struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_next_info next_fb_info; int ret = 0; union { struct s3cfb_user_window user_window; struct s3cfb_user_plane_alpha user_alpha; struct s3cfb_user_chroma user_chroma; int vsync; } p; switch (cmd) { case FBIO_WAITFORVSYNC: s3cfb_wait_for_vsync(fbdev); break; // Custom IOCTL added to return the VSYNC timestamp case S3CFB_WAIT_FOR_VSYNC: ret = s3cfb_wait_for_vsync(fbdev); if(ret > 0) { u64 nsecs = ktime_to_ns(fbdev->vsync_timestamp); copy_to_user((void*)arg, &nsecs, sizeof(u64)); } break; case S3CFB_WIN_POSITION: if (copy_from_user(&p.user_window, (struct s3cfb_user_window __user *)arg, sizeof(p.user_window))) ret = -EFAULT; else { if (p.user_window.x < 0) p.user_window.x = 0; if (p.user_window.y < 0) p.user_window.y = 0; if (p.user_window.x + var->xres > lcd->width) win->x = lcd->width - var->xres; else win->x = p.user_window.x; if (p.user_window.y + var->yres > lcd->height) win->y = lcd->height - var->yres; else win->y = p.user_window.y; s3cfb_set_window_position(fbdev, win->id); } break; case S3CFB_WIN_SET_PLANE_ALPHA: if (copy_from_user(&p.user_alpha, (struct s3cfb_user_plane_alpha __user *)arg, sizeof(p.user_alpha))) ret = -EFAULT; else { win->alpha.mode = PLANE_BLENDING; win->alpha.channel = p.user_alpha.channel; win->alpha.value = S3CFB_AVALUE(p.user_alpha.red, p.user_alpha.green, p.user_alpha.blue); s3cfb_set_alpha_blending(fbdev, win->id); } break; case S3CFB_WIN_SET_CHROMA: if (copy_from_user(&p.user_chroma, (struct s3cfb_user_chroma __user *)arg, sizeof(p.user_chroma))) ret = -EFAULT; else { win->chroma.enabled = p.user_chroma.enabled; win->chroma.key = S3CFB_CHROMA(p.user_chroma.red, p.user_chroma.green, p.user_chroma.blue); s3cfb_set_chroma_key(fbdev, win->id); } break; case S3CFB_SET_VSYNC_INT: if (get_user(p.vsync, (int __user *)arg)) ret = -EFAULT; else { if (p.vsync) s3cfb_set_global_interrupt(fbdev, 1); s3cfb_set_vsync_interrupt(fbdev, p.vsync); } break; case S3CFB_GET_CURR_FB_INFO: next_fb_info.phy_start_addr = fix->smem_start; next_fb_info.xres = var->xres; next_fb_info.yres = var->yres; next_fb_info.xres_virtual = var->xres_virtual; next_fb_info.yres_virtual = var->yres_virtual; next_fb_info.xoffset = var->xoffset; next_fb_info.yoffset = var->yoffset; next_fb_info.lcd_offset_x = 0; next_fb_info.lcd_offset_y = 0; if (copy_to_user((void *)arg, (struct s3cfb_next_info *) &next_fb_info, sizeof(struct s3cfb_next_info))) return -EFAULT; break; } return ret; }
static int s3cfb_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg) { struct s3cfb_global *fbdev = platform_get_drvdata(to_platform_device(fb->device)); struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par; struct s3cfb_lcd *lcd = fbdev->lcd; struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_next_info next_fb_info; volatile unsigned int * LCDControllerBase = NULL; int framebuffer_addr = 0; int ret = 0; union { struct s3cfb_user_window user_window; struct s3cfb_user_plane_alpha user_alpha; struct s3cfb_user_chroma user_chroma; int vsync; } p; switch (cmd) { case FBIO_WAITFORVSYNC: s3cfb_wait_for_vsync(fbdev); break; case S3CFB_WIN_POSITION: if (copy_from_user(&p.user_window, (struct s3cfb_user_window __user *)arg, sizeof(p.user_window))) ret = -EFAULT; else { if (p.user_window.x < 0) p.user_window.x = 0; if (p.user_window.y < 0) p.user_window.y = 0; if (p.user_window.x + var->xres > lcd->width) win->x = lcd->width - var->xres; else win->x = p.user_window.x; if (p.user_window.y + var->yres > lcd->height) win->y = lcd->height - var->yres; else win->y = p.user_window.y; s3cfb_set_window_position(fbdev, win->id); } break; case S3CFB_WIN_SET_PLANE_ALPHA: if (copy_from_user(&p.user_alpha, (struct s3cfb_user_plane_alpha __user *)arg, sizeof(p.user_alpha))) ret = -EFAULT; else { win->alpha.mode = PLANE_BLENDING; win->alpha.channel = p.user_alpha.channel; win->alpha.value = S3CFB_AVALUE(p.user_alpha.red, p.user_alpha.green, p.user_alpha.blue); s3cfb_set_alpha_blending(fbdev, win->id); } break; case S3CFB_WIN_SET_CHROMA: if (copy_from_user(&p.user_chroma, (struct s3cfb_user_chroma __user *)arg, sizeof(p.user_chroma))) ret = -EFAULT; else { win->chroma.enabled = p.user_chroma.enabled; win->chroma.key = S3CFB_CHROMA(p.user_chroma.red, p.user_chroma.green, p.user_chroma.blue); s3cfb_set_chroma_key(fbdev, win->id); } break; case S3CFB_SET_VSYNC_INT: if (get_user(p.vsync, (int __user *)arg)) ret = -EFAULT; else { if (p.vsync) s3cfb_set_global_interrupt(fbdev, 1); s3cfb_set_vsync_interrupt(fbdev, p.vsync); } break; case S3CFB_GET_CURR_FB_INFO: next_fb_info.phy_start_addr = fix->smem_start; next_fb_info.xres = var->xres; next_fb_info.yres = var->yres; next_fb_info.xres_virtual = var->xres_virtual; next_fb_info.yres_virtual = var->yres_virtual; next_fb_info.xoffset = var->xoffset; next_fb_info.yoffset = var->yoffset; next_fb_info.lcd_offset_x = 0; next_fb_info.lcd_offset_y = 0; if (copy_to_user((void *)arg, (struct s3cfb_next_info *) &next_fb_info, sizeof(struct s3cfb_next_info))) return -EFAULT; break; /* get changing physical framebuffer address(because of double buffering) */ case S3CFB_GET_LCD_ADDR: LCDControllerBase = (volatile unsigned int *)ioremap(0xf8000000,1024); framebuffer_addr = LCDControllerBase[0xa0/4 + (win->id)*2]; iounmap(LCDControllerBase); dev_dbg(fbdev->dev, "framebuffer_addr: 0x%08x\n", framebuffer_addr); if (copy_to_user((void *)arg, &framebuffer_addr, sizeof(int))) return -EFAULT; break; } return ret; }
static int s3cfb_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg) { struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev); struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par, *win_temp; struct s3cfb_lcd *lcd = ctrl->lcd; int ret = 0, i; union { struct s3cfb_user_window user_window; struct s3cfb_user_plane_alpha user_alpha; struct s3cfb_user_chroma user_chroma; int vsync; } p; switch (cmd) { case FBIO_WAITFORVSYNC: s3cfb_wait_for_vsync(); break; case S3CFB_WIN_ON: s3cfb_enable_window(win->id); break; case S3CFB_WIN_OFF: s3cfb_disable_window(win->id); break; case S3CFB_WIN_OFF_ALL: for (i = 0; i < pdata->nr_wins; i++) { win_temp = ctrl->fb[i]->par; s3cfb_disable_window(win_temp->id); } break; case S3CFB_WIN_POSITION: if (copy_from_user(&p.user_window, (struct s3cfb_user_window __user *) arg, sizeof(p.user_window))) ret = -EFAULT; else { if (p.user_window.x < 0) p.user_window.x = 0; if (p.user_window.y < 0) p.user_window.y = 0; if (p.user_window.x + var->xres > lcd->width) win->x = lcd->width - var->xres; else win->x = p.user_window.x; if (p.user_window.y + var->yres > lcd->height) win->y = lcd->height - var->yres; else win->y = p.user_window.y; s3cfb_set_window_position(ctrl, win->id); } break; case S3CFB_WIN_SET_PLANE_ALPHA: if (copy_from_user(&p.user_alpha, (struct s3cfb_user_plane_alpha __user *) arg, sizeof(p.user_alpha))) ret = -EFAULT; else { win->alpha.mode = PLANE_BLENDING; win->alpha.channel = p.user_alpha.channel; win->alpha.value = S3CFB_AVALUE(p.user_alpha.red, p.user_alpha.green, p.user_alpha.blue); s3cfb_set_alpha_blending(ctrl, win->id); } break; case S3CFB_WIN_SET_CHROMA: if (copy_from_user(&p.user_chroma, (struct s3cfb_user_chroma __user *) arg, sizeof(p.user_chroma))) ret = -EFAULT; else { win->chroma.enabled = p.user_chroma.enabled; win->chroma.key = S3CFB_CHROMA(p.user_chroma.red, p.user_chroma.green, p.user_chroma.blue); s3cfb_set_chroma_key(ctrl, win->id); } break; case S3CFB_SET_VSYNC_INT: if (get_user(p.vsync, (int __user *) arg)) ret = -EFAULT; else { if (p.vsync) s3cfb_set_global_interrupt(ctrl, 1); s3cfb_set_vsync_interrupt(ctrl, p.vsync); } break; } return ret; }