tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_sc7798_rgb_spi.c
1 /* drivers/video/sc8810/lcd_sc7798_rgb_spi.c
2  *
3  *
4  *
5  *
6  * Copyright (C) 2010 Spreadtrum
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  */
17
18 #include <asm/arch/sprd_lcd.h>
19
20 #define printk printf
21
22 #define  LCD_DEBUG
23 #ifdef LCD_DEBUG
24 #define LCD_PRINT printk
25 #else
26 #define LCD_PRINT(...)
27 #endif
28
29 #define sc7798_SpiWriteCmd(cmd) \
30 { \
31         spi_send_cmd((cmd & 0xFF));\
32 }
33
34 #define  sc7798_SpiWriteData(data)\
35 { \
36         spi_send_data((data & 0xFF));\
37 }
38
39 static int32_t sc7798_init(struct panel_spec *self)
40 {
41     uint32_t test_data[8] = {0};
42     uint32_t left = 0;
43     uint32_t top = 0;
44     uint32_t right = 480;
45     uint32_t bottom = 854;
46     uint32_t data = 0;
47     spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
48     spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
49     spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
50
51     LCD_PRINT("sc7798_init\n");
52
53         sc7798_SpiWriteCmd(0xB9);
54         sc7798_SpiWriteData(0xF1);
55         sc7798_SpiWriteData(0x08);
56         sc7798_SpiWriteData(0x00);
57
58         sc7798_SpiWriteCmd(0xBC); 
59         sc7798_SpiWriteData(0x67);
60
61         sc7798_SpiWriteCmd(0x3A); 
62         sc7798_SpiWriteData(0x70);
63
64         sc7798_SpiWriteCmd(0xB2); 
65         sc7798_SpiWriteData(0x23);
66
67         sc7798_SpiWriteCmd(0xB4); 
68         sc7798_SpiWriteData(0x00);
69
70         sc7798_SpiWriteCmd(0xB1); 
71         sc7798_SpiWriteData(0x22);
72         sc7798_SpiWriteData(0x1B);
73         sc7798_SpiWriteData(0x1B);
74         sc7798_SpiWriteData(0xB7);
75         sc7798_SpiWriteData(0x22);
76         sc7798_SpiWriteData(0x02);
77         sc7798_SpiWriteData(0xA8);
78
79         sc7798_SpiWriteCmd(0xC6); 
80         sc7798_SpiWriteData(0x00);
81         sc7798_SpiWriteData(0x00);
82         sc7798_SpiWriteData(0xFF);
83
84         sc7798_SpiWriteCmd(0xCC); 
85         sc7798_SpiWriteData(0x0C);
86
87         sc7798_SpiWriteCmd(0xE3); 
88         sc7798_SpiWriteData(0x02);
89         sc7798_SpiWriteData(0x02);
90         sc7798_SpiWriteData(0x02);
91         sc7798_SpiWriteData(0x02);
92
93
94         sc7798_SpiWriteCmd(0xB8); 
95         sc7798_SpiWriteData(0x07);
96         sc7798_SpiWriteData(0x22);
97
98         sc7798_SpiWriteCmd(0xB5); 
99         sc7798_SpiWriteData(0x09);
100         sc7798_SpiWriteData(0x09);
101
102         sc7798_SpiWriteCmd(0xC0); 
103         sc7798_SpiWriteData(0x73);
104         sc7798_SpiWriteData(0x50);
105         sc7798_SpiWriteData(0x00);
106         sc7798_SpiWriteData(0x08);
107         sc7798_SpiWriteData(0x70);
108
109         sc7798_SpiWriteCmd(0xB3); 
110         sc7798_SpiWriteData(0x01);
111         sc7798_SpiWriteData(0x00); 
112         sc7798_SpiWriteData(0x06);
113         sc7798_SpiWriteData(0x06);
114         sc7798_SpiWriteData(0x10);
115         sc7798_SpiWriteData(0x0A);
116         sc7798_SpiWriteData(0x45);
117         sc7798_SpiWriteData(0x40);
118
119         sc7798_SpiWriteCmd(0xB9); 
120         sc7798_SpiWriteData(0xF1);
121         sc7798_SpiWriteData(0x08);
122         sc7798_SpiWriteData(0x00);
123
124         sc7798_SpiWriteCmd(0xE9); 
125         sc7798_SpiWriteData(0x00);
126         sc7798_SpiWriteData(0x00);
127         sc7798_SpiWriteData(0x08);
128         sc7798_SpiWriteData(0x03);
129         sc7798_SpiWriteData(0x2F);
130         sc7798_SpiWriteData(0x89);
131         sc7798_SpiWriteData(0x6A); 
132         sc7798_SpiWriteData(0x12);
133         sc7798_SpiWriteData(0x31);
134         sc7798_SpiWriteData(0x23);
135         sc7798_SpiWriteData(0x48);
136         sc7798_SpiWriteData(0x0C);
137         sc7798_SpiWriteData(0x89);
138         sc7798_SpiWriteData(0x6A);
139         sc7798_SpiWriteData(0x47);
140         sc7798_SpiWriteData(0x02);
141         sc7798_SpiWriteData(0x04);
142         sc7798_SpiWriteData(0x00);
143         sc7798_SpiWriteData(0x00);
144         sc7798_SpiWriteData(0x00);
145         sc7798_SpiWriteData(0x00);
146         sc7798_SpiWriteData(0x20);
147         sc7798_SpiWriteData(0x88);
148         sc7798_SpiWriteData(0x88);
149         sc7798_SpiWriteData(0x40);
150         sc7798_SpiWriteData(0x28);
151         sc7798_SpiWriteData(0x69);
152         sc7798_SpiWriteData(0x48);
153         sc7798_SpiWriteData(0x88);
154         sc7798_SpiWriteData(0x88);
155         sc7798_SpiWriteData(0x80);
156         sc7798_SpiWriteData(0x88);
157         sc7798_SpiWriteData(0x88);
158         sc7798_SpiWriteData(0x51);
159         sc7798_SpiWriteData(0x38);
160         sc7798_SpiWriteData(0x79);
161         sc7798_SpiWriteData(0x58);
162         sc7798_SpiWriteData(0x88);
163         sc7798_SpiWriteData(0x88);
164         sc7798_SpiWriteData(0x81);
165         sc7798_SpiWriteData(0x00);
166         sc7798_SpiWriteData(0x00);
167         sc7798_SpiWriteData(0x00);
168         sc7798_SpiWriteData(0x00); 
169         sc7798_SpiWriteData(0x00);
170         sc7798_SpiWriteData(0x00);
171         sc7798_SpiWriteData(0x00);
172         sc7798_SpiWriteData(0x00);
173         sc7798_SpiWriteData(0x00);
174         sc7798_SpiWriteData(0x00);
175         sc7798_SpiWriteData(0x00);
176
177         sc7798_SpiWriteCmd(0xEA); 
178         sc7798_SpiWriteData(0x88);
179         sc7798_SpiWriteData(0x88);
180         sc7798_SpiWriteData(0x37);
181         sc7798_SpiWriteData(0x59);
182         sc7798_SpiWriteData(0x18);
183         sc7798_SpiWriteData(0x18);
184         sc7798_SpiWriteData(0x88); 
185         sc7798_SpiWriteData(0x88);
186         sc7798_SpiWriteData(0x85);
187         sc7798_SpiWriteData(0x88);
188         sc7798_SpiWriteData(0x88);
189         sc7798_SpiWriteData(0x26);
190         sc7798_SpiWriteData(0x49);
191         sc7798_SpiWriteData(0x08);
192         sc7798_SpiWriteData(0x08);
193         sc7798_SpiWriteData(0x88);
194         sc7798_SpiWriteData(0x88);
195         sc7798_SpiWriteData(0x84);
196         sc7798_SpiWriteData(0x30);
197         sc7798_SpiWriteData(0x00);
198         sc7798_SpiWriteData(0x00);
199         sc7798_SpiWriteData(0xFF);
200         sc7798_SpiWriteData(0x00);
201         sc7798_SpiWriteData(0x50);
202         sc7798_SpiWriteData(0x00);
203         sc7798_SpiWriteData(0x00);
204         sc7798_SpiWriteData(0x00);
205         sc7798_SpiWriteData(0x00);
206         sc7798_SpiWriteData(0x00);
207         sc7798_SpiWriteData(0x00);
208         sc7798_SpiWriteData(0x00);
209         sc7798_SpiWriteData(0x00);
210         sc7798_SpiWriteData(0x00);
211         sc7798_SpiWriteData(0x00);
212         sc7798_SpiWriteData(0x00);
213         sc7798_SpiWriteData(0x00);
214
215         sc7798_SpiWriteCmd(0xE0); 
216         sc7798_SpiWriteData(0x00);
217         sc7798_SpiWriteData(0x00);
218         sc7798_SpiWriteData(0x00);
219         sc7798_SpiWriteData(0x04);
220         sc7798_SpiWriteData(0x04);
221         sc7798_SpiWriteData(0x0A);
222         sc7798_SpiWriteData(0x18); 
223         sc7798_SpiWriteData(0x2B);
224         sc7798_SpiWriteData(0x05);
225         sc7798_SpiWriteData(0x0C);
226         sc7798_SpiWriteData(0x11);
227         sc7798_SpiWriteData(0x16);
228         sc7798_SpiWriteData(0x18);
229         sc7798_SpiWriteData(0x16);
230         sc7798_SpiWriteData(0x16);
231         sc7798_SpiWriteData(0x15);
232         sc7798_SpiWriteData(0x19);
233         sc7798_SpiWriteData(0x00);
234         sc7798_SpiWriteData(0x00);
235         sc7798_SpiWriteData(0x00);
236         sc7798_SpiWriteData(0x04);
237         sc7798_SpiWriteData(0x04);
238         sc7798_SpiWriteData(0x0A);
239         sc7798_SpiWriteData(0x18);
240         sc7798_SpiWriteData(0x2C);
241         sc7798_SpiWriteData(0x05);
242         sc7798_SpiWriteData(0x0C);
243         sc7798_SpiWriteData(0x12);
244         sc7798_SpiWriteData(0x16);
245         sc7798_SpiWriteData(0x18);
246         sc7798_SpiWriteData(0x16);
247         sc7798_SpiWriteData(0x17);
248         sc7798_SpiWriteData(0x16);
249         sc7798_SpiWriteData(0x19);
250
251 #if 0
252         sc7798_SpiWriteCmd(0xC1); 
253         sc7798_SpiWriteData(0x01);
254         sc7798_SpiWriteData(0x00);
255         sc7798_SpiWriteData(0x03);
256         sc7798_SpiWriteData(0x0B);
257         sc7798_SpiWriteData(0x17);
258         sc7798_SpiWriteData(0x20);
259         sc7798_SpiWriteData(0x26); 
260         sc7798_SpiWriteData(0x30);
261         sc7798_SpiWriteData(0x36);
262         sc7798_SpiWriteData(0x3F);
263         sc7798_SpiWriteData(0x48);
264         sc7798_SpiWriteData(0x50);
265         sc7798_SpiWriteData(0x58);
266         sc7798_SpiWriteData(0x5F);
267         sc7798_SpiWriteData(0x68);
268         sc7798_SpiWriteData(0x71);
269         sc7798_SpiWriteData(0x79);
270         sc7798_SpiWriteData(0x82);
271         sc7798_SpiWriteData(0x89);
272         sc7798_SpiWriteData(0x91);
273         sc7798_SpiWriteData(0x99);
274         sc7798_SpiWriteData(0xA1);
275         sc7798_SpiWriteData(0xA9);
276         sc7798_SpiWriteData(0xB0);
277         sc7798_SpiWriteData(0xB8);
278         sc7798_SpiWriteData(0xC0);
279         sc7798_SpiWriteData(0xC8);
280         sc7798_SpiWriteData(0xD0);
281         sc7798_SpiWriteData(0xD6);
282         sc7798_SpiWriteData(0xDC);
283         sc7798_SpiWriteData(0xE4);
284         sc7798_SpiWriteData(0xED);
285         sc7798_SpiWriteData(0xF7);
286         sc7798_SpiWriteData(0xFF);
287         sc7798_SpiWriteData(0x00);
288         sc7798_SpiWriteData(0x00);
289         sc7798_SpiWriteData(0x00);
290         sc7798_SpiWriteData(0xC0);
291         sc7798_SpiWriteData(0x0A);
292         sc7798_SpiWriteData(0x80);
293         sc7798_SpiWriteData(0x30);
294         sc7798_SpiWriteData(0xE8);
295         sc7798_SpiWriteData(0x00);
296         sc7798_SpiWriteData(0x00);
297         sc7798_SpiWriteData(0x03);
298         sc7798_SpiWriteData(0x0B);
299         sc7798_SpiWriteData(0x17);
300         sc7798_SpiWriteData(0x20);
301         sc7798_SpiWriteData(0x27);
302         sc7798_SpiWriteData(0x30);
303         sc7798_SpiWriteData(0x37);
304         sc7798_SpiWriteData(0x40);
305         sc7798_SpiWriteData(0x48);
306         sc7798_SpiWriteData(0x50);
307         sc7798_SpiWriteData(0x58);
308         sc7798_SpiWriteData(0x5F);
309         sc7798_SpiWriteData(0x67);
310         sc7798_SpiWriteData(0x70);
311         sc7798_SpiWriteData(0x78);
312         sc7798_SpiWriteData(0x80);
313         sc7798_SpiWriteData(0x88);
314         sc7798_SpiWriteData(0x90);
315         sc7798_SpiWriteData(0x98);
316         sc7798_SpiWriteData(0xA0);
317         sc7798_SpiWriteData(0xA8);
318         sc7798_SpiWriteData(0xAF);
319         sc7798_SpiWriteData(0xB7);
320         sc7798_SpiWriteData(0xBF);
321         sc7798_SpiWriteData(0xC7);
322         sc7798_SpiWriteData(0xCF);
323         sc7798_SpiWriteData(0xD5);
324         sc7798_SpiWriteData(0xDC);
325         sc7798_SpiWriteData(0xE4);
326         sc7798_SpiWriteData(0xED);
327         sc7798_SpiWriteData(0xF7);
328         sc7798_SpiWriteData(0xFF);
329         sc7798_SpiWriteData(0x00);
330         sc7798_SpiWriteData(0x00);
331         sc7798_SpiWriteData(0x00);
332         sc7798_SpiWriteData(0xC0);
333         sc7798_SpiWriteData(0x0A);
334         sc7798_SpiWriteData(0x80);
335         sc7798_SpiWriteData(0x30);
336         sc7798_SpiWriteData(0xE8);
337         sc7798_SpiWriteData(0x00);
338         sc7798_SpiWriteData(0x00);
339         sc7798_SpiWriteData(0x03);
340         sc7798_SpiWriteData(0x0D);
341         sc7798_SpiWriteData(0x19);
342         sc7798_SpiWriteData(0x23);
343         sc7798_SpiWriteData(0x29);
344         sc7798_SpiWriteData(0x31);
345         sc7798_SpiWriteData(0x38);
346         sc7798_SpiWriteData(0x41);
347         sc7798_SpiWriteData(0x48);
348         sc7798_SpiWriteData(0x4F);
349         sc7798_SpiWriteData(0x57);
350         sc7798_SpiWriteData(0x5D);
351         sc7798_SpiWriteData(0x65);
352         sc7798_SpiWriteData(0x6C);
353         sc7798_SpiWriteData(0x74);
354         sc7798_SpiWriteData(0x7B);
355         sc7798_SpiWriteData(0x84);
356         sc7798_SpiWriteData(0x8B);
357         sc7798_SpiWriteData(0x94);
358         sc7798_SpiWriteData(0x9B);
359         sc7798_SpiWriteData(0xA4);
360         sc7798_SpiWriteData(0xAA);
361         sc7798_SpiWriteData(0xB4);
362         sc7798_SpiWriteData(0xB9);
363         sc7798_SpiWriteData(0xC3);
364         sc7798_SpiWriteData(0xCC);
365         sc7798_SpiWriteData(0xD6);
366         sc7798_SpiWriteData(0xDC);
367         sc7798_SpiWriteData(0xE4);
368         sc7798_SpiWriteData(0xED);
369         sc7798_SpiWriteData(0xF7);
370         sc7798_SpiWriteData(0xFF);
371         sc7798_SpiWriteData(0x00);
372         sc7798_SpiWriteData(0x00);
373         sc7798_SpiWriteData(0x00);
374         sc7798_SpiWriteData(0xC0);
375         sc7798_SpiWriteData(0x0A);
376         sc7798_SpiWriteData(0x80);
377         sc7798_SpiWriteData(0x30);
378         sc7798_SpiWriteData(0xE8);
379         sc7798_SpiWriteData(0x00);
380 #endif
381 #if 1
382     //Display on
383     sc7798_SpiWriteCmd(0x11); // (SLPOUT)
384
385     LCD_DelayMS(120); // 100ms
386
387     sc7798_SpiWriteCmd(0x29); // (DISPON)
388
389     LCD_DelayMS(100); // 100ms
390 #else
391         if (1) { //  for test the lcd
392                 int i;
393                 sc7798_SpiWriteCmd(0x2C); //Write data
394                 for (i = 0; i < 480*320/3; i++)
395                         sc7798_SpiWriteData(0xff);
396                 for (i = 0; i < 480*320/3; i++)
397                         sc7798_SpiWriteData(0xff00);
398                 for (i = 0; i < 480*320/3; i++)
399                         sc7798_SpiWriteData(0xff0000);
400         }
401         sc7798_SpiWriteCmd(0x29); //Display On
402         LCD_DelayMS(120); //120ms
403         sc7798_SpiWriteCmd(0x2C); //Write data
404         LCD_DelayMS(1200); //120ms
405 #endif
406         LCD_PRINT("sc7798_init: end\n");
407
408         return 0;
409 }
410
411 static int32_t sc7798_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
412 {
413         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
414         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
415
416         if(is_sleep==1){
417                 //Sleep In
418                 sc7798_SpiWriteCmd(0x28);
419                 udelay(120000);
420                 sc7798_SpiWriteCmd(0x10);
421                 udelay(10000);
422         }else{
423                 //Sleep Out
424                 sc7798_SpiWriteCmd(0x11);
425                 udelay(120000);
426                 sc7798_SpiWriteCmd(0x29);
427                 udelay(10000);
428         }
429
430         return 0;
431 }
432
433 static int32_t sc7798_set_window(struct panel_spec *self,
434                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
435 {
436         uint32_t *test_data[4] = {0};
437         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
438         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
439         spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
440         LCD_PRINT("zxdbg add -sc7798_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
441
442         return 0;
443 }
444 static int32_t sc7798_invalidate(struct panel_spec *self)
445 {
446         LCD_PRINT("sc7798_invalidate\n");
447
448         return self->ops->panel_set_window(self, 0, 0,
449                 self->width - 1, self->height - 1);
450 }
451
452
453
454 static int32_t sc7798_invalidate_rect(struct panel_spec *self,
455                                 uint16_t left, uint16_t top,
456                                 uint16_t right, uint16_t bottom)
457 {
458         LCD_PRINT("sc7798_invalidate_rect \n");
459
460         return self->ops->panel_set_window(self, left, top,
461                         right, bottom);
462 }
463
464 static int32_t sc7798_read_id(struct panel_spec *self)
465 {
466 #if 0
467         int32_t id  = 0x62;
468         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
469         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
470         spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
471
472         sc7798_SpiWriteCmd(0xDA); // SET password
473
474         spi_read(&id);
475         id &= 0xff;
476 #endif
477         //LCD_PRINT(" sc7798_read_id u-boot id = %x\n",id);
478
479         return 0x7798;
480
481 }
482
483 static struct panel_operations lcd_sc7798_rgb_spi_operations = {
484         .panel_init = sc7798_init,
485         .panel_set_window = sc7798_set_window,
486         .panel_invalidate_rect= sc7798_invalidate_rect,
487         .panel_invalidate = sc7798_invalidate,
488         .panel_enter_sleep = sc7798_enter_sleep,
489         .panel_readid          = sc7798_read_id
490 };
491
492 static struct timing_rgb lcd_sc7798_rgb_timing = {
493         .hfp = 90,
494         .hbp = 70,
495         .hsync = 60,
496         .vfp = 8,
497         .vbp = 12,
498         .vsync = 4,
499
500 };
501
502 static struct spi_info lcd_sc7798_rgb_spi_info = {
503         .ops = NULL,
504 };
505
506 static struct info_rgb lcd_sc7798_rgb_info = {
507         .cmd_bus_mode  = SPRDFB_RGB_BUS_TYPE_SPI,
508         .video_bus_width = 24, /*18,16*/
509         .h_sync_pol = SPRDFB_POLARITY_NEG,
510         .v_sync_pol = SPRDFB_POLARITY_NEG,
511         .de_pol = SPRDFB_POLARITY_POS,
512         .timing = &lcd_sc7798_rgb_timing,
513         .bus_info = {
514                 .spi = &lcd_sc7798_rgb_spi_info,
515         }
516 };
517
518 struct panel_spec lcd_panel_sc7798_rgb_spi = {
519         .width = 480,
520         .height = 800,
521         .fps = 61,
522         .type = LCD_MODE_RGB,
523         .direction = LCD_DIRECT_NORMAL,
524         .info = {
525                 .rgb = &lcd_sc7798_rgb_info
526         },
527         .ops = &lcd_sc7798_rgb_spi_operations,
528 };
529