int s5ptvfb_set_par(struct fb_info *fb) { struct s5ptvfb_window *win = fb->par; dev_dbg(s5ptv_status.dev_fb, "[fb%d] set_par\n", win->id); if (!fb->fix.smem_start) { #ifndef CONFIG_USER_ALLOC_TVOUT GRPPRINTK(" The frame buffer is allocated here\n"); s5ptvfb_map_video_memory(fb); #else printk(KERN_ERR "[Warning] The frame buffer should be allocated by ioctl\n"); #endif } // ((struct fb_var_screeninfo) (s5ptv_status.fb->var)).bits_per_pixel = (s5ptv_status.fb->var).bits_per_pixel = ((struct fb_var_screeninfo) (fb->var)).bits_per_pixel; s5ptvfb_set_display_mode(&s5ptv_status); s5ptvfb_set_window_control(&s5ptv_status, win->id); s5ptvfb_set_window_position(&s5ptv_status, win->id); s5ptvfb_set_window_size(&s5ptv_status, win->id); s5ptvfb_set_buffer_address(&s5ptv_status, win->id); s5ptvfb_set_buffer_size(&s5ptv_status, win->id); if (win->id > 0) s5ptvfb_set_alpha_blending(&s5ptv_status, win->id); return 0; }
static int s5ptvfb_alloc_framebuffer(void) { int ret; /* alloc for each framebuffer */ s5ptv_status.fb = framebuffer_alloc(sizeof(struct s5ptvfb_window), s5ptv_status.dev_fb); if (!s5ptv_status.fb) { dev_err(s5ptv_status.dev_fb, "not enough memory\n"); ret = -ENOMEM; goto err_alloc_fb; } ret = s5ptvfb_init_fbinfo(5); if (ret) { dev_err(s5ptv_status.dev_fb, "failed to allocate memory for fb for tv\n"); ret = -ENOMEM; goto err_alloc_fb; } #ifndef CONFIG_USER_ALLOC_TVOUT if (s5ptvfb_map_video_memory(s5ptv_status.fb)) { dev_err(s5ptv_status.dev_fb, "failed to map video memory " "for default window \n"); ret = -ENOMEM; goto err_alloc_fb; } #endif return 0; err_alloc_fb: if (s5ptv_status.fb) framebuffer_release(s5ptv_status.fb); kfree(s5ptv_status.fb); return ret; }