import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / nt35510_fwvga / nt35510_fwvga.c
1 #ifndef BUILD_LK
2 #include <linux/string.h>
3 #include <linux/kernel.h>
4 #endif
5 #include "lcm_drv.h"
6
7 #ifdef BUILD_LK
8 #include <platform/mt_gpio.h>
9 #elif defined(BUILD_UBOOT)
10 #include <asm/arch/mt_gpio.h>
11 #else
12 #include <mach/mt_gpio.h>
13 #endif
14 // ---------------------------------------------------------------------------
15 // Local Constants
16 // ---------------------------------------------------------------------------
17
18 #define FRAME_WIDTH (480)
19 #define FRAME_HEIGHT (854)
20 #define LCM_DSI_CMD_MODE
21
22 // ---------------------------------------------------------------------------
23 // Local Variables
24 // ---------------------------------------------------------------------------
25
26 static LCM_UTIL_FUNCS lcm_util = {0};
27
28 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
29
30 #define UDELAY(n) (lcm_util.udelay(n))
31 #define MDELAY(n) (lcm_util.mdelay(n))
32
33 #define REGFLAG_DELAY 0XFE
34 #define REGFLAG_END_OF_TABLE 0x00 // END OF REGISTERS MARKER
35
36
37 // ---------------------------------------------------------------------------
38 // Local Functions
39 // ---------------------------------------------------------------------------
40 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
41 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
42 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
43 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
44 //#define read_reg(cmd) lcm_util.DSI_dcs_read_lcm_reg(cmd)
45 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
46
47 // ---------------------------------------------------------------------------
48 // LCM Driver Implementations
49 // ---------------------------------------------------------------------------
50
51 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
52 {
53 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
54 }
55
56
57 static void lcm_get_params(LCM_PARAMS *params)
58 {
59 memset(params, 0, sizeof(LCM_PARAMS));
60
61 params->type = LCM_TYPE_DSI;
62
63 params->width = FRAME_WIDTH;
64 params->height = FRAME_HEIGHT;
65
66 // enable tearing-free
67 params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED;
68 params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
69
70 #if defined(LCM_DSI_CMD_MODE)
71 params->dsi.mode = CMD_MODE;
72 #else
73 params->dsi.mode = SYNC_PULSE_VDO_MODE;
74 #endif
75
76 // DSI
77 /* Command mode setting */
78 params->dsi.LANE_NUM = LCM_TWO_LANE;
79 //The following defined the fomat for data coming from LCD engine.
80 params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
81 params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
82 params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
83 params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
84
85
86 params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
87 params->dsi.vertical_active_line = FRAME_HEIGHT;
88
89 params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
90 params->dsi.pll_div1=1; // div1=0,1,2,3;div1_real=1,2,4,4
91 params->dsi.pll_div2=1; // div2=0,1,2,3;div1_real=1,2,4,4
92 params->dsi.fbk_div =38; // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)
93 }
94
95 static void init_lcm_registers(void)
96 {
97 unsigned int data_array[16];
98 //*************Enable CMD2 Page1 *******************//
99 data_array[0]=0x00053902;
100 data_array[1]=0x2555AAFF;
101 data_array[2]=0x00000001;
102 dsi_set_cmdq(data_array, 3, 1);
103 //MDELAY(10);
104
105 data_array[0]=0x00083902;
106 data_array[1]=0x070302F3;
107 data_array[2]=0x0DD48845;
108 dsi_set_cmdq(data_array, 3, 1);
109 //MDELAY(10);
110
111 data_array[0]=0x00063902;
112 data_array[1]=0x004800F4;
113 data_array[2]=0x00004000;
114 dsi_set_cmdq(data_array, 3, 1);
115 //MDELAY(10);
116
117 //*************Enable CMD2 Page0 *******************//
118 data_array[0]=0x00063902;
119 data_array[1]=0x52AA55F0;
120 data_array[2]=0x00000008;
121 dsi_set_cmdq(data_array, 3, 1);
122 //MDELAY(10);
123
124 data_array[0]=0x00063902;
125 data_array[1]=0x400C00B0;
126 data_array[2]=0x00003C3C;
127 dsi_set_cmdq(data_array, 3, 1);
128 //MDELAY(10);
129
130 data_array[0]=0x00033902;
131 data_array[1]=0x0000ECB1;
132 dsi_set_cmdq(data_array, 2, 1);
133 //MDELAY(10);
134
135 data_array[0]=0x08B61500;
136 dsi_set_cmdq(data_array, 1, 1);
137 //MDELAY(10);
138
139 data_array[0]=0x00033902;
140 data_array[1]=0x007272B7;
141 dsi_set_cmdq(data_array, 2, 1);
142 //MDELAY(10);
143
144 data_array[0]=0x05BA1500;
145 dsi_set_cmdq(data_array, 1, 1);
146 //MDELAY(10);
147
148 data_array[0]=0x04BC1500; //4 dot inversion
149 //data_array[0]=0x00BC1500;
150 dsi_set_cmdq(data_array, 1, 1);
151 //MDELAY(10);
152
153 data_array[0]=0x00063902;
154 data_array[1]=0x104101BD;
155 data_array[2]=0x00000137;
156 dsi_set_cmdq(data_array, 3, 1);
157 //MDELAY(10);
158
159 data_array[0]=0x01CC1500;
160 dsi_set_cmdq(data_array, 1, 1);
161 //MDELAY(10);
162
163 //*************Enable CMD2 Page1 *******************//
164 data_array[0]=0x00063902;
165 data_array[1]=0x52AA55F0;
166 data_array[2]=0x00000108;
167 dsi_set_cmdq(data_array, 3, 1);
168 //MDELAY(10);
169
170 data_array[0]=0x00043902;
171 data_array[1]=0x0A0A0AB0;
172 dsi_set_cmdq(data_array, 2, 1);
173 //MDELAY(10);
174
175 data_array[0]=0x00043902;
176 data_array[1]=0x545454B6;
177 dsi_set_cmdq(data_array, 2, 1);
178 //MDELAY(10);
179
180 data_array[0]=0x00043902;
181 data_array[1]=0x0A0A0AB1;
182 dsi_set_cmdq(data_array, 2, 1);
183 //MDELAY(10);
184
185 data_array[0]=0x00043902;
186 data_array[1]=0x242424B7;
187 dsi_set_cmdq(data_array, 2, 1);
188 //MDELAY(10);
189
190 data_array[0]=0x00043902;
191 data_array[1]=0x030303B2;
192 dsi_set_cmdq(data_array, 2, 1);
193 //MDELAY(10);
194
195 data_array[0]=0x00043902;
196 data_array[1]=0x303030B8;
197 dsi_set_cmdq(data_array, 2, 1);
198 //MDELAY(10);
199
200 data_array[0]=0x00043902;
201 data_array[1]=0x0D0D0DB3;
202 dsi_set_cmdq(data_array, 2, 1);
203 //MDELAY(10);
204
205 data_array[0]=0x00043902;
206 data_array[1]=0x242424B9;
207 dsi_set_cmdq(data_array, 2, 1);
208 //MDELAY(10);
209
210 data_array[0]=0x00043902;
211 data_array[1]=0x0A0A0AB4;
212 dsi_set_cmdq(data_array, 2, 1);
213 //MDELAY(10);
214
215 data_array[0]=0x00043902;
216 data_array[1]=0x242424BA;
217 dsi_set_cmdq(data_array, 2, 1);
218 //MDELAY(10);
219
220 data_array[0]=0x00043902;
221 data_array[1]=0x070707B5;
222 dsi_set_cmdq(data_array, 2, 1);
223 //MDELAY(10);
224
225 data_array[0]=0x00043902;
226 data_array[1]=0x01A000BC;
227 dsi_set_cmdq(data_array, 2, 1);
228
229 data_array[0]=0x00043902;
230 data_array[1]=0x01A000BD;
231 dsi_set_cmdq(data_array, 2, 1);
232
233 data_array[0]=0x48BE1500;
234 dsi_set_cmdq(data_array, 1, 1);
235
236 //start gamma value
237 data_array[0]=0x00113902;
238 data_array[1]=0x000000D1;
239 data_array[2]=0x00B10068;
240 data_array[3]=0x01FD00E4;
241 data_array[4]=0x014C012D;
242 data_array[5]=0x00000079;
243 dsi_set_cmdq(data_array, 6, 1);
244
245 data_array[0]=0x00113902;
246 data_array[1]=0x019B01D2;
247 data_array[2]=0x020002D3;
248 data_array[3]=0x0287024A;
249 data_array[4]=0x02C00288;
250 data_array[5]=0x000000F8;
251 dsi_set_cmdq(data_array, 6, 1);
252
253 data_array[0]=0x00113902;
254 data_array[1]=0x031A03D3;
255 data_array[2]=0x03630348;
256 data_array[3]=0x03A4038C;
257 data_array[4]=0x03E203CC;
258 data_array[5]=0x000000EF;
259 dsi_set_cmdq(data_array, 6, 1);
260
261 data_array[0]=0x00053902;
262 data_array[1]=0x03F403D4;
263 data_array[2]=0x000000FF;
264 dsi_set_cmdq(data_array, 3, 1);
265
266 //End gamma value
267 data_array[0]=0x00113902;
268 data_array[1]=0x000000D5;
269 data_array[2]=0x00B10068;
270 data_array[3]=0x01FD00E4;
271 data_array[4]=0x014C012D;
272 data_array[5]=0x00000079;
273 dsi_set_cmdq(data_array, 6, 1);
274
275 data_array[0]=0x00113902;
276 data_array[1]=0x019B01D6;
277 data_array[2]=0x020002D3;
278 data_array[3]=0x0287024A;
279 data_array[4]=0x02C00288;
280 data_array[5]=0x000000F8;
281 dsi_set_cmdq(data_array, 6, 1);
282
283 data_array[0]=0x00113902;
284 data_array[1]=0x031A03D7;
285 data_array[2]=0x03630348;
286 data_array[3]=0x03A4038C;
287 data_array[4]=0x03E203CC;
288 data_array[5]=0x000000EF;
289 dsi_set_cmdq(data_array, 6, 1);
290
291 data_array[0]=0x00053902;
292 data_array[1]=0x03F403D8;
293 data_array[2]=0x000000FF;
294 dsi_set_cmdq(data_array, 3, 1);
295 //End gamma value
296
297 data_array[0]=0x00113902;
298 data_array[1]=0x000000D9;
299 data_array[2]=0x00B10068;
300 data_array[3]=0x01FD00E4;
301 data_array[4]=0x014C012D;
302 data_array[5]=0x00000079;
303 dsi_set_cmdq(data_array, 6, 1);
304
305 data_array[0]=0x00113902;
306 data_array[1]=0x019B01DD;
307 data_array[2]=0x020002D3;
308 data_array[3]=0x0287024A;
309 data_array[4]=0x02C00288;
310 data_array[5]=0x000000F8;
311 dsi_set_cmdq(data_array, 6, 1);
312
313 data_array[0]=0x00113902;
314 data_array[1]=0x031A03DE;
315 data_array[2]=0x03630348;
316 data_array[3]=0x03A4038C;
317 data_array[4]=0x03E203CC;
318 data_array[5]=0x000000EF;
319 dsi_set_cmdq(data_array, 6, 1);
320
321 data_array[0]=0x00053902;
322 data_array[1]=0x03F403DF;
323 data_array[2]=0x000000FF;
324 dsi_set_cmdq(data_array, 3, 1);
325 //End gamma value
326
327 data_array[0]=0x00113902;
328 data_array[1]=0x000000E0;
329 data_array[2]=0x00B10068;
330 data_array[3]=0x01FD00E4;
331 data_array[4]=0x014C012D;
332 data_array[5]=0x00000079;
333 dsi_set_cmdq(data_array, 6, 1);
334
335 data_array[0]=0x00113902;
336 data_array[1]=0x019B01E1;
337 data_array[2]=0x020002D3;
338 data_array[3]=0x0287024A;
339 data_array[4]=0x02C00288;
340 data_array[5]=0x000000F8;
341 dsi_set_cmdq(data_array, 6, 1);
342
343 data_array[0]=0x00113902;
344 data_array[1]=0x031A03E2;
345 data_array[2]=0x03630348;
346 data_array[3]=0x03A4038C;
347 data_array[4]=0x03E203CC;
348 data_array[5]=0x000000EF;
349 dsi_set_cmdq(data_array, 6, 1);
350
351 data_array[0]=0x00053902;
352 data_array[1]=0x03F403E3;
353 data_array[2]=0x000000FF;
354 dsi_set_cmdq(data_array, 3, 1);
355 //End gamma value
356
357 data_array[0]=0x00113902;
358 data_array[1]=0x000000E4;
359 data_array[2]=0x00B10068;
360 data_array[3]=0x01FD00E4;
361 data_array[4]=0x014C012D;
362 data_array[5]=0x00000079;
363 dsi_set_cmdq(data_array, 6, 1);
364
365 data_array[0]=0x00113902;
366 data_array[1]=0x019B01E5;
367 data_array[2]=0x020002D3;
368 data_array[3]=0x0287024A;
369 data_array[4]=0x02C00288;
370 data_array[5]=0x000000F8;
371 dsi_set_cmdq(data_array, 6, 1);
372
373 data_array[0]=0x00113902;
374 data_array[1]=0x031A03E6;
375 data_array[2]=0x03630348;
376 data_array[3]=0x03A4038C;
377 data_array[4]=0x03E203CC;
378 data_array[5]=0x000000EF;
379 dsi_set_cmdq(data_array, 6, 1);
380
381 data_array[0]=0x00053902;
382 data_array[1]=0x03F403E7;
383 data_array[2]=0x000000FF;
384 dsi_set_cmdq(data_array, 3, 1);
385 //End gamma value
386
387 data_array[0]=0x00113902;
388 data_array[1]=0x000000E8;
389 data_array[2]=0x00B10068;
390 data_array[3]=0x01FD00E4;
391 data_array[4]=0x014C012D;
392 data_array[5]=0x00000079;
393 dsi_set_cmdq(data_array, 6, 1);
394
395 data_array[0]=0x00113902;
396 data_array[1]=0x019B01E9;
397 data_array[2]=0x020002D3;
398 data_array[3]=0x0287024A;
399 data_array[4]=0x02C00288;
400 data_array[5]=0x000000F8;
401 dsi_set_cmdq(data_array, 6, 1);
402
403 data_array[0]=0x00113902;
404 data_array[1]=0x031A03EA;
405 data_array[2]=0x03630348;
406 data_array[3]=0x03A4038C;
407 data_array[4]=0x03E203CC;
408 data_array[5]=0x000000EF;
409 dsi_set_cmdq(data_array, 6, 1);
410
411 data_array[0]=0x00053902;
412 data_array[1]=0x03F403EB;
413 data_array[2]=0x000000FF;
414 dsi_set_cmdq(data_array, 3, 1);
415 //End gamma value
416 data_array[0]=0x773A1500;//Data Type
417 dsi_set_cmdq(data_array, 1, 1);
418 //MDELAY(10);
419
420 // data_array[0] = 0x00351500;// TE ON
421 // dsi_set_cmdq(&data_array, 1, 1);
422 // MDELAY(10);
423
424 data_array[0] = 0x00110500; // Sleep Out
425 dsi_set_cmdq(data_array, 1, 1);
426 MDELAY(150);
427
428 data_array[0] = 0x00290500; // Display On
429 dsi_set_cmdq(data_array, 1, 1);
430 MDELAY(40);
431
432 data_array[0] = 0x002C0500; // Display On
433 dsi_set_cmdq(data_array, 1, 1);
434 //MDELAY(10);
435
436 //******************* ENABLE PAGE0 **************//
437 data_array[0]=0x00063902;
438 data_array[1]=0x52AA55F0;
439 data_array[2]=0x00000008;
440 dsi_set_cmdq(data_array, 3, 1);
441 //MDELAY(10);
442
443
444 //{0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}},
445 data_array[0] = 0x00033902;
446 data_array[1] = (((FRAME_HEIGHT/2)&0xFF) << 16) | (((FRAME_HEIGHT/2)>>8) << 8) | 0x44;
447 dsi_set_cmdq(data_array, 2, 1);
448
449 data_array[0] = 0x00351500;// TE ON
450 dsi_set_cmdq(data_array, 1, 1);
451 //MDELAY(10);
452
453 data_array[0]= 0x00033902;
454 data_array[1]= 0x0000E8B1;
455 dsi_set_cmdq(data_array, 2, 1);
456 //MDELAY(50);
457
458 data_array[0]= 0x00023902;
459 data_array[1]= 0x0051;
460 dsi_set_cmdq(data_array, 2, 1);
461 //MDELAY(50);
462
463 //data_array[0]= 0x00033902;
464 //data_array[1]= 0x640044;
465 //dsi_set_cmdq(&data_array, 2, 1);
466 //MDELAY(50);
467
468 data_array[0]= 0x00023902;
469 data_array[1]= 0x2453;
470 dsi_set_cmdq(data_array, 2, 1);
471 //MDELAY(50);
472
473 data_array[0] = 0x01551500; // SET CABC UI MODE
474 dsi_set_cmdq(data_array, 1, 1);
475 //MDELAY(5);
476
477 data_array[0]= 0x00023902;
478 data_array[1]= 0x705e;
479 dsi_set_cmdq(data_array, 2, 1);
480 //MDELAY(50);
481
482 data_array[0]= 0x00033902;
483 data_array[1]= 0x000301E0;
484 dsi_set_cmdq(data_array, 2, 1);
485 //MDELAY(50);
486
487 }
488
489 static void lcm_init(void)
490 {
491
492 SET_RESET_PIN(0);
493 MDELAY(200);
494 SET_RESET_PIN(1);
495 MDELAY(200);
496 init_lcm_registers();
497 }
498
499
500 static void lcm_suspend(void)
501 {
502 //push_table(lcm_sleep_mode_in_setting, sizeof(lcm_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);
503 //SET_RESET_PIN(0);
504 //MDELAY(1);
505 //SET_RESET_PIN(1);
506 unsigned int data_array[2];
507 #if 1
508
509 //below BTA for can not sleep in
510 // data_array[0]=0x00000504; // BTA
511 // dsi_set_cmdq(&data_array, 1, 1);
512
513 data_array[0] = 0x00280500; // Display Off
514 dsi_set_cmdq(data_array, 1, 1);
515 MDELAY(100);
516 data_array[0] = 0x00100500; // Sleep In
517 dsi_set_cmdq(data_array, 1, 1);
518 MDELAY(200);
519 #endif
520 }
521
522
523 static void lcm_resume(void)
524 {
525 unsigned int data_array[16];
526 //lcm_init();
527 data_array[0]=0x00110500;
528 dsi_set_cmdq(data_array, 1, 1);
529 MDELAY(150);
530
531 data_array[0]=0x00290500;
532 dsi_set_cmdq(data_array, 1, 1);
533 }
534
535
536 static void lcm_update(unsigned int x, unsigned int y,
537 unsigned int width, unsigned int height)
538 {
539 unsigned int x0 = x;
540 unsigned int y0 = y;
541 unsigned int x1 = x0 + width - 1;
542 unsigned int y1 = y0 + height - 1;
543
544 unsigned char x0_MSB = ((x0>>8)&0xFF);
545 unsigned char x0_LSB = (x0&0xFF);
546 unsigned char x1_MSB = ((x1>>8)&0xFF);
547 unsigned char x1_LSB = (x1&0xFF);
548 unsigned char y0_MSB = ((y0>>8)&0xFF);
549 unsigned char y0_LSB = (y0&0xFF);
550 unsigned char y1_MSB = ((y1>>8)&0xFF);
551 unsigned char y1_LSB = (y1&0xFF);
552
553 unsigned int data_array[16];
554
555 data_array[0]= 0x00053902;
556 data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
557 data_array[2]= (x1_LSB);
558 dsi_set_cmdq(data_array, 3, 1);
559
560 data_array[0]= 0x00053902;
561 data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
562 data_array[2]= (y1_LSB);
563 dsi_set_cmdq(data_array, 3, 1);
564
565 data_array[0]= 0x00290508;//HW bug, so need send one HS packet
566 dsi_set_cmdq(data_array, 1, 1);
567
568 data_array[0]= 0x002c3909;
569 dsi_set_cmdq(data_array, 1, 0);
570
571
572
573 }
574 static unsigned int lcm_compare_id(void)
575 {
576
577 int array[4];
578 char buffer[3];
579 char id0=0;
580 char id1=0;
581 char id2=0;
582
583
584 SET_RESET_PIN(0);
585 MDELAY(200);
586 SET_RESET_PIN(1);
587 MDELAY(200);
588
589 array[0] = 0x00083700;// read id return two byte,version and id
590 dsi_set_cmdq(array, 1, 1);
591
592 read_reg_v2(0x04,buffer, 3);
593
594 id0 = buffer[0]; //should be 0x00
595 id1 = buffer[1];//should be 0x80
596 id2 = buffer[2];//should be 0x00
597
598 return 0;
599
600
601 }
602
603
604 LCM_DRIVER nt35510_fwvga_lcm_drv =
605 {
606 .name = "nt35510_fwvga",
607 .set_util_funcs = lcm_set_util_funcs,
608 .compare_id = lcm_compare_id,
609 .get_params = lcm_get_params,
610 .init = lcm_init,
611 .suspend = lcm_suspend,
612 .resume = lcm_resume,
613 #if defined(LCM_DSI_CMD_MODE)
614 .update = lcm_update,
615 #endif
616 };