tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_hx8363_rgb_spi.c
1 /* drivers/video/sc8810/lcd_hx8363_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 #define printk printf
20
21 #define  LCD_DEBUG
22 #ifdef LCD_DEBUG
23 #define LCD_PRINT printk
24 #else
25 #define LCD_PRINT(...)
26 #endif
27
28 #define HX8363_SpiWriteCmd(cmd) \ 
29 { \
30         spi_send_cmd((cmd & 0xFF));\
31 }
32
33 #define  HX8363_SpiWriteData(data)\
34 { \
35         spi_send_data((data & 0xFF));\
36 }
37
38
39 static int32_t hx8363_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
52         LCD_PRINT("hx8363_init\n");
53
54         HX8363_SpiWriteCmd(0xB9); // SET password
55         HX8363_SpiWriteData(0xFF); // 
56         HX8363_SpiWriteData(0x83); // 
57         HX8363_SpiWriteData(0x63); // 
58
59         HX8363_SpiWriteCmd(0xB1);
60         HX8363_SpiWriteData(0x01);
61         HX8363_SpiWriteData(0x00);
62         HX8363_SpiWriteData(0x44);
63         HX8363_SpiWriteData(0x08);
64         HX8363_SpiWriteData(0x01);
65 //      HX8363_SpiWriteData(0x0E); //
66 //      HX8363_SpiWriteData(0x0E); //
67 //      HX8363_SpiWriteData(0x1B); //the lower ,Saturation is better
68 //      HX8363_SpiWriteData(0x23); //the lower ,Saturation is better
69         HX8363_SpiWriteData(0x0F); //
70         HX8363_SpiWriteData(0x0F); //
71         HX8363_SpiWriteData(0x22); //the lower ,Saturation is better
72         HX8363_SpiWriteData(0x2A); //the lower ,Saturation is better
73
74         HX8363_SpiWriteData(0x3F);
75         HX8363_SpiWriteData(0x3F);
76         HX8363_SpiWriteData(0x40);
77         HX8363_SpiWriteData(0x32);
78         HX8363_SpiWriteData(0x00);
79         HX8363_SpiWriteData(0xE6);
80         HX8363_SpiWriteData(0xE6);
81         HX8363_SpiWriteData(0xE6);
82         HX8363_SpiWriteData(0xE6);
83         HX8363_SpiWriteData(0xE6);
84
85         HX8363_SpiWriteCmd(0xB2); // SET DISP
86         HX8363_SpiWriteData(0x08); // 
87         HX8363_SpiWriteData(0x03); // 
88
89         HX8363_SpiWriteCmd(0xB4);
90         HX8363_SpiWriteData(0x00);//Column inversion
91         HX8363_SpiWriteData(0x18); 
92         HX8363_SpiWriteData(0x9C);
93         HX8363_SpiWriteData(0x08);
94         HX8363_SpiWriteData(0x18);
95         HX8363_SpiWriteData(0x04);
96         HX8363_SpiWriteData(0x82);
97
98         HX8363_SpiWriteCmd(0xB6); //Set_VCOM 
99         HX8363_SpiWriteData(0x1B); //0x10
100
101         HX8363_SpiWriteCmd(0xCC); // SET Panel
102         HX8363_SpiWriteData(0x01); //
103
104         udelay(5000);
105
106         HX8363_SpiWriteCmd(0xE0);  // SET Gamma
107         HX8363_SpiWriteData(0x00);
108         HX8363_SpiWriteData(0x05);
109         HX8363_SpiWriteData(0x07);
110         HX8363_SpiWriteData(0x0C);
111         HX8363_SpiWriteData(0x13);
112         HX8363_SpiWriteData(0x2F);
113         HX8363_SpiWriteData(0x0B);
114         HX8363_SpiWriteData(0x1D);
115         HX8363_SpiWriteData(0x86);
116         HX8363_SpiWriteData(0x0D);
117         HX8363_SpiWriteData(0x91);
118         HX8363_SpiWriteData(0x16);
119         HX8363_SpiWriteData(0x99);
120         HX8363_SpiWriteData(0x16);
121         HX8363_SpiWriteData(0x16);
122         HX8363_SpiWriteData(0x09);
123         HX8363_SpiWriteData(0x05);
124         HX8363_SpiWriteData(0x00);
125         HX8363_SpiWriteData(0x05);
126         HX8363_SpiWriteData(0x07);
127         HX8363_SpiWriteData(0x0C);
128         HX8363_SpiWriteData(0x13);
129         HX8363_SpiWriteData(0x2F);
130         HX8363_SpiWriteData(0x0B);
131         HX8363_SpiWriteData(0x1D);
132         HX8363_SpiWriteData(0x86);
133         HX8363_SpiWriteData(0x0D);
134         HX8363_SpiWriteData(0x91);
135         HX8363_SpiWriteData(0x16);
136         HX8363_SpiWriteData(0x99);
137         HX8363_SpiWriteData(0x16);
138         HX8363_SpiWriteData(0x16);
139         HX8363_SpiWriteData(0x09);
140         HX8363_SpiWriteData(0x05);
141
142         HX8363_SpiWriteCmd(0xC1); //COLMOD 
143         HX8363_SpiWriteData(0x01); // 
144         //R
145         HX8363_SpiWriteData(0x07 );
146         HX8363_SpiWriteData(0x0A );
147         HX8363_SpiWriteData(0x1A );
148         HX8363_SpiWriteData(0x2F );
149         HX8363_SpiWriteData(0x3E );
150         HX8363_SpiWriteData(0x4A );
151         HX8363_SpiWriteData(0x52 );
152         HX8363_SpiWriteData(0x5A );
153         HX8363_SpiWriteData(0x62 );
154         HX8363_SpiWriteData(0x69 );
155         HX8363_SpiWriteData(0x70 );
156         HX8363_SpiWriteData(0x76 );
157         HX8363_SpiWriteData(0x7D );
158         HX8363_SpiWriteData(0x82 );
159         HX8363_SpiWriteData(0x86 );
160         HX8363_SpiWriteData(0x8C );
161         HX8363_SpiWriteData(0x93 );
162         HX8363_SpiWriteData(0x9A );
163         HX8363_SpiWriteData(0x9F );
164         HX8363_SpiWriteData(0xA4 );
165         HX8363_SpiWriteData(0xA9 );
166         HX8363_SpiWriteData(0xB0 );
167         HX8363_SpiWriteData(0xB6 );
168         HX8363_SpiWriteData(0xBB );
169         HX8363_SpiWriteData(0xC2 );
170         HX8363_SpiWriteData(0xC9 );
171         HX8363_SpiWriteData(0xCF );
172         HX8363_SpiWriteData(0xD7 );
173         HX8363_SpiWriteData(0xE0 );
174         HX8363_SpiWriteData(0xE7 );
175         HX8363_SpiWriteData(0xEF );
176         HX8363_SpiWriteData(0xF8 );
177         HX8363_SpiWriteData(0xFF );
178         HX8363_SpiWriteData(0x34 );
179         HX8363_SpiWriteData(0x1E );
180         HX8363_SpiWriteData(0x92 );
181         HX8363_SpiWriteData(0x9E );
182         HX8363_SpiWriteData(0x01 );
183         HX8363_SpiWriteData(0xE6 );
184         HX8363_SpiWriteData(0x08 );
185         HX8363_SpiWriteData(0x6F );
186         HX8363_SpiWriteData(0x02 );
187         //G
188         HX8363_SpiWriteData(0x07 );
189         HX8363_SpiWriteData(0x0A );
190         HX8363_SpiWriteData(0x1A );
191         HX8363_SpiWriteData(0x2F );
192         HX8363_SpiWriteData(0x3E );
193         HX8363_SpiWriteData(0x4A );
194         HX8363_SpiWriteData(0x52 );
195         HX8363_SpiWriteData(0x5A );
196         HX8363_SpiWriteData(0x62 );
197         HX8363_SpiWriteData(0x69 );
198         HX8363_SpiWriteData(0x70 );
199         HX8363_SpiWriteData(0x76 );
200         HX8363_SpiWriteData(0x7D );
201         HX8363_SpiWriteData(0x82 );
202         HX8363_SpiWriteData(0x86 );
203         HX8363_SpiWriteData(0x8C );
204         HX8363_SpiWriteData(0x93 );
205         HX8363_SpiWriteData(0x9A );
206         HX8363_SpiWriteData(0x9F );
207         HX8363_SpiWriteData(0xA4 );
208         HX8363_SpiWriteData(0xA9 );
209         HX8363_SpiWriteData(0xB0 );
210         HX8363_SpiWriteData(0xB6 );
211         HX8363_SpiWriteData(0xBB );
212         HX8363_SpiWriteData(0xC2 );
213         HX8363_SpiWriteData(0xC9 );
214         HX8363_SpiWriteData(0xCF );
215         HX8363_SpiWriteData(0xD7 );
216         HX8363_SpiWriteData(0xE0 );
217         HX8363_SpiWriteData(0xE7 );
218         HX8363_SpiWriteData(0xEF );
219         HX8363_SpiWriteData(0xF8 );
220         HX8363_SpiWriteData(0xFF );
221         HX8363_SpiWriteData(0x34 );
222         HX8363_SpiWriteData(0x1E );
223         HX8363_SpiWriteData(0x92 );
224         HX8363_SpiWriteData(0x9E );
225         HX8363_SpiWriteData(0x01 );
226         HX8363_SpiWriteData(0xE6 );
227         HX8363_SpiWriteData(0x08 );
228         HX8363_SpiWriteData(0x6F );
229         HX8363_SpiWriteData(0x02 );
230         //B
231         HX8363_SpiWriteData(0x07 );
232         HX8363_SpiWriteData(0x0A );
233         HX8363_SpiWriteData(0x1A );
234         HX8363_SpiWriteData(0x2F );
235         HX8363_SpiWriteData(0x3E );
236         HX8363_SpiWriteData(0x4A );
237         HX8363_SpiWriteData(0x52 );
238         HX8363_SpiWriteData(0x5A );
239         HX8363_SpiWriteData(0x62 );
240         HX8363_SpiWriteData(0x69 );
241         HX8363_SpiWriteData(0x70 );
242         HX8363_SpiWriteData(0x76 );
243         HX8363_SpiWriteData(0x7D );
244         HX8363_SpiWriteData(0x82 );
245         HX8363_SpiWriteData(0x86 );
246         HX8363_SpiWriteData(0x8C );
247         HX8363_SpiWriteData(0x93 );
248         HX8363_SpiWriteData(0x9A );
249         HX8363_SpiWriteData(0x9F );
250         HX8363_SpiWriteData(0xA4 );
251         HX8363_SpiWriteData(0xA9 );
252         HX8363_SpiWriteData(0xB0 );
253         HX8363_SpiWriteData(0xB6 );
254         HX8363_SpiWriteData(0xBB );
255         HX8363_SpiWriteData(0xC2 );
256         HX8363_SpiWriteData(0xC9 );
257         HX8363_SpiWriteData(0xCF );
258         HX8363_SpiWriteData(0xD7 );
259         HX8363_SpiWriteData(0xE0 );
260         HX8363_SpiWriteData(0xE7 );
261         HX8363_SpiWriteData(0xEF );
262         HX8363_SpiWriteData(0xF8 );
263         HX8363_SpiWriteData(0xFF );
264         HX8363_SpiWriteData(0x34 );
265         HX8363_SpiWriteData(0x1E );
266         HX8363_SpiWriteData(0x92 );
267         HX8363_SpiWriteData(0x9E );
268         HX8363_SpiWriteData(0x01 );
269         HX8363_SpiWriteData(0xE6 );
270         HX8363_SpiWriteData(0x08 );
271         HX8363_SpiWriteData(0x6F );
272         HX8363_SpiWriteData(0x02 );
273
274         HX8363_SpiWriteCmd(0x3A); //COLMOD 
275         HX8363_SpiWriteData(0x77); // 
276
277         HX8363_SpiWriteCmd(0x11);//Sleep Out 
278         udelay(120000);
279         HX8363_SpiWriteCmd(0x35); //Tearing Effect 
280         HX8363_SpiWriteData(0x00); // 
281         HX8363_SpiWriteCmd(0x36);
282         HX8363_SpiWriteData(0x02); 
283         HX8363_SpiWriteCmd(0x29); 
284         udelay(10000);
285         HX8363_SpiWriteCmd(0x2C); 
286
287 }
288
289 static int32_t hx8363_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
290 {
291         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd; 
292         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data; 
293         
294         if(is_sleep==1){
295                 //Sleep In
296                 HX8363_SpiWriteCmd(0x28);
297                 udelay(120000); 
298                 HX8363_SpiWriteCmd(0x10);
299                 udelay(10000); 
300         }else{
301                 //Sleep Out
302                 HX8363_SpiWriteCmd(0x11);
303                 udelay(120000); 
304                 HX8363_SpiWriteCmd(0x29);
305                 udelay(10000); 
306         }
307
308         return 0;
309 }
310
311
312
313
314 static int32_t hx8363_set_window(struct panel_spec *self,
315                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
316 {
317         uint32_t *test_data[4] = {0};
318         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd; 
319         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data; 
320         spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
321 #if 0
322
323         LCD_PRINT("zxdbg add -hx8363_set_window: %d, %d, %d, %d\n",left, top, right, bottom);
324
325         HX8363_SpiWriteCmd(0x2A00); 
326         HX8363_SpiWriteData((left>>8));// set left address
327         HX8363_SpiWriteData((left&0xff));
328         HX8363_SpiWriteData((right>>8));// set right address
329         HX8363_SpiWriteData((right&0xff));
330
331         HX8363_SpiWriteCmd(0x2B00); 
332         HX8363_SpiWriteData((top>>8));// set left address
333         HX8363_SpiWriteData((top&0xff));
334         HX8363_SpiWriteData((bottom>>8));// set bottom address
335         HX8363_SpiWriteData((bottom&0xff));
336
337 //      HX8363_SpiWriteCmd(0x2C00);
338
339         HX8363_SpiWriteCmd(0x2A00); 
340         spi_read(test_data);
341         spi_read(test_data+1);
342         HX8363_SpiWriteCmd(0x2B00); 
343         spi_read(test_data+2);
344         spi_read(test_data+3);
345 #endif
346         LCD_PRINT("zxdbg add -hx8363_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
347
348         return 0;
349 }
350 static int32_t hx8363_invalidate(struct panel_spec *self)
351 {
352         LCD_PRINT("hx8363_invalidate\n");
353
354         return self->ops->panel_set_window(self, 0, 0,
355                 self->width - 1, self->height - 1);
356 }
357
358
359
360 static int32_t hx8363_invalidate_rect(struct panel_spec *self,
361                                 uint16_t left, uint16_t top,
362                                 uint16_t right, uint16_t bottom)
363 {
364         LCD_PRINT("hx8363_invalidate_rect \n");
365
366         return self->ops->panel_set_window(self, left, top,
367                         right, bottom);
368 }
369
370 static int32_t hx8363_read_id(struct panel_spec *self)
371 {
372         int32_t id  = 0x62;
373         spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
374         spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
375         spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
376
377         HX8363_SpiWriteCmd(0xB9); // SET password
378         HX8363_SpiWriteData(0xFF); //
379         HX8363_SpiWriteData(0x83); //
380         HX8363_SpiWriteData(0x63); //
381
382         HX8363_SpiWriteCmd(0xFE); // SET SPI READ INDEX
383         HX8363_SpiWriteData(0xF4); // GETHXID
384         HX8363_SpiWriteCmd(0xFF); // GET SPI READ
385
386         spi_read(&id);
387         id &= 0xff;
388         LCD_PRINT(" hx8363_read_id u-boot id = %x\n",id);
389 #ifndef CONFIG_SPX15
390         return id;
391 #else
392         return 0x63;
393 #endif
394 }
395
396 static struct panel_operations lcd_hx8363_rgb_spi_operations = {
397         .panel_init = hx8363_init,
398         .panel_set_window = hx8363_set_window,
399         .panel_invalidate_rect= hx8363_invalidate_rect,
400         .panel_invalidate = hx8363_invalidate,
401         .panel_enter_sleep = hx8363_enter_sleep,
402         .panel_readid          = hx8363_read_id
403 };
404
405 static struct timing_rgb lcd_hx8363_rgb_timing = {
406         .hfp = 15,//10,  /* unit: pixel */
407         .hbp = 15, //6,
408         .hsync = 10, //8,
409         .vfp = 8, // 3, /*unit: line*/
410         .vbp = 8, // 3,
411         .vsync = 6, // 4,
412 };
413
414 static struct spi_info lcd_hx8363_rgb_spi_info = {
415         .ops = NULL,
416 };
417
418 static struct info_rgb lcd_hx8363_rgb_info = {
419         .cmd_bus_mode  = SPRDFB_RGB_BUS_TYPE_SPI,
420         .video_bus_width = 24, /*18,16*/
421         .h_sync_pol = SPRDFB_POLARITY_NEG,
422         .v_sync_pol = SPRDFB_POLARITY_NEG,
423         .de_pol = SPRDFB_POLARITY_POS,
424         .timing = &lcd_hx8363_rgb_timing,
425         .bus_info = {
426                 .spi = &lcd_hx8363_rgb_spi_info,
427         }
428 };
429
430 struct panel_spec lcd_panel_hx8363_rgb_spi_spec = {
431         .width = 480,
432         .height = 854,
433         .fps = 61,
434         .type = LCD_MODE_RGB,
435         .direction = LCD_DIRECT_NORMAL,
436         .info = {
437                 .rgb = &lcd_hx8363_rgb_info
438         },
439         .ops = &lcd_hx8363_rgb_spi_operations,
440 };