tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_hx8363_mcu.c
1 /* drivers/video/sc8825/lcd_hx8363_mcu.c
2  *
3  * Support for nt35516 mipi LCD device
4  *
5  * Copyright (C) 2010 Spreadtrum
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16
17 #include <asm/arch/sprd_lcd.h>
18
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 static int32_t hx8363_init(struct panel_spec *self)
29 {
30         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
31         send_data_t send_data = self->info.mcu->ops->send_data;
32
33         LCD_PRINT("hx8363_init\n");
34
35         send_cmd(0xB9); // SET password
36         send_data(0xFF); // 
37         send_data(0x83); // 
38         send_data(0x63); // 
39
40         send_cmd(0xB0);//Enable internal oscillator
41         send_data(0x01);
42         send_data(0x0B);
43
44         send_cmd(0xB1);
45         send_data(0x01);
46         send_data(0x00);
47         send_data(0x44);
48         send_data(0x08);
49         send_data(0x01);
50         send_data(0x11);
51         send_data(0x11);
52         send_data(0x36);
53         send_data(0x3E);
54         send_data(0x3F);
55         send_data(0x3F);
56         send_data(0x40);
57         send_data(0x32);
58         send_data(0x00);
59         send_data(0xE6);
60         send_data(0xE6);
61         send_data(0xE6);
62         send_data(0xE6);
63         send_data(0xE6);
64
65         send_cmd(0xB2); // SET DISP
66         send_data(0x08); // 
67         send_data(0x00); // 
68
69         send_cmd(0xB4);
70         send_data(0x00);//Column inversion
71         send_data(0x18); 
72         send_data(0x9C);
73         send_data(0x08);
74         send_data(0x18);
75         send_data(0x04);
76         send_data(0x72);//72
77
78         send_cmd(0xB6);//Set_VCOM 
79         send_data(0x1B); 
80
81         send_cmd(0xCC);// SET Panel
82         send_data(0x01); //
83
84         LCD_DelayMS(5);
85
86         send_cmd(0xE0); // SET Gamma
87         send_data(0x00);
88         send_data(0x05);
89         send_data(0x07);
90         send_data(0x0C);
91         send_data(0x13);
92         send_data(0x2F);
93         send_data(0x0B);
94         send_data(0x1D);
95         send_data(0x86);
96         send_data(0x0D);
97         send_data(0x91);
98         send_data(0x16);
99         send_data(0x99);
100         send_data(0x16);
101         send_data(0x16);
102         send_data(0x09);
103         send_data(0x05);
104         send_data(0x00);
105         send_data(0x05);
106         send_data(0x07);
107         send_data(0x0C);
108         send_data(0x13);
109         send_data(0x2F);
110         send_data(0x0B);
111         send_data(0x1D);
112         send_data(0x86);
113         send_data(0x0D);
114         send_data(0x91);
115         send_data(0x16);
116         send_data(0x99);
117         send_data(0x16);
118         send_data(0x16);
119         send_data(0x09);
120         send_data(0x05);
121
122         send_cmd(0xC1); //COLMOD 
123         send_data(0x01); // 
124         //R
125         send_data(0x07 );
126         send_data(0x0A );
127         send_data(0x1A );
128         send_data(0x2F );
129         send_data(0x3E );
130         send_data(0x4A );
131         send_data(0x52 );
132         send_data(0x5A );
133         send_data(0x62 );
134         send_data(0x69 );
135         send_data(0x70 );
136         send_data(0x76 );
137         send_data(0x7D );
138         send_data(0x82 );
139         send_data(0x86 );
140         send_data(0x8C );
141         send_data(0x93 );
142         send_data(0x9A );
143         send_data(0x9F );
144         send_data(0xA4 );
145         send_data(0xA9 );
146         send_data(0xB0 );
147         send_data(0xB6 );
148         send_data(0xBB );
149         send_data(0xC2 );
150         send_data(0xC9 );
151         send_data(0xCF );
152         send_data(0xD7 );
153         send_data(0xE0 );
154         send_data(0xE7 );
155         send_data(0xEF );
156         send_data(0xF8 );
157         send_data(0xFF );
158         send_data(0x34 );
159         send_data(0x1E );
160         send_data(0x92 );
161         send_data(0x9E );
162         send_data(0x01 );
163         send_data(0xE6 );
164         send_data(0x08 );
165         send_data(0x6F );
166         send_data(0x02 );
167         //G
168         send_data(0x07 );
169         send_data(0x0A );
170         send_data(0x1A );
171         send_data(0x2F );
172         send_data(0x3E );
173         send_data(0x4A );
174         send_data(0x52 );
175         send_data(0x5A );
176         send_data(0x62 );
177         send_data(0x69 );
178         send_data(0x70 );
179         send_data(0x76 );
180         send_data(0x7D );
181         send_data(0x82 );
182         send_data(0x86 );
183         send_data(0x8C );
184         send_data(0x93 );
185         send_data(0x9A );
186         send_data(0x9F );
187         send_data(0xA4 );
188         send_data(0xA9 );
189         send_data(0xB0 );
190         send_data(0xB6 );
191         send_data(0xBB );
192         send_data(0xC2 );
193         send_data(0xC9 );
194         send_data(0xCF );
195         send_data(0xD7 );
196         send_data(0xE0 );
197         send_data(0xE7 );
198         send_data(0xEF );
199         send_data(0xF8 );
200         send_data(0xFF );
201         send_data(0x34 );
202         send_data(0x1E );
203         send_data(0x92 );
204         send_data(0x9E );
205         send_data(0x01 );
206         send_data(0xE6 );
207         send_data(0x08 );
208         send_data(0x6F );
209         send_data(0x02 );
210         //B
211         send_data(0x07 );
212         send_data(0x0A );
213         send_data(0x1A );
214         send_data(0x2F );
215         send_data(0x3E );
216         send_data(0x4A );
217         send_data(0x52 );
218         send_data(0x5A );
219         send_data(0x62 );
220         send_data(0x69 );
221         send_data(0x70 );
222         send_data(0x76 );
223         send_data(0x7D );
224         send_data(0x82 );
225         send_data(0x86 );
226         send_data(0x8C );
227         send_data(0x93 );
228         send_data(0x9A );
229         send_data(0x9F );
230         send_data(0xA4 );
231         send_data(0xA9 );
232         send_data(0xB0 );
233         send_data(0xB6 );
234         send_data(0xBB );
235         send_data(0xC2 );
236         send_data(0xC9 );
237         send_data(0xCF );
238         send_data(0xD7 );
239         send_data(0xE0 );
240         send_data(0xE7 );
241         send_data(0xEF );
242         send_data(0xF8 );
243         send_data(0xFF );
244         send_data(0x34 );
245         send_data(0x1E );
246         send_data(0x92 );
247         send_data(0x9E );
248         send_data(0x01 );
249         send_data(0xE6 );
250         send_data(0x08 );
251         send_data(0x6F );
252         send_data(0x02 );
253
254         send_cmd(0x3A); //COLMOD 
255         send_data(0x07); // 
256
257         send_cmd(0x11);//Sleep Out 
258         LCD_DelayMS(120);
259
260         send_cmd(0xC2);// SET DISPIF 
261         send_data(0x04); //24bit 
262         send_cmd(0x35); //Tearing Effect 
263         send_data(0x00); // 
264         send_cmd(0x36);
265         send_data(0x02); // 
266         send_cmd(0x29); 
267         LCD_DelayMS(10);
268         send_cmd(0x2c);
269
270     return 0;
271 }
272
273 static int32_t hx8363_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
274 {
275         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
276         send_data_t send_data = self->info.mcu->ops->send_data;
277
278         if(is_sleep==1){
279                 //Sleep In
280                 send_cmd(0x28);
281                 LCD_DelayMS(120); 
282                 send_cmd(0x10);
283                 LCD_DelayMS(120); 
284         }else{
285                 //Sleep Out
286                 send_cmd(0x11);
287                 LCD_DelayMS(120); 
288                 send_cmd(0x29);
289                 LCD_DelayMS(120); 
290         }
291
292         return 0;
293 }
294
295
296
297
298 static int32_t hx8363_set_window(struct panel_spec *self,
299                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
300 {
301         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
302         send_data_t send_data = self->info.mcu->ops->send_data;
303
304         LCD_PRINT("hx8363_set_window\n");
305
306         send_cmd(0x2A); // col
307         send_data((left >> 8));
308         send_data((left & 0xFF));
309         send_data((right >> 8));
310         send_data((right & 0xFF));
311
312         send_cmd(0x2B); // row
313         send_data((top >> 8));
314         send_data((top & 0xFF));
315         send_data((bottom >> 8));
316         send_data((bottom & 0xFF));
317
318         send_cmd(0x2C); //Write data
319
320         return 0;
321 }
322 static int32_t hx8363_invalidate(struct panel_spec *self)
323 {
324         LCD_PRINT("hx8363_invalidate\n");
325
326         return self->ops->panel_set_window(self, 0, 0,
327                 self->width - 1, self->height - 1);
328 }
329
330
331
332 static int32_t hx8363_invalidate_rect(struct panel_spec *self,
333                                 uint16_t left, uint16_t top,
334                                 uint16_t right, uint16_t bottom)
335 {
336         LCD_PRINT("hx8363_invalidate_rect \n");
337
338         return self->ops->panel_set_window(self, left, top,
339                         right, bottom);
340 }
341
342 static int32_t hx8363_read_id(struct panel_spec *self)
343 {
344         int32_t id  = 0;
345         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
346         read_data_t read_data = self->info.mcu->ops->read_data;
347         send_data_t send_data = self->info.mcu->ops->send_data;
348
349         //Get ID
350         //to be added here
351 /*
352         int32_t   chip_id = 0;
353         send_cmd(0xDA);
354         chip_id = read_data();
355         LCD_PRINT("hx8363_read_id1  0XDA = 0x%x!\n", chip_id);
356         chip_id = read_data();
357         LCD_PRINT("hx8363_read_id2  0XDA = 0x%x!\n", chip_id);
358         send_cmd(0xDB);
359         chip_id = read_data();
360         LCD_PRINT("hx8363_read_id1  0XDB = 0x%x!\n", chip_id);
361         chip_id = read_data();
362         LCD_PRINT("hx8363_read_id2  0XDB = 0x%x!\n", chip_id);
363         send_cmd(0xDC);
364         chip_id = read_data();
365         LCD_PRINT("hx8363_read_id1  0XDB = 0x%x!\n", chip_id);
366         chip_id = read_data();
367         LCD_PRINT("hx8363_read_id2  0XDC = 0x%x!\n", chip_id);
368 */
369         return 0x18; // id;
370 }
371
372 static struct panel_operations lcd_hx8363_mcu_operations = {
373         .panel_init = hx8363_init,
374         .panel_set_window = hx8363_set_window,
375         .panel_invalidate_rect= hx8363_invalidate_rect,
376         .panel_invalidate = hx8363_invalidate,
377         .panel_enter_sleep = hx8363_enter_sleep,
378         .panel_readid          = hx8363_read_id
379 };
380
381 static struct timing_mcu lcd_hx8363_mcu_timing[] = {
382 [0] = {                    // read/write register timing
383                 .rcss = 15,  // 15ns
384                 .rlpw = 60,
385                 .rhpw = 60,
386                 .wcss = 10,
387                 .wlpw = 35,
388                 .whpw = 35,
389         },
390 [1] = {                    // read/write gram timing
391                 .rcss = 15,  // 15ns
392                 .rlpw = 60,
393                 .rhpw = 60,
394                 .wcss = 0,
395                 .wlpw = 16,
396                 .whpw = 16,
397         },
398 };
399
400 static struct info_mcu lcd_hx8363_mcu_info = {
401         .bus_mode = LCD_BUS_8080,
402         .bus_width = 24,
403         .bpp = 24,
404         .timing =lcd_hx8363_mcu_timing,
405         .ops = NULL,
406 };
407
408 struct panel_spec lcd_hx8363_mcu_spec = {
409         .width = 480,
410         .height = 854,
411         .type = LCD_MODE_MCU,
412         .direction = LCD_DIRECT_NORMAL,
413         .info = {.mcu = &lcd_hx8363_mcu_info},
414         .ops = &lcd_hx8363_mcu_operations,
415 };
416
417