From: yxj <yxj@I7-CH.(none)>
Date: Fri, 24 Feb 2012 01:45:58 +0000 (+0800)
Subject: rk30 fb: 完善 rk_fb_register 框架
X-Git-Tag: firefly_0821_release~9595^2~117
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c894417995abf682d7402e4f37965a86f3b4f46e;p=firefly-linux-kernel-4.4.55.git

rk30 fb: 完善 rk_fb_register 框架
---

diff --git a/arch/arm/mach-rk30/board-rk30-sdk.c b/arch/arm/mach-rk30/board-rk30-sdk.c
index 80add1493851..45e40eb37ab8 100755
--- a/arch/arm/mach-rk30/board-rk30-sdk.c
+++ b/arch/arm/mach-rk30/board-rk30-sdk.c
@@ -300,6 +300,18 @@ static struct resource resource_fb[] = {
 		.end   = 0,//RK30_FB0_MEM_SIZE - 1,
 		.flags = IORESOURCE_MEM,
 	},
+	[1] = {
+		.name  = "ipp buf",  //for rotate
+		.start = 0,
+		.end   = 0,//RK30_FB0_MEM_SIZE - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[2] = {
+		.name  = "fb2 buf",
+		.start = 0,
+		.end   = 0,//RK30_FB0_MEM_SIZE - 1,
+		.flags = IORESOURCE_MEM,
+	},
 };
 
 static struct platform_device device_fb = {
@@ -387,6 +399,10 @@ static void __init rk30_reserve(void)
 #ifdef CONFIG_FB_ROCKCHIP
 	resource_fb[0].start = board_mem_reserve_add("fb0",RK30_FB0_MEM_SIZE);
 	resource_fb[0].end = resource_fb[0].start + RK30_FB0_MEM_SIZE - 1;
+	resource_fb[1].start = board_mem_reserve_add("ipp buf",RK30_FB0_MEM_SIZE);
+	resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
+	resource_fb[2].start = board_mem_reserve_add("fb2",RK30_FB0_MEM_SIZE);
+	resource_fb[2].end = resource_fb[2].start + RK30_FB0_MEM_SIZE - 1;	
 #endif
 	board_mem_reserved();
 }
diff --git a/drivers/video/rockchip/chips/rk30_lcdc.c b/drivers/video/rockchip/chips/rk30_lcdc.c
index a3407598eea9..640d6189b36a 100644
--- a/drivers/video/rockchip/chips/rk30_lcdc.c
+++ b/drivers/video/rockchip/chips/rk30_lcdc.c
@@ -34,7 +34,7 @@
 
 
 
-static int dbg_thresd = 0;
+static int dbg_thresd =1;
 #define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)
 
 
@@ -246,7 +246,7 @@ static int win1_blank(int blank_mode, struct rk30_lcdc_device *lcdc_dev)
 	//mcu_refresh(inf);
     return 0;
 }
-static int rk30_lcdc_blank(struct rk_fb_device_driver*fb_drv,int layer_id,int blank_mode)
+static int rk30_lcdc_blank(struct rk_lcdc_device_driver*fb_drv,int layer_id,int blank_mode)
 {
 	struct rk30_lcdc_device * lcdc_dev = NULL;
 	struct lcdc_info * info = platform_get_drvdata(g_lcdc_pdev);
@@ -316,25 +316,28 @@ static  int win0_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     LcdWrReg(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(xpos) | v_DSP_STY(ypos));
     LcdWrReg(lcdc_dev, WIN0_DSP_INFO, v_DSP_WIDTH(par->xsize) | v_DSP_HEIGHT(par->ysize));
     LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(ScaleYrgbX) | v_Y_SCL_FACTOR(ScaleYrgbY));
-	LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_CBR,  v_X_SCL_FACTOR(ScaleCbrX) | v_Y_SCL_FACTOR(ScaleCbrY));
+    LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_CBR,  v_X_SCL_FACTOR(ScaleCbrX) | v_Y_SCL_FACTOR(ScaleCbrY));
     switch(par->format)
     {
-    	case RGB888:  //rgb888
-    	     LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
-       	     break;
-    	case RGB565:  //rgb565
-    	     LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_YUV_VIRWIDTH(xvir));
-             break;
-    	case YUV420:   
-    	     LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO,v_RGB565_VIRWIDTH(xvir));
-             break;
-    	default:
-	     	LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
-	     break;
+        case ARGB888:
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_ARGB888_VIRWIDTH(xvir));
+            break;
+        case RGB888:  //rgb888
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
+            break;
+        case RGB565:  //rgb565
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB565_VIRWIDTH(xvir));
+            break;
+        case YUV422:
+        case YUV420:   
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO,v_YUV_VIRWIDTH(xvir));
+            break;
+        default:
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
+            break;
     }
 
     LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
-	printk(KERN_INFO "%s>>>>done!\n",__func__);
 	
     return 0;
 
@@ -389,16 +392,20 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     LcdMskReg(lcdc_dev, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR, v_COLORKEY_EN(1) | v_KEYCOLOR(0));
 	switch(par->format)
     {
-    	case RGB888:  //rgb888
-    	     LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
-       	     break;
-    	case RGB565:  //rgb565
-    	     LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_YUV_VIRWIDTH(xvir));
-             break;
-    	case YUV420:   
-    	     LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO,v_RGB565_VIRWIDTH(xvir));
-             break;
-    	default:
+	case ARGB888:
+		LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_ARGB888_VIRWIDTH(xvir));
+		break;
+	case RGB888:  //rgb888
+		LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
+		break;
+	case RGB565:  //rgb565
+		LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB565_VIRWIDTH(xvir));
+		break;
+	case YUV422:
+	case YUV420:   
+		LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO,v_YUV_VIRWIDTH(xvir));
+		break;
+	default:
 	     	LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
 	     	break;
     }
@@ -409,7 +416,7 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     return 0;
 }
 
-static int rk30_lcdc_set_par(struct rk_fb_device_driver *fb_drv,int layer_id)
+static int rk30_lcdc_set_par(struct rk_lcdc_device_driver *fb_drv,int layer_id)
 {
 	struct rk30_lcdc_device *lcdc_dev=NULL;
 	struct layer_par *par = &fb_drv->layer_par[0];
@@ -440,7 +447,7 @@ static int rk30_lcdc_set_par(struct rk_fb_device_driver *fb_drv,int layer_id)
 	return 0;
 }
  
-int rk30_lcdc_pan(struct rk_fb_device_driver * dev_drv,int layer_id)
+int rk30_lcdc_pan(struct rk_lcdc_device_driver * dev_drv,int layer_id)
 {
 	
     return 0;
@@ -488,7 +495,7 @@ static struct layer_par lcdc1_layer[] = {
 	},
 };
 
-static struct rk_fb_device_driver lcdc0_driver = {
+static struct rk_lcdc_device_driver lcdc0_driver = {
 	.name			= "lcdc0",
 	.layer_par		= lcdc0_layer,
 	.num_layer		= ARRAY_SIZE(lcdc0_layer),
@@ -499,7 +506,7 @@ static struct rk_fb_device_driver lcdc0_driver = {
 	.blank         = rk30_lcdc_blank,
 	.pan           = rk30_lcdc_pan,
 };
-static struct rk_fb_device_driver lcdc1_driver = {
+static struct rk_lcdc_device_driver lcdc1_driver = {
 	.name			= "lcdc1",
 	.layer_par		= lcdc1_layer,
 	.num_layer		= ARRAY_SIZE(lcdc1_layer),
diff --git a/drivers/video/rockchip/chips/rk30_lcdc.h b/drivers/video/rockchip/chips/rk30_lcdc.h
index 4e98c106211f..68c6a8adb530 100644
--- a/drivers/video/rockchip/chips/rk30_lcdc.h
+++ b/drivers/video/rockchip/chips/rk30_lcdc.h
@@ -361,10 +361,11 @@ typedef volatile struct tagLCDC_REG
 #define v_VASP(x) ((x)<<16)
 
 
-
+//LCDC_WINx_VIR ,x is number of words of win0 virtual width
+#define v_ARGB888_VIRWIDTH(x) (x)
 #define v_RGB888_VIRWIDTH(x) (((x*3)>>2)+((x)%3))
-#define v_RGB565_VIRWIDTH(x) ((x)>>1)
-#define v_YUV_VIRWIDTH(x)    ((x)>>1)
+#define v_RGB565_VIRWIDTH(x) (((x)>>1) + ((x%2)?1:0))
+#define v_YUV_VIRWIDTH(x)    (((x)>>2) +((x%4)?1:0))
 
 #define m_ACTWIDTH       (0xffff<<0)
 #define m_ACTHEIGHT      (0xffff<<16)
@@ -444,7 +445,7 @@ typedef volatile struct tagLCDC_REG
 
 #define CalScale(x, y)	             (((u32)x*0x1000)/y)
 struct rk30_lcdc_device{
-	struct rk_fb_device_driver *driver;
+	struct rk_lcdc_device_driver *driver;
 	/* LCDC reg base address and backup reg */
     LCDC_REG *preg;
     LCDC_REG regbak;
diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c
index 5c5a81716534..33ea664b0991 100644
--- a/drivers/video/rockchip/rk_fb.c
+++ b/drivers/video/rockchip/rk_fb.c
@@ -73,10 +73,21 @@ static struct rk_fb_rgb def_rgb_16 = {
      transp: { offset: 0,  length: 0, },
 };
 
+int fb0_open(struct fb_info *info, int user)
+{
+  return 0; 
+}
+
+int fb0_release(struct fb_info *info, int user)
+{
+  
+    return 0;
+}
+
 static int fb0_blank(int blank_mode, struct fb_info *info)
 {
 	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
-	struct rk_fb_device_driver *rk_fb_dev_drv = fb_inf->rk_lcdc_device[0];
+	struct rk_lcdc_device_driver *rk_fb_dev_drv = fb_inf->rk_lcdc_device[0];
 	 fb_inf->rk_lcdc_device[0]->blank(rk_fb_dev_drv,0,blank_mode);
 
     return 0;
@@ -137,7 +148,7 @@ static int fb0_set_par(struct fb_info *info)
 	struct rk_fb_inf *inf =  platform_get_drvdata(g_fb_pdev);
 	struct fb_var_screeninfo *var = &info->var;
 	struct fb_fix_screeninfo *fix = &info->fix;
-	struct rk_fb_device_driver *rk_fb_dev_drv = inf->rk_lcdc_device[0];
+	struct rk_lcdc_device_driver *rk_fb_dev_drv = inf->rk_lcdc_device[0];
 	struct layer_par *par = &rk_fb_dev_drv->layer_par[0];
 	rk_screen *screen = &rk_fb_dev_drv->screen;
 	
@@ -243,6 +254,86 @@ int fb1_release(struct fb_info *info, int user)
   
     return 0;
 }
+static int fb2_blank(int blank_mode, struct fb_info *info)
+{
+	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+}
+
+static int fb2_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+    return 0;
+}
+
+static int fb2_set_par(struct fb_info *info)
+{
+ struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+    return 0;
+}
+
+static int fb2_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+
+static int fb2_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
+{
+  struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+int fb2_open(struct fb_info *info, int user)
+{
+  return 0; 
+}
+
+int fb2_release(struct fb_info *info, int user)
+{
+  
+    return 0;
+}
+
+static int fb3_blank(int blank_mode, struct fb_info *info)
+{
+	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+}
+
+static int fb3_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+    return 0;
+}
+
+static int fb3_set_par(struct fb_info *info)
+{
+ struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+ 
+}
+
+static int fb3_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+
+static int fb3_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
+{
+  struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+int fb3_open(struct fb_info *info, int user)
+{
+  return 0; 
+}
+
+int fb3_release(struct fb_info *info, int user)
+{
+  
+    return 0;
+}
+
 
 static inline unsigned int chan_to_field(unsigned int chan,
 					 struct fb_bitfield *bf)
@@ -277,45 +368,153 @@ static int fb_setcolreg(unsigned regno,
 	return 0;
 }
 
-static struct fb_ops fb1_ops = {
-	.owner		= THIS_MODULE,
-	.fb_open    = fb1_open,
-	.fb_release = fb1_release,
-	.fb_check_var	= fb1_check_var,
-	.fb_set_par	= fb1_set_par,
-	.fb_blank	= fb1_blank,
-    .fb_pan_display = fb1_pan_display,
-    .fb_ioctl = fb1_ioctl,
-	.fb_setcolreg	= fb_setcolreg,
-	.fb_fillrect	= cfb_fillrect,
-	.fb_copyarea	= cfb_copyarea,
-	.fb_imageblit	= cfb_imageblit,
+static struct fb_ops fb_ops[] = {
+	[0]={
+		.owner		= THIS_MODULE,
+		.fb_open    = fb0_open,
+		.fb_release = fb0_release,
+		.fb_check_var	= fb0_check_var,
+		.fb_set_par	= fb0_set_par,
+		.fb_blank	= fb0_blank,
+		.fb_pan_display = fb0_pan_display,
+		.fb_ioctl = fb0_ioctl,
+		.fb_setcolreg	= fb_setcolreg,
+		.fb_fillrect	= cfb_fillrect,
+		.fb_copyarea	= cfb_copyarea,
+		.fb_imageblit	= cfb_imageblit,
+	},
+	[1]={
+		.owner		= THIS_MODULE,
+		.fb_open    = fb1_open,
+		.fb_release = fb1_release,
+		.fb_check_var	= fb1_check_var,
+		.fb_set_par	= fb1_set_par,
+		.fb_blank	= fb1_blank,
+		.fb_pan_display = fb1_pan_display,
+		.fb_ioctl = fb1_ioctl,
+		.fb_setcolreg	= fb_setcolreg,
+		.fb_fillrect	= cfb_fillrect,
+		.fb_copyarea	= cfb_copyarea,
+		.fb_imageblit	= cfb_imageblit,	
+	},
+	[2]={
+		.owner		= THIS_MODULE,
+		.fb_open    = fb2_open,
+		.fb_release = fb2_release,
+		.fb_check_var	= fb2_check_var,
+		.fb_set_par	= fb2_set_par,
+		.fb_blank	= fb2_blank,
+		.fb_pan_display = fb2_pan_display,
+		.fb_ioctl = fb2_ioctl,
+		.fb_setcolreg	= fb_setcolreg,
+		.fb_fillrect	= cfb_fillrect,
+		.fb_copyarea	= cfb_copyarea,
+		.fb_imageblit	= cfb_imageblit,
+	},
+	[3]={
+		.owner		= THIS_MODULE,
+		.fb_open    = fb3_open,
+		.fb_release = fb3_release,
+		.fb_check_var	= fb3_check_var,
+		.fb_set_par	= fb3_set_par,
+		.fb_blank	= fb3_blank,
+		.fb_pan_display = fb3_pan_display,
+		.fb_ioctl = fb3_ioctl,
+		.fb_setcolreg	= fb_setcolreg,
+		.fb_fillrect	= cfb_fillrect,
+		.fb_copyarea	= cfb_copyarea,
+		.fb_imageblit	= cfb_imageblit,
+	}
+};
+
+
+
+static struct fb_var_screeninfo def_var = {
+    .red    = {11,5,0},//def_rgb_16.red,
+    .green  = {5,6,0},//def_rgb_16.green,
+    .blue   = {0,5,0},
+    .transp = {0,0,0},	
+    .nonstd      = 0, //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format)
+    .grayscale   = 0,  //win1 transprent mode & value(mode<<8 + value)
+    .activate    = FB_ACTIVATE_NOW,
+    .accel_flags = 0,
+    .vmode       = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_ops fb0_ops = {
-	.owner		= THIS_MODULE,
-	.fb_check_var	= fb0_check_var,
-	.fb_set_par = fb0_set_par,
-	.fb_blank   = fb0_blank,
-	.fb_pan_display = fb0_pan_display,
-    .fb_ioctl = fb0_ioctl,
-	.fb_setcolreg	= fb_setcolreg,
-	.fb_fillrect    = cfb_fillrect,
-	.fb_copyarea	= cfb_copyarea,
-	.fb_imageblit	= cfb_imageblit,
-	//.fb_cursor      = rk29_set_cursor,
+static struct fb_fix_screeninfo def_fix = {
+	.type		 = FB_TYPE_PACKED_PIXELS,
+	.type_aux	 = 0,
+	.xpanstep	 = 1,
+	.ypanstep	 = 1,
+	.ywrapstep	 = 0,
+	.accel		 = FB_ACCEL_NONE,
+	.visual 	 = FB_VISUAL_TRUECOLOR,
+		
 };
-int rk_fb_register(struct rk_fb_device_driver *fb_device_driver)
+
+static int request_fb_buffer(struct fb_info *fbi,int fb_id)
+{
+	struct resource *res;
+	int ret = 0;
+	switch(fb_id)
+	{
+		case 0:
+			res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "fb0 buf");
+			if (res == NULL)
+			{
+        		dev_err(&g_fb_pdev->dev, "failed to get win0 memory \n");
+        		ret = -ENOENT;
+    		}
+    		fbi->fix.smem_start = res->start;
+    		fbi->fix.smem_len = res->end - res->start + 1;
+    		fbi->screen_base = ioremap(res->start, fbi->fix.smem_len);
+    		memset(fbi->screen_base, 0, fbi->fix.smem_len);
+			break;
+		#ifdef CONFIG_FB_WORK_IPP
+		case 1:
+       		/* alloc ipp buf for rotate */
+    		res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "ipp buf");
+			if (res == NULL)
+    		{
+        		dev_err(&g_fb_pdev->dev, "failed to get win1 ipp memory \n");
+        		ret = -ENOENT;
+        	}
+    		fbi->fix.mmio_start = res->start;
+    		fbi->fix.mmio_len = res->end - res->start + 1;
+			break;
+		#endif
+		case 2:
+			res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "fb2 buf");
+			if (res == NULL)
+			{
+        		dev_err(&g_fb_pdev->dev, "failed to get win0 memory \n");
+        		ret = -ENOENT;
+    		}
+    		fbi->fix.smem_start = res->start;
+    		fbi->fix.smem_len = res->end - res->start + 1;
+    		fbi->screen_base = ioremap(res->start, fbi->fix.smem_len);
+    		memset(fbi->screen_base, 0, fbi->fix.smem_len);
+		    break;
+		default:
+			break;
+			
+	}
+	return ret;
+}
+int rk_fb_register(struct rk_lcdc_device_driver *dev_drv)
 {
 	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
-	int i=0;
-	if(NULL==fb_device_driver){
+	struct fb_info *fbi;
+	int i=0,ret = 0;
+	int lcdc_id = 0;
+	int win0_index = 0;
+	if(NULL==dev_drv){
 		printk("rk_fb_register lcdc register fail");
 		return -ENOENT;
-		}
+	}
 	for(i=0;i<RK30_MAX_LCDC_SUPPORT;i++){
 		if(NULL==fb_inf->rk_lcdc_device[i]){
-		fb_inf->rk_lcdc_device[i] = fb_device_driver;
+		fb_inf->rk_lcdc_device[i] = dev_drv;
 		fb_inf->rk_lcdc_device[i]->id = i;
 		fb_inf->num_lcdc++;
 		break;
@@ -325,101 +524,58 @@ int rk_fb_register(struct rk_fb_device_driver *fb_device_driver)
 		printk("rk_fb_register lcdc out of support %d",i);
 		return -ENOENT;
 	}
-	printk("%s>>>%s registered\n",__func__,fb_inf->rk_lcdc_device[i]->name);
-	/************fb0 set ***********/
-	fb_inf->fb0->fix.type        = FB_TYPE_PACKED_PIXELS;
-    fb_inf->fb0->fix.type_aux    = 0;
-    fb_inf->fb0->fix.xpanstep    = 1;
-    fb_inf->fb0->fix.ypanstep    = 1;
-    fb_inf->fb0->fix.ywrapstep   = 0;
-    fb_inf->fb0->fix.accel       = FB_ACCEL_NONE;
-    fb_inf->fb0->fix.visual      = FB_VISUAL_TRUECOLOR;
-
-    fb_inf->fb0->var.xres = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb0->var.yres = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb0->var.bits_per_pixel = 16;
-    //fb_inf->fb0_color_deepth = 0;
-    fb_inf->fb0->var.xres_virtual = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb0->var.yres_virtual = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb0->var.width = fb_inf->rk_lcdc_device[0]->screen.width;
-    fb_inf->fb0->var.height = fb_inf->rk_lcdc_device[0]->screen.height;
-    fb_inf->fb0->var.pixclock =fb_inf->rk_lcdc_device[0]->pixclock;
-    fb_inf->fb0->var.left_margin = fb_inf->rk_lcdc_device[0]->screen.left_margin;
-    fb_inf->fb0->var.right_margin = fb_inf->rk_lcdc_device[0]->screen.right_margin;
-    fb_inf->fb0->var.upper_margin = fb_inf->rk_lcdc_device[0]->screen.upper_margin;
-    fb_inf->fb0->var.lower_margin = fb_inf->rk_lcdc_device[0]->screen.lower_margin;
-    fb_inf->fb0->var.vsync_len = fb_inf->rk_lcdc_device[0]->screen.vsync_len;
-    fb_inf->fb0->var.hsync_len = fb_inf->rk_lcdc_device[0]->screen.hsync_len;
-    fb_inf->fb0->var.red    = def_rgb_16.red;
-    fb_inf->fb0->var.green  = def_rgb_16.green;
-    fb_inf->fb0->var.blue   = def_rgb_16.blue;
-    fb_inf->fb0->var.transp = def_rgb_16.transp;
-
-    fb_inf->fb0->var.nonstd      = 0;  //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format)
-    fb_inf->fb0->var.grayscale   = 0;  //win1 transprent mode & value(mode<<8 + value)
-    fb_inf->fb0->var.activate    = FB_ACTIVATE_NOW;
-    fb_inf->fb0->var.accel_flags = 0;
-    fb_inf->fb0->var.vmode       = FB_VMODE_NONINTERLACED;
-
-    fb_inf->fb0->fbops           = &fb0_ops;
-    fb_inf->fb0->flags           = FBINFO_FLAG_DEFAULT;
-    fb_inf->fb0->pseudo_palette  = fb_inf->rk_lcdc_device[0]->layer_par[0].pseudo_pal;
-
-
-	/************fb1 set ****************/
-	fb_inf->fb1->fix.type        = FB_TYPE_PACKED_PIXELS;
-    fb_inf->fb1->fix.type_aux    = 0;
-    fb_inf->fb1->fix.xpanstep    = 1;
-    fb_inf->fb1->fix.ypanstep    = 1;
-    fb_inf->fb1->fix.ywrapstep   = 0;
-    fb_inf->fb1->fix.accel       = FB_ACCEL_NONE;
-    fb_inf->fb1->fix.visual      = FB_VISUAL_TRUECOLOR;
-
-    fb_inf->fb1->var.xres = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb1->var.yres = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb1->var.bits_per_pixel = 16;
-    //fb_inf->fb1_color_deepth = 0;
-    fb_inf->fb1->var.xres_virtual = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb1->var.yres_virtual = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb1->var.width = fb_inf->rk_lcdc_device[0]->screen.width;
-    fb_inf->fb1->var.height = fb_inf->rk_lcdc_device[0]->screen.height;
-    //fb_inf->fb1->var.pixclock = div_u64(1000000000000llu, screen.pixclock);
-    fb_inf->fb1->var.left_margin = fb_inf->rk_lcdc_device[0]->screen.left_margin;
-    fb_inf->fb1->var.right_margin = fb_inf->rk_lcdc_device[0]->screen.right_margin;
-    fb_inf->fb1->var.upper_margin = fb_inf->rk_lcdc_device[0]->screen.upper_margin;
-    fb_inf->fb1->var.lower_margin = fb_inf->rk_lcdc_device[0]->screen.lower_margin;
-    fb_inf->fb1->var.vsync_len = fb_inf->rk_lcdc_device[0]->screen.vsync_len;
-    fb_inf->fb1->var.hsync_len = fb_inf->rk_lcdc_device[0]->screen.hsync_len;
-    fb_inf->fb1->var.red    = def_rgb_16.red;
-    fb_inf->fb1->var.green  = def_rgb_16.green;
-    fb_inf->fb1->var.blue   = def_rgb_16.blue;
-    fb_inf->fb1->var.transp = def_rgb_16.transp;
-
-    fb_inf->fb1->var.nonstd      = 0;  //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format)
-    fb_inf->fb1->var.grayscale   = 0;  //win1 transprent mode & value(mode<<8 + value)
-    fb_inf->fb1->var.activate    = FB_ACTIVATE_NOW;
-    fb_inf->fb1->var.accel_flags = 0;
-    fb_inf->fb1->var.vmode       = FB_VMODE_NONINTERLACED;
-
-    fb_inf->fb1->fbops           = &fb1_ops;
-    fb_inf->fb1->flags           = FBINFO_FLAG_DEFAULT;
-    fb_inf->fb1->pseudo_palette  = fb_inf->rk_lcdc_device[0]->layer_par[0].pseudo_pal;
-    fb_inf->fb1->screen_base     = 0;
-
+	lcdc_id = i;
+	
+	/************fb set,one layer one fb ***********/
+	for(i=0;i<dev_drv->num_layer;i++)
+	{
+		fbi= framebuffer_alloc(0, &g_fb_pdev->dev);
+		if(!fbi)
+		{
+			dev_err(&g_fb_pdev->dev,">> fb framebuffer_alloc fail!");
+			fbi = NULL;
+			ret = -ENOMEM;
+		}
+		fbi->var = def_var;
+		fbi->fix = def_fix;
+		sprintf(fbi->fix.id,"fb%d",fb_inf->num_fb);
+		fbi->var.xres = fb_inf->rk_lcdc_device[lcdc_id]->screen.x_res;
+		fbi->var.yres = fb_inf->rk_lcdc_device[lcdc_id]->screen.y_res;
+		fbi->var.bits_per_pixel = 16;
+		fbi->var.xres_virtual = fb_inf->rk_lcdc_device[lcdc_id]->screen.x_res;
+		fbi->var.yres_virtual = fb_inf->rk_lcdc_device[lcdc_id]->screen.y_res;
+		fbi->var.width = fb_inf->rk_lcdc_device[lcdc_id]->screen.width;
+		fbi->var.height = fb_inf->rk_lcdc_device[lcdc_id]->screen.height;
+		fbi->var.pixclock =fb_inf->rk_lcdc_device[lcdc_id]->pixclock;
+		fbi->var.left_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.left_margin;
+		fbi->var.right_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.right_margin;
+		fbi->var.upper_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.upper_margin;
+		fbi->var.lower_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.lower_margin;
+		fbi->var.vsync_len = fb_inf->rk_lcdc_device[lcdc_id]->screen.vsync_len;
+		fbi->var.hsync_len = fb_inf->rk_lcdc_device[lcdc_id]->screen.hsync_len;
+		fbi->fbops			 = &fb_ops[fb_inf->num_fb];
+		fbi->flags			 = FBINFO_FLAG_DEFAULT;
+		fbi->pseudo_palette  = fb_inf->rk_lcdc_device[lcdc_id]->layer_par[i].pseudo_pal;
+		request_fb_buffer(fbi,fb_inf->num_fb);
+		fb_inf->fb[fb_inf->num_fb] = fbi;
+		printk("%s>>>>>%s\n",__func__,fb_inf->fb[fb_inf->num_fb]->fix.id);
+		fb_inf->num_fb++;
+		
+	}
 #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)
-    fb0_set_par(fb_inf->fb0);
-    if (fb_prepare_logo(fb_inf->fb0, FB_ROTATE_UR)) {
+    fb_inf->fb[fb_inf->num_fb-2]->fbops->fb_set_par(fb_inf->fb[fb_inf->num_fb-2]);
+    if(fb_prepare_logo(fb_inf->fb[fb_inf->num_fb-2], FB_ROTATE_UR)) {
         /* Start display and show logo on boot */
-        fb_set_cmap(&fb_inf->fb0->cmap, fb_inf->fb0);
-        fb_show_logo(fb_inf->fb0, FB_ROTATE_UR);
-        fb0_blank(FB_BLANK_UNBLANK, fb_inf->fb0);
+        fb_set_cmap(&fb_inf->fb[fb_inf->num_fb-2]->cmap, fb_inf->fb[fb_inf->num_fb-2]);
+        fb_show_logo(fb_inf->fb[fb_inf->num_fb-2], FB_ROTATE_UR);
+        fb_inf->fb[fb_inf->num_fb-2]->fbops->fb_blank(FB_BLANK_UNBLANK, fb_inf->fb[fb_inf->num_fb-2]);
     }
 #endif
 	return 0;
 	
 	
 }
-int rk_fb_unregister(struct rk_fb_device_driver *fb_device_driver)
+int rk_fb_unregister(struct rk_lcdc_device_driver *fb_device_driver)
 {
 
 	struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
@@ -446,7 +602,6 @@ int rk_fb_unregister(struct rk_fb_device_driver *fb_device_driver)
 
 static int __devinit rk_fb_probe (struct platform_device *pdev)
 {
-	struct resource *res = NULL;
 	struct rk_fb_inf *fb_inf	= NULL;
 	int ret = 0;
 	g_fb_pdev=pdev;
@@ -459,30 +614,6 @@ static int __devinit rk_fb_probe (struct platform_device *pdev)
     }
     memset(fb_inf, 0, sizeof(struct rk_fb_inf));
 	platform_set_drvdata(pdev, fb_inf);
-	fb_inf->fb0 = framebuffer_alloc(0, &pdev->dev);
-	if(!fb_inf->fb0){
-		dev_err(&pdev->dev,">> fb0 framebuffer_alloc fail!");
-		fb_inf->fb1 = NULL;
-		ret = -ENOMEM;
-	}
-	strcpy(fb_inf->fb0->fix.id, "fb0");
-	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fb0 buf");
-    if (res == NULL)
-    {
-        dev_err(&pdev->dev, "failed to get win1 memory \n");
-        ret = -ENOENT;
-    }
-    fb_inf->fb0->fix.smem_start = res->start;
-    fb_inf->fb0->fix.smem_len = res->end - res->start + 1;
-    fb_inf->fb0->screen_base = ioremap(res->start, fb_inf->fb0->fix.smem_len);
-    memset(fb_inf->fb0->screen_base, 0, fb_inf->fb0->fix.smem_len);
-	fb_inf->fb1= framebuffer_alloc(0, &pdev->dev);
-	if(!fb_inf->fb1){
-		dev_err(&pdev->dev,">> fb1 framebuffer_alloc fail!");
-		fb_inf->fb1 = NULL;
-		ret = -ENOMEM;
-	}
-	strcpy(fb_inf->fb1->fix.id, "fb1");
 	printk("rk fb probe ok!\n");
     return 0;
 }
diff --git a/drivers/video/rockchip/rk_fb.h b/drivers/video/rockchip/rk_fb.h
index 1721f8558b31..35159c897949 100644
--- a/drivers/video/rockchip/rk_fb.h
+++ b/drivers/video/rockchip/rk_fb.h
@@ -18,22 +18,23 @@
 
 #define RK30_MAX_LCDC_SUPPORT	4
 #define RK30_MAX_LAYER_SUPPORT	4
+#define RK_MAX_FB_SUPPORT     4
 
 
 /********************************************************************
-**                            ºê¶¨Òå                                *
+**                          display output format                        *
 ********************************************************************/
-/* ÊäÍùÆÁµÄÊý¾Ý¸ñʽ */
+/* */
 #define OUT_P888            0
-#define OUT_P666            1    //666µÄÆÁ, ½ÓDATA0-17
-#define OUT_P565            2    //565µÄÆÁ, ½ÓDATA0-15
+#define OUT_P666            1    //
+#define OUT_P565            2    //
 #define OUT_S888x           4
 #define OUT_CCIR656         6
 #define OUT_S888            8
 #define OUT_S888DUMY        12
-#define OUT_P16BPP4         24  //Ä£Äⷽʽ,¿ØÖÆÆ÷²¢²»Ö§³Ö
-#define OUT_D888_P666       0x21  //666µÄÆÁ, ½ÓDATA2-7, DATA10-15, DATA18-23
-#define OUT_D888_P565       0x22  //565µÄÆÁ, ½ÓDATA3-7, DATA10-15, DATA19-23
+#define OUT_P16BPP4         24  //
+#define OUT_D888_P666       0x21  //
+#define OUT_D888_P565       0x22  //
 
 enum data_format{
 	ARGB888 = 0,
@@ -81,7 +82,7 @@ struct layer_par {
 	int id;
 };
 
-struct rk_fb_device_driver{
+struct rk_lcdc_device_driver{
 	const char *name;
 	int id;
 	struct device  *dev;
@@ -93,21 +94,20 @@ struct rk_fb_device_driver{
 	int (*ioctl)(unsigned int cmd, unsigned long arg,struct layer_par *layer_par);
 	int (*suspend)(struct layer_par *layer_par);
 	int (*resume)(struct layer_par *layer_par);
-	int (*blank)(struct rk_fb_device_driver *rk_fb_dev_drv,int layer_id,int blank_mode);
-	int (*set_par)(struct rk_fb_device_driver *rk_fb_dev_drv,int layer_id);
-	int (*pan)(struct rk_fb_device_driver *rk_fb_dev_drv,int layer_id);
+	int (*blank)(struct rk_lcdc_device_driver *rk_fb_dev_drv,int layer_id,int blank_mode);
+	int (*set_par)(struct rk_lcdc_device_driver *rk_fb_dev_drv,int layer_id);
+	int (*pan)(struct rk_lcdc_device_driver *rk_fb_dev_drv,int layer_id);
 	
 };
 
 struct rk_fb_inf {
-    struct fb_info *fb1;
-    struct fb_info *fb0;
-
-	struct rk_fb_device_driver *rk_lcdc_device[RK30_MAX_LCDC_SUPPORT];
-	
-	int num_lcdc;
+    struct fb_info *fb[RK_MAX_FB_SUPPORT];
+    int num_fb;
+    
+    struct rk_lcdc_device_driver *rk_lcdc_device[RK30_MAX_LCDC_SUPPORT];
+    int num_lcdc;
 };
-extern int rk_fb_register(struct rk_fb_device_driver *fb_device_driver);
-extern int rk_fb_unregister(struct rk_fb_device_driver *fb_device_driver);
+extern int rk_fb_register(struct rk_lcdc_device_driver *fb_device_driver);
+extern int rk_fb_unregister(struct rk_lcdc_device_driver *fb_device_driver);
 
 #endif