import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / nt35510_dsi_cmd_6572_qvga / nt35510_dsi_cmd_6572_qvga.c
1 #ifdef BUILD_LK
2 #include <string.h>
3 #else
4 #include <linux/string.h>
5 #if defined(BUILD_UBOOT)
6 #include <asm/arch/mt_gpio.h>
7 #else
8 #include <mach/mt_gpio.h>
9 #endif
10 #endif
11 #include "lcm_drv.h"
12
13
14 // ---------------------------------------------------------------------------
15 // Local Constants
16 // ---------------------------------------------------------------------------
17
18 #define FRAME_WIDTH (240)
19 #define FRAME_HEIGHT (320)
20
21 #define REGFLAG_DELAY 0xAB
22 #define REGFLAG_END_OF_TABLE 0xAA // END OF REGISTERS MARKER
23
24 // ---------------------------------------------------------------------------
25 // Local Variables
26 // ---------------------------------------------------------------------------
27
28 static LCM_UTIL_FUNCS lcm_util = {0};
29
30 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
31
32 #define UDELAY(n) (lcm_util.udelay(n))
33 #define MDELAY(n) (lcm_util.mdelay(n))
34
35 #define LCM_ID (0x55)
36 #define LCM_ID1 (0xC1)
37 #define LCM_ID2 (0x80)
38
39 // ---------------------------------------------------------------------------
40 // Local Functions
41 // ---------------------------------------------------------------------------
42
43 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
44 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
45 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
46 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
47 #define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
48 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
49
50 struct LCM_setting_table {
51 unsigned char cmd;
52 unsigned char count;
53 unsigned char para_list[64];
54 };
55
56
57 static struct LCM_setting_table lcm_sleep_out_setting[] = {
58 // Sleep Out
59 {0x11, 1, {0x00}},
60 {REGFLAG_DELAY, 120, {}},
61
62 // Display ON
63 {0x29, 1, {0x00}},
64 {REGFLAG_END_OF_TABLE, 0x00, {}}
65 };
66
67
68 static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = {
69 // Display off sequence
70 {0x28, 1, {0x00}},
71 {REGFLAG_DELAY, 10, {}},
72
73 // Sleep Mode On
74 {0x10, 1, {0x00}},
75 {REGFLAG_DELAY, 120, {}},
76
77 {REGFLAG_END_OF_TABLE, 0x00, {}}
78 };
79
80 static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
81 {
82 unsigned int i;
83
84 for(i = 0; i < count; i++) {
85 unsigned cmd;
86 cmd = table[i].cmd;
87
88 switch (cmd) {
89 case REGFLAG_DELAY :
90 MDELAY(table[i].count);
91 break;
92
93 case REGFLAG_END_OF_TABLE :
94 break;
95
96 default:
97 dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
98
99 if (cmd != 0xFF && cmd != 0x2C && cmd != 0x3C) {
100 //#if defined(BUILD_UBOOT)
101 // printf("[DISP] - uboot - REG_R(0x%x) = 0x%x. \n", cmd, table[i].para_list[0]);
102 //#endif
103 while(read_reg(cmd) != table[i].para_list[0]);
104 }
105 }
106 }
107 }
108
109
110 // ---------------------------------------------------------------------------
111 // LCM Driver Implementations
112 // ---------------------------------------------------------------------------
113 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
114 {
115 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
116 }
117
118
119 static void lcm_get_params(LCM_PARAMS *params)
120 {
121 memset(params, 0, sizeof(LCM_PARAMS));
122
123 params->type = LCM_TYPE_DSI;
124
125 params->width = FRAME_WIDTH;
126 params->height = FRAME_HEIGHT;
127
128 // enable tearing-free
129 params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED;
130 params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
131
132 params->dsi.mode = CMD_MODE;
133
134 // DSI
135 /* Command mode setting */
136 params->dsi.LANE_NUM = LCM_TWO_LANE;
137
138 //The following defined the fomat for data coming from LCD engine.
139 params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
140 params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
141 params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
142 params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
143
144 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
145
146 params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
147
148 params->dsi.word_count=240*3; //DSI CMD mode need set these two bellow params, different to 6577
149 params->dsi.vertical_active_line=320;
150 params->dsi.compatibility_for_nvk = 0; // this parameter would be set to 1 if DriverIC is NTK's and when force match DSI clock for NTK's
151
152 // Bit rate calculation
153 params->dsi.PLL_CLOCK = 156; //dsi clock customization: should config clock value directly
154 }
155
156
157 static void init_lcm_registers(void)
158 {
159 unsigned int data_array[16];
160
161
162 //*************Enable TE *******************//
163 data_array[0]= 0x00053902;
164 data_array[1]= 0x2555aaff;
165 data_array[2]= 0x00000001;
166 dsi_set_cmdq(data_array, 3, 1);
167
168 data_array[0]= 0x00093902;
169 data_array[1]= 0x000201f8;
170 data_array[2]= 0x00133320;
171 data_array[3]= 0x00000048;
172 dsi_set_cmdq(data_array, 4, 1);
173
174 //*************Enable CMD2 Page1 *******************//
175 data_array[0]=0x00063902;
176 data_array[1]=0x52aa55f0;
177 data_array[2]=0x00000108;
178 dsi_set_cmdq(data_array, 3, 1);
179
180 //************* AVDD: manual *******************//
181 data_array[0]=0x00043902;
182 data_array[1]=0x0d0d0db0;
183 dsi_set_cmdq(data_array, 2, 1);
184
185 data_array[0]=0x00043902;
186 data_array[1]=0x343434b6;
187 dsi_set_cmdq(data_array, 2, 1);
188
189 data_array[0]=0x00043902;
190 data_array[1]=0x0d0d0db1;
191 dsi_set_cmdq(data_array, 2, 1);
192
193 data_array[0]=0x00043902;
194 data_array[1]=0x343434b7;
195 dsi_set_cmdq(data_array, 2, 1);
196
197 data_array[0]=0x00043902;
198 data_array[1]=0x000000b2;
199 dsi_set_cmdq(data_array, 2, 1);
200
201 data_array[0]=0x00043902;
202 data_array[1]=0x242424b8;
203 dsi_set_cmdq(data_array, 2, 1);
204
205 data_array[0]=0x00023902;
206 data_array[1]=0x000001bf;
207 dsi_set_cmdq(data_array, 2, 1);
208
209 data_array[0]=0x00043902;
210 data_array[1]=0x0f0f0fb3;
211 dsi_set_cmdq(data_array, 2, 1);
212
213 data_array[0]=0x00043902;
214 data_array[1]=0x343434b9;
215 dsi_set_cmdq(data_array, 2, 1);
216
217 data_array[0]=0x00043902;
218 data_array[1]=0x080808b5;
219 dsi_set_cmdq(data_array, 2, 1);
220
221 data_array[0]=0x00023902;
222 data_array[1]=0x000003c2;
223 dsi_set_cmdq(data_array, 2, 1);
224
225 data_array[0]=0x00043902;
226 data_array[1]=0x242424ba;
227 dsi_set_cmdq(data_array, 2, 1);
228
229 data_array[0]=0x00043902;
230 data_array[1]=0x007800bc;
231 dsi_set_cmdq(data_array, 2, 1);
232
233 data_array[0]=0x00043902;
234 data_array[1]=0x007800bd;
235 dsi_set_cmdq(data_array, 2, 1);
236
237 data_array[0]=0x00033902;
238 data_array[1]=0x006400be;
239 dsi_set_cmdq(data_array, 2, 1);
240
241 //*************Gamma Table *******************//
242 data_array[0]=0x00353902;
243 data_array[1]=0x003300D1;
244 data_array[2]=0x003A0034;
245 data_array[3]=0x005C004A;
246 data_array[4]=0x00A60081;
247 data_array[5]=0x011301E5;
248 data_array[6]=0x01820154;
249 data_array[7]=0x020002CA;
250 data_array[8]=0x02340201;
251 data_array[9]=0x02840267;
252 data_array[10]=0x02B702A4;
253 data_array[11]=0x02DE02CF;
254 data_array[12]=0x03FE02F2;
255 data_array[13]=0x03330310;
256 data_array[14]=0x0000006D;
257 dsi_set_cmdq(data_array, 15, 1);
258
259 data_array[0]=0x00353902;
260 data_array[1]=0x003300D2;
261 data_array[2]=0x003A0034;
262 data_array[3]=0x005C004A;
263 data_array[4]=0x00A60081;
264 data_array[5]=0x011301E5;
265 data_array[6]=0x01820154;
266 data_array[7]=0x020002CA;
267 data_array[8]=0x02340201;
268 data_array[9]=0x02840267;
269 data_array[10]=0x02B702A4;
270 data_array[11]=0x02DE02CF;
271 data_array[12]=0x03FE02F2;
272 data_array[13]=0x03330310;
273 data_array[14]=0x0000006D;
274 dsi_set_cmdq(data_array, 15, 1);
275
276 data_array[0]=0x00353902;
277 data_array[1]=0x003300D3;
278 data_array[2]=0x003A0034;
279 data_array[3]=0x005C004A;
280 data_array[4]=0x00A60081;
281 data_array[5]=0x011301E5;
282 data_array[6]=0x01820154;
283 data_array[7]=0x020002CA;
284 data_array[8]=0x02340201;
285 data_array[9]=0x02840267;
286 data_array[10]=0x02B702A4;
287 data_array[11]=0x02DE02CF;
288 data_array[12]=0x03FE02F2;
289 data_array[13]=0x03330310;
290 data_array[14]=0x0000006D;
291 dsi_set_cmdq(data_array, 15, 1);
292
293 data_array[0]=0x00353902;
294 data_array[1]=0x003300D4;
295 data_array[2]=0x003A0034;
296 data_array[3]=0x005C004A;
297 data_array[4]=0x00A60081;
298 data_array[5]=0x011301E5;
299 data_array[6]=0x01820154;
300 data_array[7]=0x020002CA;
301 data_array[8]=0x02340201;
302 data_array[9]=0x02840267;
303 data_array[10]=0x02B702A4;
304 data_array[11]=0x02DE02CF;
305 data_array[12]=0x03FE02F2;
306 data_array[13]=0x03330310;
307 data_array[14]=0x0000006D;
308 dsi_set_cmdq(data_array, 15, 1);
309
310 data_array[0]=0x00353902;
311 data_array[1]=0x003300D5;
312 data_array[2]=0x003A0034;
313 data_array[3]=0x005C004A;
314 data_array[4]=0x00A60081;
315 data_array[5]=0x011301E5;
316 data_array[6]=0x01820154;
317 data_array[7]=0x020002CA;
318 data_array[8]=0x02340201;
319 data_array[9]=0x02840267;
320 data_array[10]=0x02B702A4;
321 data_array[11]=0x02DE02CF;
322 data_array[12]=0x03FE02F2;
323 data_array[13]=0x03330310;
324 data_array[14]=0x0000006D;
325 dsi_set_cmdq(data_array, 15, 1);
326
327 data_array[0]=0x00353902;
328 data_array[1]=0x003300D6;
329 data_array[2]=0x003A0034;
330 data_array[3]=0x005C004A;
331 data_array[4]=0x00A60081;
332 data_array[5]=0x011301E5;
333 data_array[6]=0x01820154;
334 data_array[7]=0x020002CA;
335 data_array[8]=0x02340201;
336 data_array[9]=0x02840267;
337 data_array[10]=0x02B702A4;
338 data_array[11]=0x02DE02CF;
339 data_array[12]=0x03FE02F2;
340 data_array[13]=0x03330310;
341 data_array[14]=0x0000006D;
342 dsi_set_cmdq(data_array, 15, 1);
343 MDELAY(10);
344
345 // ******************** EABLE CMD2 PAGE 0 **************//
346 data_array[0]=0x00063902;
347 data_array[1]=0x52aa55f0;
348 data_array[2]=0x00000008;
349 dsi_set_cmdq(data_array, 3, 1);
350
351 // ******************** EABLE DSI TE **************//
352 data_array[0]=0x00033902;
353 data_array[1]=0x0000fcb1;
354 dsi_set_cmdq(data_array, 2, 1);
355
356 data_array[0]=0x00023902;
357 data_array[1]=0x000005b6;
358 dsi_set_cmdq(data_array, 2, 1);
359
360 data_array[0]=0x00033902;
361 data_array[1]=0x007070b7;
362 dsi_set_cmdq(data_array, 2, 1);
363
364 data_array[0]=0x00053902;
365 data_array[1]=0x030301b8;
366 data_array[2]=0x00000003;
367 dsi_set_cmdq(data_array, 3, 1);
368
369 data_array[0]=0x00043902;
370 data_array[1]=0x000002bc;
371 dsi_set_cmdq(data_array, 2, 1);
372
373 data_array[0]=0x00063902;
374 data_array[1]=0x5002d0c9;
375 data_array[2]=0x00005050;
376 dsi_set_cmdq(data_array, 3, 1);
377
378 // ******************** EABLE DSI TE packet **************//
379 data_array[0]=0x00351500;
380 dsi_set_cmdq(data_array, 1, 1);
381
382 data_array[0]=0x773a1500;
383 dsi_set_cmdq(data_array, 1, 1);
384
385 data_array[0]= 0x00053902;
386 data_array[1]= 0x0000002a;
387 data_array[2]= 0x000000ef;
388 dsi_set_cmdq(data_array, 3, 1);
389
390 data_array[0]= 0x00053902;
391 data_array[1]= 0x0100002b;
392 data_array[2]= 0x0000003f;
393 dsi_set_cmdq(data_array, 3, 1);
394
395 data_array[0] = 0x00110500;
396 dsi_set_cmdq(data_array, 1, 1);
397 MDELAY(120);
398
399 data_array[0]= 0x00290500;
400 dsi_set_cmdq(data_array, 1, 1);
401 }
402
403
404 static void lcm_init(void)
405 {
406 SET_RESET_PIN(1);
407 SET_RESET_PIN(0);
408 MDELAY(5);
409 SET_RESET_PIN(1);
410 MDELAY(20);
411
412 init_lcm_registers();
413 }
414
415
416 static void lcm_suspend(void)
417 {
418 unsigned int data_array[16];
419
420 data_array[0] = 0x00100500;
421 dsi_set_cmdq(data_array, 1, 1);
422 MDELAY(120);
423
424 data_array[0] = 0x00280500;
425 dsi_set_cmdq(data_array, 1, 1);
426 MDELAY(10);
427
428 data_array[0] = 0x014F1500;
429 dsi_set_cmdq(data_array, 1, 1);
430 MDELAY(40);
431 }
432
433
434 static void lcm_resume(void)
435 {
436 lcm_init();
437 }
438
439
440 static void lcm_update(unsigned int x, unsigned int y,
441 unsigned int width, unsigned int height)
442 {
443 unsigned int x0 = x;
444 unsigned int y0 = y;
445 unsigned int x1 = x0 + width - 1;
446 unsigned int y1 = y0 + height - 1;
447
448 unsigned char x0_MSB = ((x0>>8)&0xFF);
449 unsigned char x0_LSB = (x0&0xFF);
450 unsigned char x1_MSB = ((x1>>8)&0xFF);
451 unsigned char x1_LSB = (x1&0xFF);
452 unsigned char y0_MSB = ((y0>>8)&0xFF);
453 unsigned char y0_LSB = (y0&0xFF);
454 unsigned char y1_MSB = ((y1>>8)&0xFF);
455 unsigned char y1_LSB = (y1&0xFF);
456
457 unsigned int data_array[16];
458
459
460 data_array[0]= 0x00053902;
461 data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
462 data_array[2]= (x1_LSB);
463 dsi_set_cmdq(data_array, 3, 1);
464
465 data_array[0]= 0x00053902;
466 data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
467 data_array[2]= (y1_LSB);
468 dsi_set_cmdq(data_array, 3, 1);
469
470 data_array[0]= 0x002c3909;
471 dsi_set_cmdq(data_array, 1, 0);
472 }
473
474
475 static void lcm_setbacklight(unsigned int level)
476 {
477 unsigned int data_array[16];
478
479
480 #if defined(BUILD_LK)
481 printf("%s, %d\n", __func__, level);
482 #elif defined(BUILD_UBOOT)
483 printf("%s, %d\n", __func__, level);
484 #else
485 printk("lcm_setbacklight = %d\n", level);
486 #endif
487
488 if(level > 255)
489 level = 255;
490
491 data_array[0]= 0x00023902;
492 data_array[1] =(0x51|(level<<8));
493 dsi_set_cmdq(data_array, 2, 1);
494 }
495
496
497 static void lcm_setpwm(unsigned int divider)
498 {
499 // TBD
500 }
501
502
503 static unsigned int lcm_getpwm(unsigned int divider)
504 {
505 // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk;
506 // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706
507 unsigned int pwm_clk = 23706 / (1<<divider);
508
509
510 return pwm_clk;
511 }
512
513
514 static unsigned int lcm_compare_id(void)
515 {
516 unsigned int id = 0, id2 = 0;
517 unsigned char buffer[2];
518 unsigned int data_array[16];
519
520
521 SET_RESET_PIN(1); //NOTE:should reset LCM firstly
522 MDELAY(10);
523 SET_RESET_PIN(0);
524 MDELAY(10);
525 SET_RESET_PIN(1);
526 MDELAY(10);
527
528 /*
529 data_array[0] = 0x00110500; // Sleep Out
530 dsi_set_cmdq(data_array, 1, 1);
531 MDELAY(120);
532 */
533
534 //*************Enable CMD2 Page1 *******************//
535 data_array[0]=0x00063902;
536 data_array[1]=0x52AA55F0;
537 data_array[2]=0x00000108;
538 dsi_set_cmdq(data_array, 3, 1);
539 MDELAY(10);
540
541 data_array[0] = 0x00023700;// read id return two byte,version and id
542 dsi_set_cmdq(data_array, 1, 1);
543 MDELAY(10);
544
545 read_reg_v2(0xC5, buffer, 2);
546 id = buffer[0]; //we only need ID
547 id2= buffer[1]; //we test buffer 1
548
549 return (LCM_ID == id)?1:0;
550 }
551
552 void lcm_read_fb(unsigned char *buffer)
553 {
554 unsigned int array[2];
555
556 array[0] = 0x000A3700;// read size
557 dsi_set_cmdq(array, 1, 1);
558
559 read_reg_v2(0x2E,buffer,10);
560 read_reg_v2(0x3E,buffer+10,10);
561 read_reg_v2(0x3E,buffer+10*2,10);
562 read_reg_v2(0x3E,buffer+10*3,10);
563 read_reg_v2(0x3E,buffer+10*4,10);
564 read_reg_v2(0x3E,buffer+10*5,10);
565 }
566
567
568 // ---------------------------------------------------------------------------
569 // Get LCM Driver Hooks
570 // ---------------------------------------------------------------------------
571 LCM_DRIVER nt35510_dsi_cmd_6572_qvga_drv =
572 {
573 .name = "nt35510_dsi_cmd_6572_qvga",
574 .set_util_funcs = lcm_set_util_funcs,
575 .get_params = lcm_get_params,
576 .init = lcm_init,
577 .suspend = lcm_suspend,
578 .resume = lcm_resume,
579 .set_backlight = lcm_setbacklight,
580 //.set_pwm = lcm_setpwm,
581 //.get_pwm = lcm_getpwm,
582 .compare_id = lcm_compare_id,
583 .update = lcm_update,
584 .read_fb = lcm_read_fb,
585 };
586