tizen 2.4 release
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_hx8369b_mipi_vivaltoVE.c
1 /* drivers/video/sprdfb/lcd_hx8369b_mipi.c\r
2  *\r
3  * Support for hx8369b mipi LCD device\r
4  *\r
5  * Copyright (C) 2010 Spreadtrum\r
6  */\r
7 \r
8 #include <asm/arch/sprd_lcd.h>\r
9 #include "../sprdfb.h"\r
10 #define printk printf\r
11 \r
12 #define  LCD_DEBUG\r
13 #ifdef LCD_DEBUG\r
14 #define LCD_PRINT printk\r
15 #else\r
16 #define LCD_PRINT(...)\r
17 #endif\r
18 \r
19 #define MAX_DATA   150\r
20 \r
21 \r
22 \r
23 typedef struct LCM_Init_Code_tag {\r
24         unsigned int tag;\r
25         unsigned char data[MAX_DATA];\r
26 }LCM_Init_Code;\r
27 \r
28 typedef struct LCM_force_cmd_code_tag{\r
29         unsigned int datatype;\r
30         LCM_Init_Code real_cmd_code;\r
31 }LCM_Force_Cmd_Code;\r
32 \r
33 #define LCM_TAG_SHIFT 24\r
34 #define LCM_TAG_MASK  ((1 << 24) -1)\r
35 #define LCM_SEND(len) ((1 << LCM_TAG_SHIFT)| len)\r
36 #define LCM_SLEEP(ms) ((2 << LCM_TAG_SHIFT)| ms)\r
37 //#define ARRAY_SIZE(array) ( sizeof(array) / sizeof(array[0]))\r
38 \r
39 #define LCM_TAG_SEND  (1<< 0)\r
40 #define LCM_TAG_SLEEP (1 << 1)\r
41 \r
42 \r
43 static LCM_Init_Code init_data_boe_hf[] = {\r
44         {LCM_SEND(6),{4,0,0xB9,0xFF,0x83,0x69}},\r
45         //{LCM_SLEEP(10)},\r
46         {LCM_SEND(13),{11,0,0xB1,0x0B,0x83,0x77,0x00,0x11,0x11,0x08,0x08,0x0C,0x12}},\r
47         {LCM_SEND(7),{5,0,0xC6,0x41,0xFF,0x7A,0xFF}},\r
48         {LCM_SEND(7),{5,0,0xE3,0x00,0x00,0x00,0x00}},\r
49         {LCM_SEND(9),{7,0,0xC0,0x73,0x50,0x00,0x34,0xC4,0x00}},\r
50         {LCM_SEND(18),{16,0,0xBA,0x31,0x00,0x16,0xCA,0xB0,0x0A,0x00,0x10,0x28,0x02,0x21,0x21,0x9A,0x1A,0x8F}},\r
51         {LCM_SEND(2),{0x3A,0x70}},\r
52         {LCM_SEND(10),{8,0,0xB3,0x83,0x00,0x31,0x03,0x01,0x13,0x06}},\r
53         {LCM_SEND(2),{0xB4,0x00}},\r
54         {LCM_SEND(2),{0xCC,0x0C}},\r
55         {LCM_SEND(2),{0xEA,0x72}},\r
56         {LCM_SEND(2),{0xB2,0x03}},\r
57         //set GIP timing control\r
58         {LCM_SEND(95),{93,0,0xD5,0x00,0x00,0x0D,0x00,0x00,0x00,0x00,0x12,0x40,0x00,0x00,0x00,0x01,0x60,0x37,0x00,0x00,0x0F,\r
59                                                 0x01,0x02,0x47,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x18,\r
60                                                 0x00,0x00,0x89,0x00,0x11,0x33,0x55,0x77,0x31,0x00,0x00,0x98,0x00,0x66,0x44,0x22,0x00,0x02,\r
61                                                 0x00,0x00,0x89,0x00,0x00,0x22,0x44,0x66,0x20,0x00,0x00,0x98,0x00,0x77,0x55,0x33,0x11,0x13,\r
62                                                 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0xCF,0xFF,0xFF,0x03,0x00,0xCF,0xFF,0xFF,0x20,0x8C,0x5A}},\r
63         //gamma setting\r
64         {LCM_SEND(38),{36,0,0xE0,0x00,0x00,0x00,0x0D,0x0C,0x3F,0x18,0x2C,0x04,0x0F,0x0E,0x14,0x17,0x15,0x16,0x10,\r
65                                                 0x13,0x00,0x00,0x00,0x0C,0x12,0x3F,0x17,0x2C,0x05,0x08,0x0E,0x12,0x16,0x14,0x15,\r
66                                                 0x11,0x13,0x01}},\r
67         {LCM_SEND(130),{128,0,0xC1,0x01,0x00,0x08,0x10,0x18,0x1F,0x27,0x2E,0x34,0x3E,0x48,0x50,0x58,0x60,0x68,0x70,0x78,\r
68                                                         0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF7,0xFF,\r
69                                                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x18,0x1F,0x27,0x2E,0x34,\r
70                                                         0x3E,0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,\r
71                                                         0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF7,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
72                                                         0x00,0x08,0x10,0x18,0x1F,0x27,0x2E,0x34,0x3E,0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x80,\r
73                                                         0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF7,0xFF,0x00,\r
74                                                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},\r
75         {LCM_SEND(1),{0x11}},\r
76         {LCM_SLEEP(120)},\r
77         {LCM_SEND(1),{0x29}},\r
78         {LCM_SLEEP(10)}, //40\r
79 };\r
80 \r
81 static LCM_Init_Code disp_on =  {LCM_SEND(1), {0x29}};\r
82 \r
83 static LCM_Init_Code sleep_in[] =  {\r
84         {LCM_SEND(1), {0x28}},\r
85         {LCM_SLEEP(150)},       //>150ms\r
86         {LCM_SEND(1), {0x10}},\r
87         {LCM_SLEEP(150)},       //>150ms\r
88 };\r
89 \r
90 static LCM_Init_Code sleep_out[] =  {\r
91         {LCM_SEND(1), {0x11}},\r
92         {LCM_SLEEP(120)},//>120ms\r
93         {LCM_SEND(1), {0x29}},\r
94         {LCM_SLEEP(20)}, //>20ms\r
95 };\r
96 \r
97 \r
98 static int32_t hx8369b_mipi_init(struct panel_spec *self)\r
99 {\r
100         int32_t i;\r
101         LCM_Init_Code *init = init_data_boe_hf;\r
102         unsigned int tag;\r
103 \r
104 \r
105 \r
106         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
107         mipi_dcs_write_t mipi_dcs_write = self->info.mipi->ops->mipi_dcs_write;\r
108         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
109 \r
110         LCD_PRINT("lcd_hx8369b_init vivaltoVE\n");\r
111 \r
112         mipi_set_cmd_mode();\r
113         mipi_eotp_set(0,0);\r
114 \r
115         for(i = 0; i < ARRAY_SIZE(init_data_boe_hf); i++){\r
116                 tag = (init->tag >>24);\r
117                 if(tag & LCM_TAG_SEND){\r
118                         mipi_dcs_write(init->data, (init->tag & LCM_TAG_MASK));\r
119                         udelay(20);\r
120                 }else if(tag & LCM_TAG_SLEEP){\r
121                         mdelay(init->tag & LCM_TAG_MASK);//udelay((init->tag & LCM_TAG_MASK) * 1000);\r
122                 }\r
123                 init++;\r
124         }\r
125         mipi_eotp_set(0,0);\r
126 \r
127         return 0;\r
128 }\r
129 \r
130 static uint32_t hx8369b_readid(struct panel_spec *self)\r
131 {\r
132         uint32 j =0;\r
133         uint8_t read_data[3] = {0};\r
134         int32_t read_rtn = 0;\r
135         uint8_t param[2] = {0};\r
136         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
137         mipi_force_write_t mipi_force_write = self->info.mipi->ops->mipi_force_write;\r
138         mipi_force_read_t mipi_force_read = self->info.mipi->ops->mipi_force_read;\r
139         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
140 \r
141         LCD_PRINT("lcd_hx8369b_mipi read id!\n");\r
142 \r
143         mipi_set_cmd_mode();\r
144         mipi_eotp_set(0,0);\r
145 \r
146         for(j = 0; j < 4; j++){\r
147                 param[0] = 0x01;\r
148                 param[1] = 0x00;\r
149                 mipi_force_write(0x37, param, 2);\r
150                 read_rtn = mipi_force_read(0xda,1,&read_data[0]);\r
151                 read_rtn = mipi_force_read(0xdb,1,&read_data[1]);\r
152                 read_rtn = mipi_force_read(0xdc,1,&read_data[2]);\r
153 \r
154                 if((0x55 == read_data[0])&&(0xBF == read_data[1])&&(0x90 == read_data[2]))\r
155                 {\r
156                         return 0x8369;\r
157                 }\r
158         }\r
159         LCD_PRINT("lcd_hx8369b_mipi read id fail! 0xda,0xdb,0xdc is 0x%x,0x%x,0x%x!\n",read_data[0],read_data[1],read_data[2]);\r
160         mipi_eotp_set(0,0);\r
161         return 0;\r
162 }\r
163 \r
164 static struct panel_operations lcd_hx8369b_mipi_operations = {\r
165         .panel_init = hx8369b_mipi_init,\r
166         .panel_readid = hx8369b_readid,\r
167 };\r
168 \r
169 static struct timing_rgb lcd_hx8369b_mipi_timing = {\r
170         .hfp = 115,  /* unit: pixel */\r
171         .hbp = 55,\r
172         .hsync = 50,\r
173         .vfp = 6, /*unit: line*/\r
174         .vbp = 19,\r
175         .vsync = 4,\r
176 };\r
177 \r
178 \r
179 static struct info_mipi lcd_hx8369b_mipi_info = {\r
180         .work_mode  = SPRDFB_MIPI_MODE_VIDEO,\r
181         .video_bus_width = 24, /*18,16*/\r
182         .lan_number =   2,\r
183         .phy_feq =481*1000,\r
184         .h_sync_pol = SPRDFB_POLARITY_POS,\r
185         .v_sync_pol = SPRDFB_POLARITY_POS,\r
186         .de_pol = SPRDFB_POLARITY_POS,\r
187         .te_pol = SPRDFB_POLARITY_POS,\r
188         .color_mode_pol = SPRDFB_POLARITY_NEG,\r
189         .shut_down_pol = SPRDFB_POLARITY_NEG,\r
190         .timing = &lcd_hx8369b_mipi_timing,\r
191         .ops = NULL,\r
192 };\r
193 \r
194 struct panel_spec lcd_hx8369b_mipi_vivaltoVE_spec = {\r
195         .width = 480,\r
196         .height = 800,\r
197         .fps = 60,\r
198         .type = LCD_MODE_DSI,\r
199         .direction = LCD_DIRECT_NORMAL,\r
200         .info = {\r
201                 .mipi = &lcd_hx8369b_mipi_info\r
202         },\r
203         .ops = &lcd_hx8369b_mipi_operations,\r
204 };\r