import PULS_20180308
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / rm72013_wxga_dsi_vdo / rm72013_wxga_dsi_vdo.c
1 #ifdef BUILD_LK
2 #include <string.h>
3 //Evan add
4 #include <debug.h>
5 #include <sys/types.h>
6 #include <platform/mt_i2c.h>
7 //Evan add end
8 #else
9 #include <linux/string.h>
10 #endif
11
12 #ifdef BUILD_LK
13 #include <platform/mt_gpio.h>
14 #include <platform/mt_pmic.h>
15 #else
16 #include <mach/mt_gpio.h>
17 #include <mach/mt_pm_ldo.h>
18 #include <mach/upmu_common.h>
19 #endif
20 #include "lcm_drv.h"
21
22 // ---------------------------------------------------------------------------
23 // Local Constants
24 // ---------------------------------------------------------------------------
25 #define FRAME_WIDTH (800)
26 #define FRAME_HEIGHT (1280)
27
28 #define REGFLAG_DELAY 0XFE
29 #define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER
30
31 #define LCM_DSI_CMD_MODE 0
32 #define LCM_ID 0x03 //DPT+AUO+Rm72013
33
34 // ---------------------------------------------------------------------------
35 // Local Variables
36 // ---------------------------------------------------------------------------
37 static LCM_UTIL_FUNCS lcm_util = {
38 .set_gpio_out = NULL,
39 };
40
41 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
42 #define UDELAY(n) (lcm_util.udelay(n))
43 #define MDELAY(n) (lcm_util.mdelay(n))
44
45 // ---------------------------------------------------------------------------
46 // Local Functions
47 // ---------------------------------------------------------------------------
48 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
49 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
50 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
51 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
52 #define read_reg lcm_util.dsi_read_reg()
53 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
54
55 struct LCM_setting_table {
56 unsigned cmd;
57 unsigned char count;
58 unsigned char para_list[64];
59 };
60
61 static struct LCM_setting_table lcm_initialization_setting[] = {
62 {0x50,1,{0x77}},
63 {0xE1,1,{0x66}},
64 {0xDC,1,{0x67}},
65 {0xD3,1,{0xC8}},
66 {0x50,1,{0x00}},
67 {0xF0,2,{0x5A,0x5A}},
68 {0xF5,1,{0x96}},
69 {0xC3,3,{0x40,0x00,0x28}},
70 {REGFLAG_DELAY, 6, {}},
71 {0x11,1,{}},
72 {0x29,1,{}},
73 {REGFLAG_DELAY, 200, {}},
74 {REGFLAG_END_OF_TABLE, 0x00, {}}
75 };
76
77 static struct LCM_setting_table lcm_power_off_setting[] = {
78 {0x28,1,{}},
79 {0x10,1,{}},
80 {REGFLAG_DELAY, 5, {}},
81 {0xF0,2,{0x5A,0x5A}},
82 {0xC3,3,{0x40,0x00,0x20}},
83 {REGFLAG_END_OF_TABLE, 0x00, {}}
84 };
85
86 static void lcd_power_en(unsigned char enabled)
87 {
88 if (enabled) {
89 #ifdef BUILD_LK
90 upmu_set_rg_vgp1_vosel(0x7);//3.3V
91 upmu_set_rg_vgp1_en(0x1);
92 upmu_set_rg_vgp3_vosel(0x3);//1.8V
93 upmu_set_rg_vgp3_en(0x1);
94 #else
95 upmu_set_rg_vgp1_vosel(0x7);//3.3V
96 upmu_set_rg_vgp1_en(0x1);
97 upmu_set_rg_vgp3_vosel(0x3);//1.8V
98 upmu_set_rg_vgp3_en(0x1);
99 #endif
100 } else {
101 #ifdef BUILD_LK
102 upmu_set_rg_vgp1_en(0);
103 upmu_set_rg_vgp1_vosel(0);
104 upmu_set_rg_vgp3_en(0);
105 upmu_set_rg_vgp3_vosel(0);
106 #else
107 upmu_set_rg_vgp1_en(0);
108 upmu_set_rg_vgp1_vosel(0);
109 upmu_set_rg_vgp3_en(0);
110 upmu_set_rg_vgp3_vosel(0);
111 #endif
112 }
113 }
114
115
116 static void lcd_reset(unsigned char enabled)
117 {
118 if (enabled) {
119 mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ONE);
120 } else {
121 mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ZERO);
122 }
123 }
124
125 // ---------------------------------------------------------------------------
126 // LCM Driver Implementations
127 // ---------------------------------------------------------------------------
128 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
129 {
130 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
131 }
132
133
134 static void lcm_get_params(LCM_PARAMS *params)
135 {
136 memset(params, 0, sizeof(LCM_PARAMS));
137
138 params->type = LCM_TYPE_DSI;
139 params->width = FRAME_WIDTH;
140 params->height = FRAME_HEIGHT;
141 params->dsi.mode = SYNC_EVENT_VDO_MODE; //BURST_VDO_MODE;BURST_VDO_MODE;
142
143 // DSI
144 /* Command mode setting */
145 params->dsi.LANE_NUM = LCM_FOUR_LANE;
146 //The following defined the fomat for data coming from LCD engine.
147 params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; //LCM_DSI_FORMAT_RGB666;
148
149 // Video mode setting
150 params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888; //LCM_PACKED_PS_18BIT_RGB666;
151
152 params->dsi.vertical_sync_active = 4;//0;
153 params->dsi.vertical_backporch = 8;//23;
154 params->dsi.vertical_frontporch = 8;
155 params->dsi.vertical_active_line = FRAME_HEIGHT;
156
157 params->dsi.horizontal_sync_active = 4;//0;
158 params->dsi.horizontal_backporch = 132;//160;
159 params->dsi.horizontal_frontporch = 24; //100;//160;
160 params->dsi.horizontal_active_pixel = FRAME_WIDTH;
161
162 params->dsi.PLL_CLOCK = 250;//148;
163 }
164
165 static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
166 {
167 unsigned int i;
168
169 for(i = 0; i < count; i++) {
170 unsigned cmd;
171 cmd = table[i].cmd;
172
173 switch (cmd) {
174 case REGFLAG_DELAY :
175 MDELAY(table[i].count);
176 break;
177
178 case REGFLAG_END_OF_TABLE :
179 break;
180
181 default:
182 dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
183 }
184 }
185
186 }
187
188 static void lcm_init(void)
189 {
190 unsigned int data_array[16];
191
192 #ifdef BUILD_LK
193 printf("%s, LK \n", __func__);
194 #else
195 printk("%s, kernel", __func__);
196 #endif
197
198 lcd_reset(0);
199 lcd_power_en(0);
200 lcd_power_en(1);
201 MDELAY(5);
202 mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE);//iml8881 bias
203 MDELAY(50);
204 lcd_reset(1);
205 MDELAY(15);
206 lcd_reset(0);
207 MDELAY(15);
208 lcd_reset(1);
209 MDELAY(15);
210
211 push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
212 }
213
214
215 static void lcm_suspend(void)
216 {
217 unsigned int data_array[16];
218
219 #ifdef BUILD_LK
220 printf("%s, LK \n", __func__);
221 #else
222 printk("%s, kernel", __func__);
223 #endif
224
225 push_table(lcm_power_off_setting, sizeof(lcm_power_off_setting) / sizeof(struct LCM_setting_table), 1);
226
227 lcd_reset(0);
228 mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO);//iml8881 bias
229 lcd_power_en(0);
230 MDELAY(10);
231 }
232
233
234 static void lcm_resume(void)
235 {
236 unsigned int data_array[16];
237
238 #ifdef BUILD_LK
239 printf("%s, LK \n", __func__);
240 #else
241 printk("%s, kernel", __func__);
242 #endif
243
244 lcm_init();
245 }
246 /*
247 static unsigned int lcm_esd_test = FALSE;
248
249 static unsigned int lcm_esd_check(void)
250 {
251
252 #ifndef BUILD_LK
253
254 char buffer[1];
255 int array[4];
256 int ret = 0;
257
258 if(lcm_esd_test)
259 {
260 lcm_esd_test = FALSE;
261 return TRUE;
262 }
263
264 array[0] = 0x00013700;
265 dsi_set_cmdq(array, 1, 1);
266 read_reg_v2(0x0A, buffer, 1);
267 //printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]);
268 if(buffer[0] != 0x9C)
269 {
270 // printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]);
271 ret++;
272 }
273
274 // return TRUE: need recovery
275 // return FALSE: No need recovery
276 if(ret)
277 {
278 return TRUE;
279 }
280 else
281 {
282 return FALSE;
283 }
284 #endif
285 }
286
287 static unsigned int lcm_esd_recover(void)
288 {
289 #ifdef BUILD_LK
290 printf("%s, LK \n", __func__);
291 #else
292 printk("%s, KERNEL \n", __func__);
293 #endif
294 lcm_init();
295 return TRUE;
296 }
297 */
298 static unsigned int lcm_compare_id(void)
299 {
300 unsigned int id1 = 0, id2 = 0, id = 0;
301
302 #ifdef BUILD_LK
303 printf("%s, LK \n", __func__);
304 #endif
305 lcd_reset(0);
306 lcd_power_en(0);
307 lcd_power_en(1);
308 lcd_reset(1);
309 MDELAY(20);
310 lcd_reset(0);
311 MDELAY(20);
312 lcd_reset(1);
313 MDELAY(20);
314
315 mt_set_gpio_mode(GPIO_HALL_2_PIN, GPIO_HALL_2_PIN_M_GPIO);
316 mt_set_gpio_dir(GPIO_HALL_2_PIN, GPIO_DIR_IN);
317 mt_set_gpio_pull_enable(GPIO_HALL_2_PIN, GPIO_PULL_DISABLE);
318 mt_set_gpio_mode(GPIO_HALL_1_PIN, GPIO_HALL_1_PIN_M_GPIO);
319 mt_set_gpio_dir(GPIO_HALL_1_PIN, GPIO_DIR_IN);
320 mt_set_gpio_pull_enable(GPIO_HALL_1_PIN, GPIO_PULL_DISABLE);
321 MDELAY(2);
322
323 id1 = mt_get_gpio_in(GPIO_HALL_1_PIN);
324 id2 = mt_get_gpio_in(GPIO_HALL_2_PIN);
325 id = (id1<<1)|(id2);
326 #ifdef BUILD_LK
327 printf("DPT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id);
328 #else
329 printk("DPT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id);
330 #endif
331 lcd_reset(0);
332 lcd_power_en(0);
333 MDELAY(10);
334 return (LCM_ID == id)?1:0;
335 }
336
337 LCM_DRIVER rm72013_wxga_dsi_vdo_lcm_drv =
338 {
339 .name = "rm72013_wxga_dsi_vdo",
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 //.esd_check = lcm_esd_check,
346 //.esd_recover = lcm_esd_recover,
347 .compare_id = lcm_compare_id,
348 };
349
350