tizen 2.4 release
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sc8825fb / 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/tiger_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
271 static int32_t hx8363_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
272 {
273         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
274         send_data_t send_data = self->info.mcu->ops->send_data;
275
276         if(is_sleep==1){
277                 //Sleep In
278                 send_cmd(0x28);
279                 LCD_DelayMS(120); 
280                 send_cmd(0x10);
281                 LCD_DelayMS(120); 
282         }else{
283                 //Sleep Out
284                 send_cmd(0x11);
285                 LCD_DelayMS(120); 
286                 send_cmd(0x29);
287                 LCD_DelayMS(120); 
288         }
289
290         return 0;
291 }
292
293
294
295
296 static int32_t hx8363_set_window(struct panel_spec *self,
297                 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
298 {
299         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
300         send_data_t send_data = self->info.mcu->ops->send_data;
301
302         LCD_PRINT("hx8363_set_window\n");
303
304         send_cmd(0x2A); // col
305         send_data((left >> 8));
306         send_data((left & 0xFF));
307         send_data((right >> 8));
308         send_data((right & 0xFF));
309
310         send_cmd(0x2B); // row
311         send_data((top >> 8));
312         send_data((top & 0xFF));
313         send_data((bottom >> 8));
314         send_data((bottom & 0xFF));
315
316         send_cmd(0x2C); //Write data
317
318         return 0;
319 }
320 static int32_t hx8363_invalidate(struct panel_spec *self)
321 {
322         LCD_PRINT("hx8363_invalidate\n");
323
324         return self->ops->panel_set_window(self, 0, 0,
325                 self->width - 1, self->height - 1);
326 }
327
328
329
330 static int32_t hx8363_invalidate_rect(struct panel_spec *self,
331                                 uint16_t left, uint16_t top,
332                                 uint16_t right, uint16_t bottom)
333 {
334         LCD_PRINT("hx8363_invalidate_rect \n");
335
336         return self->ops->panel_set_window(self, left, top,
337                         right, bottom);
338 }
339
340 static int32_t hx8363_read_id(struct panel_spec *self)
341 {
342         int32_t id  = 0;
343         send_data_t send_cmd = self->info.mcu->ops->send_cmd;
344         read_data_t read_data = self->info.mcu->ops->read_data;
345         send_data_t send_data = self->info.mcu->ops->send_data;
346
347         //Get ID
348
349         //to be added here
350
351
352         return 0x18; // id;
353 }
354
355 static struct panel_operations lcd_hx8363_mcu_operations = {
356         .panel_init = hx8363_init,
357         .panel_set_window = hx8363_set_window,
358         .panel_invalidate_rect= hx8363_invalidate_rect,
359         .panel_invalidate = hx8363_invalidate,
360         .panel_enter_sleep = hx8363_enter_sleep,
361         .panel_readid          = hx8363_read_id
362 };
363
364 static struct timing_mcu lcd_hx8363_mcu_timing[] = {
365 [0] = {                    // read/write register timing
366                 .rcss = 15,  // 15ns
367                 .rlpw = 60,
368                 .rhpw = 60,
369                 .wcss = 10,
370                 .wlpw = 35,
371                 .whpw = 35,
372         },
373 [1] = {                    // read/write gram timing
374                 .rcss = 15,  // 15ns
375                 .rlpw = 60,
376                 .rhpw = 60,
377                 .wcss = 0,
378                 .wlpw = 16,
379                 .whpw = 16,
380         },
381 };
382
383 static struct info_mcu lcd_hx8363_mcu_info = {
384         .bus_mode = LCD_BUS_8080,
385         .bus_width = 24,
386         .bpp = 24,
387         .timing =lcd_hx8363_mcu_timing,
388         .ops = NULL,
389 };
390
391 struct panel_spec lcd_hx8363_mcu_spec = {
392         .width = 480,
393         .height = 854,
394         .type = LCD_MODE_MCU,
395         .direction = LCD_DIRECT_NORMAL,
396         .info = {.mcu = &lcd_hx8363_mcu_info},
397         .ops = &lcd_hx8363_mcu_operations,
398 };
399
400