rk30 fb:can show android logo
authoryxj <yxj@I7-CH.(none)>
Sat, 24 Mar 2012 07:32:50 +0000 (15:32 +0800)
committeryxj <yxj@I7-CH.(none)>
Sat, 24 Mar 2012 07:35:06 +0000 (15:35 +0800)
 add err-handling function
 use ARGB888 to show android

drivers/video/rockchip/chips/rk30_lcdc.c
drivers/video/rockchip/chips/rk30_lcdc.h
drivers/video/rockchip/rk_fb.c

index 98b6db5a85ac95248ae757bc556d26ea9d58c06d..149f24dd4236b25d49fdd7a1e98b60e4e7c030ab 100644 (file)
@@ -34,7 +34,7 @@
 
 
 
-static int dbg_thresd =1;
+static int dbg_thresd = 0;
 #define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)
 
 
@@ -75,38 +75,45 @@ int rk30_lcdc_deinit(void)
     return 0;
 }
 
-void rk30_load_screen(struct rk30_lcdc_device*lcdc_dev, bool initscreen)
+int rk30_load_screen(struct rk30_lcdc_device*lcdc_dev, bool initscreen)
 {
-    int ret = -EINVAL;
-    rk_screen *screen = to_screen(lcdc_dev);
-    u16 face;
-    u16 mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend;
-    u16 right_margin = screen->right_margin;
+       int ret = -EINVAL;
+       rk_screen *screen = to_screen(lcdc_dev);
+       u16 face;
+       u16 mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend;
+       u16 right_margin = screen->right_margin;
        u16 lower_margin = screen->lower_margin;
-    u16 x_res = screen->x_res, y_res = screen->y_res;
-    u32 aclk_rate = 150000000;
+       u16 x_res = screen->x_res, y_res = screen->y_res;
+       u32 aclk_rate = 150000000;
 
-    // set the rgb or mcu
+       // set the rgb or mcu
 
        if(screen->type==SCREEN_MCU)
        {
-       LcdMskReg(lcdc_dev, MCU_CTRL, m_MCU_OUTPUT_SELECT,v_MCU_OUTPUT_SELECT(1));
+               LcdMskReg(lcdc_dev, MCU_CTRL, m_MCU_OUTPUT_SELECT,v_MCU_OUTPUT_SELECT(1));
                // set out format and mcu timing
-                mcu_total  = (screen->mcu_wrperiod*150*1000)/1000000;
-       if(mcu_total>31)    mcu_total = 31;
-               if(mcu_total<3)     mcu_total = 3;
-       mcu_rwstart = (mcu_total+1)/4 - 1;
-       mcu_rwend = ((mcu_total+1)*3)/4 - 1;
-       mcu_csstart = (mcu_rwstart>2) ? (mcu_rwstart-3) : (0);
-       mcu_csend = (mcu_rwend>15) ? (mcu_rwend-1) : (mcu_rwend);
-
-       DBG(">> mcu_total=%d, mcu_rwstart=%d, mcu_csstart=%d, mcu_rwend=%d, mcu_csend=%d \n",
-        mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend);
+               mcu_total  = (screen->mcu_wrperiod*150*1000)/1000000;
+               if(mcu_total>31)    
+                       mcu_total = 31;
+               if(mcu_total<3)    
+                       mcu_total = 3;
+               mcu_rwstart = (mcu_total+1)/4 - 1;
+               mcu_rwend = ((mcu_total+1)*3)/4 - 1;
+               mcu_csstart = (mcu_rwstart>2) ? (mcu_rwstart-3) : (0);
+               mcu_csend = (mcu_rwend>15) ? (mcu_rwend-1) : (mcu_rwend);
+
+               DBG(">> mcu_total=%d, mcu_rwstart=%d, mcu_csstart=%d, mcu_rwend=%d, mcu_csend=%d \n",
+                       mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend);
 
                // set horizontal & vertical out timing
        
-           right_margin = x_res/6; 
+               right_margin = x_res/6; 
                screen->pixclock = 150000000; //mcu fix to 150 MHz
+               LcdMskReg(lcdc_dev, MCU_CTRL,m_MCU_CS_ST | m_MCU_CS_END| m_MCU_RW_ST | m_MCU_RW_END |
+                       m_MCU_WRITE_PERIOD | m_MCU_HOLDMODE_SELECT | m_MCU_HOLDMODE_FRAME_ST,
+                       v_MCU_CS_ST(mcu_csstart) | v_MCU_CS_END(mcu_csend) | v_MCU_RW_ST(mcu_rwstart) |
+                       v_MCU_RW_END(mcu_rwend) |  v_MCU_WRITE_PERIOD(mcu_total) |
+                       v_MCU_HOLDMODE_SELECT((SCREEN_MCU==screen->type)?(1):(0)) | v_MCU_HOLDMODE_FRAME_ST(0));
        
        }
 
@@ -144,61 +151,65 @@ void rk30_load_screen(struct rk30_lcdc_device*lcdc_dev, bool initscreen)
     }
 
        //use default overlay,set vsyn hsync den dclk polarity
-     LcdMskReg(lcdc_dev, DSP_CTRL0,m_DISPLAY_FORMAT | m_HSYNC_POLARITY | m_VSYNC_POLARITY 
-               | m_DEN_POLARITY |m_DCLK_POLARITY,
-        v_DISPLAY_FORMAT(face) | v_HSYNC_POLARITY(screen->pin_hsync) | v_VSYNC_POLARITY(screen->pin_vsync) |
-        v_DEN_POLARITY(screen->pin_den) | v_DCLK_POLARITY(screen->pin_dclk));
+       LcdMskReg(lcdc_dev, DSP_CTRL0,m_DISPLAY_FORMAT | m_HSYNC_POLARITY | m_VSYNC_POLARITY |
+               m_DEN_POLARITY |m_DCLK_POLARITY,v_DISPLAY_FORMAT(face) | 
+               v_HSYNC_POLARITY(screen->pin_hsync) | v_VSYNC_POLARITY(screen->pin_vsync) |
+               v_DEN_POLARITY(screen->pin_den) | v_DCLK_POLARITY(screen->pin_dclk));
 
        //set background color to black,set swap according to the screen panel
-     LcdMskReg(lcdc_dev, DSP_CTRL1, m_BG_COLOR | m_OUTPUT_RB_SWAP | m_OUTPUT_RG_SWAP | m_DELTA_SWAP | 
+       LcdMskReg(lcdc_dev, DSP_CTRL1, m_BG_COLOR | m_OUTPUT_RB_SWAP | m_OUTPUT_RG_SWAP | m_DELTA_SWAP | 
                m_DUMMY_SWAP,  v_BG_COLOR(0x000000) | v_OUTPUT_RB_SWAP(screen->swap_rb) | 
                v_OUTPUT_RG_SWAP(screen->swap_rg) | v_DELTA_SWAP(screen->swap_delta) | v_DUMMY_SWAP(screen->swap_dumy) );
 
        
-    LcdWrReg(lcdc_dev, DSP_HTOTAL_HS_END,v_HSYNC(screen->hsync_len) |
+       LcdWrReg(lcdc_dev, DSP_HTOTAL_HS_END,v_HSYNC(screen->hsync_len) |
              v_HORPRD(screen->hsync_len + screen->left_margin + x_res + right_margin));
-    LcdWrReg(lcdc_dev, DSP_HACT_ST_END, v_HAEP(screen->hsync_len + screen->left_margin + x_res) |
+       LcdWrReg(lcdc_dev, DSP_HACT_ST_END, v_HAEP(screen->hsync_len + screen->left_margin + x_res) |
              v_HASP(screen->hsync_len + screen->left_margin));
 
-    LcdWrReg(lcdc_dev, DSP_VTOTAL_VS_END, v_VSYNC(screen->vsync_len) |
+       LcdWrReg(lcdc_dev, DSP_VTOTAL_VS_END, v_VSYNC(screen->vsync_len) |
               v_VERPRD(screen->vsync_len + screen->upper_margin + y_res + lower_margin));
-    LcdWrReg(lcdc_dev, DSP_VACT_ST_END,  v_VAEP(screen->vsync_len + screen->upper_margin+y_res)|
+       LcdWrReg(lcdc_dev, DSP_VACT_ST_END,  v_VAEP(screen->vsync_len + screen->upper_margin+y_res)|
               v_VASP(screen->vsync_len + screen->upper_margin));
        // let above to take effect
-    LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
+       LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
                                                         
-    if(initscreen == 0)    //not init
-    {
-        clk_disable(lcdc_dev->dclk);
-      //  clk_disable(inf->aclk);
-    }
-
  
 
-    ret = clk_set_rate(lcdc_dev->dclk, screen->pixclock);
-    if(ret)
-    {
-        printk(KERN_ERR ">>>>>> set lcdc dclk failed\n");
-    }
-    lcdc_dev->driver->pixclock = lcdc_dev->pixclock = div_u64(1000000000000llu, clk_get_rate(lcdc_dev->dclk));
-    if(initscreen)
-    {
-        if(screen->lcdc_aclk){
-           aclk_rate = screen->lcdc_aclk;
-        }
-        ret = clk_set_rate(lcdc_dev->aclk, aclk_rate);
-        if(ret){
-            printk(KERN_ERR ">>>>>> set lcdc aclk failed\n");
-        }
-        clk_enable(lcdc_dev->aclk);
-    }
+       ret = clk_set_rate(lcdc_dev->dclk, screen->pixclock);
+       if(ret)
+       {
+               printk(KERN_ERR ">>>>>> set lcdc dclk failed\n");
+       }
+       else
+       {
+               lcdc_dev->driver->pixclock = lcdc_dev->pixclock = div_u64(1000000000000llu, clk_get_rate(lcdc_dev->dclk));
+               clk_enable(lcdc_dev->dclk);
+               printk("%s: dclk:%lu ",lcdc_dev->driver->name,clk_get_rate(lcdc_dev->dclk));
+       }
+       if(initscreen)
+       {
+               if(screen->lcdc_aclk)
+               {
+                       ret = clk_set_rate(lcdc_dev->aclk, screen->lcdc_aclk);
+                       if(ret)
+                       {
+                               printk(KERN_ERR ">>>>>> set lcdc aclk  rate failed\n");
+                       }
+                       else
+                       {
+                               clk_enable(lcdc_dev->aclk);
+                               printk("aclk:%lu\n",clk_get_rate(lcdc_dev->aclk));
+                       }
+               }
+               
+       }
   
-    clk_enable(lcdc_dev->dclk);
    
-    if(screen->init)
-    {
-       screen->init();
-    }
+       if(screen->init)
+       {
+               screen->init();
+       }
        printk("%s>>>>>ok!\n",__func__);
 }
 
@@ -324,7 +335,7 @@ static  int win0_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
             break;
         case RGB888:  //rgb888
             LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB888_VIRWIDTH(xvir));
-            LcdMskReg(lcdc_dev,SYS_CTRL1,m_W0_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
+            LcdMskReg(lcdc_dev,SYS_CTRL1,m_W0_RGB_RB_SWAP,v_W0_RGB_RB_SWAP(1));
             break;
         case RGB565:  //rgb565
             LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB565_VIRWIDTH(xvir));
@@ -396,11 +407,11 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     {
         case ARGB888:
             LcdWrReg(lcdc_dev, WIN1_VIR,v_ARGB888_VIRWIDTH(xvir));
-            LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
+            //LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
             break;
         case RGB888:  //rgb888
             LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB888_VIRWIDTH(xvir));
-            LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
+           // LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
             break;
         case RGB565:  //rgb565
             LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB565_VIRWIDTH(xvir));
@@ -532,65 +543,65 @@ static int __devinit rk30_lcdc_probe (struct platform_device *pdev)
 
        /*************Malloc rk30lcdc_inf and set it to pdev for drvdata**********/
        inf = kmalloc(sizeof(struct lcdc_info), GFP_KERNEL);
-    if(!inf)
-    {
-        dev_err(&pdev->dev, ">>rk30 lcdc inf kmalloc fail!");
-        ret = -ENOMEM;
-    }
+       if(!inf)
+       {
+               dev_err(&pdev->dev, ">>rk30 lcdc inf kmalloc fail!");
+               return -ENOMEM;
+       }
        memset(inf, 0, sizeof(struct lcdc_info));
        platform_set_drvdata(pdev, inf);
 
-       /****************       get lcdc0 reg           *************************/
-        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lcdc0 reg");
-    if (res == NULL)
-    {
-        dev_err(&pdev->dev, "failed to get memory registers\n");
-        ret = -ENOENT;
-               //goto release_drvdata;
-    }
-    inf->lcdc0.reg_phy_base = res->start;
-    inf->lcdc0.len = (res->end - res->start) + 1;
-    mem = request_mem_region(inf->lcdc0.reg_phy_base, inf->lcdc0.len, pdev->name);
-    if (mem == NULL)
-    {
-        dev_err(&pdev->dev, "failed to get memory region\n");
-        ret = -ENOENT;
-               //goto release_drvdata;
-    }
-    inf->lcdc0.reg_vir_base = ioremap(inf->lcdc0.reg_phy_base, inf->lcdc0.len);
-    if (inf->lcdc0.reg_vir_base == NULL)
-    {
-        dev_err(&pdev->dev, "ioremap() of registers failed\n");
-        ret = -ENXIO;
-               //goto release_drvdata;
-    }
-    inf->lcdc0.preg = (LCDC_REG*)inf->lcdc0.reg_vir_base;
+       /****************get lcdc0 reg  *************************/
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lcdc0 reg");
+       if (res == NULL)
+       {
+               dev_err(&pdev->dev, "failed to get io resource for lcdc0 \n");
+               ret = -ENOENT;
+               goto err0;
+       }
+       inf->lcdc0.reg_phy_base = res->start;
+       inf->lcdc0.len = (res->end - res->start) + 1;
+       mem = request_mem_region(inf->lcdc0.reg_phy_base, inf->lcdc0.len, pdev->name);
+       if (mem == NULL)
+       {
+               dev_err(&pdev->dev, "failed to request mem region for lcdc0\n");
+               ret = -ENOENT;
+               goto err0;
+       }
+       inf->lcdc0.reg_vir_base = ioremap(inf->lcdc0.reg_phy_base, inf->lcdc0.len);
+       if (inf->lcdc0.reg_vir_base == NULL)
+       {
+               dev_err(&pdev->dev, "ioremap of lcdc0 register failed\n");
+               ret = -ENXIO;
+               goto err1;
+       }
+       inf->lcdc0.preg = (LCDC_REG*)inf->lcdc0.reg_vir_base;
        printk("lcdc0 reg_phy_base = 0x%08x,reg_vir_base:0x%p\n", inf->lcdc0.reg_phy_base, inf->lcdc0.preg);
        /****************       get lcdc1 reg           *************************/
-        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lcdc1 reg");
-    if (res == NULL)
-    {
-        dev_err(&pdev->dev, "failed to get memory registers\n");
-        ret = -ENOENT;
-               //goto release_drvdata;
-    }
-    inf->lcdc1.reg_phy_base = res->start;
-    inf->lcdc1.len = (res->end - res->start) + 1;
-    mem = request_mem_region(inf->lcdc1.reg_phy_base, inf->lcdc1.len, pdev->name);
-    if (mem == NULL)
-    {
-        dev_err(&pdev->dev, "failed to get memory region\n");
-        ret = -ENOENT;
-               //goto release_drvdata;
-    }
-    inf->lcdc1.reg_vir_base = ioremap(inf->lcdc1.reg_phy_base, inf->lcdc1.len);
-    if (inf->lcdc1.reg_vir_base == NULL)
-    {
-        dev_err(&pdev->dev, "ioremap() of registers failed\n");
-        ret = -ENXIO;
-               //goto release_drvdata;
-    }
-    inf->lcdc1.preg = (LCDC_REG*)inf->lcdc1.reg_vir_base;
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lcdc1 reg");
+       if (res == NULL)
+       {
+               dev_err(&pdev->dev, "failed to get io resource for lcdc1\n");
+               ret = -ENOENT;
+               goto err2;
+       }
+       inf->lcdc1.reg_phy_base = res->start;
+       inf->lcdc1.len = (res->end - res->start) + 1;
+       mem = request_mem_region(inf->lcdc1.reg_phy_base, inf->lcdc1.len, pdev->name);
+       if (mem == NULL)
+       {
+               dev_err(&pdev->dev, "failed to request memory region of lcdc1\n");
+               ret = -ENOENT;
+               goto err2;
+       }
+       inf->lcdc1.reg_vir_base = ioremap(inf->lcdc1.reg_phy_base, inf->lcdc1.len);
+       if (inf->lcdc1.reg_vir_base == NULL)
+       {
+                       dev_err(&pdev->dev, "ioremap of lcdc1 register failed\n");
+               ret = -ENXIO;
+               goto err3;
+       }
+       inf->lcdc1.preg = (LCDC_REG*)inf->lcdc1.reg_vir_base;
        printk("lcdc1 reg_phy_base = 0x%08x,reg_vir_base:0x%p\n", inf->lcdc1.reg_phy_base, inf->lcdc1.preg);
        /*****************       LCDC driver            ********/
        inf->lcdc0.driver = &lcdc0_driver;
@@ -601,16 +612,43 @@ static int __devinit rk30_lcdc_probe (struct platform_device *pdev)
        set_lcd_info(&inf->lcdc0.driver->screen, NULL);
        set_lcd_info(&inf->lcdc1.driver->screen, NULL);
        /*****************      INIT LCDC               ********/
-       init_rk30_lcdc(inf);
-       rk30_load_screen(&inf->lcdc0,1);
+       ret = init_rk30_lcdc(inf);
+       if(ret < 0)
+       {
+               printk(KERN_ERR "init rk30 lcdc failed!\n");
+               goto err4;
+       }
+       ret = rk30_load_screen(&inf->lcdc0,1);
+       if(ret < 0)
+       {
+               printk(KERN_ERR "rk30 load screen for lcdc0 failed!\n");
+               goto err4;
+       }
        //rk30_load_screen(&inf->lcdc1,1);
        /*****************      lcdc register           ********/
-       rk_fb_register(&lcdc0_driver);
+       ret = rk_fb_register(&lcdc0_driver);
+       if(ret < 0)
+       {
+               printk(KERN_ERR "registe fb for lcdc0 failed!\n");
+               goto err4;
+       }
        //rk_fb_register(&lcdc1_driver);
 
-       
        printk("rk30 lcdc probe ok!\n");
+
        return 0;
+err4:
+       iounmap(inf->lcdc1.reg_vir_base);
+err3:  
+       release_mem_region(inf->lcdc1.reg_phy_base,inf->lcdc1.len);
+err2:
+       iounmap(inf->lcdc0.reg_vir_base);
+err1:
+       release_mem_region(inf->lcdc0.reg_phy_base,inf->lcdc0.len);
+err0:
+       platform_set_drvdata(pdev, NULL);
+       kfree(inf);
+       return ret;
     
 }
 static int __devexit rk30_lcdc_remove(struct platform_device *pdev)
index 68c6a8adb5305eca4941dff5a7af36a5f19a8c71..17cb647e05274645bc979123cefd1552b02767bb 100644 (file)
@@ -251,22 +251,23 @@ typedef volatile struct tagLCDC_REG
 
 
 //LCDC_MCU_TIMING_CTRL
-#define m_MCU_WRITE_PERIOD      (31<<0)
-#define m_MCU_CS_ST             (31<<5)
-#define m_MCU_CS_END            (31<<10)
-#define m_MCU_RW_ST             (31<<15)
-#define m_MCU_RW_END            (31<<20)
+#define m_MCU_WRITE_PERIOD      (0x3f<<0)
+#define m_MCU_CS_ST             (0xf<<6)
+#define m_MCU_CS_END            (0x3f<<10)
+#define m_MCU_RW_ST             (0xf<<16)
+#define m_MCU_RW_END            (0x3f<<20)
+#define m_MCU_BPS_CLK_SEL              (1<<26)
 #define m_MCU_HOLDMODE_SELECT     (1<<27)
 #define m_MCU_HOLDMODE_FRAME_ST   (1<<28)
 #define m_MCU_RS_SELECT            (1<<29)
 #define m_MCU_BYPASSMODE_SELECT   (1<<30)
 #define m_MCU_OUTPUT_SELECT        (1<<31)
-#define v_MCU_WRITE_PERIOD(x)      (((x)&31)<<0)
-#define v_MCU_CS_ST(x)          (((x)&31)<<5)
-#define v_MCU_CS_END(x)         (((x)&31)<<10)
-#define v_MCU_RW_ST(x)          (((x)&31)<<15)
-#define v_MCU_RW_END(x)         (((x)&31)<<20)
-#define v_MCU_HOLD_STATUS(x)          (((x)&1)<<26)
+#define v_MCU_WRITE_PERIOD(x)      (((x)&0x3f)<<0)
+#define v_MCU_CS_ST(x)          (((x)&0xf)<<6)
+#define v_MCU_CS_END(x)         (((x)&0x3f)<<10)
+#define v_MCU_RW_ST(x)          (((x)&0xf)<<16)
+#define v_MCU_RW_END(x)         (((x)&0x3f)<<20)
+#define v_MCU_BPS_CLK_SEL      (((x)&1)<<26)
 #define v_MCU_HOLDMODE_SELECT(x)     (((x)&1)<<27)
 #define v_MCU_HOLDMODE_FRAME_ST(x)   (((x)&1)<<28)
 #define v_MCU_RS_SELECT(x)            (((x)&1)<<29)
index 27668fbab83a510ade24b045b0f72e2cc586e926..14cea5338419745718349c34898b38c9827557dc 100644 (file)
@@ -113,6 +113,11 @@ static int rk_fb_release(struct fb_info *info,int user)
 
     return 0;
 }
+
+static int rk_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       return 0;
+}
 static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,
                        unsigned long arg)
 {
@@ -336,6 +341,7 @@ static int rk_fb_set_par(struct fb_info *info)
     }
        CHK_SUSPEND(inf);
        /* calculate y_offset,c_offset,line_length,cblen and crlen  */
+#if 0
     switch (data_format)
     {
        case HAL_PIXEL_FORMAT_RGBA_8888 :      // rgb
@@ -379,6 +385,22 @@ static int rk_fb_set_par(struct fb_info *info)
                printk("un supported format:0x%x\n",data_format);
             return -EINVAL;
     }
+#else
+       switch(var->bits_per_pixel)
+       {
+               case 32:
+                       par->format = ARGB888;
+                       fix->line_length = 4 * xvir;
+                       par->y_offset = (yoffset*xvir + xoffset)*4;
+                       break;
+               case 16:
+                       par->format = RGB565;
+                       fix->line_length = 2 * xvir;
+                       par->y_offset = (yoffset*xvir + xoffset)*2;
+                       break;
+                       
+       }
+#endif
 
     smem_len = fix->line_length * yvir + cblen + crlen;
    // map_size = PAGE_ALIGN(smem_len);
@@ -441,6 +463,7 @@ static struct fb_ops fb_ops = {
     .fb_set_par     = rk_fb_set_par,
     .fb_blank       = rk_fb_blank,
     .fb_ioctl       = rk_fb_ioctl,
+    .fb_pan_display = rk_pan_display,
     .fb_setcolreg   = fb_setcolreg,
     .fb_fillrect    = cfb_fillrect,
     .fb_copyarea    = cfb_copyarea,
@@ -509,6 +532,7 @@ static int request_fb_buffer(struct fb_info *fbi,int fb_id)
             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);
+           printk("phy:%x\n>>vir:%x\n",fbi->fix.smem_start,fbi->screen_base);
         #ifdef CONFIG_FB_WORK_IPP
         /* alloc ipp buf for rotate */
             res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "ipp buf");