d0c3975d2e537c8a41c5dc4cc88b5b6f4e85c866
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / screen / rk_screen.c
1
2 #include <linux/rk_fb.h>
3 #include "lcd.h"
4 #if defined(CONFIG_RK_HDMI)
5 #include "../hdmi/rk_hdmi.h"
6 #endif
7
8
9
10
11
12
13 // if we use one lcdc with jetta for dual display,we need these configration
14 #if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) && defined(CONFIG_RK_HDMI)
15 static int set_scaler_info(struct rk29fb_screen *screen, u8 hdmi_resolution)
16 {
17         #if defined(CONFIG_RK610_LVDS)
18         screen->s_clk_inv = S_DCLK_POL;
19         screen->s_den_inv = 0;
20         screen->s_hv_sync_inv = 0;
21         #endif
22         
23         switch(hdmi_resolution)
24         {
25         case HDMI_1920x1080p_60Hz:
26                 /* Scaler Timing    */
27         #if defined(CONFIG_RK610_LVDS)
28                 screen->hdmi_resolution = hdmi_resolution;
29                 screen->s_pixclock = S_OUT_CLK;
30                 screen->s_hsync_len = S_H_PW;
31                 screen->s_left_margin = S_H_BP;
32                 screen->s_right_margin = S_H_FP;
33                 screen->s_hsync_len = S_H_PW;
34                 screen->s_upper_margin = S_V_BP;
35                 screen->s_lower_margin = S_V_FP;
36                 screen->s_vsync_len = S_V_PW;
37                 screen->s_hsync_st = S_H_ST;
38                 screen->s_vsync_st = S_V_ST;
39         #endif
40
41                 //bellow are for JettaB
42         #if defined(CONFIG_RK616_LVDS)
43                 screen->pll_cfg_val = S_PLL_CFG_VAL;
44                 screen->frac        = S_FRAC;
45                 screen->scl_vst     = S_SCL_VST;
46                 screen->scl_hst     = S_SCL_HST;
47                 screen->vif_vst     = S_VIF_VST;
48                 screen->vif_hst     = S_VIF_HST;
49         #endif
50                 break;
51         case HDMI_1920x1080p_50Hz:
52                 /* Scaler Timing    */
53         #if defined(CONFIG_RK610_LVDS)
54                 screen->hdmi_resolution = hdmi_resolution;
55                 screen->s_pixclock = S1_OUT_CLK;
56                 screen->s_hsync_len = S1_H_PW;
57                 screen->s_left_margin = S1_H_BP;
58                 screen->s_right_margin = S1_H_FP;
59                 screen->s_hsync_len = S1_H_PW;
60                 screen->s_upper_margin = S1_V_BP;
61                 screen->s_lower_margin = S1_V_FP;
62                 screen->s_vsync_len = S1_V_PW;
63                 screen->s_hsync_st = S1_H_ST;
64                 screen->s_vsync_st = S1_V_ST;
65         #endif
66
67         #if defined(CONFIG_RK616_LVDS)
68                 screen->pll_cfg_val = S1_PLL_CFG_VAL;
69                 screen->frac        = S1_FRAC;
70                 screen->scl_vst     = S1_SCL_VST;
71                 screen->scl_hst     = S1_SCL_HST;
72                 screen->vif_vst     = S1_VIF_VST;
73                 screen->vif_hst     = S1_VIF_HST;
74         #endif
75                 break;
76         case HDMI_1280x720p_60Hz:
77                 /* Scaler Timing    */
78         #if defined(CONFIG_RK610_LVDS)
79                 screen->hdmi_resolution = hdmi_resolution;
80                 screen->s_pixclock = S2_OUT_CLK;
81                 screen->s_hsync_len = S2_H_PW;
82                 screen->s_left_margin = S2_H_BP;
83                 screen->s_right_margin = S2_H_FP;
84                 screen->s_hsync_len = S2_H_PW;
85                 screen->s_upper_margin = S2_V_BP;
86                 screen->s_lower_margin = S2_V_FP;
87                 screen->s_vsync_len = S2_V_PW;
88                 screen->s_hsync_st = S2_H_ST;
89                 screen->s_vsync_st = S2_V_ST;
90         #endif
91         
92         #if defined(CONFIG_RK616_LVDS)
93                 screen->pll_cfg_val = S2_PLL_CFG_VAL;
94                 screen->frac        = S2_FRAC;
95                 screen->scl_vst     = S2_SCL_VST;
96                 screen->scl_hst     = S2_SCL_HST;
97                 screen->vif_vst     = S2_VIF_VST;
98                 screen->vif_hst     = S2_VIF_HST;
99         #endif
100                 break;
101         case HDMI_1280x720p_50Hz:
102                 /* Scaler Timing    */
103         #if defined(CONFIG_RK610_LVDS)
104                 screen->hdmi_resolution = hdmi_resolution;
105                 screen->s_pixclock = S3_OUT_CLK;
106                 screen->s_hsync_len = S3_H_PW;
107                 screen->s_left_margin = S3_H_BP;
108                 screen->s_right_margin = S3_H_FP;
109                 screen->s_hsync_len = S3_H_PW;
110                 screen->s_upper_margin = S3_V_BP;
111                 screen->s_lower_margin = S3_V_FP;
112                 screen->s_vsync_len = S3_V_PW;
113                 screen->s_hsync_st = S3_H_ST;
114                 screen->s_vsync_st = S3_V_ST;
115         #endif
116         
117         #if defined(CONFIG_RK616_LVDS)
118                 screen->pll_cfg_val = S3_PLL_CFG_VAL;
119                 screen->frac        = S3_FRAC;
120                 screen->scl_vst     = S3_SCL_VST;
121                 screen->scl_hst     = S3_SCL_HST;
122                 screen->vif_vst     = S3_VIF_VST;
123                 screen->vif_hst     = S3_VIF_HST;
124         #endif
125                 break;
126         case HDMI_720x576p_50Hz_4_3:
127         case HDMI_720x576p_50Hz_16_9:
128                 /* Scaler Timing    */
129         #if defined(CONFIG_RK610_LVDS)
130                 screen->hdmi_resolution = hdmi_resolution;
131                 screen->s_pixclock = S4_OUT_CLK;
132                 screen->s_hsync_len = S4_H_PW;
133                 screen->s_left_margin = S4_H_BP;
134                 screen->s_right_margin = S4_H_FP;
135                 screen->s_hsync_len = S4_H_PW;
136                 screen->s_upper_margin = S4_V_BP;
137                 screen->s_lower_margin = S4_V_FP;
138                 screen->s_vsync_len = S4_V_PW;
139                 screen->s_hsync_st = S4_H_ST;
140                 screen->s_vsync_st = S4_V_ST;
141         #endif
142         
143         #if defined(CONFIG_RK616_LVDS)
144                 screen->pll_cfg_val = S4_PLL_CFG_VAL;
145                 screen->frac        = S4_FRAC;
146                 screen->scl_vst     = S4_SCL_VST;
147                 screen->scl_hst     = S4_SCL_HST;
148                 screen->vif_vst     = S4_VIF_VST;
149                 screen->vif_hst     = S4_VIF_HST;
150         #endif
151                 break;
152                 
153         case HDMI_720x480p_60Hz_16_9:
154         case HDMI_720x480p_60Hz_4_3:
155                 /* Scaler Timing    */
156         #if defined(CONFIG_RK610_LVDS)
157                 screen->hdmi_resolution = hdmi_resolution;
158                 screen->s_pixclock = S5_OUT_CLK;
159                 screen->s_hsync_len = S5_H_PW;
160                 screen->s_left_margin = S5_H_BP;
161                 screen->s_right_margin = S5_H_FP;
162                 screen->s_hsync_len = S5_H_PW;
163                 screen->s_upper_margin = S5_V_BP;
164                 screen->s_lower_margin = S5_V_FP;
165                 screen->s_vsync_len = S5_V_PW;
166                 screen->s_hsync_st = S5_H_ST;
167                 screen->s_vsync_st = S5_V_ST;
168         #endif
169         
170         #if defined(CONFIG_RK616_LVDS)
171                 screen->pll_cfg_val = S5_PLL_CFG_VAL;
172                 screen->frac        = S5_FRAC;
173                 screen->scl_vst     = S5_SCL_VST;
174                 screen->scl_hst     = S5_SCL_HST;
175                 screen->vif_vst     = S5_VIF_VST;
176                 screen->vif_hst     = S5_VIF_HST;
177         #endif
178                 break;
179         default :
180                 printk("%s lcd not support dual display at this hdmi resolution %d \n",__func__,hdmi_resolution);
181                 return -1;
182                 break;
183         }
184         
185         return 0;
186 }
187 #else
188 #define set_scaler_info  NULL
189 #endif
190
191 void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info )
192 {
193
194 #if defined(RK_USE_SCREEN_ID)
195         set_lcd_info_by_id(screen,lcd_info);
196 #else
197         screen->type = SCREEN_TYPE;
198         screen->face = OUT_FACE;
199         screen->lvds_format = LVDS_FORMAT;  //lvds data format
200
201         
202         screen->x_res = H_VD;           //screen resolution
203         screen->y_res = V_VD;
204
205         screen->width = LCD_WIDTH;
206         screen->height = LCD_HEIGHT;
207
208     
209         screen->lcdc_aclk = LCDC_ACLK; // Timing 
210         screen->pixclock = DCLK;
211         screen->left_margin = H_BP;
212         screen->right_margin = H_FP;
213         screen->hsync_len = H_PW;
214         screen->upper_margin = V_BP;
215         screen->lower_margin = V_FP;
216         screen->vsync_len = V_PW;
217
218         
219         screen->pin_hsync = HSYNC_POL; //Pin polarity 
220         screen->pin_vsync = VSYNC_POL;
221         screen->pin_den = DEN_POL;
222         screen->pin_dclk = DCLK_POL;
223
224         
225         screen->swap_rb = SWAP_RB; // Swap rule 
226         screen->swap_rg = SWAP_RG;
227         screen->swap_gb = SWAP_GB;
228         screen->swap_delta = 0;
229         screen->swap_dumy = 0;
230         
231 #if defined(CONFIG_MIPI_DSI)
232        /* MIPI DSI */
233 #if defined(MIPI_DSI_LANE)       
234     screen->dsi_lane = MIPI_DSI_LANE;
235 #else
236         screen->dsi_lane = 4;
237 #endif
238     //screen->dsi_video_mode = MIPI_DSI_VIDEO_MODE;
239 #if defined(MIPI_DSI_HS_CLK)    
240     screen->hs_tx_clk = MIPI_DSI_HS_CLK;
241 #else    
242     screen->hs_tx_clk = 1000000000;        //1GHz
243 #endif
244
245 #endif
246
247
248         /* Operation function*/
249 #if defined(RK_SCREEN_INIT)  //some screen need to init by spi or i2c
250         screen->init = rk_lcd_init;
251         screen->standby = rk_lcd_standby;
252         if(lcd_info)
253                 gLcd_info = lcd_info;   
254 #endif
255
256 #if defined(USE_RK_DSP_LUT)
257         screen->dsp_lut = dsp_lut;
258 #endif
259         
260 #if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) 
261         screen->sscreen_get = set_scaler_info;
262 #endif
263
264 #endif
265
266 }
267
268 size_t get_fb_size(void)
269 {
270         size_t size = 0;
271         #if defined(CONFIG_THREE_FB_BUFFER)
272                 size = ((H_VD)*(V_VD)<<2)* 3; //three buffer
273         #else
274                 size = ((H_VD)*(V_VD)<<2)<<1; //two buffer
275         #endif
276         return ALIGN(size,SZ_1M);
277 }