change source file mode to 0644 instead of 0755
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_hx8389c_mipi.c
1 /* drivers/video/sprdfb/lcd_hx8389c_mipi.c\r
2  *\r
3  * Support for hx8389c 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[] = {\r
44 \r
45         {LCM_SEND(6),{4,0,0xB9,0xFF,0x83,0x89}},\r
46         {LCM_SEND(23),{21,0,0xB1,0x7F,0x10,0x10,0xD2,0x32,0x80,0x10,0xF0,0x56,0x80,0x20,0x20,0xF8,0xAA,0xAA,0xA1,0x00,0x80,0x30,0x00}},\r
47         {LCM_SEND(13),{11,0,0xB2,0x82,0x50,0x05,0x07,0xF0,0x38,0x11,0x64,0x5D,0x09}},\r
48         {LCM_SEND(14),{12,0,0xB4,0x66,0x66,0x66,0x70,0x00,0x00,0x18,0x76,0x28,0x76,0xA8}},\r
49         {LCM_SEND(2),{0xD2,0x33}},\r
50         {LCM_SEND(7),{5,0,0xC0,0x30,0x17,0x00,0x03}},\r
51         {LCM_SEND(7),{5,0,0xC7,0x00,0x80,0x00,0xC0}},\r
52         {LCM_SEND(7),{5,0,0xBF,0x05,0x50,0x00,0x3E}},\r
53         {LCM_SLEEP(10)},\r
54         //{LCM_SEND(6),{4,0,0xB9,0xFF,0x83,0x89}},\r
55         {LCM_SEND(2),{0xCC,0x0E}},\r
56         {LCM_SEND(38),{36,0,0xD3,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x32,0x10,0x00,0x00,0x00,0x03,0xC6,0x03,0xC6,0x00,0x00,0x00,0x00 \\r
57         ,0x35,0x33,0x04,0x04,0x37,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x0A,0x00,0x01}},\r
58         {LCM_SEND(41),{39,0,0xD5,0x18,0x18,0x18,0x18,0x19,0x19,0x18,0x18,0x20,0x21,0x24,0x25,0x18,0x18,0x18,0x18,0x00,0x01,0x04,0x05 \\r
59         ,0x02,0x03,0x06,0x07,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}},\r
60         {LCM_SEND(41),{39,0,0xD6,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x19,0x25,0x24,0x21,0x20,0x18,0x18 \\r
61         ,0x18,0x18,0x07,0x06,0x03,0x02,0x05,0x04,0x01,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 \\r
62         ,0x18,0x18,0x18,0x18,0x18,0x18}},\r
63         {LCM_SEND(6),{4,0,0xB7,0x20,0x80,0x00}},\r
64 \r
65 //gamma\r
66         {LCM_SEND(45),{43,0,0xE0,0x00,0x02,0x06,0x38,0x3C,0x3F,0x1B,0x46,0x06,0x09,0x0C,0x17 \\r
67         ,0x10,0x13,0x16,0x13,0x14,0x08,0x13,0x15,0x19,0x00,0x02,0x06,0x37,0x3C,0x3F \\r
68         ,0x1A,0x45,0x05,0x09,0x0B,0x16,0x0F,0x13,0x15,0x13,0x14,0x07,0x12,0x14,0x18}},\r
69 \r
70         {LCM_SEND(2),{0xBD,0x00}},\r
71         {LCM_SEND(46),{44,0,0xC1,0x00,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50 \\r
72         ,0x58,0x60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8 \\r
73         ,0xE0,0xE8,0xF0,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},\r
74         {LCM_SEND(2),{0xBD,0x01}},\r
75         {LCM_SEND(45),{43,0,0xC1,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78 \\r
76         ,0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF8,0xFF,0x00,0x00,0x00 \\r
77         ,0x00,0x00,0x00,0x00,0x00,0x00}},\r
78         {LCM_SEND(2),{0xBD,0x02}},\r
79         {LCM_SEND(45),{43,0,0xC1,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x80,0x88,0x90 \\r
80         ,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
81 }},\r
82 \r
83 #if 0\r
84 //CABC\r
85         {LCM_SEND(2),{0x51,0x80}},\r
86         {LCM_SLEEP(5)},\r
87 \r
88         {LCM_SEND(16),{14,0,0xC9,0x1F,0x2E,0x0A,0x1E,0x81,0x1E,0x00,0x00,0x01,0x19,0x00,0x00,0x20}},\r
89         {LCM_SLEEP(5)},\r
90         {LCM_SEND(2),{0x55,0x00}},\r
91         {LCM_SLEEP(5)},\r
92         {LCM_SEND(2),{0x53,0x24}},\r
93         {LCM_SLEEP(5)},\r
94 #endif\r
95 //display on\r
96         {LCM_SEND(1),{0x11}},\r
97         {LCM_SLEEP(180)},\r
98         {LCM_SEND(1),{0x29}},\r
99         {LCM_SLEEP(10)},\r
100 \r
101 };\r
102 \r
103 static LCM_Init_Code disp_on =  {LCM_SEND(1), {0x29}};\r
104 \r
105 static LCM_Init_Code sleep_in[] =  {\r
106         {LCM_SEND(1), {0x28}},\r
107         {LCM_SLEEP(150)},       //>150ms\r
108         {LCM_SEND(1), {0x10}},\r
109         {LCM_SLEEP(150)},       //>150ms\r
110 };\r
111 \r
112 static LCM_Init_Code sleep_out[] =  {\r
113         {LCM_SEND(1), {0x11}},\r
114         {LCM_SLEEP(120)},//>120ms\r
115         {LCM_SEND(1), {0x29}},\r
116         {LCM_SLEEP(20)}, //>20ms\r
117 };\r
118 \r
119 \r
120 static int32_t lcd_hx8389c_tshark2_j3_init(struct panel_spec *self)\r
121 {\r
122         int32_t i;\r
123         LCM_Init_Code *init = init_data;\r
124         unsigned int tag;\r
125 \r
126         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
127         mipi_dcs_write_t mipi_dcs_write = self->info.mipi->ops->mipi_dcs_write;\r
128         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
129 \r
130         LCD_PRINT("lcd_hx8389c_init\n");\r
131 \r
132         mipi_set_cmd_mode();\r
133         mipi_eotp_set(0,0);\r
134 \r
135         for(i = 0; i < ARRAY_SIZE(init_data); i++){\r
136                 tag = (init->tag >>24);\r
137                 if(tag & LCM_TAG_SEND){\r
138                         mipi_dcs_write(init->data, (init->tag & LCM_TAG_MASK));\r
139                         udelay(20);\r
140                 }else if(tag & LCM_TAG_SLEEP){\r
141                         mdelay(init->tag & LCM_TAG_MASK);//udelay((init->tag & LCM_TAG_MASK) * 1000);\r
142                 }\r
143                 init++;\r
144         }\r
145         mipi_eotp_set(0,0);\r
146 \r
147         return 0;\r
148 }\r
149 \r
150 static uint32_t hx8389c_tshark2_j3_readid(struct panel_spec *self)\r
151 {\r
152 #if 0\r
153         uint32 j =0;\r
154         uint8_t read_data[3] = {0};\r
155         int32_t read_rtn = 0;\r
156         uint8_t param[2] = {0};\r
157         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
158         mipi_force_write_t mipi_force_write = self->info.mipi->ops->mipi_force_write;\r
159         mipi_force_read_t mipi_force_read = self->info.mipi->ops->mipi_force_read;\r
160         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
161 \r
162         LCD_PRINT("lcd_hx8389c_mipi read id!\n");\r
163 \r
164         mipi_set_cmd_mode();\r
165         mipi_eotp_set(0,0);\r
166 \r
167         for(j = 0; j < 4; j++){\r
168                 param[0] = 0x01;\r
169                 param[1] = 0x00;\r
170                 mipi_force_write(0x37, param, 2);\r
171                 read_rtn = mipi_force_read(0xda,1,&read_data[0]);\r
172                 read_rtn = mipi_force_read(0xdb,1,&read_data[1]);\r
173                 read_rtn = mipi_force_read(0xdc,1,&read_data[2]);\r
174 #ifndef NEW_PANAL_BOE\r
175                 if((0x55 == read_data[0])&&(0xc0 == read_data[1])&&(0x90 == read_data[2]))\r
176 #else\r
177                 if((0x55 == read_data[0])&&(0xB8 == read_data[1])&&(0x90 == read_data[2]))\r
178 #endif\r
179                 {\r
180                         LCD_PRINT("lcd_hx8389c_mipi read id success!\n");\r
181                         return 0x8369;\r
182                 }\r
183         }\r
184         LCD_PRINT("lcd_hx8389c_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
185         mipi_eotp_set(0,0);\r
186         return 0;\r
187 #endif\r
188         return 0x8389;\r
189 }\r
190 \r
191 static struct panel_operations lcd_hx8389c_mipi_operations = {\r
192         .panel_init = lcd_hx8389c_tshark2_j3_init,\r
193         .panel_readid = hx8389c_tshark2_j3_readid,\r
194 };\r
195 \r
196 static struct timing_rgb lcd_hx8389c_mipi_timing = {\r
197         .hfp = 80,  /* unit: pixel */\r
198         .hbp = 80,\r
199         .hsync = 20,\r
200         .vfp = 18, /*unit: line*/\r
201         .vbp = 13,\r
202         .vsync = 2,\r
203 };\r
204 \r
205 \r
206 static struct info_mipi lcd_hx8389c_mipi_info = {\r
207         .work_mode  = SPRDFB_MIPI_MODE_VIDEO,\r
208         .video_bus_width = 24, /*18,16*/\r
209         .lan_number = 2,\r
210         .phy_feq =500*1000,\r
211         .h_sync_pol = SPRDFB_POLARITY_POS,\r
212         .v_sync_pol = SPRDFB_POLARITY_POS,\r
213         .de_pol = SPRDFB_POLARITY_POS,\r
214         .te_pol = SPRDFB_POLARITY_POS,\r
215         .color_mode_pol = SPRDFB_POLARITY_NEG,\r
216         .shut_down_pol = SPRDFB_POLARITY_NEG,\r
217         .timing = &lcd_hx8389c_mipi_timing,\r
218         .ops = NULL,\r
219 };\r
220 \r
221 struct panel_spec lcd_hx8389c_mipi_spec = {\r
222         .width = 540,\r
223         .height = 960,\r
224         .fps = 60,\r
225         .type = LCD_MODE_DSI,\r
226         .direction = LCD_DIRECT_NORMAL,\r
227         .info = {\r
228                 .mipi = &lcd_hx8389c_mipi_info\r
229         },\r
230         .ops = &lcd_hx8389c_mipi_operations,\r
231 };\r