import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / nt35582_mcu_6575 / nt35582_mcu_6575.c
1 #ifndef BUILD_LK
2 #include <linux/string.h>
3 #endif
4 #include "lcm_drv.h"
5
6
7 // ---------------------------------------------------------------------------
8 // Local Constants
9 // ---------------------------------------------------------------------------
10
11 #define FRAME_WIDTH (480)
12 #define FRAME_HEIGHT (800)
13 #define LCM_ID (0x5582)
14
15 // ---------------------------------------------------------------------------
16 // Local Variables
17 // ---------------------------------------------------------------------------
18
19 static LCM_UTIL_FUNCS lcm_util = {0};
20
21 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
22
23 #define UDELAY(n) (lcm_util.udelay(n))
24 #define MDELAY(n) (lcm_util.mdelay(n))
25
26
27 // ---------------------------------------------------------------------------
28 // Local Functions
29 // ---------------------------------------------------------------------------
30
31 static __inline void send_ctrl_cmd(unsigned int cmd)
32 {
33 lcm_util.send_cmd(cmd);
34 }
35
36 static __inline void send_data_cmd(unsigned int data)
37 {
38 lcm_util.send_data(data&0xff);
39 }
40
41 static __inline unsigned short read_data_cmd(void)
42 {
43 return (unsigned short)(lcm_util.read_data());
44 }
45
46 static __inline void set_lcm_register(unsigned int regIndex,
47 unsigned int regData)
48 {
49 send_ctrl_cmd(regIndex);
50 send_data_cmd(regData);
51 }
52
53 static void init_lcm_registers(void)
54 {
55 send_ctrl_cmd(0x1100);//sleep out
56 MDELAY(200);
57
58 set_lcm_register(0xC000,0x86);//power control PWCTR1
59 set_lcm_register(0xC001,0x00);
60 set_lcm_register(0xC002,0x86);
61 set_lcm_register(0xC003,0x00);
62 set_lcm_register(0xC100,0x45);
63 set_lcm_register(0xC200,0x21);
64 set_lcm_register(0xC202,0x02);
65 set_lcm_register(0xB600,0x30);//SD_OP_SET
66 set_lcm_register(0xB602,0x30);
67 set_lcm_register(0xB100,0xA7);//wei zeng added
68 set_lcm_register(0xC700,0x8F);//vcom
69 set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55
70
71
72 set_lcm_register(0xE000,0x0E);//gamma GMACTRL1
73 set_lcm_register(0xE001,0x14);
74 set_lcm_register(0xE002,0x29);
75 set_lcm_register(0xE003,0x3A);
76 set_lcm_register(0xE004,0x1D);
77 set_lcm_register(0xE005,0x30);
78 set_lcm_register(0xE006,0x61);
79 set_lcm_register(0xE007,0x3D);
80 set_lcm_register(0xE008,0x22);
81 set_lcm_register(0xE009,0x2A);
82 set_lcm_register(0xE00A,0x87);
83 set_lcm_register(0xE00B,0x16);
84 set_lcm_register(0xE00C,0x3B);
85 set_lcm_register(0xE00D,0x4C);
86 set_lcm_register(0xE00E,0x78);
87 set_lcm_register(0xE00F,0x96);
88 set_lcm_register(0xE010,0x4A);
89 set_lcm_register(0xE011,0x4D);
90
91 set_lcm_register(0xE100,0x0E);//GMACTRL2
92 set_lcm_register(0xE101,0x14);
93 set_lcm_register(0xE102,0x29);
94 set_lcm_register(0xE103,0x3A);
95 set_lcm_register(0xE104,0x1D);
96 set_lcm_register(0xE105,0x30);
97 set_lcm_register(0xE106,0x61);
98 set_lcm_register(0xE107,0x3F);
99 set_lcm_register(0xE108,0x20);
100 set_lcm_register(0xE109,0x26);
101 set_lcm_register(0xE10A,0x83);
102 set_lcm_register(0xE10B,0x16);
103 set_lcm_register(0xE10C,0x3B);
104 set_lcm_register(0xE10D,0x4C);
105 set_lcm_register(0xE10E,0x78);
106 set_lcm_register(0xE10F,0x96);
107 set_lcm_register(0xE110,0x4A);
108 set_lcm_register(0xE111,0x4D);
109
110 set_lcm_register(0xE200,0x0E);//GMACTRL3
111 set_lcm_register(0xE201,0x14);
112 set_lcm_register(0xE202,0x29);
113 set_lcm_register(0xE203,0x3A);
114 set_lcm_register(0xE204,0x1D);
115 set_lcm_register(0xE205,0x30);
116 set_lcm_register(0xE206,0x61);
117 set_lcm_register(0xE207,0x3D);
118 set_lcm_register(0xE208,0x22);
119 set_lcm_register(0xE209,0x2A);
120 set_lcm_register(0xE20A,0x87);
121 set_lcm_register(0xE20B,0x16);
122 set_lcm_register(0xE20C,0x3B);
123 set_lcm_register(0xE20D,0x4C);
124 set_lcm_register(0xE20E,0x78);
125 set_lcm_register(0xE20F,0x96);
126 set_lcm_register(0xE210,0x4A);
127 set_lcm_register(0xE211,0x4D);
128
129
130 set_lcm_register(0xE300,0x0E);//GMACTRL4
131 set_lcm_register(0xE301,0x14);
132 set_lcm_register(0xE302,0x29);
133 set_lcm_register(0xE303,0x3A);
134 set_lcm_register(0xE304,0x1D);
135 set_lcm_register(0xE305,0x30);
136 set_lcm_register(0xE306,0x61);
137 set_lcm_register(0xE307,0x3F);
138 set_lcm_register(0xE308,0x20);
139 set_lcm_register(0xE309,0x26);
140 set_lcm_register(0xE30A,0x83);
141 set_lcm_register(0xE30B,0x16);
142 set_lcm_register(0xE30C,0x3B);
143 set_lcm_register(0xE30D,0x4C);
144 set_lcm_register(0xE30E,0x78);
145 set_lcm_register(0xE30F,0x96);
146 set_lcm_register(0xE310,0x4A);
147 set_lcm_register(0xE311,0x4D);
148
149 set_lcm_register(0xE400,0x0E);//GMACTRL5
150 set_lcm_register(0xE401,0x14);
151 set_lcm_register(0xE402,0x29);
152 set_lcm_register(0xE403,0x3A);
153 set_lcm_register(0xE404,0x1D);
154 set_lcm_register(0xE405,0x30);
155 set_lcm_register(0xE406,0x61);
156 set_lcm_register(0xE407,0x3D);
157 set_lcm_register(0xE408,0x22);
158 set_lcm_register(0xE409,0x2A);
159 set_lcm_register(0xE40A,0x87);
160 set_lcm_register(0xE40B,0x16);
161 set_lcm_register(0xE40C,0x3B);
162 set_lcm_register(0xE40D,0x4C);
163 set_lcm_register(0xE40E,0x78);
164 set_lcm_register(0xE40F,0x96);
165 set_lcm_register(0xE410,0x4A);
166 set_lcm_register(0xE411,0x4D);
167
168
169 set_lcm_register(0xE500,0x0E);
170 set_lcm_register(0xE501,0x14);
171 set_lcm_register(0xE502,0x29);
172 set_lcm_register(0xE503,0x3A);
173 set_lcm_register(0xE504,0x1D);
174 set_lcm_register(0xE505,0x30);
175 set_lcm_register(0xE506,0x61);
176 set_lcm_register(0xE507,0x3F);
177 set_lcm_register(0xE508,0x20);
178 set_lcm_register(0xE509,0x26);
179 set_lcm_register(0xE50A,0x83);
180 set_lcm_register(0xE50B,0x16);
181 set_lcm_register(0xE50C,0x3B);
182 set_lcm_register(0xE50D,0x4C);
183 set_lcm_register(0xE50E,0x78);
184 set_lcm_register(0xE50F,0x96);
185 set_lcm_register(0xE510,0x4A);
186 set_lcm_register(0xE511,0x4D);
187
188 // enable tering free
189 set_lcm_register(0x3500,0x02);
190
191 set_lcm_register(0x3600,0x00);
192 send_ctrl_cmd(0x2900);
193 MDELAY(200);
194 send_ctrl_cmd(0x2C00);//wei zeng
195
196 }
197
198
199 // ---------------------------------------------------------------------------
200 // LCM Driver Implementations
201 // ---------------------------------------------------------------------------
202
203 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
204 {
205 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
206 }
207
208
209 static void lcm_get_params(LCM_PARAMS *params)
210 {
211 memset(params, 0, sizeof(LCM_PARAMS));
212
213 params->type = LCM_TYPE_DBI;
214 params->ctrl = LCM_CTRL_PARALLEL_DBI;
215 params->width = FRAME_WIDTH;
216 params->height = FRAME_HEIGHT;
217
218 params->io_select_mode = 1; //note:this para is different between 6573 and 6575
219
220
221 params->dbi.port = 0; //DBI port must be 0 or 1 on mt6575, should not be 2
222 params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS;
223 params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB;
224 params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST;
225 params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB;
226 params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666;
227 params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS;
228 params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS;
229 params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA;
230
231 params->dbi.parallel.write_setup = 1;
232 params->dbi.parallel.write_hold = 1;
233 params->dbi.parallel.write_wait = 3;
234 params->dbi.parallel.read_setup = 4;
235 params->dbi.parallel.read_hold = 0;
236 params->dbi.parallel.read_latency = 18;
237 params->dbi.parallel.wait_period = 1;
238 params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer
239 // enable tearing-free
240 params->dbi.te_mode = 0;
241 //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
242 params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
243 }
244
245
246 static void lcm_init(void)
247 {
248 SET_RESET_PIN(0);
249 MDELAY(25);
250 SET_RESET_PIN(1);
251 MDELAY(50);
252
253 init_lcm_registers();
254 }
255
256
257 static void lcm_suspend(void)
258 {
259 send_ctrl_cmd(0x1000);
260 MDELAY(20);
261 }
262
263
264 static void lcm_resume(void)
265 {
266 send_ctrl_cmd(0x1100);
267 MDELAY(200);
268
269 // xuecheng, do we need to write 0x2900??
270 send_ctrl_cmd(0x2900);
271 }
272
273 static void lcm_update(unsigned int x, unsigned int y,
274 unsigned int width, unsigned int height)
275 {
276 short x0, y0, x1, y1;
277 short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
278
279
280 x0 = (short)x;
281 y0 = (short)y;
282 x1 = (short)x+width-1;
283 y1 = (short)y+height-1;
284
285 h_X_start=((x0&0x0300)>>8);
286 l_X_start=(x0&0x00FF);
287 h_X_end=((x1&0x0300)>>8);
288 l_X_end=(x1&0x00FF);
289
290 h_Y_start=((y0&0x0300)>>8);
291 l_Y_start=(y0&0x00FF);
292 h_Y_end=((y1&0x0300)>>8);
293 l_Y_end=(y1&0x00FF);
294
295 send_ctrl_cmd( 0x2A00 );
296 send_data_cmd( h_X_start);
297 send_ctrl_cmd( 0x2A01 );
298 send_data_cmd( l_X_start);
299 send_ctrl_cmd( 0x2A02);
300 send_data_cmd( h_X_end );
301 send_ctrl_cmd( 0x2A03);
302 send_data_cmd( l_X_end );
303 send_ctrl_cmd( 0x2B00 );
304 send_data_cmd( h_Y_start);
305 send_ctrl_cmd( 0x2B01 );
306 send_data_cmd( l_Y_start);
307 send_ctrl_cmd( 0x2B02);
308 send_data_cmd( h_Y_end );
309 send_ctrl_cmd( 0x2B03);
310 send_data_cmd( l_Y_end );
311 send_ctrl_cmd(0x3601); //enable HSM mode
312 send_data_cmd(0x01);
313 send_ctrl_cmd( 0x2C00 );
314 }
315
316 static unsigned int lcm_compare_id(void)
317 {
318 unsigned int id = 0;
319
320 send_ctrl_cmd(0x1180);
321 id = read_data_cmd();
322
323 #if defined(BUILD_UBOOT)
324 printf("%s, id1 = 0x%08x\n", __func__, id);
325 #endif
326
327 send_ctrl_cmd(0x1080);
328 id |= (read_data_cmd() << 8);
329
330 #if defined(BUILD_UBOOT)
331 printf("%s, id2 = 0x%08x\n", __func__, id);
332 #endif
333
334 return (LCM_ID == id)?1:0;
335 }
336
337 LCM_DRIVER nt35582_mcu_6575_lcm_drv =
338 {
339 .name = "nt35582_mcu_6575",
340 .set_util_funcs = lcm_set_util_funcs,
341 .get_params = lcm_get_params,
342 .init = lcm_init,
343 .suspend = lcm_suspend,
344 .resume = lcm_resume,
345 .update = lcm_update,
346 .compare_id = lcm_compare_id
347 };