#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 *
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;
} 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
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);
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