From 6d7604b3ebc12cf091d2eab1d16fb9cab59230de Mon Sep 17 00:00:00 2001 From: yxj Date: Fri, 10 Aug 2012 16:25:20 +0800 Subject: [PATCH] rkfb: modify to compatible for platform which have only one lcdc but need to implement dual display like rk2928 --- drivers/video/rockchip/rk_fb.c | 48 ++++++++++++++--------------- drivers/video/rockchip/rkfb_sysfs.c | 2 +- include/linux/rk_fb.h | 4 ++- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 56d4c007e4a7..86f149ac5fb5 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -346,7 +346,7 @@ static int rk_fb_set_par(struct fb_info *info) struct fb_fix_screeninfo *fix = &info->fix; struct rk_lcdc_device_driver * dev_drv = (struct rk_lcdc_device_driver * )info->par; struct layer_par *par = NULL; - rk_screen *screen =dev_drv->screen; + rk_screen *screen =dev_drv->screen0; struct fb_info * info2 = NULL; struct rk_lcdc_device_driver * dev_drv1 = NULL; struct layer_par *par2 = NULL; @@ -664,7 +664,7 @@ int rk_fb_switch_screen(rk_screen *screen ,int enable ,int lcdc_id) } #endif hdmi_var->grayscale &= 0xff; - hdmi_var->grayscale |= (dev_drv->screen->x_res<<8) + (dev_drv->screen->y_res<<20); + hdmi_var->grayscale |= (dev_drv->cur_screen->x_res<<8) + (dev_drv->cur_screen->y_res<<20); ret = info->fbops->fb_open(info,1); ret = dev_drv->load_screen(dev_drv,1); ret = info->fbops->fb_set_par(info); @@ -723,8 +723,8 @@ int rk_fb_disp_scale(u8 scale_x, u8 scale_y,u8 lcdc_id) } var = &info->var; - screen_x = dev_drv->screen->x_res; - screen_y = dev_drv->screen->y_res; + screen_x = dev_drv->cur_screen->x_res; + screen_y = dev_drv->cur_screen->y_res; xpos = (screen_x-screen_x*scale_x/100)>>1; ypos = (screen_y-screen_y*scale_y/100)>>1; xsize = screen_x*scale_x/100; @@ -952,9 +952,9 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv, init_lcdc_device_driver(dev_drv, def_drv,id); if(dev_drv->screen_ctr_info->set_screen_info) { - dev_drv->screen_ctr_info->set_screen_info(dev_drv->screen, + dev_drv->screen_ctr_info->set_screen_info(dev_drv->screen0, dev_drv->screen_ctr_info->lcd_info); - if(SCREEN_NULL==dev_drv->screen->type) + if(SCREEN_NULL==dev_drv->screen0->type) { printk(KERN_WARNING "no display device on lcdc%d!?\n",dev_drv->id); fb_inf->num_lcdc--; @@ -971,6 +971,7 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv, } dev_drv->init_lcdc(dev_drv); + dev_drv->cur_screen = dev_drv->screen0; dev_drv->load_screen(dev_drv,1); /************fb set,one layer one fb ***********/ dev_drv->fb_index_base = fb_inf->num_fb; @@ -987,26 +988,25 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv, fbi->var = def_var; fbi->fix = def_fix; sprintf(fbi->fix.id,"fb%d",fb_inf->num_fb); - fbi->var.xres = fb_inf->lcdc_dev_drv[lcdc_id]->screen->x_res; - fbi->var.yres = fb_inf->lcdc_dev_drv[lcdc_id]->screen->y_res; + fbi->var.xres = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->x_res; + fbi->var.yres = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->y_res; fbi->var.grayscale |= (fbi->var.xres<<8) + (fbi->var.yres<<20); - //fbi->var.bits_per_pixel = 16; #ifdef CONFIG_LOGO_LINUX_BMP fbi->var.bits_per_pixel = 32; #else - fbi->var.bits_per_pixel = 16; + fbi->var.bits_per_pixel = 16; #endif - fbi->var.xres_virtual = fb_inf->lcdc_dev_drv[lcdc_id]->screen->x_res; - fbi->var.yres_virtual = fb_inf->lcdc_dev_drv[lcdc_id]->screen->y_res; - fbi->var.width = fb_inf->lcdc_dev_drv[lcdc_id]->screen->width; - fbi->var.height = fb_inf->lcdc_dev_drv[lcdc_id]->screen->height; + fbi->var.xres_virtual = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->x_res; + fbi->var.yres_virtual = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->y_res; + fbi->var.width = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->width; + fbi->var.height = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->height; fbi->var.pixclock = fb_inf->lcdc_dev_drv[lcdc_id]->pixclock; - fbi->var.left_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen->left_margin; - fbi->var.right_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen->right_margin; - fbi->var.upper_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen->upper_margin; - fbi->var.lower_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen->lower_margin; - fbi->var.vsync_len = fb_inf->lcdc_dev_drv[lcdc_id]->screen->vsync_len; - fbi->var.hsync_len = fb_inf->lcdc_dev_drv[lcdc_id]->screen->hsync_len; + fbi->var.left_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->left_margin; + fbi->var.right_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->right_margin; + fbi->var.upper_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->upper_margin; + fbi->var.lower_margin = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->lower_margin; + fbi->var.vsync_len = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->vsync_len; + fbi->var.hsync_len = fb_inf->lcdc_dev_drv[lcdc_id]->screen0->hsync_len; fbi->fbops = &fb_ops; fbi->flags = FBINFO_FLAG_DEFAULT; fbi->pseudo_palette = fb_inf->lcdc_dev_drv[lcdc_id]->layer_par[i]->pseudo_pal; @@ -1093,8 +1093,8 @@ static void rkfb_early_suspend(struct early_suspend *h) continue; if(inf->lcdc_dev_drv[i]->screen_ctr_info->io_disable) inf->lcdc_dev_drv[i]->screen_ctr_info->io_disable(); - if(inf->lcdc_dev_drv[i]->screen->standby) - inf->lcdc_dev_drv[i]->screen->standby(1); + if(inf->lcdc_dev_drv[i]->screen0->standby) + inf->lcdc_dev_drv[i]->screen0->standby(1); inf->lcdc_dev_drv[i]->suspend(inf->lcdc_dev_drv[i]); } @@ -1111,8 +1111,8 @@ static void rkfb_early_resume(struct early_suspend *h) continue; if(inf->lcdc_dev_drv[i]->screen_ctr_info->io_enable) inf->lcdc_dev_drv[i]->screen_ctr_info->io_enable(); - if(inf->lcdc_dev_drv[i]->screen->standby) - inf->lcdc_dev_drv[i]->screen->standby(0); + if(inf->lcdc_dev_drv[i]->screen0->standby) + inf->lcdc_dev_drv[i]->screen0->standby(0); inf->lcdc_dev_drv[i]->resume(inf->lcdc_dev_drv[i]); } diff --git a/drivers/video/rockchip/rkfb_sysfs.c b/drivers/video/rockchip/rkfb_sysfs.c index 1ee1b06ceaaa..b6a273786033 100644 --- a/drivers/video/rockchip/rkfb_sysfs.c +++ b/drivers/video/rockchip/rkfb_sysfs.c @@ -40,7 +40,7 @@ static ssize_t show_screen_info(struct device *dev, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_lcdc_device_driver * dev_drv = (struct rk_lcdc_device_driver * )fbi->par; - rk_screen * screen = dev_drv->screen; + rk_screen * screen = dev_drv->screen0; int fps; u64 ft = (u64)(screen->upper_margin + screen->lower_margin + screen->y_res +screen->vsync_len)* (screen->left_margin + screen->right_margin + screen->x_res + screen->hsync_len)* diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index b68134e1aaad..0a24b049e7f6 100644 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -203,7 +203,9 @@ struct rk_lcdc_device_driver{ int num_layer; int num_buf; //the num_of buffer int fb_index_base; //the first fb index of the lcdc device - rk_screen *screen; + rk_screen *screen0; //some platform have only one lcdc,but extend + rk_screen *screen1; //two display devices for dual display,such as rk2918,rk2928 + rk_screen *cur_screen; u32 pixclock; -- 2.34.1