import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / VVX10F008B00_WUXGA_DSI_VDO / VVX10F008B00_WUXGA_DSI_VDO.c
1 #ifndef BUILD_LK
2 #include <linux/string.h>
3 #else
4 #include <string.h>
5 #endif
6
7 #ifdef BUILD_LK
8 #include <platform/mt_gpio.h>
9 #include <platform/mt_i2c.h>
10 #include <platform/mt_pmic.h>
11 #elif (defined BUILD_UBOOT)
12 #include <asm/arch/mt6577_gpio.h>
13 #else
14 #include <mach/mt_gpio.h>
15 #include <mach/mt_pm_ldo.h>
16 #endif
17
18 #include "lcm_drv.h"
19
20 // ---------------------------------------------------------------------------
21 // Local Constants
22 // ---------------------------------------------------------------------------
23 #define FRAME_WIDTH (1920)
24 #define FRAME_HEIGHT (1200)
25
26 // ---------------------------------------------------------------------------
27 // Local Variables
28 // ---------------------------------------------------------------------------
29 static LCM_UTIL_FUNCS lcm_util = {0};
30
31 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
32
33 #define UDELAY(n) (lcm_util.udelay(n))
34 #define MDELAY(n) (lcm_util.mdelay(n))
35
36 #ifdef GPIO_LCM_PWR_EN
37 #define GPIO_LCD_PWR_EN GPIO_LCM_PWR_EN
38 #else
39 #define GPIO_LCD_PWR_EN 0xFFFFFFFF
40 #endif
41
42 //LDO power for LCM as back up solution
43 //#ifdef GPIO_LCM_PWR
44 //#define GPIO_LCD_PWR_EN GPIO_LCM_PWR
45 //#else
46 //#define GPIO_LCD_PWR_EN 0xFFFFFFFF
47 //#endif
48
49 // ---------------------------------------------------------------------------
50 // Local Functions
51 // ---------------------------------------------------------------------------
52 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
53 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
54 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
55 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
56 #define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
57 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
58
59 #define LCM_DSI_CMD_MODE 0
60
61 // ---------------------------------------------------------------------------
62 // LCM Driver Implementations
63 // ---------------------------------------------------------------------------
64 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
65 {
66 memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
67 }
68
69 static void lcm_get_params(LCM_PARAMS *params)
70 {
71 memset(params, 0, sizeof(LCM_PARAMS));
72
73 params->type = LCM_TYPE_DSI;
74
75 params->width = FRAME_WIDTH;
76 params->height = FRAME_HEIGHT;
77
78 #if (LCM_DSI_CMD_MODE)
79 params->dsi.mode = CMD_MODE;
80 #else
81 params->dsi.mode = SYNC_EVENT_VDO_MODE; //SYNC_PULSE_VDO_MODE;
82 #endif
83
84 // DSI
85 /* Command mode setting */
86 // Three lane or Four lane
87 params->dsi.LANE_NUM = LCM_FOUR_LANE;
88
89 //The following defined the fomat for data coming from LCD engine.
90 params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
91 params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
92 params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
93 params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
94
95 // Highly depends on LCD driver capability.
96 // Not support in MT6573
97 params->dsi.packet_size=256;
98
99 // Video mode setting
100 params->dsi.intermediat_buffer_num = 0;
101
102 params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
103 params->dsi.word_count=FRAME_WIDTH*3;
104
105 params->dsi.vertical_sync_active = 2;
106 params->dsi.vertical_backporch = 10;
107 params->dsi.vertical_frontporch = 23;
108 params->dsi.vertical_active_line = FRAME_HEIGHT;
109
110 params->dsi.horizontal_sync_active = 16;
111 params->dsi.horizontal_backporch = 48;
112 params->dsi.horizontal_frontporch = 96;
113 params->dsi.horizontal_active_pixel = FRAME_WIDTH;
114 params->dsi.ssc_disable = 1;
115
116 // Bit rate calculation
117 // Every lane speed
118 //params->dsi.pll_div1=0; // div1=0,1,2,3;div1_real=1,2,4,4
119 //params->dsi.pll_div2=0; // div2=0,1,2,3;div1_real=1,2,4,4
120 //params->dsi.fbk_div =0x12; // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)
121
122 params->dsi.PLL_CLOCK = 494;
123 }
124
125 static void lcm_set_gpio_output(unsigned int GPIO, unsigned int output)
126 {
127 mt_set_gpio_mode(GPIO, GPIO_MODE_00);
128 mt_set_gpio_dir(GPIO, GPIO_DIR_OUT);
129 mt_set_gpio_out(GPIO, (output>0)? GPIO_OUT_ONE: GPIO_OUT_ZERO);
130 }
131 #if 0
132 static void lcm_init(void)
133 {
134 #ifdef BUILD_LK
135 printf("[LK/LCM] lcm_init() enter\n");
136
137 #else
138 printk("[Kernel/LCM] lcm_init() enter\n");
139
140 #endif
141 }
142 #endif
143
144 static void lcm_init_power(void)
145 {
146 #ifdef BUILD_LK
147 printf("[LK/LCM] lcm_init_power() enter\n");
148
149 #else
150 printk("[Kernel/LCM] lcm_init_power() enter\n");
151
152 #endif
153
154 }
155
156 static void lcm_suspend_power(void)
157 {
158 #ifdef BUILD_LK
159 printf("[LK/LCM] lcm_suspend_power() enter\n");
160
161 #else
162 printk("[Kernel/LCM] lcm_suspend_power() enter\n");
163
164 #endif
165
166 }
167
168 static void lcm_resume_power(void)
169 {
170 #ifdef BUILD_LK
171 printf("[LK/LCM] lcm_resume_power() enter\n");
172
173 #else
174 printk("[Kernel/LCM] lcm_resume_power() enter\n");
175
176 #endif
177
178 }
179
180 static void lcm_init(void)
181 {
182 #ifdef BUILD_LK
183 printf("[LK/LCM] lcm_init() enter\n");
184
185 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO);
186 MDELAY(50);
187
188 //VGP1 3.3V
189 //upmu_set_rg_vgp1_vosel(0x7);
190 //upmu_set_rg_vgp1_en(0x1);
191 //MDELAY(10);
192
193 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
194 MDELAY(50);
195
196 #else
197 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO);
198 MDELAY(50);
199
200 //VGP1 3.3V
201 //upmu_set_rg_vgp1_vosel(0x7);
202 //upmu_set_rg_vgp1_en(0x1);
203 //MDELAY(10);
204
205 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
206 MDELAY(50);
207
208 printk("[Kernel/LCM] lcm_init() enter\n");
209
210 //lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO);
211 //MDELAY(10);
212
213 //hwPowerOn(MT65XX_POWER_LDO_VGP6, VOL_3300, "LCM");
214 //MDELAY(10);
215
216 //lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
217 //MDELAY(300);
218
219 #endif
220 }
221
222 static void lcm_suspend(void)
223 {
224 #ifdef BUILD_LK
225 printf("[LK/LCM] lcm_suspend() enter\n");
226
227 lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO);
228 MDELAY(100);
229
230 //VGP1 3.3V
231 //upmu_set_rg_vgp1_vosel(0x0);
232 //upmu_set_rg_vgp1_en(0x0);
233 //MDELAY(50);
234
235 #else
236 printk("[Kernel/LCM] lcm_suspend() enter\n");
237
238 lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO);
239 MDELAY(100);
240
241 //hwPowerDown(MT65XX_POWER_LDO_VGP1, "LCM");
242 //MDELAY(50);
243
244 #endif
245 }
246
247 static void lcm_resume(void)
248 {
249 #ifdef BUILD_LK
250 printf("[LK/LCM] lcm_resume() enter\n");
251
252 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO);
253 MDELAY(50);
254
255 //VGP1 3.3V
256 //upmu_set_rg_vgp1_vosel(0x7);
257 //upmu_set_rg_vgp1_en(0x1);
258 //MDELAY(10);
259
260 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
261 MDELAY(50);
262
263 #else
264 printk("[Kernel/LCM] lcm_resume() enter\n");
265
266 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO);
267 MDELAY(50);
268
269 //hwPowerOn(MT65XX_POWER_LDO_VGP1, VOL_3300, "LCM");
270 //MDELAY(100);
271
272 lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
273 MDELAY(50);
274
275 #endif
276 }
277
278 #if (LCM_DSI_CMD_MODE)
279 static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height)
280 {
281 unsigned int x0 = x;
282 unsigned int y0 = y;
283 unsigned int x1 = x0 + width - 1;
284 unsigned int y1 = y0 + height - 1;
285
286 unsigned char x0_MSB = ((x0>>8)&0xFF);
287 unsigned char x0_LSB = (x0&0xFF);
288 unsigned char x1_MSB = ((x1>>8)&0xFF);
289 unsigned char x1_LSB = (x1&0xFF);
290 unsigned char y0_MSB = ((y0>>8)&0xFF);
291 unsigned char y0_LSB = (y0&0xFF);
292 unsigned char y1_MSB = ((y1>>8)&0xFF);
293 unsigned char y1_LSB = (y1&0xFF);
294
295 unsigned int data_array[16];
296
297 data_array[0]= 0x00053902;
298 data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
299 data_array[2]= (x1_LSB);
300 dsi_set_cmdq(data_array, 3, 1);
301
302 data_array[0]= 0x00053902;
303 data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
304 data_array[2]= (y1_LSB);
305 dsi_set_cmdq(data_array, 3, 1);
306
307 data_array[0]= 0x00290508; //HW bug, so need send one HS packet
308 dsi_set_cmdq(data_array, 1, 1);
309
310 data_array[0]= 0x002c3909;
311 dsi_set_cmdq(data_array, 1, 0);
312 }
313 #endif
314
315
316 LCM_DRIVER vvx10f008b00_wuxga_dsi_vdo_lcm_drv =
317 {
318 .name = "VVX10F008B00_WUXGA_DSI_VDO",
319 .set_util_funcs = lcm_set_util_funcs,
320 .get_params = lcm_get_params,
321 .init = lcm_init,
322 .suspend = lcm_suspend,
323 .resume = lcm_resume,
324 .init_power = lcm_init_power,
325 .resume_power = lcm_resume_power,
326 .suspend_power = lcm_suspend_power,
327 #if (LCM_DSI_CMD_MODE)
328 .update = lcm_update,
329 #endif
330 };