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