int s3cfb_check_var_window(struct s3cfb_global *fbdev, struct fb_var_screeninfo *var, struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev); struct s3cfb_window *win = fb->par; struct s3cfb_lcd *lcd = fbdev->lcd; dev_dbg(fbdev->dev, "[fb%d] check_var\n", win->id); if (var->bits_per_pixel != 16 && var->bits_per_pixel != 24 && var->bits_per_pixel != 32) { dev_err(fbdev->dev, "invalid bits per pixel\n"); return -EINVAL; } if (var->xres > lcd->width) var->xres = lcd->width; if (var->yres > lcd->height) var->yres = lcd->height; if (var->xres_virtual < var->xres) var->xres_virtual = var->xres; #if defined(CONFIG_FB_S3C_VIRTUAL) if (var->yres_virtual < var->yres) var->yres_virtual = var->yres * CONFIG_FB_S3C_NR_BUFFERS; #else if (var->yres_virtual > var->yres * CONFIG_FB_S3C_NR_BUFFERS) var->yres_virtual = var->yres * CONFIG_FB_S3C_NR_BUFFERS; #endif if (var->xoffset > (var->xres_virtual - var->xres)) var->xoffset = var->xres_virtual - var->xres; if (var->yoffset + var->yres > var->yres_virtual) var->yoffset = var->yres_virtual - var->yres; if (win->x + var->xres > lcd->width) win->x = lcd->width - var->xres; if (win->y + var->yres > lcd->height) win->y = lcd->height - var->yres; if (var->pixclock != fbdev->fb[pdata->default_win]->var.pixclock) { dev_info(fbdev->dev, "pixclk is changed from %d Hz to %d Hz\n", fbdev->fb[pdata->default_win]->var.pixclock, var->pixclock); } s3cfb_set_bitfield(var); s3cfb_set_alpha_info(var, win); return 0; }
static int s3cfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fb) { struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev); struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; struct s3cfb_lcd *lcd = ctrl->lcd; dev_dbg(ctrl->dev, "[fb%d] check_var\n", win->id); if (var->bits_per_pixel != 16 && var->bits_per_pixel != 24 && var->bits_per_pixel != 32) { dev_err(ctrl->dev, "invalid bits per pixel\n"); return -EINVAL; } if (var->xres > lcd->width) var->xres = lcd->width; if (var->yres > lcd->height) var->yres = lcd->height; if (var->xres_virtual != var->xres) var->xres_virtual = var->xres; if (var->yres_virtual > var->yres * (fb->fix.ypanstep + 1)) var->yres_virtual = var->yres * (fb->fix.ypanstep + 1); if (var->xoffset != 0) var->xoffset = 0; if (var->yoffset + var->yres > var->yres_virtual) var->yoffset = var->yres_virtual - var->yres; if (win->x + var->xres > lcd->width) win->x = lcd->width - var->xres; if (win->y + var->yres > lcd->height) win->y = lcd->height - var->yres; /* modify the fix info */ if (win->id != pdata->default_win) { fix->line_length = var->xres_virtual * var->bits_per_pixel / 8; fix->smem_len = fix->line_length * var->yres_virtual; } s3cfb_set_bitfield(var); s3cfb_set_alpha_info(var, win); return 0; }
static int s3cfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fb) { struct s3cfb_window *win = fb->par; struct s3cfb_global *fbdev = platform_get_drvdata(to_platform_device(fb->device)); struct s3cfb_lcd *lcd = fbdev->lcd; dev_dbg(fbdev->dev, "[fb%d] check_var\n", win->id); if (var->bits_per_pixel != 16 && var->bits_per_pixel != 24 && var->bits_per_pixel != 32) { dev_err(fbdev->dev, "invalid bits per pixel\n"); return -EINVAL; } if (var->xres > lcd->width) var->xres = lcd->width; if (var->yres > lcd->height) var->yres = lcd->height; if (var->xres_virtual < var->xres) var->xres_virtual = var->xres; if (var->yres_virtual > var->yres * CONFIG_FB_S3C_NR_BUFFERS) var->yres_virtual = var->yres * CONFIG_FB_S3C_NR_BUFFERS; var->xoffset = 0; if (var->yoffset + var->yres > var->yres_virtual) var->yoffset = var->yres_virtual - var->yres; if (win->x + var->xres > lcd->width) win->x = lcd->width - var->xres; if (win->y + var->yres > lcd->height) win->y = lcd->height - var->yres; s3cfb_set_bitfield(var); s3cfb_set_alpha_info(var, win); return 0; }
int s3cfb_init_fbinfo(struct s3cfb_global *fbdev, int id) { struct fb_info *fb = fbdev->fb[id]; struct fb_fix_screeninfo *fix = &fb->fix; struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par; struct s3cfb_alpha *alpha = &win->alpha; struct s3cfb_lcd *lcd = fbdev->lcd; struct s3cfb_lcd_timing *timing = &lcd->timing; memset(win, 0, sizeof(struct s3cfb_window)); platform_set_drvdata(to_platform_device(fbdev->dev), fb); strncpy(fix->id, S3CFB_NAME, sizeof(fix->id)); /* fimd specific */ win->id = id; win->path = DATA_PATH_DMA; win->dma_burst = 16; s3cfb_update_power_state(fbdev, win->id, FB_BLANK_POWERDOWN); alpha->mode = PLANE_BLENDING; /* fbinfo */ fb->fbops = &s3cfb_ops; fb->flags = FBINFO_FLAG_DEFAULT; fb->pseudo_palette = &win->pseudo_pal; #if (CONFIG_FB_S3C_NR_BUFFERS != 1) fix->xpanstep = 2; fix->ypanstep = 1; #else fix->xpanstep = 0; fix->ypanstep = 0; #endif fix->type = FB_TYPE_PACKED_PIXELS; fix->accel = FB_ACCEL_NONE; fix->visual = FB_VISUAL_TRUECOLOR; var->xres = lcd->width; var->yres = lcd->height; #if defined(CONFIG_FB_S3C_VIRTUAL) var->xres_virtual = CONFIG_FB_S3C_X_VRES; var->yres_virtual = CONFIG_FB_S3C_Y_VRES * CONFIG_FB_S3C_NR_BUFFERS; #else var->xres_virtual = var->xres; var->yres_virtual = var->yres * CONFIG_FB_S3C_NR_BUFFERS; #endif var->bits_per_pixel = 32; var->xoffset = 0; var->yoffset = 0; var->width = 0; var->height = 0; var->transp.length = 0; fix->line_length = var->xres_virtual * var->bits_per_pixel / 8; fix->smem_len = fix->line_length * var->yres_virtual; var->nonstd = 0; var->activate = FB_ACTIVATE_NOW; var->vmode = FB_VMODE_NONINTERLACED; var->hsync_len = timing->h_sw; var->vsync_len = timing->v_sw; var->left_margin = timing->h_bp; var->right_margin = timing->h_fp; var->upper_margin = timing->v_bp; var->lower_margin = timing->v_fp; var->pixclock = (lcd->freq * (var->left_margin + var->right_margin + var->hsync_len + var->xres) * (var->upper_margin + var->lower_margin + var->vsync_len + var->yres)); var->pixclock = KHZ2PICOS(var->pixclock/1000); s3cfb_set_bitfield(var); s3cfb_set_alpha_info(var, win); return 0; }
static void s3cfb_init_fbinfo(struct s3cfb_global *ctrl, int id) { struct fb_info *fb = ctrl->fb[id]; struct fb_fix_screeninfo *fix = &fb->fix; struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par; struct s3cfb_alpha *alpha = &win->alpha; struct s3cfb_lcd *lcd = ctrl->lcd; struct s3cfb_lcd_timing *timing = &lcd->timing; memset(win, 0, sizeof(*win)); platform_set_drvdata(to_platform_device(ctrl->dev), ctrl); strcpy(fix->id, S3CFB_NAME); win->id = id; win->path = DATA_PATH_DMA; win->dma_burst = 16; alpha->mode = PLANE_BLENDING; fb->fbops = &s3cfb_ops; fb->flags = FBINFO_FLAG_DEFAULT; fb->pseudo_palette = &win->pseudo_pal; #if (CONFIG_FB_S3C_NR_BUFFERS != 1) fix->xpanstep = 2; fix->ypanstep = 1; #else fix->xpanstep = 0; fix->ypanstep = 0; #endif fix->type = FB_TYPE_PACKED_PIXELS; fix->accel = FB_ACCEL_NONE; fix->visual = FB_VISUAL_TRUECOLOR; var->xres = lcd->width; var->yres = lcd->height; #if defined(CONFIG_FB_S3C_VIRTUAL) var->xres_virtual = CONFIG_FB_S3C_X_VRES; var->yres_virtual = CONFIG_FB_S3C_Y_VRES * CONFIG_FB_S3C_NR_BUFFERS; #else var->xres_virtual = var->xres; var->yres_virtual = var->yres * CONFIG_FB_S3C_NR_BUFFERS; #endif var->bits_per_pixel = 32; var->xoffset = 0; var->yoffset = 0; var->width = lcd->p_width; var->height = lcd->p_height; var->transp.length = 0; fix->line_length = var->xres_virtual * var->bits_per_pixel / 8; fix->smem_len = fix->line_length * var->yres_virtual; var->nonstd = 0; var->activate = FB_ACTIVATE_NOW; var->vmode = FB_VMODE_NONINTERLACED; var->hsync_len = timing->h_sw; var->vsync_len = timing->v_sw; var->left_margin = timing->h_fp; var->right_margin = timing->h_bp; var->upper_margin = timing->v_fp; var->lower_margin = timing->v_bp; var->pixclock = lcd->freq * (var->left_margin + var->right_margin + var->hsync_len + var->xres) * (var->upper_margin + var->lower_margin + var->vsync_len + var->yres); // namko: Removed the 1.5x multiplier for LTE480WV. dev_dbg(ctrl->dev, "pixclock: %d\n", var->pixclock); s3cfb_set_bitfield(var); s3cfb_set_alpha_info(var, win); }
static int s3cfb_init_fbinfo(int id) { struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev); struct fb_info *fb = ctrl->fb[id]; struct fb_fix_screeninfo *fix = &fb->fix; struct fb_var_screeninfo *var = &fb->var; struct s3cfb_window *win = fb->par; struct s3cfb_alpha *alpha = &win->alpha; struct s3cfb_lcd *lcd = ctrl->lcd; struct s3cfb_lcd_timing *timing = &lcd->timing; memset(win, 0, sizeof(struct s3cfb_window)); platform_set_drvdata(to_platform_device(ctrl->dev), fb); strcpy(fix->id, S3CFB_NAME); /* fimd specific */ win->id = id; win->path = DATA_PATH_DMA; win->dma_burst = 16; alpha->mode = PLANE_BLENDING; /* fbinfo */ fb->fbops = &s3cfb_ops; fb->flags = FBINFO_FLAG_DEFAULT; fb->pseudo_palette = &win->pseudo_pal; fix->xpanstep = 0; fix->ypanstep = pdata->nr_buffers[id] - 1; fix->type = FB_TYPE_PACKED_PIXELS; fix->accel = FB_ACCEL_NONE; fix->visual = FB_VISUAL_TRUECOLOR; var->xres = lcd->width; var->yres = lcd->height; var->xres_virtual = var->xres; var->yres_virtual = var->yres + (var->yres * fix->ypanstep); var->bits_per_pixel = 32; var->xoffset = 0; var->yoffset = 0; var->width = 0; var->height = 0; var->transp.length = 0; fix->line_length = var->xres_virtual * var->bits_per_pixel / 8; fix->smem_len = fix->line_length * var->yres_virtual; var->nonstd = 0; var->activate = FB_ACTIVATE_NOW; var->vmode = FB_VMODE_NONINTERLACED; var->hsync_len = timing->h_sw; var->vsync_len = timing->v_sw; var->left_margin = timing->h_bp; var->right_margin = timing->h_fp; var->upper_margin = timing->v_bp; var->lower_margin = timing->v_fp; var->pixclock = lcd->freq * (var->left_margin + var->right_margin + var->hsync_len + var->xres) * (var->upper_margin + var->lower_margin + var->vsync_len + var->yres); dev_dbg(ctrl->dev, "pixclock: %d\n", var->pixclock); s3cfb_set_bitfield(var); s3cfb_set_alpha_info(var, win); return 0; }