import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / hx8369_6575 / hx8369_6575.c
1 #include <linux/string.h>
2
3 #include "lcm_drv.h"
4
5
6 // ---------------------------------------------------------------------------
7 // Local Constants
8 // ---------------------------------------------------------------------------
9
10 #define FRAME_WIDTH (480)
11 #define FRAME_HEIGHT (800)
12 #define LCM_ID (0x69)
13
14 // ---------------------------------------------------------------------------
15 // Local Variables
16 // ---------------------------------------------------------------------------
17
18 static LCM_UTIL_FUNCS lcm_util = {0};
19
20 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
21
22 #define UDELAY(n) (lcm_util.udelay(n))
23 #define MDELAY(n) (lcm_util.mdelay(n))
24
25
26 // ---------------------------------------------------------------------------
27 // Local Functions
28 // ---------------------------------------------------------------------------
29
30 static __inline void send_ctrl_cmd(unsigned int cmd)
31 {
32 lcm_util.send_cmd(cmd);
33 }
34
35 static __inline void send_data_cmd(unsigned int data)
36 {
37 lcm_util.send_data(data&0xff);
38 }
39
40 static __inline unsigned int read_data_cmd(void)
41 {
42 return 0xFF&lcm_util.read_data();
43 }
44
45 static __inline void set_lcm_register(unsigned int regIndex,
46 unsigned int regData)
47 {
48 send_ctrl_cmd(regIndex);
49 send_data_cmd(regData);
50 }
51
52 static void sw_clear_panel(unsigned int color)
53 {
54 unsigned short x0, y0, x1, y1, x, y;
55 unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
56
57 x0 = (unsigned short)0;
58 y0 = (unsigned short)0;
59 x1 = (unsigned short)FRAME_WIDTH-1;
60 y1 = (unsigned short)FRAME_HEIGHT-1;
61
62 h_X_start=((x0&0xFF00)>>8);
63 l_X_start=(x0&0x00FF);
64 h_X_end=((x1&0xFF00)>>8);
65 l_X_end=(x1&0x00FF);
66
67 h_Y_start=((y0&0xFF00)>>8);
68 l_Y_start=(y0&0x00FF);
69 h_Y_end=((y1&0xFF00)>>8);
70 l_Y_end=(y1&0x00FF);
71
72 send_ctrl_cmd(0x2A);
73 send_data_cmd(h_X_start);
74 send_data_cmd(l_X_start);
75 send_data_cmd(h_X_end);
76 send_data_cmd(l_X_end);
77
78 send_ctrl_cmd(0x2B);
79 send_data_cmd(h_Y_start);
80 send_data_cmd(l_Y_start);
81 send_data_cmd(h_Y_end);
82 send_data_cmd(l_Y_end);
83
84 send_ctrl_cmd(0x29);
85
86 send_ctrl_cmd(0x2C);
87 for (y = y0; y <= y1; ++ y) {
88 for (x = x0; x <= x1; ++ x) {
89 lcm_util.send_data(color);
90 }
91 }
92 }
93
94 static void init_lcm_registers(void)
95 {
96 send_ctrl_cmd(0xB9); // SET password
97 send_data_cmd(0xFF);
98 send_data_cmd(0x83);
99 send_data_cmd(0x69);
100
101 send_ctrl_cmd(0xB1); //Set Power
102 send_data_cmd(0x85);
103 send_data_cmd(0x00);
104 send_data_cmd(0x34);
105 send_data_cmd(0x0A);
106 send_data_cmd(0x00);
107 send_data_cmd(0x0F);
108 send_data_cmd(0x0F);
109 send_data_cmd(0x2A);
110 send_data_cmd(0x32);
111 send_data_cmd(0x3F);
112 send_data_cmd(0x3F);
113 send_data_cmd(0x01);
114 send_data_cmd(0x23);
115 send_data_cmd(0x01);
116 send_data_cmd(0xE6);
117 send_data_cmd(0xE6);
118 send_data_cmd(0xE6);
119 send_data_cmd(0xE6);
120 send_data_cmd(0xE6);
121
122 send_ctrl_cmd(0xB2); // SET Display 480x800
123 send_data_cmd(0x00);
124 send_data_cmd(0x20);
125 send_data_cmd(0x03);
126 send_data_cmd(0x03);
127 send_data_cmd(0x70);
128 send_data_cmd(0x00);
129 send_data_cmd(0xFF);
130 send_data_cmd(0x06);
131 send_data_cmd(0x00);
132 send_data_cmd(0x00);
133 send_data_cmd(0x00);
134 send_data_cmd(0x03);
135 send_data_cmd(0x03);
136 send_data_cmd(0x00);
137 send_data_cmd(0x01);
138
139 send_ctrl_cmd(0xB4); // SET Display column inversion
140 send_data_cmd(0x00);
141 send_data_cmd(0x18);
142 send_data_cmd(0x80);
143 send_data_cmd(0x06);
144 send_data_cmd(0x02);
145
146 send_ctrl_cmd(0xB6); // SET VCOM
147 send_data_cmd(0x3A);
148 send_data_cmd(0x3A);
149
150 send_ctrl_cmd(0xD5);
151 send_data_cmd(0x00);
152 send_data_cmd(0x02);
153 send_data_cmd(0x03);
154 send_data_cmd(0x00);
155 send_data_cmd(0x01);
156 send_data_cmd(0x03);
157 send_data_cmd(0x28);
158 send_data_cmd(0x70);
159 send_data_cmd(0x01);
160 send_data_cmd(0x03);
161 send_data_cmd(0x00);
162 send_data_cmd(0x00);
163 send_data_cmd(0x40);
164 send_data_cmd(0x06);
165 send_data_cmd(0x51);
166 send_data_cmd(0x07);
167 send_data_cmd(0x00);
168 send_data_cmd(0x00);
169 send_data_cmd(0x41);
170 send_data_cmd(0x06);
171 send_data_cmd(0x50);
172 send_data_cmd(0x07);
173 send_data_cmd(0x07);
174 send_data_cmd(0x0F);
175 send_data_cmd(0x04);
176 send_data_cmd(0x00);
177
178 send_ctrl_cmd(0xE0); // Set Gamma
179 send_data_cmd(0x00);
180 send_data_cmd(0x13);
181 send_data_cmd(0x19);
182 send_data_cmd(0x38);
183 send_data_cmd(0x3D);
184 send_data_cmd(0x3F);
185 send_data_cmd(0x28);
186 send_data_cmd(0x46);
187 send_data_cmd(0x07);
188 send_data_cmd(0x0D);
189 send_data_cmd(0x0E);
190 send_data_cmd(0x12);
191 send_data_cmd(0x15);
192 send_data_cmd(0x12);
193 send_data_cmd(0x14);
194 send_data_cmd(0x0F);
195 send_data_cmd(0x17);
196 send_data_cmd(0x00);
197 send_data_cmd(0x13);
198 send_data_cmd(0x19);
199 send_data_cmd(0x38);
200 send_data_cmd(0x3D);
201 send_data_cmd(0x3F);
202 send_data_cmd(0x28);
203 send_data_cmd(0x46);
204 send_data_cmd(0x07);
205 send_data_cmd(0x0D);
206 send_data_cmd(0x0E);
207 send_data_cmd(0x12);
208 send_data_cmd(0x15);
209 send_data_cmd(0x12);
210 send_data_cmd(0x14);
211 send_data_cmd(0x0F);
212 send_data_cmd(0x17);
213
214 send_ctrl_cmd(0xC1); // Set DGC
215 send_data_cmd(0x01);
216 send_data_cmd(0x04);
217 send_data_cmd(0x13);
218 send_data_cmd(0x1A);
219 send_data_cmd(0x20);
220 send_data_cmd(0x27);
221 send_data_cmd(0x2C);
222 send_data_cmd(0x32);
223 send_data_cmd(0x36);
224 send_data_cmd(0x3F);
225 send_data_cmd(0x47);
226 send_data_cmd(0x50);
227 send_data_cmd(0x59);
228 send_data_cmd(0x60);
229 send_data_cmd(0x68);
230 send_data_cmd(0x71);
231 send_data_cmd(0x7B);
232 send_data_cmd(0x82);
233 send_data_cmd(0x89);
234 send_data_cmd(0x91);
235 send_data_cmd(0x98);
236 send_data_cmd(0xA0);
237 send_data_cmd(0xA8);
238 send_data_cmd(0xB0);
239 send_data_cmd(0xB8);
240 send_data_cmd(0xC1);
241 send_data_cmd(0xC9);
242 send_data_cmd(0xD0);
243 send_data_cmd(0xD7);
244 send_data_cmd(0xE0);
245 send_data_cmd(0xE7);
246 send_data_cmd(0xEF);
247 send_data_cmd(0xF7);
248 send_data_cmd(0xFE);
249 send_data_cmd(0xCF);
250 send_data_cmd(0x52);
251 send_data_cmd(0x34);
252 send_data_cmd(0xF8);
253 send_data_cmd(0x51);
254 send_data_cmd(0xF5);
255 send_data_cmd(0x9D);
256 send_data_cmd(0x75);
257 send_data_cmd(0x00);
258 send_data_cmd(0x04);
259 send_data_cmd(0x13);
260 send_data_cmd(0x1A);
261 send_data_cmd(0x20);
262 send_data_cmd(0x27);
263 send_data_cmd(0x2C);
264 send_data_cmd(0x32);
265 send_data_cmd(0x36);
266 send_data_cmd(0x3F);
267 send_data_cmd(0x47);
268 send_data_cmd(0x50);
269 send_data_cmd(0x59);
270 send_data_cmd(0x60);
271 send_data_cmd(0x68);
272 send_data_cmd(0x71);
273 send_data_cmd(0x7B);
274 send_data_cmd(0x82);
275 send_data_cmd(0x89);
276 send_data_cmd(0x91);
277 send_data_cmd(0x98);
278 send_data_cmd(0xA0);
279 send_data_cmd(0xA8);
280 send_data_cmd(0xB0);
281 send_data_cmd(0xB8);
282 send_data_cmd(0xC1);
283 send_data_cmd(0xC9);
284 send_data_cmd(0xD0);
285 send_data_cmd(0xD7);
286 send_data_cmd(0xE0);
287 send_data_cmd(0xE7);
288 send_data_cmd(0xEF);
289 send_data_cmd(0xF7);
290 send_data_cmd(0xFE);
291 send_data_cmd(0xCF);
292 send_data_cmd(0x52);
293 send_data_cmd(0x34);
294 send_data_cmd(0xF8);
295 send_data_cmd(0x51);
296 send_data_cmd(0xF5);
297 send_data_cmd(0x9D);
298 send_data_cmd(0x75);
299 send_data_cmd(0x00);
300 send_data_cmd(0x04);
301 send_data_cmd(0x13);
302 send_data_cmd(0x1A);
303 send_data_cmd(0x20);
304 send_data_cmd(0x27);
305 send_data_cmd(0x2C);
306 send_data_cmd(0x32);
307 send_data_cmd(0x36);
308 send_data_cmd(0x3F);
309 send_data_cmd(0x47);
310 send_data_cmd(0x50);
311 send_data_cmd(0x59);
312 send_data_cmd(0x60);
313 send_data_cmd(0x68);
314 send_data_cmd(0x71);
315 send_data_cmd(0x7B);
316 send_data_cmd(0x82);
317 send_data_cmd(0x89);
318 send_data_cmd(0x91);
319 send_data_cmd(0x98);
320 send_data_cmd(0xA0);
321 send_data_cmd(0xA8);
322 send_data_cmd(0xB0);
323 send_data_cmd(0xB8);
324 send_data_cmd(0xC1);
325 send_data_cmd(0xC9);
326 send_data_cmd(0xD0);
327 send_data_cmd(0xD7);
328 send_data_cmd(0xE0);
329 send_data_cmd(0xE7);
330 send_data_cmd(0xEF);
331 send_data_cmd(0xF7);
332 send_data_cmd(0xFE);
333 send_data_cmd(0xCF);
334 send_data_cmd(0x52);
335 send_data_cmd(0x34);
336 send_data_cmd(0xF8);
337 send_data_cmd(0x51);
338 send_data_cmd(0xF5);
339 send_data_cmd(0x9D);
340 send_data_cmd(0x75);
341 send_data_cmd(0x00);
342
343 send_ctrl_cmd(0x3A); // set Interface Pixel Format
344 send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel
345
346 send_ctrl_cmd(0x51);//write display brightness
347 send_data_cmd(0xff);//set brightness 0x00-0xff
348 MDELAY(50);
349
350 send_ctrl_cmd(0x53);//write ctrl display
351 send_data_cmd(0x24);
352 MDELAY(50);
353
354 send_ctrl_cmd(0x55);
355 send_data_cmd(0x02);//still picture
356 MDELAY(50);
357
358 send_ctrl_cmd(0x5e);//write CABC minumum brightness
359 send_data_cmd(0x70);//
360 MDELAY(50);
361
362 send_ctrl_cmd(0x11);
363 MDELAY(120);
364 }
365
366
367 // ---------------------------------------------------------------------------
368 // LCM Driver Implementations
369 // ---------------------------------------------------------------------------
370
371 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
372 {
373 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
374 }
375
376
377 static void lcm_get_params(LCM_PARAMS *params)
378 {
379 memset(params, 0, sizeof(LCM_PARAMS));
380
381 params->type = LCM_TYPE_DBI;
382 params->ctrl = LCM_CTRL_PARALLEL_DBI;
383 params->width = FRAME_WIDTH;
384 params->height = FRAME_HEIGHT;
385 params->io_select_mode = 1;
386
387 params->dbi.port = 0;
388 params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M;
389 params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS;
390 params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB;
391 params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST;
392 params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB;
393 params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888;
394 params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS;
395 params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS;
396 params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA;
397
398 params->dbi.parallel.write_setup = 1;
399 params->dbi.parallel.write_hold = 1;
400 params->dbi.parallel.write_wait = 3;
401 params->dbi.parallel.read_setup = 3;
402 params->dbi.parallel.read_latency = 20;
403 params->dbi.parallel.wait_period = 0;
404
405 }
406
407
408
409 static void lcm_init(void)
410 {
411 SET_RESET_PIN(0);
412 MDELAY(25);
413 SET_RESET_PIN(1);
414 MDELAY(50);
415
416 init_lcm_registers();
417 }
418
419
420 static void lcm_suspend(void)
421 {
422 sw_clear_panel(0);
423 send_ctrl_cmd(0x10);
424 MDELAY(5);
425 }
426
427
428 static void lcm_resume(void)
429 {
430 send_ctrl_cmd(0x11);
431 MDELAY(120);
432 }
433
434 static void lcm_update(unsigned int x, unsigned int y,
435 unsigned int width, unsigned int height)
436 {
437 unsigned short x0, y0, x1, y1;
438 unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
439
440 x0 = (unsigned short)x;
441 y0 = (unsigned short)y;
442 x1 = (unsigned short)x+width-1;
443 y1 = (unsigned short)y+height-1;
444
445 h_X_start=((x0&0xFF00)>>8);
446 l_X_start=(x0&0x00FF);
447 h_X_end=((x1&0xFF00)>>8);
448 l_X_end=(x1&0x00FF);
449
450 h_Y_start=((y0&0xFF00)>>8);
451 l_Y_start=(y0&0x00FF);
452 h_Y_end=((y1&0xFF00)>>8);
453 l_Y_end=(y1&0x00FF);
454
455 send_ctrl_cmd(0x2A);
456 send_data_cmd(h_X_start);
457 send_data_cmd(l_X_start);
458 send_data_cmd(h_X_end);
459 send_data_cmd(l_X_end);
460
461 send_ctrl_cmd(0x2B);
462 send_data_cmd(h_Y_start);
463 send_data_cmd(l_Y_start);
464 send_data_cmd(h_Y_end);
465 send_data_cmd(l_Y_end);
466
467 send_ctrl_cmd(0x29);
468
469 send_ctrl_cmd(0x2C);
470 }
471
472 static void lcm_setbacklight(unsigned int level)
473 {
474 if(level > 255) level = 255;
475 send_ctrl_cmd(0x51);
476 send_data_cmd(level);
477 }
478 static unsigned int lcm_compare_id(void)
479 {
480 send_ctrl_cmd(0xB9); // SET password
481 send_data_cmd(0xFF);
482 send_data_cmd(0x83);
483 send_data_cmd(0x69);
484 send_ctrl_cmd(0xC3);
485 send_data_cmd(0xFF);
486
487 send_ctrl_cmd(0xF4);
488 read_data_cmd();
489 return (LCM_ID == read_data_cmd())?1:0;
490 }
491
492 LCM_DRIVER hx8369_6575_lcm_drv =
493 {
494 .name = "hx8369_6575",
495 .set_util_funcs = lcm_set_util_funcs,
496 .get_params = lcm_get_params,
497 .init = lcm_init,
498 .suspend = lcm_suspend,
499 .resume = lcm_resume,
500 .update = lcm_update,
501 .set_backlight = lcm_setbacklight,
502 .compare_id = lcm_compare_id,
503 };
504
505