2 #include <linux/string.h>
7 #include <platform/mt_gpio.h>
8 #include <platform/upmu_common.h>
9 #elif defined(BUILD_UBOOT)
10 #include <asm/arch/mt_gpio.h>
12 #include <mach/mt_gpio.h>
13 #include <mach/mt_pm_ldo.h>
14 #include <mach/upmu_common.h>
16 // ---------------------------------------------------------------------------
18 // ---------------------------------------------------------------------------
20 #define FRAME_WIDTH (1024)
21 #define FRAME_HEIGHT (600)
23 #define REGFLAG_DELAY 0XFE
24 #define REGFLAG_END_OF_TABLE 0xFFF // END OF REGISTERS MARKER
26 #define LCM_ID_79007 0x00
27 #define LCM_DSI_CMD_MODE 0
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
41 // ---------------------------------------------------------------------------
43 // ---------------------------------------------------------------------------
45 static LCM_UTIL_FUNCS lcm_util
= {0};
47 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
49 #define UDELAY(n) (lcm_util.udelay(n))
50 #define MDELAY(n) (lcm_util.mdelay(n))
53 // ---------------------------------------------------------------------------
55 // ---------------------------------------------------------------------------
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)
65 static unsigned int lcm_esd_test
= FALSE
; ///only for ESD test
70 static void lcm_gpio_set(int num
, int enable
)
73 printf("\n\n\n===================== %s %d: num:%d => %d =======================\n\n\n", __func__
, __LINE__
, num
, enable
);
75 lcm_util
.set_gpio_mode(num
, GPIO_MODE_00
);
76 lcm_util
.set_gpio_dir(num
, GPIO_DIR_OUT
);
79 lcm_util
.set_gpio_out(num
, GPIO_OUT_ONE
);
81 lcm_util
.set_gpio_out(num
, GPIO_OUT_ZERO
);
84 static void lcd_reset(unsigned char enabled
)
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
);
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
);
100 static void lcd_stbyb(unsigned char enabled
)
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
);
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
);
116 static void lcd_DVDD_power_en(unsigned char enabled
)
120 upmu_set_rg_vgp1_vosel(0x3); //1.8V
121 upmu_set_rg_vgp1_en(0x1);
125 upmu_set_rg_vgp1_en(0x0);
128 static void lcd_AVDD_power_en(unsigned char enabled
)
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
);
137 static void init_lcm_registers(void)
139 unsigned int data_array
[16];
141 //printf("[IND][K] y_____0%s\n", __func__);
143 //printk("[IND][K] y_____1%s\n", __func__);
146 data_array
[0] = 0x47801500;
147 dsi_set_cmdq(&data_array
, 1, 1);
149 data_array
[0] = 0x40811500;
150 dsi_set_cmdq(&data_array
, 1, 1);
152 data_array
[0] = 0x04821500;
153 dsi_set_cmdq(&data_array
, 1, 1);
155 data_array
[0] = 0x77831500;
156 dsi_set_cmdq(&data_array
, 1, 1);
158 data_array
[0] = 0x0F841500;
159 dsi_set_cmdq(&data_array
, 1, 1);
161 data_array
[0] = 0x70851500;
162 dsi_set_cmdq(&data_array
, 1, 1);
164 data_array
[0] = 0x70861500;
165 dsi_set_cmdq(&data_array
, 1, 1);
171 // ---------------------------------------------------------------------------
172 // LCM Driver Implementations
173 // ---------------------------------------------------------------------------
175 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
177 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
181 static void lcm_get_params(LCM_PARAMS
*params
)
183 memset(params
, 0, sizeof(LCM_PARAMS
));
185 params
->type
= LCM_TYPE_DSI
;
187 params
->width
= FRAME_WIDTH
;
188 params
->height
= FRAME_HEIGHT
;
190 #if (LCM_DSI_CMD_MODE)
191 params
->dsi
.mode
= CMD_MODE
;
193 params
->dsi
.mode
= BURST_VDO_MODE
; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;
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
;
203 // Video mode setting
204 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
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
;
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*/
224 static void lcm_init(void)
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);
231 lcd_AVDD_power_en(0);
234 lcd_DVDD_power_en(1);
246 lcd_AVDD_power_en(1);
248 init_lcm_registers();
250 //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com
254 static void lcm_suspend(void)
256 //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015,
257 //improve dsi config and power on/off sequence
261 lcd_AVDD_power_en(0);
264 lcd_DVDD_power_en(0);
268 //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com
272 static void lcm_resume(void)
277 static unsigned int lcm_compare_id(void)
282 static unsigned int lcm_esd_check(void)
291 lcm_esd_test
= FALSE
;
295 array
[0] = 0x5A871500;
296 dsi_set_cmdq(array
, 1, 1);
298 array
[0] = 0x125B1500;
299 dsi_set_cmdq(array
, 1, 1);
301 array
[0] = 0x55871500;
302 dsi_set_cmdq(array
, 1, 1);
304 array
[0] = 0x125B1500;
305 dsi_set_cmdq(array
, 1, 1);
307 //array[0] = 0x08B11500;
308 //dsi_set_cmdq(array, 1, 1);
312 array
[0] = 0x00013700;
313 dsi_set_cmdq(array
, 1, 1);
315 read_reg_v2(0x81, buffer
, 1);
316 //printk("\n ZERO] [0x81]=0x%02x\n", buffer[0]);
318 if(buffer
[0] != 0x40)
320 printk("[LCM ERROR] [0x81]=0x%02x\n", buffer
[0]);
325 printk("[LCM ESD OK] [0x81]=0x%02x\n", buffer
[0]);
326 array
[0] = 0x925B1500;
327 dsi_set_cmdq(array
, 1, 1);
329 array
[0] = 0x5A871500;
330 dsi_set_cmdq(array
, 1, 1);
332 array
[0] = 0x925B1500;
333 dsi_set_cmdq(array
, 1, 1);
335 array
[0] = 0x00871500;
336 dsi_set_cmdq(array
, 1, 1);
340 // return TRUE: need recovery
341 // return FALSE: No need recovery
346 static unsigned int lcm_esd_recover(void)
349 printk("\n [LCM ERROR] lcm_esd_recover \n");
351 lcd_DVDD_power_en(0);
357 LCM_DRIVER kr076_ek79007_wsvga_dsi_vdo_lcm_drv
=
359 .name
= "kr076_ek79007_wsvga_dsi_vdo",
360 .set_util_funcs
= lcm_set_util_funcs
,
361 .get_params
= lcm_get_params
,
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
,