2 #include <linux/string.h>
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>
14 #include <mach/mt_gpio.h>
15 #include <mach/mt_pm_ldo.h>
20 // ---------------------------------------------------------------------------
22 // ---------------------------------------------------------------------------
23 #define FRAME_WIDTH (1920)
24 #define FRAME_HEIGHT (1200)
26 // ---------------------------------------------------------------------------
28 // ---------------------------------------------------------------------------
29 static LCM_UTIL_FUNCS lcm_util
= {0};
31 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
33 #define UDELAY(n) (lcm_util.udelay(n))
34 #define MDELAY(n) (lcm_util.mdelay(n))
36 #ifdef GPIO_LCM_PWR_EN
37 #define GPIO_LCD_PWR_EN GPIO_LCM_PWR_EN
39 #define GPIO_LCD_PWR_EN 0xFFFFFFFF
42 //LDO power for LCM as back up solution
44 //#define GPIO_LCD_PWR_EN GPIO_LCM_PWR
46 //#define GPIO_LCD_PWR_EN 0xFFFFFFFF
49 // ---------------------------------------------------------------------------
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)
59 #define LCM_DSI_CMD_MODE 0
61 // ---------------------------------------------------------------------------
62 // LCM Driver Implementations
63 // ---------------------------------------------------------------------------
64 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
66 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
69 static void lcm_get_params(LCM_PARAMS
*params
)
71 memset(params
, 0, sizeof(LCM_PARAMS
));
73 params
->type
= LCM_TYPE_DSI
;
75 params
->width
= FRAME_WIDTH
;
76 params
->height
= FRAME_HEIGHT
;
78 #if (LCM_DSI_CMD_MODE)
79 params
->dsi
.mode
= CMD_MODE
;
81 params
->dsi
.mode
= SYNC_EVENT_VDO_MODE
; //SYNC_PULSE_VDO_MODE;
85 /* Command mode setting */
86 // Three lane or Four lane
87 params
->dsi
.LANE_NUM
= LCM_FOUR_LANE
;
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
;
95 // Highly depends on LCD driver capability.
96 // Not support in MT6573
97 params
->dsi
.packet_size
=256;
100 params
->dsi
.intermediat_buffer_num
= 0;
102 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
103 params
->dsi
.word_count
=FRAME_WIDTH
*3;
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
;
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;
116 // Bit rate calculation
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)
122 params
->dsi
.PLL_CLOCK
= 494;
125 static void lcm_set_gpio_output(unsigned int GPIO
, unsigned int output
)
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
);
132 static void lcm_init(void)
135 printf("[LK/LCM] lcm_init() enter\n");
138 printk("[Kernel/LCM] lcm_init() enter\n");
144 static void lcm_init_power(void)
147 printf("[LK/LCM] lcm_init_power() enter\n");
150 printk("[Kernel/LCM] lcm_init_power() enter\n");
156 static void lcm_suspend_power(void)
159 printf("[LK/LCM] lcm_suspend_power() enter\n");
162 printk("[Kernel/LCM] lcm_suspend_power() enter\n");
168 static void lcm_resume_power(void)
171 printf("[LK/LCM] lcm_resume_power() enter\n");
174 printk("[Kernel/LCM] lcm_resume_power() enter\n");
180 static void lcm_init(void)
183 printf("[LK/LCM] lcm_init() enter\n");
185 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ZERO
);
189 //upmu_set_rg_vgp1_vosel(0x7);
190 //upmu_set_rg_vgp1_en(0x1);
193 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ONE
);
197 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ZERO
);
201 //upmu_set_rg_vgp1_vosel(0x7);
202 //upmu_set_rg_vgp1_en(0x1);
205 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ONE
);
208 printk("[Kernel/LCM] lcm_init() enter\n");
210 //lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO);
213 //hwPowerOn(MT65XX_POWER_LDO_VGP6, VOL_3300, "LCM");
216 //lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE);
222 static void lcm_suspend(void)
225 printf("[LK/LCM] lcm_suspend() enter\n");
227 lcm_set_gpio_output(GPIO_LCD_PWR_EN
,GPIO_OUT_ZERO
);
231 //upmu_set_rg_vgp1_vosel(0x0);
232 //upmu_set_rg_vgp1_en(0x0);
236 printk("[Kernel/LCM] lcm_suspend() enter\n");
238 lcm_set_gpio_output(GPIO_LCD_PWR_EN
,GPIO_OUT_ZERO
);
241 //hwPowerDown(MT65XX_POWER_LDO_VGP1, "LCM");
247 static void lcm_resume(void)
250 printf("[LK/LCM] lcm_resume() enter\n");
252 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ZERO
);
256 //upmu_set_rg_vgp1_vosel(0x7);
257 //upmu_set_rg_vgp1_en(0x1);
260 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ONE
);
264 printk("[Kernel/LCM] lcm_resume() enter\n");
266 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ZERO
);
269 //hwPowerOn(MT65XX_POWER_LDO_VGP1, VOL_3300, "LCM");
272 lcm_set_gpio_output(GPIO_LCD_PWR_EN
, GPIO_OUT_ONE
);
278 #if (LCM_DSI_CMD_MODE)
279 static void lcm_update(unsigned int x
, unsigned int y
, unsigned int width
, unsigned int height
)
283 unsigned int x1
= x0
+ width
- 1;
284 unsigned int y1
= y0
+ height
- 1;
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);
295 unsigned int data_array
[16];
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);
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);
307 data_array
[0]= 0x00290508; //HW bug, so need send one HS packet
308 dsi_set_cmdq(data_array
, 1, 1);
310 data_array
[0]= 0x002c3909;
311 dsi_set_cmdq(data_array
, 1, 0);
316 LCM_DRIVER vvx10f008b00_wuxga_dsi_vdo_lcm_drv
=
318 .name
= "VVX10F008B00_WUXGA_DSI_VDO",
319 .set_util_funcs
= lcm_set_util_funcs
,
320 .get_params
= lcm_get_params
,
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
,