import PULS_20180308
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / ota7291_wxga_dsi_vdo / ota7291_wxga_dsi_vdo.c
CommitLineData
6fa3eb70
S
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#ifdef BUILD_LK
23#define TPS_I2C_BUS 0
24#define TPS_I2C_ID I2C2
25#define TPS_SLAVE_ADDR 0x74
26#define TPS_data_size 13 //1024
27const uint8_t e2prom_data[TPS_data_size] = {0xFA,0x3C,0x28,0x09,0x09,0x08,0x23,0x03,0x01,0x06,0x01,0x7D,0x7D};
28#endif
29
30// ---------------------------------------------------------------------------
31// Local Constants
32// ---------------------------------------------------------------------------
33#define FRAME_WIDTH (800)
34#define FRAME_HEIGHT (1280)
35
36#define REGFLAG_DELAY 0XFE
37#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER
38
39#define LCM_ID 0x01 //KDT+AUO+OTA7291
40#define LCM_DSI_CMD_MODE 0
41
42// ---------------------------------------------------------------------------
43// Local Variables
44// ---------------------------------------------------------------------------
45static LCM_UTIL_FUNCS lcm_util = {
46 .set_gpio_out = NULL,
47};
48
49#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
50#define UDELAY(n) (lcm_util.udelay(n))
51#define MDELAY(n) (lcm_util.mdelay(n))
52
53// ---------------------------------------------------------------------------
54// Local Functions
55// ---------------------------------------------------------------------------
56#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
57#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
58#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
59#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
60#define read_reg lcm_util.dsi_read_reg()
61#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
62
63struct LCM_setting_table {
64 unsigned cmd;
65 unsigned char count;
66 unsigned char para_list[64];
67};
68
69static struct LCM_setting_table lcm_initialization_setting[] = {
70 {0xd8,1,{0x66}},
71 {0x19,18,{0x00,0x00,0xfc,0x51,0xf2,0x3f,0xff,0xf3,0x3f,0x91,0x00,0x00,0x00,0x1c,0xf8,0x1f,0x01,0xc3}},
72 {0x19,18,{0x60,0x00,0x64,0xa0,0x10,0x0a,0x1e,0x1c,0x36,0x9c,0x10,0x09,0x3a,0x1e,0x80,0x91,0x02,0x3c}},
73};
74
75
76#ifdef BUILD_LK
77/*----------------------------------------*/
78/*--------------TPS65640------------------*/
79static int tps65640_write_data(void)
80{
81 printf("Evan:%s\n",__func__);
82 int ret=0;
83 mt_i2c i2c = {0};
84 i2c.id = TPS_I2C_ID;
85 i2c.addr = TPS_SLAVE_ADDR;
86 i2c.mode = ST_MODE;
87 i2c.speed = 100;
88 i2c.dma_en = 0;
89
90 u8 buf1[TPS_data_size+1];
91 buf1[0] = 0x00;
92 int i=0;
93 for(i=0;i<TPS_data_size;i++)
94 buf1[i+1]=e2prom_data[i];
95 ret = i2c_write(&i2c, buf1, TPS_data_size+1);
96 if(!ret)
97 {
98 printf("--------Evan:%s step1 error---------\n",__func__);
99 return ret;
100 }
101
102 u8 buf2[2];
103 buf2[0]=0xFF;
104 buf2[1]=0x80;
105 ret = i2c_write(&i2c, buf2, 2);
106 if(!ret)
107 {
108 printf("--------Evan:%s step2 error---------\n",__func__);
109 return ret;
110 }
111
112 return ret;
113}
114
115static int tps65640_read_data(uint8_t *data)
116{
117 printf("Evan:%s\n",__func__);
118 int ret=0;
119 mt_i2c i2c = {0};
120 i2c.id = TPS_I2C_ID;
121 i2c.addr = TPS_SLAVE_ADDR;
122 i2c.mode = ST_MODE;
123 i2c.speed = 100;
124 i2c.dma_en = 0;
125
126 u8 buf1[2];
127 buf1[0]=0xFF;
128 buf1[1]=0x01;
129 ret = i2c_write(&i2c, buf1, 2);
130 if(!ret)
131 {
132 printf("--------Evan:%s step1 error---------\n",__func__);
133 return ret;
134 }
135
136 uint8_t buf2=0x00;
137 ret = i2c_write(&i2c, buf2, 1);
138 if(!ret)
139 {
140 printf("--------Evan:%s step2-1 error---------\n",__func__);
141 return ret;
142 }
143
144 ret=i2c_read(&i2c, data, TPS_data_size);
145 if(!ret)
146 {
147 printf("--------Evan:%s step2-2 error---------\n",__func__);
148 return ret;
149 }
150 return ret;
151
152}
153
154
155
156static int tps65640_e2prom_data_check(void)
157{
158 printf("Evan:%s\n",__func__);
159 int i=0,ret=1;
160 uint8_t data[TPS_data_size];
161 //read e2prom data
162 tps65640_read_data(data);
163 //check e2prom data
164 for(i=0;i<TPS_data_size;i++)
165 if(data[i]!=e2prom_data[i])
166 {
167 ret=0;
168 printf("---------Evan:e2prom_data need update--------\n");
169 break;
170 }
171 if(ret)
172 printf("---------Evan:e2prom_data is OK--------\n");
173 else
174 ret=tps65640_write_data();
175 return ret;
176}
177
178static int tps65640_enable()
179{
180 printf("Evan:%s\n",__func__);
181 //todo:IC power on,
182}
183
184/*----------------------------------------*/
185#endif
186
187static void lcd_power_en(unsigned char enabled)
188{
189 if (enabled) {
190#ifdef BUILD_LK
191 upmu_set_rg_vgp1_vosel(0x7);//3.3V
192 upmu_set_rg_vgp1_en(0x1);
193 upmu_set_rg_vgp3_vosel(0x3);//1.8V
194 upmu_set_rg_vgp3_en(0x1);
195#else
196 upmu_set_rg_vgp1_vosel(0x7);//3.3V
197 upmu_set_rg_vgp1_en(0x1);
198 upmu_set_rg_vgp3_vosel(0x3);//1.8V
199 upmu_set_rg_vgp3_en(0x1);
200#endif
201 } else {
202#ifdef BUILD_LK
203 upmu_set_rg_vgp1_en(0);
204 upmu_set_rg_vgp1_vosel(0);
205 upmu_set_rg_vgp3_en(0);
206 upmu_set_rg_vgp3_vosel(0);
207#else
208 upmu_set_rg_vgp1_en(0);
209 upmu_set_rg_vgp1_vosel(0);
210 upmu_set_rg_vgp3_en(0);
211 upmu_set_rg_vgp3_vosel(0);
212#endif
213 }
214}
215
216
217static void lcd_reset(unsigned char enabled)
218{
219 if (enabled) {
220 mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ONE);
221 } else {
222 mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ZERO);
223 }
224}
225
226// ---------------------------------------------------------------------------
227// LCM Driver Implementations
228// ---------------------------------------------------------------------------
229static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
230{
231 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
232}
233
234
235static void lcm_get_params(LCM_PARAMS *params)
236{
237 memset(params, 0, sizeof(LCM_PARAMS));
238
239 params->type = LCM_TYPE_DSI;
240 params->width = FRAME_WIDTH;
241 params->height = FRAME_HEIGHT;
242 params->dsi.mode = SYNC_EVENT_VDO_MODE; //BURST_VDO_MODE;BURST_VDO_MODE;
243
244 // DSI
245 /* Command mode setting */
246 params->dsi.LANE_NUM = LCM_FOUR_LANE;
247 //The following defined the fomat for data coming from LCD engine.
248 params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; //LCM_DSI_FORMAT_RGB666;
249
250 // Video mode setting
251 params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888; //LCM_PACKED_PS_18BIT_RGB666;
252
253 params->dsi.vertical_sync_active = 4;//0;
254 params->dsi.vertical_backporch = 8;//23;
255 params->dsi.vertical_frontporch = 8;
256 params->dsi.vertical_active_line = FRAME_HEIGHT;
257
258 params->dsi.horizontal_sync_active = 4;//0;
259 params->dsi.horizontal_backporch = 132;//160;
260 params->dsi.horizontal_frontporch = 24; //100;//160;
261 params->dsi.horizontal_active_pixel = FRAME_WIDTH;
262
263 params->dsi.PLL_CLOCK = 260;//148;
264}
265
266
267static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
268{
269 unsigned int i;
270
271 for(i = 0; i < count; i++) {
272 unsigned cmd;
273 cmd = table[i].cmd;
274
275 switch (cmd) {
276 case REGFLAG_DELAY :
277 MDELAY(table[i].count);
278 break;
279
280 case REGFLAG_END_OF_TABLE :
281 break;
282
283 default:
284 dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
285 }
286 }
287
288}
289
290static void lcm_init(void)
291{
292 unsigned int data_array[16];
293
294#ifdef BUILD_LK
295 printf("%s, LK \n", __func__);
296#else
297 printk("%s, kernel", __func__);
298#endif
299
300 lcd_reset(0);
301 lcd_power_en(0);
302 lcd_power_en(1);
4b9e9796
S
303 MDELAY(5);
304 mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE);//iml8881 bias
6fa3eb70
S
305 MDELAY(50);
306 lcd_reset(1);
4b9e9796 307 MDELAY(15);
6fa3eb70 308 lcd_reset(0);
4b9e9796 309 MDELAY(15);
6fa3eb70 310 lcd_reset(1);
4b9e9796 311 MDELAY(15);
6fa3eb70
S
312
313 push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
314}
315
316
317static void lcm_suspend(void)
318{
319 unsigned int data_array[16];
320
321#ifdef BUILD_LK
322 printf("%s, LK \n", __func__);
323#else
324 printk("%s, kernel", __func__);
325#endif
326
4b9e9796
S
327 lcd_reset(0);
328 MDELAY(5);
6fa3eb70 329 mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO);//iml8881 bias
6fa3eb70
S
330 lcd_power_en(0);
331 MDELAY(10);
332}
333
334
335static void lcm_resume(void)
336{
337 unsigned int data_array[16];
338
339#ifdef BUILD_LK
340 printf("%s, LK \n", __func__);
341#else
342 printk("%s, kernel", __func__);
343#endif
344
345 lcm_init();
346}
347
348static unsigned int lcm_compare_id(void)
349{
350 unsigned int id1 = 0, id2 = 0, id = 0;
351
352#ifdef BUILD_LK
353 printf("%s, LK \n", __func__);
354#endif
355 lcd_reset(0);
356 lcd_power_en(0);
357 lcd_power_en(1);
358 lcd_reset(1);
359 MDELAY(20);
360 lcd_reset(0);
361 MDELAY(20);
362 lcd_reset(1);
363 MDELAY(20);
364
365 mt_set_gpio_mode(GPIO_HALL_2_PIN, GPIO_HALL_2_PIN_M_GPIO);
366 mt_set_gpio_dir(GPIO_HALL_2_PIN, GPIO_DIR_IN);
367 mt_set_gpio_pull_enable(GPIO_HALL_2_PIN, GPIO_PULL_DISABLE);
368 mt_set_gpio_mode(GPIO_HALL_1_PIN, GPIO_HALL_1_PIN_M_GPIO);
369 mt_set_gpio_dir(GPIO_HALL_1_PIN, GPIO_DIR_IN);
370 mt_set_gpio_pull_enable(GPIO_HALL_1_PIN, GPIO_PULL_DISABLE);
371 MDELAY(2);
372
373 id1 = mt_get_gpio_in(GPIO_HALL_1_PIN);
374 id2 = mt_get_gpio_in(GPIO_HALL_2_PIN);
375 id = (id1<<1)|(id2);
376#ifdef BUILD_LK
377 printf("KDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id);
378#else
379 printk("KDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id);
380#endif
381 lcd_reset(0);
382 lcd_power_en(0);
383 MDELAY(10);
384 return (LCM_ID == id)?1:0;
385}
386
387LCM_DRIVER ota7291_wxga_dsi_vdo_lcm_drv =
388{
389 .name = "ota7291_wxga_dsi_vdo",
390 .set_util_funcs = lcm_set_util_funcs,
391 .get_params = lcm_get_params,
392 .init = lcm_init,
393 .suspend = lcm_suspend,
394 .resume = lcm_resume,
395 .compare_id = lcm_compare_id,
396};
397
398