import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / r61408_wvga_dsi_cmd / r61408_wvga_dsi_cmd.c
1 #include <linux/string.h>
2
3 #include "lcm_drv.h"
4
5 // ---------------------------------------------------------------------------
6 // Local Constants
7 // ---------------------------------------------------------------------------
8
9 #define FRAME_WIDTH (480)
10 #define FRAME_HEIGHT (800)
11
12 // ---------------------------------------------------------------------------
13 // Local Variables
14 // ---------------------------------------------------------------------------
15
16 static LCM_UTIL_FUNCS lcm_util = {0};
17
18 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
19
20 #define UDELAY(n) (lcm_util.udelay(n))
21 #define MDELAY(n) (lcm_util.mdelay(n))
22
23
24 // ---------------------------------------------------------------------------
25 // Local Functions
26 // ---------------------------------------------------------------------------
27
28 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
29 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
30 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
31 #define read_reg lcm_util.dsi_read_reg()
32
33
34 #define LCM_DSI_CMD_MODE
35
36 static void init_lcm_registers(void)
37 {
38 unsigned int data_array[16];
39 #if defined(LCM_DSI_CMD_MODE)
40 {
41 data_array[0] = 0x04B02300;
42 dsi_set_cmdq(&data_array, 1, 1);
43 MDELAY(50);
44 #if 1
45 data_array[0] = 0x00032902;
46 data_array[1] = 0x000002B3;
47 dsi_set_cmdq(&data_array, 2, 1);
48 MDELAY(50);
49
50 data_array[0] = 0x00032902;//DSI control
51 data_array[1] = 0x008352B6;
52 dsi_set_cmdq(&data_array, 2, 1);
53 MDELAY(50);
54
55 data_array[0] = 0x00052902;//MDDI
56 data_array[1] = 0x118000B7;
57 data_array[2] = 0x00000025;
58 dsi_set_cmdq(&data_array, 3, 1);
59 MDELAY(50);
60
61 data_array[0] = 0x00BD2300; //resizing
62 dsi_set_cmdq(&data_array, 1, 1);
63 MDELAY(50);
64
65 data_array[0] = 0x00032902; // panel driving setting 1
66 data_array[1] = 0x008702C0;
67 dsi_set_cmdq(&data_array, 2, 1);
68 MDELAY(50);
69
70 data_array[0] = 0x00102902; // panel driving setting 2
71 data_array[1] = 0x003543C1;
72 data_array[2] = 0x12222020;
73 data_array[3] = 0xA5084426;
74 data_array[4] = 0x0121580F;
75 dsi_set_cmdq(&data_array, 5, 1);
76 MDELAY(50);
77
78 data_array[0] = 0x00072902; // V-timing setting
79 data_array[1] = 0x060608C2;
80 data_array[2] = 0x00040107;
81 dsi_set_cmdq(&data_array, 3, 1);
82 MDELAY(50);
83
84 data_array[0] = 0x00032902; // outline
85 data_array[1] = 0x000000C6;
86 dsi_set_cmdq(&data_array, 2, 1);
87 MDELAY(50);
88
89 data_array[0] = 0x00192902; // GAMMA A
90 data_array[1] = 0x1E1600C8;
91 data_array[2] = 0x374D3528;
92 data_array[3] = 0x040B1422;
93 data_array[4] = 0x1E160000;
94 data_array[5] = 0x374D3528;
95 data_array[6] = 0x040B1422;
96 data_array[7] = 0x00000000;
97 dsi_set_cmdq(&data_array, 8, 1);
98 MDELAY(50);
99
100 data_array[0] = 0x00192902; // GAMMA B
101 data_array[1] = 0x1E1600C9;
102 data_array[2] = 0x374D3528;
103 data_array[3] = 0x040B1422;
104 data_array[4] = 0x1E160000;
105 data_array[5] = 0x374D3528;
106 data_array[6] = 0x040B1422;
107 data_array[7] = 0x00000000;
108 dsi_set_cmdq(&data_array, 8, 1);
109 MDELAY(50);
110
111 data_array[0] = 0x00192902; // GAMMA C
112 data_array[1] = 0x1E1600CA;
113 data_array[2] = 0x374D3528;
114 data_array[3] = 0x040B1422;
115 data_array[4] = 0x1E160000;
116 data_array[5] = 0x374D3528;
117 data_array[6] = 0x040B1422;
118 data_array[7] = 0x00000000;
119 dsi_set_cmdq(&data_array, 8, 1);
120 MDELAY(50);
121
122 data_array[0] = 0x00112902; // Power setting
123 data_array[1] = 0xBD03A9D0;
124 data_array[2] = 0x20720CA5;
125 data_array[3] = 0x01000110;
126 data_array[4] = 0x01030001;
127 data_array[5] = 0x00000000;
128 dsi_set_cmdq(&data_array, 6, 1);
129 MDELAY(50);
130
131 data_array[0] = 0x00082902; // Power setting
132 data_array[1] = 0x230C18D1;
133 data_array[2] = 0x50027503;
134 dsi_set_cmdq(&data_array, 3, 1);
135 MDELAY(50);
136
137 data_array[0] = 0x33D32300;
138 dsi_set_cmdq(&data_array, 1, 1);
139 MDELAY(50);
140
141 data_array[0] = 0x00032902;
142 data_array[1] = 0x001B1BD5;
143 dsi_set_cmdq(&data_array, 2, 1);
144 MDELAY(50);
145
146 data_array[0] = 0xA8D62300;
147 dsi_set_cmdq(&data_array, 1, 1);
148 MDELAY(50);
149
150 data_array[0] = 0x00032902;
151 data_array[1] = 0x000001DE;
152 dsi_set_cmdq(&data_array, 2, 1);
153 MDELAY(50);
154
155 data_array[0] = 0x00052902;
156 data_array[1] = 0x000000E0;
157 data_array[2] = 0x00000000;
158 dsi_set_cmdq(&data_array, 3, 1);
159 MDELAY(50);
160
161 data_array[0] = 0x00072902;
162 data_array[1] = 0x010101E1;
163 data_array[2] = 0x00000101;
164 dsi_set_cmdq(&data_array, 3, 1);
165 MDELAY(50);
166
167 data_array[0] = 0x00e62300;
168 dsi_set_cmdq(&data_array, 1, 1);
169 MDELAY(50);
170
171 data_array[0] = 0x03FA2300;
172 dsi_set_cmdq(&data_array, 1, 1);
173 MDELAY(50);
174 #endif
175 data_array[0] = 0x00053902;
176 data_array[1] = 0x0300002B;
177 data_array[2] = 0x00000055;
178 dsi_set_cmdq(&data_array, 3, 1);
179 MDELAY(50);
180
181 data_array[0] = 0x00053902;
182 data_array[1] = 0x0100002A;
183 data_array[2] = 0x000000DF;
184 dsi_set_cmdq(&data_array, 3, 1);
185 MDELAY(50);
186
187 data_array[0] = 0x00361500;
188 dsi_set_cmdq(&data_array, 1, 1);
189 MDELAY(50);
190
191 data_array[0] = 0x773A1500;
192 dsi_set_cmdq(&data_array, 1, 1);
193 MDELAY(50);
194
195 // data_array[0] = 0x03B02300;
196 // dsi_set_cmdq(&data_array, 1, 1);
197 #if 0
198 data_array[0] = 0x28D60500;
199 dsi_set_cmdq(&data_array, 1, 1);
200 MDELAY(50);
201
202 data_array[0] = 0x000E2902;
203 data_array[1] = 0x700000FD;
204 data_array[2] = 0x34313200;
205 data_array[3] = 0x04313230;
206 data_array[4] = 0x00000000;
207 dsi_set_cmdq(&data_array, 5, 1);
208 MDELAY(50);
209
210 data_array[0] = 0x00052902;
211 data_array[1] = 0x000000FE;
212 data_array[2] = 0x00000020;
213 dsi_set_cmdq(&data_array, 3, 1);
214 MDELAY(50);
215 /*
216 data_array[0] = 0x00112902; // Power setting
217 data_array[1] = 0xBD03A9D0;
218 data_array[2] = 0x20720CA5;
219 data_array[3] = 0x01000110;
220 data_array[4] = 0x01030001;
221 data_array[5] = 0x00000000;
222 dsi_set_cmdq(&data_array, 6, 1);
223 MDELAY(50);
224
225 data_array[0] = 0x00082902; // Power setting
226 data_array[1] = 0x230C18D1;
227 data_array[2] = 0x50027503;
228 dsi_set_cmdq(&data_array, 3, 1);
229 MDELAY(50);
230
231 data_array[0] = 0x33D32300;
232 dsi_set_cmdq(&data_array, 1, 1);
233 MDELAY(50);
234 */
235 #endif
236 data_array[0] = 0x00110500;
237 dsi_set_cmdq(&data_array, 1, 1);
238
239 MDELAY(125);
240
241 data_array[0] = 0x00290500;
242 dsi_set_cmdq(&data_array, 1, 1);
243 MDELAY(125);
244
245 data_array[0] = 0x03B02300;
246 dsi_set_cmdq(&data_array, 1, 1);
247 MDELAY(50);
248 }
249 #endif
250 }
251 // ---------------------------------------------------------------------------
252 // LCM Driver Implementations
253 // ---------------------------------------------------------------------------
254
255 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
256 {
257 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
258 }
259
260
261 static void lcm_get_params(LCM_PARAMS *params)
262 {
263 memset(params, 0, sizeof(LCM_PARAMS));
264
265 params->type = LCM_TYPE_DSI;
266 #if defined(LCM_DSI_CMD_MODE)
267 params->dsi.mode = CMD_MODE;
268 #else
269 params->dsi.mode = SYNC_EVENT_VDO_MODE;
270 #endif
271 params->ctrl = LCM_CTRL_PARALLEL_DBI;
272 //params->ctrl = LCM_CTRL_NONE;
273 params->width = FRAME_WIDTH;
274 params->height = FRAME_HEIGHT;
275
276 // DBI
277 //params->dbi.port = 0;
278 params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M;
279 params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS;
280 params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB;
281 params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST;
282 params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB;
283 params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888;
284 params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS;
285 params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS;
286 params->dbi.io_driving_current = 0;
287
288 // enable tearing-free
289 //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
290 params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED;
291 params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
292
293 // DPI
294 params->dpi.format = LCM_DPI_FORMAT_RGB888;
295 params->dpi.rgb_order = LCM_COLOR_ORDER_RGB;
296 params->dpi.intermediat_buffer_num = 2;
297
298 // DSI
299 params->dsi.DSI_WMEM_CONTI=0x3C;
300 params->dsi.DSI_RMEM_CONTI=0x3E;
301 //params->dsi.LANE_NUM=LCM_ONE_LANE;
302 params->dsi.LANE_NUM=LCM_TWO_LANE;
303 params->dsi.VC_NUM=0x0;
304 params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
305 params->dsi.word_count=480*3;
306
307 params->dsi.vertical_sync_active=2;
308 params->dsi.vertical_backporch=2;
309 params->dsi.vertical_frontporch=2;
310 params->dsi.vertical_active_line=800;
311
312 params->dsi.line_byte=2180; // 2256 = 752*3
313 params->dsi.horizontal_sync_active_byte=26;
314 params->dsi.horizontal_backporch_byte=206;
315 params->dsi.horizontal_frontporch_byte=206;
316 params->dsi.rgb_byte=(480*3+6);
317
318 params->dsi.horizontal_sync_active_word_count=20;
319 params->dsi.horizontal_backporch_word_count=200;
320 params->dsi.horizontal_frontporch_word_count=200;
321
322 /* params->dsi.HS_TRAIL=0x14;
323 params->dsi.HS_ZERO=0x14;
324 params->dsi.HS_PRPR=0x0A;
325 params->dsi.LPX=0x05;
326
327 params->dsi.TA_SACK=0x01;
328 params->dsi.TA_GET=0x37;
329 params->dsi.TA_SURE=0x16;
330 params->dsi.TA_GO=0x10;
331
332 params->dsi.CLK_TRAIL=0x14;
333 params->dsi.CLK_ZERO=0x14;
334 params->dsi.LPX_WAIT=0x0A;
335 params->dsi.CONT_DET=0x00;
336
337 params->dsi.CLK_HS_PRPR=0x0A;
338 */
339 params->dsi.HS_TRAIL=0x0C;
340 params->dsi.HS_ZERO=0x04;
341 params->dsi.HS_PRPR=0x02;
342 params->dsi.LPX=0x06;
343
344 params->dsi.TA_SACK=0x01;
345 params->dsi.TA_GET=0x1E;
346 params->dsi.TA_SURE=0x09;
347 params->dsi.TA_GO=0x18;
348
349 params->dsi.CLK_TRAIL=0x01;
350 params->dsi.CLK_ZERO=0x06;
351 params->dsi.LPX_WAIT=0x0A;
352 params->dsi.CONT_DET=0x00;
353
354 params->dsi.CLK_HS_PRPR=0x01;
355
356 params->dsi.pll_div1=0x1D; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)
357
358 //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2)
359 params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2)
360
361 }
362
363 static void lcm_init(void)
364 {
365 SET_RESET_PIN(0);
366 MDELAY(25);
367 SET_RESET_PIN(1);
368 MDELAY(50);
369
370 init_lcm_registers();
371 MDELAY(500);
372 // clear_panel();
373 }
374
375
376 static void lcm_suspend(void)
377 {
378 unsigned int data_array[16];
379
380 data_array[0]=0x00280500; // Display Off
381 dsi_set_cmdq(&data_array, 1, 1);
382 MDELAY(10);
383 data_array[0] = 0x00100500; // Sleep In
384 dsi_set_cmdq(&data_array, 1, 1);
385 MDELAY(100);
386 }
387
388
389 static void lcm_resume(void)
390 {
391 unsigned int data_array[16];
392
393 data_array[0] = 0x00110500; // Sleep Out
394 dsi_set_cmdq(&data_array, 1, 1);
395 MDELAY(100);
396 data_array[0] = 0x00290500; // Display On
397 dsi_set_cmdq(&data_array, 1, 1);
398 MDELAY(10);
399 }
400
401
402 static void lcm_update(unsigned int x, unsigned int y,
403 unsigned int width, unsigned int height)
404 {
405 unsigned int x0 = x;
406 unsigned int y0 = y;
407 unsigned int x1 = x0 + width - 1;
408 unsigned int y1 = y0 + height - 1;
409
410 unsigned char x0_MSB = ((x0>>8)&0xFF);
411 unsigned char x0_LSB = (x0&0xFF);
412 unsigned char x1_MSB = ((x1>>8)&0xFF);
413 unsigned char x1_LSB = (x1&0xFF);
414 unsigned char y0_MSB = ((y0>>8)&0xFF);
415 unsigned char y0_LSB = (y0&0xFF);
416 unsigned char y1_MSB = ((y1>>8)&0xFF);
417 unsigned char y1_LSB = (y1&0xFF);
418
419 unsigned int data_array[16];
420
421 data_array[0]= 0x00053902;
422 data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
423 data_array[2]= (x1_LSB);
424 data_array[3]= 0x00053902;
425 data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
426 data_array[5]= (y1_LSB);
427 data_array[6]= 0x002c3909;
428 // data_array[0]= 0x002c3901;
429
430 dsi_set_cmdq(&data_array, 7, 0);
431
432 }
433
434 LCM_DRIVER r61408_wvga_dsi_cmd_drv =
435 {
436 .name = "r61408",
437 .set_util_funcs = lcm_set_util_funcs,
438 .get_params = lcm_get_params,
439 .init = lcm_init,
440 .suspend = lcm_suspend,
441 .resume = lcm_resume,
442 #if defined(LCM_DSI_CMD_MODE)
443 .update = lcm_update,
444 #endif
445 };