rkfb:add ioctl to get buffers number
authoryxj <yxj@rock-chips.com>
Sat, 14 Jul 2012 09:14:33 +0000 (17:14 +0800)
committeryxj <yxj@rock-chips.com>
Sat, 14 Jul 2012 09:16:02 +0000 (17:16 +0800)
arch/arm/mach-rk30/board-rk30-sdk.c
drivers/video/rockchip/chips/rk30_lcdc.c
drivers/video/rockchip/rk_fb.c
include/linux/fb.h
include/linux/rk_fb.h

index b3db166033feb697bed2f1dd92f88689723047c6..31911f44708a18e61315bde6bc769a5a9892137e 100755 (executable)
@@ -64,7 +64,7 @@
 #include "../../../drivers/staging/android/timed_gpio.h"
 #endif
 
-#define RK30_FB0_MEM_SIZE 8*SZ_1M
+#define RK30_FB0_MEM_SIZE 12*SZ_1M
 
 #ifdef CONFIG_VIDEO_RK29
 /*---------------- Camera Sensor Macro Define Begin  ------------------------*/
index 87d2ab494b613b2721ada25d40d99be7a8b1f945..21a1c4e5c0bf9a0ab0e13fc2ff0bd1ae5e80b955 100644 (file)
@@ -610,17 +610,19 @@ int rk30_lcdc_pan_display(struct rk_lcdc_device_driver * dev_drv,int layer_id)
                 
        }
 
-       spin_lock_irqsave(&dev_drv->cpl_lock,flags);
-       init_completion(&dev_drv->frame_done);
-       spin_unlock_irqrestore(&dev_drv->cpl_lock,flags);
-       timeout = wait_for_completion_timeout(&dev_drv->frame_done,msecs_to_jiffies(dev_drv->screen->ft+5));
-       if(!timeout&&(!dev_drv->frame_done.done))
+       if(dev_drv->num_buf < 3) //3buffer ,no need to  wait for sysn
        {
-               printk(KERN_ERR "wait for new frame start time out!\n");
-               return -ETIMEDOUT;
+               spin_lock_irqsave(&dev_drv->cpl_lock,flags);
+               init_completion(&dev_drv->frame_done);
+               spin_unlock_irqrestore(&dev_drv->cpl_lock,flags);
+               timeout = wait_for_completion_timeout(&dev_drv->frame_done,msecs_to_jiffies(dev_drv->screen->ft+5));
+               if(!timeout&&(!dev_drv->frame_done.done))
+               {
+                       printk(KERN_ERR "wait for new frame start time out!\n");
+                       return -ETIMEDOUT;
+               }
        }
        
-       
        return 0;
 }
 
@@ -804,10 +806,13 @@ static irqreturn_t rk30_lcdc_isr(int irq, void *dev_id)
        LcdMskReg(lcdc_dev, INT_STATUS, m_FRM_START_INT_CLEAR, v_FRM_START_INT_CLEAR(1));
        LCDC_REG_CFG_DONE();
        //LcdMskReg(lcdc_dev, INT_STATUS, m_LINE_FLAG_INT_CLEAR, v_LINE_FLAG_INT_CLEAR(1));
-       
-       spin_lock(&(lcdc_dev->driver.cpl_lock));
-       complete(&(lcdc_dev->driver.frame_done));
-       spin_unlock(&(lcdc_dev->driver.cpl_lock));
+       if(lcdc_dev->driver.num_buf < 3)  //three buffer ,no need to wait for sync
+       {
+               spin_lock(&(lcdc_dev->driver.cpl_lock));
+               complete(&(lcdc_dev->driver.frame_done));
+               spin_unlock(&(lcdc_dev->driver.cpl_lock));
+       }
        return IRQ_HANDLED;
 }
 
index 9ec9cd885821a647a083b22afbc9486f2a4175ac..a07940b493a223ca0ee703c79630d6d20e99fd9c 100644 (file)
@@ -249,6 +249,7 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,unsigned long arg)
        int layer_id = get_fb_layer_id(&info->fix);
        int enable; // enable fb:1 enable;0 disable 
        int ovl;        //overlay:0 win1 on the top of win0;1,win0 on the top of win1
+       int num_buf; //buffer_number
        void __user *argp = (void __user *)arg;
        
        switch(cmd)
@@ -278,10 +279,17 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,unsigned long arg)
                        if (copy_from_user(&ovl, argp, sizeof(ovl)))
                                return -EFAULT;
                        dev_drv->ovl_mgr(dev_drv,ovl,1);
+                       break;
                case FBIOGET_OVERLAY_STATE:
                        ovl = dev_drv->ovl_mgr(dev_drv,0,0);
                        if (copy_to_user(argp, &ovl, sizeof(ovl)))
                                return -EFAULT;
+                       break;
+               case FBIOPUT_NUM_BUFFERS:
+                       if (copy_from_user(&num_buf, argp, sizeof(num_buf)))
+                               return -EFAULT;
+                       dev_drv->num_buf = num_buf;
+                       break;
                case FBIOGET_SCREEN_STATE:
                case FBIOPUT_SET_CURSOR_EN:
                case FBIOPUT_SET_CURSOR_POS:
index 0dcb6b4dc8d6f3fc7c058c3be3574df9609087de..97e479bdc8c59c0bcfafe9b7288ee622002c8f5e 100755 (executable)
@@ -27,6 +27,8 @@
 #define FBIOPUT_SET_CURSOR_CMAP    0x460c
 #define FBIOPUT_GET_CURSOR_RESOLUTION    0x460d
 #define FBIOPUT_GET_CURSOR_EN    0x460e
+#define FBIOPUT_NUM_BUFFERS    0x460f
+
 #ifdef __KERNEL__
 #define FBIO_CURSOR            _IOWR('F', 0x08, struct fb_cursor_user)
 #else
index 70ae80ee99d0de22692605e8a72a6900dbb323d5..1b8663626f45ae7c8fdf5f1e6ebc94d719efdfbc 100644 (file)
@@ -191,6 +191,7 @@ struct rk_lcdc_device_driver{
        struct layer_par *layer_par[RK_MAX_FB_SUPPORT];
        struct layer_par *def_layer_par;
        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;
        u32 pixclock;