tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_hx8369b_tshark2_j3_mipi.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[] = {\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),{0x39,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 //CABC\r
84         {LCM_SEND(2),{0x51,0x80}},\r
85         {LCM_SLEEP(5)},\r
86 \r
87         {LCM_SEND(16),{14,0,0xC9,0x1F,0x2E,0x0A,0x1E,0x81,0x1E,0x00,0x00,0x01,0x19,0x00,0x00,0x20}},\r
88         {LCM_SLEEP(5)},\r
89         {LCM_SEND(2),{0x55,0x00}},\r
90         {LCM_SLEEP(5)},\r
91         {LCM_SEND(2),{0x53,0x24}},\r
92         {LCM_SLEEP(5)},\r
93 \r
94 //display on\r
95         {LCM_SEND(1),{0x11}},\r
96         {LCM_SLEEP(180)},\r
97         {LCM_SEND(1),{0x29}},\r
98         {LCM_SLEEP(10)}, \r
99 \r
100 };\r
101 \r
102 static LCM_Init_Code disp_on =  {LCM_SEND(1), {0x29}};\r
103 \r
104 static LCM_Init_Code sleep_in[] =  {\r
105         {LCM_SEND(1), {0x28}},\r
106         {LCM_SLEEP(150)},       //>150ms\r
107         {LCM_SEND(1), {0x10}},\r
108         {LCM_SLEEP(150)},       //>150ms\r
109 };\r
110 \r
111 static LCM_Init_Code sleep_out[] =  {\r
112         {LCM_SEND(1), {0x11}},\r
113         {LCM_SLEEP(120)},//>120ms\r
114         {LCM_SEND(1), {0x29}},\r
115         {LCM_SLEEP(20)}, //>20ms\r
116 };\r
117 \r
118 \r
119 static int32_t lcd_hx8369b_tshark2_j3_init(struct panel_spec *self)\r
120 {\r
121         int32_t i;\r
122         LCM_Init_Code *init = init_data;\r
123         unsigned int tag;\r
124 \r
125         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
126         mipi_dcs_write_t mipi_dcs_write = self->info.mipi->ops->mipi_dcs_write;\r
127         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
128 \r
129         LCD_PRINT("lcd_tshark2_j3_init\n");\r
130 \r
131         mipi_set_cmd_mode();\r
132         mipi_eotp_set(0,0);\r
133 \r
134         for(i = 0; i < ARRAY_SIZE(init_data); i++){\r
135                 tag = (init->tag >>24);\r
136                 if(tag & LCM_TAG_SEND){\r
137                         mipi_dcs_write(init->data, (init->tag & LCM_TAG_MASK));\r
138                         udelay(20);\r
139                 }else if(tag & LCM_TAG_SLEEP){\r
140                         mdelay(init->tag & LCM_TAG_MASK);//udelay((init->tag & LCM_TAG_MASK) * 1000);\r
141                 }\r
142                 init++;\r
143         }\r
144         mipi_eotp_set(0,0);\r
145 \r
146         return 0;\r
147 }\r
148 \r
149 static uint32_t hx8369b_tshark2_j3_readid(struct panel_spec *self)\r
150 {\r
151 #if 0\r
152         uint32 j =0;\r
153         uint8_t read_data[3] = {0};\r
154         int32_t read_rtn = 0;\r
155         uint8_t param[2] = {0};\r
156         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
157         mipi_force_write_t mipi_force_write = self->info.mipi->ops->mipi_force_write;\r
158         mipi_force_read_t mipi_force_read = self->info.mipi->ops->mipi_force_read;\r
159         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
160 \r
161         LCD_PRINT("lcd_hx8369b_mipi read id!\n");\r
162 \r
163         mipi_set_cmd_mode();\r
164         mipi_eotp_set(0,0);\r
165 \r
166         for(j = 0; j < 4; j++){\r
167                 param[0] = 0x01;\r
168                 param[1] = 0x00;\r
169                 mipi_force_write(0x37, param, 2);\r
170                 read_rtn = mipi_force_read(0xda,1,&read_data[0]);\r
171                 read_rtn = mipi_force_read(0xdb,1,&read_data[1]);\r
172                 read_rtn = mipi_force_read(0xdc,1,&read_data[2]);\r
173 #ifndef NEW_PANAL_BOE\r
174                 if((0x55 == read_data[0])&&(0xc0 == read_data[1])&&(0x90 == read_data[2]))\r
175 #else\r
176                 if((0x55 == read_data[0])&&(0xB8 == read_data[1])&&(0x90 == read_data[2]))\r
177 #endif\r
178                 {\r
179                         LCD_PRINT("lcd_hx8369b_mipi read id success!\n");\r
180                         return 0x8369;\r
181                 }\r
182         }\r
183         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
184         mipi_eotp_set(0,0);\r
185         return 0;\r
186 #endif\r
187         return 0x8369;\r
188 }\r
189 \r
190 static struct panel_operations lcd_hx8369b_mipi_operations = {\r
191         .panel_init = lcd_hx8369b_tshark2_j3_init,\r
192         .panel_readid = hx8369b_tshark2_j3_readid,\r
193 };\r
194 \r
195 static struct timing_rgb lcd_hx8369b_mipi_timing = {\r
196         .hfp = 80,  /* unit: pixel */\r
197         .hbp = 80,\r
198         .hsync = 20,\r
199         .vfp = 18, /*unit: line*/\r
200         .vbp = 13,\r
201         .vsync = 2,\r
202 };\r
203 \r
204 \r
205 static struct info_mipi lcd_hx8369b_mipi_info = {\r
206         .work_mode  = SPRDFB_MIPI_MODE_VIDEO,\r
207         .video_bus_width = 24, /*18,16*/\r
208         .lan_number = 2,\r
209         .phy_feq =500*1000,\r
210         .h_sync_pol = SPRDFB_POLARITY_POS,\r
211         .v_sync_pol = SPRDFB_POLARITY_POS,\r
212         .de_pol = SPRDFB_POLARITY_POS,\r
213         .te_pol = SPRDFB_POLARITY_POS,\r
214         .color_mode_pol = SPRDFB_POLARITY_NEG,\r
215         .shut_down_pol = SPRDFB_POLARITY_NEG,\r
216         .timing = &lcd_hx8369b_mipi_timing,\r
217         .ops = NULL,\r
218 };\r
219 \r
220 struct panel_spec lcd_hx8369b_tshark2_j3_mipi_spec = {\r
221         .width = 540,\r
222         .height = 960,\r
223         .fps = 60,\r
224         .type = LCD_MODE_DSI,\r
225         .direction = LCD_DIRECT_NORMAL,\r
226         .info = {\r
227                 .mipi = &lcd_hx8369b_mipi_info\r
228         },\r
229         .ops = &lcd_hx8369b_mipi_operations,\r
230 };\r