rkfb: modify to compatible for platform which have only one lcdc but need to implemen...
[firefly-linux-kernel-4.4.55.git] / include / linux / rk_fb.h
index a33dfd7ac448bdfd64a6b561f1a4882fa8628a9c..0a24b049e7f6ff5a375830444d400da276ed1301 100644 (file)
 #ifndef __ARCH_ARM_MACH_RK30_FB_H
 #define __ARCH_ARM_MACH_RK30_FB_H
 
+#include <linux/fb.h>
 #include<linux/completion.h>
+#include<linux/spinlock.h>
 #include<asm/atomic.h>
 #include <mach/board.h>
-#include<linux/rk_screen.h>
 
 
 #define RK30_MAX_LCDC_SUPPORT  4
 #define RK30_MAX_LAYER_SUPPORT 4
-#define RK_MAX_FB_SUPPORT     4
+#define RK_MAX_FB_SUPPORT       8
 
 
 
 #define FB_WIMO_FLAG
 #endif
 #ifdef FB_WIMO_FLAG
-#define FB0_IOCTL_SET_BUF                                      0x6017
+#define FB0_IOCTL_SET_BUF                              0x6017
 #define FB0_IOCTL_COPY_CURBUF                          0x6018
 #define FB0_IOCTL_CLOSE_BUF                            0x6019
 #endif
 
-#define FB1_IOCTL_GET_PANEL_SIZE               0x5001
-#define FB1_IOCTL_SET_YUV_ADDR                 0x5002
+#define FBIOGET_PANEL_SIZE             0x5001
+#define FBIOSET_YUV_ADDR               0x5002
 //#define FB1_TOCTL_SET_MCU_DIR                        0x5003
-#define FB1_IOCTL_SET_ROTATE            0x5003
-#define FB1_IOCTL_SET_I2P_ODD_ADDR      0x5005
-#define FB1_IOCTL_SET_I2P_EVEN_ADDR     0x5006
-#define FB1_IOCTL_SET_WIN0_TOP          0x5018
+#define FBIOSET_ROTATE                 0x5003
+#define FB_IOCTL_SET_I2P_ODD_ADDR       0x5005
+#define FB_IOCTL_SET_I2P_EVEN_ADDR      0x5006
+#define FBIOSET_OVERLAY_STATE          0x5018
+#define FBIOSET_ENABLE                 0x5019  
+#define FBIOGET_ENABLE                 0x5020
 
 /********************************************************************
 **              display output interface supported by rk lcdc                       *
@@ -139,6 +142,16 @@ enum data_format{
        YUV444,
 };
 
+enum fb_win_map_order{
+       FB_DEFAULT_ORDER           = 0,
+       FB0_WIN2_FB1_WIN1_FB2_WIN0 = 012,
+       FB0_WIN1_FB1_WIN2_FB2_WIN0 = 021, 
+       FB0_WIN2_FB1_WIN0_FB2_WIN1 = 102,
+       FB0_WIN0_FB1_WIN2_FB2_WIN1 = 120,
+       FB0_WIN0_FB1_WIN1_FB2_WIN2 = 210,
+       FB0_WIN1_FB1_WIN0_FB2_WIN2 = 201,       
+};
+
 struct rk_fb_rgb {
        struct fb_bitfield      red;
        struct fb_bitfield      green;
@@ -158,8 +171,9 @@ typedef enum _TRSP_MODE
 } TRSP_MODE;
 
 struct layer_par {
-    const char *name;
+    char name[5];
     int id;
+    bool state;        //on or off
     u32        pseudo_pal[16];
     u32 y_offset;       //yuv/rgb offset  -->LCDC_WINx_YRGB_MSTx
     u32 c_offset;     //cb cr offset--->LCDC_WINx_CBR_MSTx
@@ -184,18 +198,29 @@ struct rk_lcdc_device_driver{
        int id;
        struct device  *dev;
        
-       struct layer_par *layer_par;
+       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;
+       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;
 
+       
+        char fb0_win_id;
+        char fb1_win_id;
+        char fb2_win_id;
+        struct mutex fb_win_id_mutex;
+       
        struct completion  frame_done;            //sync for pan_display,whe we set a new frame address to lcdc register,we must make sure the frame begain to display
        spinlock_t  cpl_lock;                    //lock for completion  frame done
        int first_frame ;
 
-       atomic_t in_suspend;                    //when enter suspend write or read lcdc register are forbidden
-       
+       struct rk29fb_info *screen_ctr_info;
+       int (*open)(struct rk_lcdc_device_driver *dev_drv,int layer_id,bool open);
+       int (*init_lcdc)(struct rk_lcdc_device_driver *dev_drv);
        int (*ioctl)(struct rk_lcdc_device_driver *dev_drv, unsigned int cmd,unsigned long arg,int layer_id);
        int (*suspend)(struct rk_lcdc_device_driver *dev_drv);
        int (*resume)(struct rk_lcdc_device_driver *dev_drv);
@@ -203,24 +228,35 @@ struct rk_lcdc_device_driver{
        int (*set_par)(struct rk_lcdc_device_driver *dev_drv,int layer_id);
        int (*pan_display)(struct rk_lcdc_device_driver *dev_drv,int layer_id);
        int (*get_disp_info)(struct rk_lcdc_device_driver *dev_drv,int layer_id);
-       int (*load_screen)(struct rk_lcdc_device_driver *lcdc_dev, bool initscreen);
+       int (*load_screen)(struct rk_lcdc_device_driver *dev_drv, bool initscreen);
+       int (*get_layer_state)(struct rk_lcdc_device_driver *dev_drv,int layer_id);
+       int (*ovl_mgr)(struct rk_lcdc_device_driver *dev_drv,int swap,bool set);  //overlay manager
+       int (*fps_mgr)(struct rk_lcdc_device_driver *dev_drv,int fps,bool set);
+       int (*fb_get_layer)(struct rk_lcdc_device_driver *dev_drv,const char *id);                                      //find layer for fb
+       int (*fb_layer_remap)(struct rk_lcdc_device_driver *dev_drv,enum fb_win_map_order order);
+       int (*set_dsp_lut)(struct rk_lcdc_device_driver *dev_drv,int *lut);
+       int (*read_dsp_lut)(struct rk_lcdc_device_driver *dev_drv,int *lut);
        
 };
 
 struct rk_fb_inf {
-    struct rk29fb_info * lcd_info;     //lcd io control info
-    struct fb_info *fb[RK_MAX_FB_SUPPORT];
-    int num_fb;
-    
-    struct rk_lcdc_device_driver *lcdc_dev_drv[RK30_MAX_LCDC_SUPPORT];
-    int num_lcdc;
+       struct rk29fb_info * mach_info;     //lcd io control info
+       struct fb_info *fb[RK_MAX_FB_SUPPORT];
+       int num_fb;
+
+       struct rk_lcdc_device_driver *lcdc_dev_drv[RK30_MAX_LCDC_SUPPORT];
+       int num_lcdc;
 
-    int video_mode;  //when play video set it to 1
+       int video_mode;  //when play video set it to 1
+       struct workqueue_struct *workqueue;
+       struct delayed_work delay_work;
 };
-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);
-extern int init_lcdc_device_driver(struct rk_lcdc_device_driver *def_drv,
-       struct rk_lcdc_device_driver *dev_drv,int id);
+extern int rk_fb_register(struct rk_lcdc_device_driver *dev_drv,
+       struct rk_lcdc_device_driver *def_drv,int id);
+extern int rk_fb_unregister(struct rk_lcdc_device_driver *dev_drv);
 extern int get_fb_layer_id(struct fb_fix_screeninfo *fix);
+extern struct rk_lcdc_device_driver * rk_get_lcdc_drv(char *name);
+extern int rk_fb_switch_screen(rk_screen *screen ,int enable ,int lcdc_id);
+extern int rk_fb_disp_scale(u8 scale_x, u8 scale_y,u8 lcdc_id);
 extern int rkfb_create_sysfs(struct fb_info *fbi);
 #endif