import PULS_20180308
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / kr076_starry_ek79007_wsvga_dsi_vdo / kr076_starry_ek79007_wsvga_dsi_vdo.c
1 #ifndef BUILD_LK
2 #include <linux/string.h>
3 #endif
4 #include "lcm_drv.h"
5
6 #ifdef BUILD_LK
7 #include <platform/mt_gpio.h>
8 #include <platform/upmu_common.h>
9 #elif defined(BUILD_UBOOT)
10 #include <asm/arch/mt_gpio.h>
11 #else
12 #include <mach/mt_gpio.h>
13 #include <mach/mt_pm_ldo.h>
14 #include <mach/upmu_common.h>
15 #endif
16 // ---------------------------------------------------------------------------
17 // Local Constants
18 // ---------------------------------------------------------------------------
19
20 #define FRAME_WIDTH (1024)
21 #define FRAME_HEIGHT (600)
22
23 #define REGFLAG_DELAY 0XFE
24 #define REGFLAG_END_OF_TABLE 0xFFF // END OF REGISTERS MARKER
25
26 #define LCM_ID_79007 0x00
27 #define LCM_DSI_CMD_MODE 0
28
29 #define GPIO_RESET_PIN GPIO83
30 #define GPIO_STBYB_PIN GPIO117
31 #define GPIO_AVDD_PIN GPIO119
32 #define GPIO_LCM_PWR_EN GPIO89
33 #ifndef TRUE
34 #define TRUE 1
35 #endif
36
37 #ifndef FALSE
38 #define FALSE 0
39 #endif
40
41 // ---------------------------------------------------------------------------
42 // Local Variables
43 // ---------------------------------------------------------------------------
44
45 static LCM_UTIL_FUNCS lcm_util = {0};
46
47 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
48
49 #define UDELAY(n) (lcm_util.udelay(n))
50 #define MDELAY(n) (lcm_util.mdelay(n))
51
52
53 // ---------------------------------------------------------------------------
54 // Local Functions
55 // ---------------------------------------------------------------------------
56
57 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
58 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
59 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
60 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
61 #define read_reg lcm_util.dsi_read_reg()
62 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
63
64 #ifndef BUILD_LK
65 static unsigned int lcm_esd_test = FALSE; ///only for ESD test
66 #endif
67
68
69
70 static void lcm_gpio_set(int num, int enable)
71 {
72 #ifdef BUILD_LK
73 printf("\n\n\n===================== %s %d: num:%d => %d =======================\n\n\n", __func__, __LINE__, num, enable);
74 #endif
75 lcm_util.set_gpio_mode(num, GPIO_MODE_00);
76 lcm_util.set_gpio_dir(num, GPIO_DIR_OUT);
77
78 if (enable)
79 lcm_util.set_gpio_out(num, GPIO_OUT_ONE);
80 else
81 lcm_util.set_gpio_out(num, GPIO_OUT_ZERO);
82 }
83
84 static void lcd_reset(unsigned char enabled)
85 {
86 if (enabled)
87 {
88 mt_set_gpio_mode(GPIO_RESET_PIN, GPIO_MODE_00);
89 mt_set_gpio_dir(GPIO_RESET_PIN, GPIO_DIR_OUT);
90 mt_set_gpio_out(GPIO_RESET_PIN, GPIO_OUT_ONE);
91 }
92 else
93 {
94 mt_set_gpio_mode(GPIO_RESET_PIN, GPIO_MODE_00);
95 mt_set_gpio_dir(GPIO_RESET_PIN, GPIO_DIR_OUT);
96 mt_set_gpio_out(GPIO_RESET_PIN, GPIO_OUT_ZERO);
97 }
98 }
99
100 static void lcd_stbyb(unsigned char enabled)
101 {
102 if (enabled)
103 {
104 mt_set_gpio_mode(GPIO_STBYB_PIN, GPIO_MODE_00);
105 mt_set_gpio_dir(GPIO_STBYB_PIN, GPIO_DIR_OUT);
106 mt_set_gpio_out(GPIO_STBYB_PIN, GPIO_OUT_ONE);
107 }
108 else
109 {
110 mt_set_gpio_mode(GPIO_STBYB_PIN, GPIO_MODE_00);
111 mt_set_gpio_dir(GPIO_STBYB_PIN, GPIO_DIR_OUT);
112 mt_set_gpio_out(GPIO_STBYB_PIN, GPIO_OUT_ZERO);
113 }
114 }
115
116 static void lcd_DVDD_power_en(unsigned char enabled)
117 {
118 if (enabled)
119 {
120 upmu_set_rg_vgp1_vosel(0x3); //1.8V
121 upmu_set_rg_vgp1_en(0x1);
122 }
123 else
124 {
125 upmu_set_rg_vgp1_en(0x0);
126 }
127 }
128 static void lcd_AVDD_power_en(unsigned char enabled)
129 {
130 //lcm_gpio_set(GPIO_LCM_PWR_EN, enabled);
131 mt_set_gpio_mode(GPIO_LCM_PWR_EN, GPIO_MODE_00);
132 mt_set_gpio_dir(GPIO_LCM_PWR_EN, GPIO_DIR_OUT);
133 mt_set_gpio_out(GPIO_LCM_PWR_EN, enabled);
134 }
135
136
137 static void init_lcm_registers(void)
138 {
139 unsigned int data_array[16];
140 #ifdef BUILD_LK
141 //printf("[IND][K] y_____0%s\n", __func__);
142 #else
143 //printk("[IND][K] y_____1%s\n", __func__);
144 #endif
145
146 data_array[0] = 0x47801500;
147 dsi_set_cmdq(&data_array, 1, 1);
148 MDELAY(1);
149 data_array[0] = 0x40811500;
150 dsi_set_cmdq(&data_array, 1, 1);
151 MDELAY(1);
152 data_array[0] = 0x04821500;
153 dsi_set_cmdq(&data_array, 1, 1);
154 MDELAY(1);
155 data_array[0] = 0x77831500;
156 dsi_set_cmdq(&data_array, 1, 1);
157 MDELAY(1);
158 data_array[0] = 0x0F841500;
159 dsi_set_cmdq(&data_array, 1, 1);
160 MDELAY(1);
161 data_array[0] = 0x70851500;
162 dsi_set_cmdq(&data_array, 1, 1);
163 MDELAY(1);
164 data_array[0] = 0x70861500;
165 dsi_set_cmdq(&data_array, 1, 1);
166 MDELAY(1);
167
168 }
169
170
171 // ---------------------------------------------------------------------------
172 // LCM Driver Implementations
173 // ---------------------------------------------------------------------------
174
175 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
176 {
177 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
178 }
179
180
181 static void lcm_get_params(LCM_PARAMS *params)
182 {
183 memset(params, 0, sizeof(LCM_PARAMS));
184
185 params->type = LCM_TYPE_DSI;
186
187 params->width = FRAME_WIDTH;
188 params->height = FRAME_HEIGHT;
189
190 #if (LCM_DSI_CMD_MODE)
191 params->dsi.mode = CMD_MODE;
192 #else
193 params->dsi.mode = BURST_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;
194 #endif
195
196 // DSI
197 /* Command mode setting */
198 //1 Three lane or Four lane
199 params->dsi.LANE_NUM = LCM_FOUR_LANE;
200 //The following defined the fomat for data coming from LCD engine.
201 params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
202
203 // Video mode setting
204 params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
205
206 params->dsi.vertical_sync_active = 0x05;// 3 2
207 params->dsi.vertical_backporch = 23;// 20 1
208 params->dsi.vertical_frontporch = 12; // 1 12
209 params->dsi.vertical_active_line = FRAME_HEIGHT;
210
211 params->dsi.horizontal_sync_active = 0x16;// 50 2
212 params->dsi.horizontal_backporch = 160;
213 params->dsi.horizontal_frontporch = 160;
214 params->dsi.horizontal_active_pixel = FRAME_WIDTH;
215 /*[PLATFORM]-Mod-BEGIN by TCTSZ.huangjing,2014.09.09,set mipi clk 227M and disable ssc.*/
216 //params->dsi.PLL_CLOCK=240;
217 params->dsi.PLL_CLOCK=175;
218 params->dsi.ssc_disable = TRUE;
219 /*[PLATFORM]-Mod-END by TCTSZ.huangjing*/
220 }
221
222
223
224 static void lcm_init(void)
225 {
226 //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015,
227 //improve dsi config and power on/off sequence
228 lcd_DVDD_power_en(0);
229 lcd_stbyb(0);
230 lcd_reset(0);
231 lcd_AVDD_power_en(0);
232 MDELAY(30);
233
234 lcd_DVDD_power_en(1);
235 MDELAY(10);
236
237 lcd_stbyb(1);
238 MDELAY(10);
239
240 lcd_reset(1);
241 MDELAY(20);
242 lcd_reset(0);
243 MDELAY(10);
244 lcd_reset(1);
245
246 lcd_AVDD_power_en(1);
247
248 init_lcm_registers();
249 MDELAY(50);
250 //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com
251 }
252
253
254 static void lcm_suspend(void)
255 {
256 //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015,
257 //improve dsi config and power on/off sequence
258 lcd_stbyb(0);
259 MDELAY(80);
260
261 lcd_AVDD_power_en(0);
262 MDELAY(50);
263
264 lcd_DVDD_power_en(0);
265 MDELAY(10);
266
267 lcd_reset(0);
268 //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com
269 }
270
271
272 static void lcm_resume(void)
273 {
274 lcm_init();
275 }
276
277 static unsigned int lcm_compare_id(void)
278 {
279 return 1;
280 }
281
282 static unsigned int lcm_esd_check(void)
283 {
284 #ifndef BUILD_LK
285 char buffer[3];
286 int array[4];
287 int ret = 0;
288
289 if(lcm_esd_test)
290 {
291 lcm_esd_test = FALSE;
292 return TRUE;
293 }
294
295 array[0] = 0x5A871500;
296 dsi_set_cmdq(array, 1, 1);
297
298 array[0] = 0x125B1500;
299 dsi_set_cmdq(array, 1, 1);
300
301 array[0] = 0x55871500;
302 dsi_set_cmdq(array, 1, 1);
303
304 array[0] = 0x125B1500;
305 dsi_set_cmdq(array, 1, 1);
306
307 //array[0] = 0x08B11500;
308 //dsi_set_cmdq(array, 1, 1);
309
310 //MDELAY(2000);
311
312 array[0] = 0x00013700;
313 dsi_set_cmdq(array, 1, 1);
314
315 read_reg_v2(0x81, buffer, 1);
316 //printk("\n ZERO] [0x81]=0x%02x\n", buffer[0]);
317
318 if(buffer[0] != 0x40)
319 {
320 printk("[LCM ERROR] [0x81]=0x%02x\n", buffer[0]);
321 return TRUE;
322 }
323 else
324 {
325 printk("[LCM ESD OK] [0x81]=0x%02x\n", buffer[0]);
326 array[0] = 0x925B1500;
327 dsi_set_cmdq(array, 1, 1);
328
329 array[0] = 0x5A871500;
330 dsi_set_cmdq(array, 1, 1);
331
332 array[0] = 0x925B1500;
333 dsi_set_cmdq(array, 1, 1);
334
335 array[0] = 0x00871500;
336 dsi_set_cmdq(array, 1, 1);
337 return FALSE;
338 }
339
340 // return TRUE: need recovery
341 // return FALSE: No need recovery
342 #else
343 return FALSE;
344 #endif
345 }
346 static unsigned int lcm_esd_recover(void)
347 {
348 #ifndef BUILD_LK
349 printk("\n [LCM ERROR] lcm_esd_recover \n");
350 #endif
351 lcd_DVDD_power_en(0);
352 MDELAY(30);
353 lcm_init();
354 return TRUE;
355 }
356
357 LCM_DRIVER kr076_ek79007_wsvga_dsi_vdo_lcm_drv =
358 {
359 .name = "kr076_ek79007_wsvga_dsi_vdo",
360 .set_util_funcs = lcm_set_util_funcs,
361 .get_params = lcm_get_params,
362 .init = lcm_init,
363 .suspend = lcm_suspend,
364 .resume = lcm_resume,
365 .compare_id = lcm_compare_id,
366 .esd_check = lcm_esd_check,
367 .esd_recover = lcm_esd_recover,
368 #if (LCM_DSI_CMD_MODE)
369 .set_backlight = lcm_setbacklight,
370 .update = lcm_update,
371 #endif
372 };
373
374
375
376