Explorar el Código

feat: import X5 project

Signed-off-by: svoboda18 <dev.svoboda18@gmail.com>
svoboda18 hace 2 años
padre
commit
dba98f8a0c

+ 8 - 0
dev/lcm/hct_hx8394d_dsi_vdo_hd_cmi/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y += hct_hx8394d_dsi_vdo_hd_cmi.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 504 - 0
dev/lcm/hct_hx8394d_dsi_vdo_hd_cmi/hct_hx8394d_dsi_vdo_hd_cmi.c

@@ -0,0 +1,504 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2008
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+#ifdef BUILD_LK
+#else
+    #include <linux/string.h>
+    #if defined(BUILD_UBOOT)
+        #include <asm/arch/mt_gpio.h>
+    #else
+        #include <mt-plat/mt_gpio.h>
+    #endif
+#endif
+#include "lcm_drv.h"
+
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH  										(720)
+#define FRAME_HEIGHT 										(1280)
+
+#define LCM_ID                      								(0x0d)
+
+#define REGFLAG_DELAY             								(0XFE)
+#define REGFLAG_END_OF_TABLE      								(0x100)	// END OF REGISTERS MARKER
+
+#ifndef TRUE
+    #define TRUE 1
+#endif
+
+#ifndef FALSE
+    #define FALSE 0
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v)    									(lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n) 										(lcm_util.udelay(n))
+#define MDELAY(n) 										(lcm_util.mdelay(n))
+
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)	lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)		lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define wrtie_cmd(cmd)										lcm_util.dsi_write_cmd(cmd)
+#define write_regs(addr, pdata, byte_nums)					lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg                                            lcm_util.dsi_read_reg()
+#define read_reg_v2(cmd, buffer, buffer_size)				lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
+
+ struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+#if 0
+static struct LCM_setting_table lcm_initialization_setting[] = {
+	// Set EXTC 
+	{0xB9, 3, {0xFF,0x83,0x94}},
+	
+	// Set MIPI 
+	{0xBA, 2, {0x73,0x83}},
+
+	#if 1	//HX5186 Mode 
+	// Set Power   HX5186 Mode 
+	{0xB1, 15, {0x6C,0x12,0x12,0x34,0x04,0x11,0xF1,0x80,0xFA,0x54,0x23,0x80,0xC0,0xD2,0x58}},
+
+	#else	//External Power mode 
+	// Set Power   External Power mode 
+	{0xB1, 15, {0x6C,0x12,0x12,0x34,0x04,0x11,0xF1,0x80,0xFA,0x54,0x23,0x80,0xC0,0xD2,0x58}},
+	#endif
+	
+	// Set Display 
+	{0xB2, 11, {0x00,0x64,0x0E,0x0D,0x32,0x1C,0x08,0x08,0x1C,0x4D,0x00}},
+	
+	// Set CYC 
+	{0xB4, 12, {0x00,0xFF,0x51,0x5A,0x59,0x5A,0x03,0x5A,0x01,0x60,0x20,0x60}},
+	
+	// Set VDC 
+	{0xBC, 1, {0x07}},
+	
+	// Set Power Option   HX5186 Mode	
+	{0xBF, 3, {0x41,0x0E,0x01}},
+	
+	// Set Gamma 
+	{0xE0, 42, {0x00,0x0E,0x13,0x32,0x37,0x3F,0x20,0x40,0x07,0x0B,0x0D,0x17,0x0E,0x10,0x14,0x12,0x13,0x06,0x10,0x10,0x17,0x00,0x0D,0x14,0x33,0x38,0x3F,0x21,0x3F,0x06,0x0A,0x0C,0x17,0x0D,0x11,0x13,0x12,0x14,0x07,0x11,0x12,0x16}},
+	
+	// Set GIP 
+	{0xD3, 30, {0x00,0x07,0x00,0x40,0x07,0x10,0x00,0x08,0x10,0x08,0x00,0x08,0x54,0x15,0x0E,0x05,0x0E,0x02,0x15,0x06,0x05,0x06,0x47,0x44,0x0A,0x0A,0x4B,0x10,0x07,0x07}},
+	
+	// Set Forward GIP 
+	{0xD5, 44, {0x1A,0x1A,0x1B,0x1B,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x24,0x25,0x18,0x18,0x26,0x27,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x21,0x18,0x18,0x18,0x18}},
+	
+	// Set Backward GIP  
+	{0xD6, 44, {0x1A,0x1A,0x1B,0x1B,0x0B,0x0A,0x09,0x08,0x07,0x06,
+				0x05,0x04,0x03,0x02,0x01,0x00,0x21,0x20,0x58,0x58,
+				0x27,0x26,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+				0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x25,0x24,
+				0x18,0x18,0x18,0x18}},
+	
+	// Set Panel 
+	{0xCC, 1, {0x01}},
+	
+	// Set C0 
+	{0xC0, 2, {0x30,0x14}},
+	
+	// Set TCON Option 
+	{0xC7, 4, {0x00,0xC0,0x40,0xC0}},
+	
+	//-----------------------------------------------------
+    {0x11,  0,  {0}},
+    {REGFLAG_DELAY, 120, {0}},
+
+    {0x29,  0,  {0}},
+    {REGFLAG_DELAY, 20, {0}},
+};
+
+
+
+
+
+static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
+{
+	unsigned int i;
+
+    for(i = 0; i < count; i++) {
+		
+        unsigned cmd;
+        cmd = table[i].cmd;
+		
+        switch (cmd) {
+			
+            case REGFLAG_DELAY :
+                MDELAY(table[i].count);
+                break;
+				
+            case REGFLAG_END_OF_TABLE :
+                break;
+				
+            default:
+				dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+       	}
+    }
+	
+}
+
+#endif
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+    memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+	memset(params, 0, sizeof(LCM_PARAMS));
+	params->type   = LCM_TYPE_DSI;
+	params->width  = FRAME_WIDTH;
+	params->height = FRAME_HEIGHT;
+
+	// enable tearing-free
+	params->dbi.te_mode 			= LCM_DBI_TE_MODE_DISABLED;
+    //params->dbi.te_edge_polarity          = LCM_POLARITY_RISING;
+
+	params->dsi.mode   =SYNC_EVENT_VDO_MODE;
+
+	// DSI
+	/* Command mode setting */
+	params->dsi.LANE_NUM			= LCM_FOUR_LANE;
+	//The following defined the fomat for data coming from LCD engine. 
+	params->dsi.data_format.color_order 	= LCM_COLOR_ORDER_RGB;
+	params->dsi.data_format.trans_seq   	= LCM_DSI_TRANS_SEQ_MSB_FIRST; 
+	params->dsi.data_format.padding     	= LCM_DSI_PADDING_ON_LSB;
+	params->dsi.data_format.format      	= LCM_DSI_FORMAT_RGB888;
+	// Highly depends on LCD driver capability.
+	// Not support in MT6573
+	params->dsi.packet_size=256;
+	// Video mode setting		
+	params->dsi.intermediat_buffer_num 	= 2;
+	params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
+        //params->dsi.word_count=720 * 3;
+	params->dsi.vertical_sync_active				= 4;//5
+	params->dsi.vertical_backporch					= 12;
+	params->dsi.vertical_frontporch					= 15;
+	params->dsi.vertical_active_line				= FRAME_HEIGHT; 
+	params->dsi.horizontal_sync_active				= 40;//38//15
+	params->dsi.horizontal_backporch				= 40;//38//70
+	params->dsi.horizontal_frontporch				= 40;//38//65
+	//params->dsi.horizontal_blanking_pixel		       		= 60;
+	params->dsi.horizontal_active_pixel		       		= FRAME_WIDTH;
+	// Bit rate calculation
+
+#if FRAME_WIDTH == 480	
+	params->dsi.PLL_CLOCK=210;//254//247
+#elif FRAME_WIDTH == 540
+	params->dsi.PLL_CLOCK=230;
+#elif FRAME_WIDTH == 720
+	params->dsi.PLL_CLOCK=218;//256   276
+#elif FRAME_WIDTH == 1080
+	params->dsi.PLL_CLOCK=410;
+#else
+	params->dsi.PLL_CLOCK=230;
+#endif
+          
+          params->dsi.esd_check_enable = 1;
+          params->dsi.customization_esd_check_enable = 1;
+          params->dsi.cont_clock=0; //1;
+          params->dsi.lcm_esd_check_table[0].cmd          = 0xd9;
+	params->dsi.lcm_esd_check_table[0].count        = 1;
+	params->dsi.lcm_esd_check_table[0].para_list[0] = 0x80;
+          /*
+          params->dsi.lcm_esd_check_table[0].cmd = 0x9;//09 ,45,d9
+          params->dsi.lcm_esd_check_table[0].count = 3;
+          params->dsi.lcm_esd_check_table[0].para_list[0] = 0x80;
+          params->dsi.lcm_esd_check_table[0].para_list[1] = 0x73;
+          params->dsi.lcm_esd_check_table[0].para_list[2] = 0x6;//04/06
+
+          params->dsi.lcm_esd_check_table[1].cmd = 0xd9;
+          params->dsi.lcm_esd_check_table[1].count = 1;
+          params->dsi.lcm_esd_check_table[1].para_list[0] = 0x80;
+          //params->dsi.lcm_esd_check_table[1].para_list[1] = 0x00;
+          //params->dsi.lcm_esd_check_table[1].para_list[2] = 0x45;
+
+          params->dsi.lcm_esd_check_table[2].cmd = 0x45;
+          params->dsi.lcm_esd_check_table[2].count = 2;
+          params->dsi.lcm_esd_check_table[2].para_list[0] = 0x5;
+          params->dsi.lcm_esd_check_table[2].para_list[1] = 0x1d;
+          */
+}
+
+static void lcm_init_register(void)
+{
+    unsigned int data_array[16];
+    MDELAY(180);
+    data_array[0] = 0x00043902;
+    data_array[1] = 0x9483ffb9;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x00033902;
+    data_array[1] = 0x008373ba;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x00103902;
+    data_array[1] = 0x12126cb1;
+    data_array[2] = 0xf1110434;
+    data_array[3] = 0x2354fa80;
+    data_array[4] = 0x58d2c080;
+    dsi_set_cmdq(data_array, 5, 1);
+
+    data_array[0] = 0x000c3902;
+    data_array[1] = 0x0e6400b2;
+    data_array[2] = 0x081c320d;
+    data_array[3] = 0x004d1c08;
+    dsi_set_cmdq(data_array, 4, 1);
+
+    data_array[0] = 0x000d3902;
+    data_array[1] = 0x51ff00b4;
+    data_array[2] = 0x035a595a;
+    data_array[3] = 0x2070015a;
+    data_array[4] = 0x00000070;
+    dsi_set_cmdq(data_array, 5, 1);
+
+    data_array[0] = 0x00023902;
+    data_array[1] = 0x000007bc;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x00043902;
+    data_array[1] = 0x010e41bf;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x002b3902;
+    data_array[1] = 0x130e00e0;
+    data_array[2] = 0x203f3732;
+    data_array[3] = 0x0d0b0740;
+    data_array[4] = 0x14100e17;
+    data_array[5] = 0x10061312;
+    data_array[6] = 0x0d001710;
+    data_array[7] = 0x3f383314;
+    data_array[8] = 0x0a063f21;
+    data_array[9] = 0x110d170c;
+    data_array[10] = 0x07141213;
+    data_array[11] = 0x00161211;
+    dsi_set_cmdq(data_array, 12, 1);
+
+    data_array[0] = 0x001f3902;
+    data_array[1] = 0x000700d3;
+    data_array[2] = 0x00100740;
+    data_array[3] = 0x00081008;
+    data_array[4] = 0x0e155408;
+    data_array[5] = 0x15020e05;
+    data_array[6] = 0x47060506;
+    data_array[7] = 0x4b0a0a44;
+    data_array[8] = 0x00070710;
+    dsi_set_cmdq(data_array, 9, 1);
+
+    data_array[0] = 0x002d3902;
+    data_array[1] = 0x1b1a1ad5;
+    data_array[2] = 0x0201001b;
+    data_array[3] = 0x06050403;
+    data_array[4] = 0x0a090807;
+    data_array[5] = 0x1825240b;
+    data_array[6] = 0x18272618;
+    data_array[7] = 0x18181818;
+    data_array[8] = 0x18181818;
+    data_array[9] = 0x18181818;
+    data_array[10] = 0x20181818;
+    data_array[11] = 0x18181821;
+    data_array[12] = 0x00000018;
+    dsi_set_cmdq(data_array, 13, 1);
+
+    data_array[0] = 0x002d3902;
+    data_array[1] = 0x1b1a1ad6;
+    data_array[2] = 0x090a0b1b;
+    data_array[3] = 0x05060708;
+    data_array[4] = 0x01020304;
+    data_array[5] = 0x58202100;
+    data_array[6] = 0x18262758;
+    data_array[7] = 0x18181818;
+    data_array[8] = 0x18181818;
+    data_array[9] = 0x18181818;
+    data_array[10] = 0x25181818;
+    data_array[11] = 0x18181824;
+    data_array[12] = 0x00000018;
+    dsi_set_cmdq(data_array, 13, 1);
+
+    data_array[0] = 0x00023902;
+    data_array[1] = 0x0000bdc6;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x00023902;
+    data_array[1] = 0x000002bd;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x000d3902;
+    data_array[1] = 0xeeffffd8;
+    data_array[2] = 0xffa0fbeb;
+    data_array[3] = 0xfbebeeff;
+    data_array[4] = 0x000000a0;
+    dsi_set_cmdq(data_array, 5, 1);
+
+    data_array[0] = 0x00023902;
+    data_array[1] = 0x000009cc;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x00033902;
+    data_array[1] = 0x001430c0;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    data_array[0] = 0x00053902;
+    data_array[1] = 0x40c000c7;
+    data_array[2] = 0x000000c0;
+    dsi_set_cmdq(data_array, 3, 1);
+
+    data_array[0] = 0x00033902;
+    data_array[1] = 0x006767b6;
+    dsi_set_cmdq(data_array, 2, 1);
+
+    MDELAY(15);
+    data_array[0] = 0x00110500;
+    dsi_set_cmdq(data_array, 1, 1);
+    MDELAY(120);
+    data_array[0] = 0x00290500;
+    dsi_set_cmdq(data_array, 1, 1);
+    MDELAY(20);
+}
+
+static void lcm_init(void)
+{
+    SET_RESET_PIN(1);
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(10);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+
+	lcm_init_register();
+    //push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+}
+
+static void lcm_suspend(void)
+{
+    unsigned int data_array[16];
+    data_array[0]=0x00280500;
+    dsi_set_cmdq(data_array, 1, 1);
+    MDELAY(10);
+    data_array[0]=0x00100500;
+    dsi_set_cmdq(data_array, 1, 1);
+    SET_RESET_PIN(1);
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(50);
+}
+
+static unsigned int lcm_compare_id(void);
+
+static void lcm_resume(void)
+{
+	lcm_init();
+}
+
+
+
+	
+static unsigned int lcm_compare_id(void)
+{
+	unsigned int id=0;
+	unsigned char buffer[2];
+	unsigned int array[16];  
+
+	SET_RESET_PIN(1);
+	MDELAY(1);
+	SET_RESET_PIN(0);
+	MDELAY(1);
+	SET_RESET_PIN(1);
+	MDELAY(120);//Must over 6 ms
+
+	array[0]=0x00043902;
+	array[1]=0x9483FFB9;// page enable
+	dsi_set_cmdq(array, 2, 1);
+	MDELAY(10);
+
+	array[0]=0x00033902; 
+	array[1]=0x008372BA;// page enable //9341
+	//array[2]=0x1800A416; 
+	dsi_set_cmdq(array, 2, 1); 
+	MDELAY(10); 
+
+	array[0] = 0x00023700;// return byte number
+	dsi_set_cmdq(array, 1, 1);
+	MDELAY(10);
+
+	read_reg_v2(0xdc, buffer, 2);
+	id = buffer[0]; 
+
+#ifdef BUILD_LK
+	printf("[HX8394D]%s,  id = 0x%x\n", __func__, id);
+#else
+	printk("[HX8394D]%s,  id = 0x%x\n", __func__, id);
+#endif
+
+
+    return (LCM_ID == id)?1:0;
+}
+
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+LCM_DRIVER hct_hx8394d_dsi_vdo_hd_cmi = 
+{
+	.name			  = "hct_hx8394d_dsi_vdo_hd_cmi",
+	.set_util_funcs = lcm_set_util_funcs,
+	.get_params     = lcm_get_params,
+	.init           = lcm_init,
+	.suspend        = lcm_suspend,
+	.resume         = lcm_resume,	
+	.compare_id     = lcm_compare_id,	
+//	.esd_check   = lcm_esd_check,	
+//	.esd_recover   = lcm_esd_recover,	
+//	.update         = lcm_update,
+};
+

+ 8 - 0
dev/lcm/hct_hx8394f_dsi_vdo_hd_cmi/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y += hct_hx8394f_dsi_vdo_hd_cmi.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 228 - 0
dev/lcm/hct_hx8394f_dsi_vdo_hd_cmi/hct_hx8394f_dsi_vdo_hd_cmi.c

@@ -0,0 +1,228 @@
+/*****************************************************************************
+
+*****************************************************************************/
+#include "lcm_drv.h"
+
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH 720
+#define FRAME_HEIGHT 1280
+
+#define LCM_ID 0x0F
+
+#define REGFLAG_DELAY 0XFE
+#define REGFLAG_END_OF_TABLE 0x100 // END OF REGISTERS MARKER
+
+#ifndef TRUE
+    #define TRUE 1
+#endif
+
+#ifndef FALSE
+    #define FALSE 0
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n) (lcm_util.udelay(n))
+#define MDELAY(n) (lcm_util.mdelay(n))
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+#define dsi_set_cmdq_V3(para_tbl,size,force_update)         lcm_util.dsi_set_cmdq_V3(para_tbl,size,force_update)
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)    lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)       lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define wrtie_cmd(cmd)                                      lcm_util.dsi_write_cmd(cmd)
+#define write_regs(addr, pdata, byte_nums)                  lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg(cmd)                                       lcm_util.dsi_dcs_read_lcm_reg(cmd)
+#define read_reg_v2(cmd, buffer, buffer_size)               lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
+
+struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+static struct LCM_setting_table lcm_initialization_setting[] = {
+    {0xB9, 3, {0xFF, 0x83, 0x94}},
+    {0xBA, 6, {0x62, 0x03, 0x68, 0x6B, 0xB2, 0xC0}},
+    {0xB1, 10, {0x50, 0x12, 0x72, 0x09, 0x33, 0x54, 0xB1, 0x31, 0x6B, 0x2F}},
+    {0xB2, 6, {0x00, 0x80, 0x64, 0x0E, 0x0D, 0x2F}},
+    {0xB4, 21, {0x73, 0x74, 0x73, 0x74, 0x73, 0x74, 0x01, 0x0C, 0x86, 0x75, 0x00, 0x3F, 0x73, 0x74, 0x73, 0x74, 0x73, 0x74, 0x01, 0x0C, 0x86}},
+    {0xB6, 2, {0x6B, 0x6B}},
+    {0xD3, 33, {0x00, 0x00, 0x07, 0x07, 0x40, 0x07, 0x10, 0x00, 0x08, 0x10, 0x08, 0x00, 0x08, 0x54, 0x15, 0x0E, 0x05, 0x0E, 0x02, 0x15, 0x06, 0x05, 0x06, 0x47, 0x44, 0x0A, 0x0A, 0x4B, 0x10, 0x07, 0x07, 0x0E, 0x40}},
+    {0xD5, 44, {0x1A, 0x1A, 0x1B, 0x1B, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x24, 0x25, 0x18, 0x18, 0x26, 0x27, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x20, 0x21, 0x18, 0x18, 0x18, 0x18}},
+    {0xD6, 44, {0x1A, 0x1A, 0x1B, 0x1B, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x21, 0x20, 0x18, 0x18, 0x27, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x25, 0x24, 0x18, 0x18, 0x18, 0x18}},
+    {0xE0, 58, {0x00, 0x0D, 0x1B, 0x22, 0x26, 0x2A, 0x2F, 0x2D, 0x5D, 0x6D, 0x7E, 0x7C, 0x87, 0x96, 0x99, 0x9D, 0xA7, 0xAE, 0xA5, 0xB5, 0xBA, 0x57, 0x55, 0x58, 0x5C, 0x5E, 0x64, 0x6B, 0x7F, 0x00, 0x0D, 0x1B, 0x22, 0x26, 0x2A, 0x2F, 0x2D, 0x5D, 0x6D, 0x7E, 0x7C, 0x87, 0x96, 0x99, 0x9D, 0xA7, 0xAE, 0xA5, 0xB5, 0xBA, 0x57, 0x55, 0x58, 0x5C, 0x5E, 0x64, 0x6B, 0x7F}},
+    {0xC0, 2, {0x1F, 0x73}},
+    {0xCC, 1, {0x0B}},
+    {0xD4, 1, {0x02}},
+    {0xBD, 1, {0x01}},
+    {0xB1, 1, {0x60}},
+    {0xBD, 1, {0x00}},
+    {0xBD, 1, {0x02}},
+    {0xD8, 12, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
+    {0xBD, 1, {0x00}},
+    {0xBF, 7, {0x40, 0x81, 0x50, 0x00, 0x1A, 0xFC, 0x01}},
+    {0x11, 1, {0x00}},
+    {REGFLAG_DELAY, 120, {}},
+    {0x29, 1, {0x00}},
+    {REGFLAG_DELAY, 10, {}},
+    {REGFLAG_END_OF_TABLE, 0, {}}
+};
+
+static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = {
+    // Display off sequence
+    {0x28, 1, {0x00}},
+    {REGFLAG_DELAY, 10, {}},
+
+    // Sleep Mode On
+    {0x10, 1, {0x00}},
+    {REGFLAG_DELAY, 150, {}},
+
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
+{
+    unsigned int i;
+
+    for(i = 0; i < count; i++) {
+        unsigned cmd;
+        cmd = table[i].cmd;
+
+        switch (cmd) {
+            case REGFLAG_DELAY :
+                MDELAY(table[i].count);
+                break;
+            case REGFLAG_END_OF_TABLE :
+                break;
+            default:
+                dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+           }
+    }
+
+}
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+    memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+    memset(params, 0, sizeof(LCM_PARAMS));
+    params->type   = LCM_TYPE_DSI;
+    params->width  = FRAME_WIDTH;
+    params->height = FRAME_HEIGHT;
+
+    params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED;
+    params->dsi.mode = SYNC_EVENT_VDO_MODE;
+
+    params->dsi.LANE_NUM = LCM_THREE_LANE;
+    params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
+    params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
+    params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
+    params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
+    params->dsi.packet_size = 256;
+    params->dsi.intermediat_buffer_num = 2;
+    params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888;
+    params->dsi.vertical_sync_active = 4;
+    params->dsi.vertical_backporch = 12;
+    params->dsi.vertical_frontporch = 15;
+    params->dsi.vertical_active_line = FRAME_HEIGHT;
+    params->dsi.horizontal_sync_active = 10;
+    params->dsi.horizontal_backporch = 20;
+    params->dsi.horizontal_frontporch = 40;
+    params->dsi.horizontal_active_pixel = FRAME_WIDTH;
+    params->dsi.cont_clock = 0;
+    params->dsi.PLL_CLOCK = 230;
+}
+
+static void lcm_init(void)
+{
+    SET_RESET_PIN(1);
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(20);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+
+    push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+}
+
+static void lcm_suspend(void)
+{
+    SET_RESET_PIN(1);
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(30);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+
+    push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);
+}
+
+static void lcm_resume(void)
+{
+    lcm_init();
+}
+
+static unsigned int lcm_compare_id(void)
+{
+    unsigned char buffer[2];
+    unsigned int array[3];
+
+    SET_RESET_PIN(1);
+    MDELAY(1);
+    SET_RESET_PIN(0);
+    MDELAY(1);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+
+    array[0] = 0x43902;
+    array[1] = 0x9483FFB9;
+    dsi_set_cmdq(array, 2, 1);
+    MDELAY(10);
+
+    array[0] = 0x73902;
+    array[1] = 0x680362BA;
+    array[2] = 0xC0B26B;
+    dsi_set_cmdq(array, 3, 1);
+    MDELAY(10);
+    array[0] = 0x23700;
+    dsi_set_cmdq(array, 1, 1);
+    MDELAY(10);
+
+    read_reg_v2(0xdc, buffer, 2);
+
+    return LCM_ID == buffer[0] ? 1 : 0;
+}
+
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+
+LCM_DRIVER hct_hx8394f_dsi_vdo_hd_cmi =
+{
+    .name           = "hct_hx8394f_dsi_vdo_hd_cmi",
+    .set_util_funcs = lcm_set_util_funcs,
+    .get_params     = lcm_get_params,
+    .init           = lcm_init,
+    .suspend        = lcm_suspend,
+    .resume         = lcm_resume,
+    .compare_id     = lcm_compare_id,
+};
+

+ 8 - 0
dev/lcm/hct_ili9881_dsi_vdo_hd_cpt/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y +=hct_ili9881_dsi_vdo_hd_cpt.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 399 - 0
dev/lcm/hct_ili9881_dsi_vdo_hd_cpt/hct_ili9881_dsi_vdo_hd_cpt.c

@@ -0,0 +1,399 @@
+
+/*----------------------------------------------------------------
+* Author : Rubén Espínola (ruben1863@github.com)
+* Contact : rubenes2003@gmail.com
+* Supported device: DOOGEE X5
+* Reversed for SaMad SegMane
+* Copyright 2019 © Rubén Espínola
+ *---------------------------------------------------------------*/
+
+#ifndef BUILD_LK
+#include <linux/string.h>
+#endif
+
+#include "lcm_drv.h"
+
+#if defined(BUILD_LK)
+#else
+
+#include <linux/proc_fs.h>
+#endif
+
+
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH                                         (720)
+#define FRAME_HEIGHT                                        (1280)
+
+#define LCM_ID                       (0x1283)
+
+#define REGFLAG_DELAY               (0XFE)
+#define REGFLAG_END_OF_TABLE        (0x00)
+
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
+#define UDELAY(n) (lcm_util.udelay(n))
+#define MDELAY(n) (lcm_util.mdelay(n))
+
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+#define dsi_set_cmdq_V3(para_tbl,size,force_update)         lcm_util.dsi_set_cmdq_V3(para_tbl,size,force_update)
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)	lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)		lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define read_reg_v2(cmd, buffer, buffer_size)	            lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
+#define write_regs(addr, pdata, byte_nums)	                lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg(cmd)   lcm_util.dsi_dcs_read_lcm_reg(cmd)
+#define wrtie_cmd(cmd)	lcm_util.dsi_write_cmd(cmd)
+
+struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+static struct LCM_setting_table lcm_initialization_setting[] = {
+	{0xFF, 3, {0x98,0x81,0x07}},
+	{0x03, 1, {0x20}},
+	{0x04, 1, {0x06}},
+	{0x05, 1, {0x00}},
+	{0x06, 1, {0x01}},
+	{0x07, 1, {0x00}},
+	{0x08, 1, {0x00}},
+	{0x09, 1, {0x00}},
+	{0x0A, 1, {0x00}},
+	{0x0B, 1, {0x2F}},
+	{0x0C, 1, {0x00}},
+	{0x0D, 1, {0x00}},
+	{0x0E, 1, {0x00}},
+	{0x0F, 1, {0x00}},
+	{0x10, 1, {0x40}},
+	{0x11, 1, {0x02}},
+	{0x12, 1, {0x05}},
+	{0x13, 1, {0x90}},
+	{0x14, 1, {0x02}},
+	{0x15, 1, {0x00}},
+	{0x16, 1, {0x2F}},
+	{0x17, 1, {0x2F}},
+	{0x18, 1, {0x00}},
+	{0x19, 1, {0x00}},
+	{0x1A, 1, {0x00}},
+	{0x1B, 1, {0x50}},
+	{0x1C, 1, {0x2C}},
+	{0x1D, 1, {0x0C}},
+	{0x1E, 1, {0x00}},
+	{0x1F, 1, {0x87}},
+	{0x20, 1, {0x86}},
+	{0x21, 1, {0x00}},
+	{0x22, 1, {0x00}},
+	{0x23, 1, {0xC0}},
+	{0x24, 1, {0x30}},
+	{0x25, 1, {0x00}},
+	{0x26, 1, {0x00}},
+	{0x27, 1, {0x03}},
+	{0x30, 1, {0x01}},
+	{0x31, 1, {0x23}},
+	{0x32, 1, {0x45}},
+	{0x33, 1, {0x67}},
+	{0x34, 1, {0x89}},
+	{0x35, 1, {0xAB}},
+	{0x36, 1, {0x01}},
+	{0x37, 1, {0x23}},
+	{0x38, 1, {0x45}},
+	{0x39, 1, {0x67}},
+	{0x3A, 1, {0x89}},
+	{0x3B, 1, {0xAB}},
+	{0x3C, 1, {0xCD}},
+	{0x3D, 1, {0xEF}},
+	{0x50, 1, {0x11}},
+	{0x51, 1, {0x06}},
+	{0x52, 1, {0x0C}},
+	{0x53, 1, {0x0D}},
+	{0x54, 1, {0x0E}},
+	{0x55, 1, {0x0F}},
+	{0x56, 1, {0x02}},
+	{0x57, 1, {0x02}},
+	{0x58, 1, {0x02}},
+	{0x59, 1, {0x02}},
+	{0x5A, 1, {0x02}},
+	{0x5B, 1, {0x02}},
+	{0x5C, 1, {0x02}},
+	{0x5D, 1, {0x02}},
+	{0x5E, 1, {0x02}},
+	{0x5F, 1, {0x02}},
+	{0x60, 1, {0x05}},
+	{0x61, 1, {0x05}},
+	{0x62, 1, {0x05}},
+	{0x63, 1, {0x02}},
+	{0x64, 1, {0x01}},
+	{0x65, 1, {0x00}},
+	{0x66, 1, {0x08}},
+	{0x67, 1, {0x08}},
+	{0x68, 1, {0x0C}},
+	{0x69, 1, {0x0D}},
+	{0x6A, 1, {0x0E}},
+	{0x6B, 1, {0x0F}},
+	{0x6C, 1, {0x02}},
+	{0x6D, 1, {0x02}},
+	{0x6E, 1, {0x02}},
+	{0x6F, 1, {0x02}},
+	{0x70, 1, {0x02}},
+	{0x71, 1, {0x02}},
+	{0x72, 1, {0x02}},
+	{0x73, 1, {0x02}},
+	{0x74, 1, {0x02}},
+	{0x75, 1, {0x02}},
+	{0x76, 1, {0x05}},
+	{0x77, 1, {0x05}},
+	{0x78, 1, {0x05}},
+	{0x79, 1, {0x02}},
+	{0x7A, 1, {0x01}},
+	{0x7B, 1, {0x00}},
+	{0x7C, 1, {0x06}},
+	{0xFF, 3, {0x98,0x81,0x08}},
+	{0x76, 1, {0xC4}},
+	{0x78, 1, {0x02}},
+	{0x74, 1, {0x2F}},
+	{0x8E, 1, {0x15}},
+	{0x40, 1, {0x01}},
+	{0x84, 1, {0x81}},
+	{0xE3, 1, {0x75}},
+	{0x7D, 1, {0xCB}},
+	{0x7E, 1, {0x49}},
+	{0x49, 1, {0x10}},
+	{0x72, 1, {0x25}},
+	{0x32, 1, {0x05}},
+	{0x3C, 1, {0x05}},
+	{0xA3, 1, {0x40}},
+	{0xFF, 3, {0x98,0x81,0x01}},
+	{0x22, 1, {0x0A}},
+	{0x43, 1, {0x01}},
+	{0x31, 1, {0x00}},
+	{0x53, 1, {0x80}},
+	{0x55, 1, {0x15}},
+	{0x50, 1, {0x96}},
+	{0x51, 1, {0x96}},
+	{0xA0, 1, {0x06}},
+	{0xA1, 1, {0x18}},
+	{0xA2, 1, {0x24}},
+	{0xA3, 1, {0x0D}},
+	{0xA4, 1, {0x13}},
+	{0xA5, 1, {0x23}},
+	{0xA6, 1, {0x16}},
+	{0xA7, 1, {0x1A}},
+	{0xA8, 1, {0x80}},
+	{0xA9, 1, {0x1B}},
+	{0xAA, 1, {0x26}},
+	{0xAB, 1, {0x87}},
+	{0xAC, 1, {0x15}},
+	{0xAD, 1, {0x12}},
+	{0xAE, 1, {0x4C}},
+	{0xAF, 1, {0x28}},
+	{0xB0, 1, {0x30}},
+	{0xB1, 1, {0x67}},
+	{0xB2, 1, {0x71}},
+	{0xB3, 1, {0x33}},
+	{0xC0, 1, {0x0A}},
+	{0xC1, 1, {0x15}},
+	{0xC2, 1, {0x20}},
+	{0xC3, 1, {0x13}},
+	{0xC4, 1, {0x13}},
+	{0xC5, 1, {0x24}},
+	{0xC6, 1, {0x1C}},
+	{0xC7, 1, {0x1B}},
+	{0xC8, 1, {0x82}},
+	{0xC9, 1, {0x1C}},
+	{0xCA, 1, {0x2A}},
+	{0xCB, 1, {0x84}},
+	{0xCC, 1, {0x24}},
+	{0xCD, 1, {0x28}},
+	{0xCE, 1, {0x59}},
+	{0xCF, 1, {0x24}},
+	{0xD0, 1, {0x25}},
+	{0xD1, 1, {0x60}},
+	{0xD2, 1, {0x73}},
+	{0xD3, 1, {0x3F}},
+	{0xFF, 3, {0x98,0x81,0x00}},
+	{0x36, 1, {0x00}},
+	{0x11, 1, {0x00}},
+    {REGFLAG_DELAY,120,{}}, 
+	{0x29, 1, {0x00}},
+    {REGFLAG_DELAY,20,{}}, 
+	{REGFLAG_END_OF_TABLE, 0x00, {}}  //Stop cmd is 0x00	
+};	
+
+static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = 
+{
+    {0x28, 1, {0x00}},
+    {REGFLAG_DELAY, 20, {}},
+    {0x10, 1, {0x00}},
+    {REGFLAG_DELAY, 120, {}},
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static struct LCM_setting_table lcm_sleep_out_setting[] = 
+{
+    {0x11, 1, {0x00}},
+    {REGFLAG_DELAY, 120, {}},
+    {0x29, 1, {0x00}},
+    {REGFLAG_DELAY, 20, {}},
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
+{
+    unsigned int i;
+
+    for(i = 0; i < count; i++) {
+        
+        unsigned cmd;
+        cmd = table[i].cmd;
+        
+        switch (cmd) {
+            case REGFLAG_DELAY :
+                MDELAY(table[i].count);
+                break;
+                
+            case REGFLAG_END_OF_TABLE :
+                break;
+                
+            default:
+                dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+        }
+    }
+    
+}
+
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+    memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+	memset(params, 0, sizeof(LCM_PARAMS));
+	params->dsi.LANE_NUM = 3;
+	params->dsi.packet_size = 256;
+	params->dsi.vertical_backporch = 18;
+	params->dsi.vertical_frontporch = 8;
+	params->dsi.horizontal_backporch = 92;
+	params->dsi.horizontal_frontporch = 76;
+	params->dsi.PLL_CLOCK = 284;
+	params->dsi.ssc_disable = 1;
+	params->width = 720;
+	params->type = 2;
+	params->dsi.mode = 2;
+	params->dsi.data_format.format = 2;
+	params->dsi.intermediat_buffer_num = 2;
+	params->dsi.PS = 2;
+	params->dsi.vertical_sync_active = 2;
+	params->dsi.horizontal_active_pixel = 720;
+	params->height = 1280;
+	params->dsi.vertical_active_line = 1280;
+	params->dbi.te_mode = 0;
+	params->dbi.te_edge_polarity = 0;
+	params->dsi.data_format.color_order = 0;
+	params->dsi.data_format.trans_seq = 0;
+	params->dsi.data_format.padding = 0;
+	params->dsi.horizontal_sync_active = 60;
+	params->dsi.horizontal_blanking_pixel = 60;
+}
+
+static void lcm_init(void)
+{
+	SET_RESET_PIN(1);
+	MDELAY(10);
+	SET_RESET_PIN(0);
+	MDELAY(20);
+	SET_RESET_PIN(1);
+	MDELAY(120);
+
+    push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+}
+
+
+static void lcm_suspend(void)
+{
+#ifndef BUILD_LK
+	push_table(lcm_sleep_in_setting, sizeof(lcm_sleep_in_setting) / sizeof(struct LCM_setting_table), 1);
+#endif
+}
+
+static void lcm_resume(void)
+{
+#ifndef BUILD_LK
+	push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1);
+    lcm_init();
+#endif
+}
+
+static unsigned int lcm_compare_id(void)
+{
+        int array[4];
+        char buffer[5];
+        char id_high=0;
+        char id_midd=0;
+        char id_low=0;
+        int id=0;
+
+        SET_RESET_PIN(1);
+        SET_RESET_PIN(0);
+        MDELAY(25);       
+        SET_RESET_PIN(1);
+        MDELAY(50);      
+       
+        array[0]=0x00043902;
+        array[1]=0x018198FF;
+        dsi_set_cmdq(array, 3, 1);
+        MDELAY(10);
+        array[0]=0x00023700;
+        dsi_set_cmdq(array, 1, 1);
+
+    
+        read_reg_v2(0x00, buffer,1);
+        id_high = buffer[0];
+        read_reg_v2(0x01, buffer,1);
+        id_midd = buffer[1];
+        read_reg_v2(0x02, buffer,1);
+        id_low = buffer[2];
+
+	if((0x98 == id_high)&&(0x81 == id_midd))
+	{
+		return 1;
+	}
+	else
+	{
+		return 0;
+	}
+}
+
+
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+LCM_DRIVER hct_ili9881_dsi_vdo_hd_cpt = 
+{
+    .name           = "hct_ili9881_dsi_vdo_hd_cpt",
+    .set_util_funcs = lcm_set_util_funcs,
+    .get_params     = lcm_get_params,
+    .init           = lcm_init,
+    .suspend        = lcm_suspend,
+    .resume         = lcm_resume,   
+    .compare_id     = lcm_compare_id,    
+};

+ 8 - 0
dev/lcm/hct_nt35521s_dsi_vdo_hd_boe_50_xld/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y += hct_nt35521s_dsi_vdo_hd_boe_50_xld.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 562 - 0
dev/lcm/hct_nt35521s_dsi_vdo_hd_boe_50_xld/hct_nt35521s_dsi_vdo_hd_boe_50_xld.c

@@ -0,0 +1,562 @@
+
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2008
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+#ifdef BUILD_LK
+#else
+#include <linux/string.h>
+#endif
+
+#include "lcm_drv.h"
+//yufeng
+#ifdef BUILD_LK
+    #include <platform/mt_gpio.h>
+#elif defined(BUILD_UBOOT)
+    #include <asm/arch/mt_gpio.h>
+#else
+        #include <mt-plat/mt_gpio.h>
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH                                          (720)
+#define FRAME_HEIGHT                                         (1280)
+
+#define REGFLAG_DELAY                                         0XFC
+#define REGFLAG_END_OF_TABLE                                  0xFA   // END OF REGISTERS MARKER
+
+#define LCM_ID_NT35521  0x5521
+#define LCM_DSI_CMD_MODE                                    0
+
+#define FALSE 0
+#define TRUE 1
+//HQ_fujin 131104
+static unsigned int lcm_esd_test = FALSE;      ///only for ESD test
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v)    (lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n) (lcm_util.udelay(n))
+#define MDELAY(n) (lcm_util.mdelay(n))
+
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)    lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)        lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define wrtie_cmd(cmd)                                    lcm_util.dsi_write_cmd(cmd)
+#define write_regs(addr, pdata, byte_nums)                lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg                                            lcm_util.dsi_read_reg()
+#define read_reg_v2(cmd, buffer, buffer_size)                   lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) 
+
+struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+    memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+
+		memset(params, 0, sizeof(LCM_PARAMS));
+
+		params->type   = LCM_TYPE_DSI;
+
+		params->width  = FRAME_WIDTH;
+		params->height = FRAME_HEIGHT;
+
+		// enable tearing-free
+		params->dbi.te_mode= LCM_DBI_TE_MODE_DISABLED;
+		params->dsi.mode   = SYNC_EVENT_VDO_MODE;
+
+		// DSI
+		/* Command mode setting */
+		//1 Three lane or Four lane
+		params->dsi.LANE_NUM		    = LCM_THREE_LANE;
+		//The following defined the fomat for data coming from LCD engine.
+		params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
+		params->dsi.data_format.trans_seq   = LCM_DSI_TRANS_SEQ_MSB_FIRST;
+		params->dsi.data_format.padding     = LCM_DSI_PADDING_ON_LSB;
+		params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;
+
+		// Highly depends on LCD driver capability.
+		// Not support in MT6573
+		params->dsi.packet_size=256;
+
+		// Video mode setting
+		params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
+
+		params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
+		params->dsi.word_count=720*3;
+
+
+		params->dsi.vertical_sync_active				= 6;// 3    2
+		params->dsi.vertical_backporch					= 16;// 20   1
+		params->dsi.vertical_frontporch					= 16; // 1  12
+		params->dsi.vertical_active_line				= FRAME_HEIGHT;
+
+		params->dsi.horizontal_sync_active				= 10;// 50  2
+		params->dsi.horizontal_backporch				= 30;
+		params->dsi.horizontal_frontporch				= 30 ;
+		params->dsi.horizontal_active_pixel				= FRAME_WIDTH;
+
+	    //params->dsi.LPX=8;
+
+		// Bit rate calculation
+		//1 Every lane speed
+        	//params->dsi.pll_select=1;
+	    params->dsi.PLL_CLOCK = 260; //this value must be in MTK suggested table
+
+params->dsi.esd_check_enable = 1;
+params->dsi.customization_esd_check_enable = 1;
+params->dsi.lcm_esd_check_table[0].count = 1;
+params->dsi.lcm_esd_check_table[0].cmd = 10;
+params->dsi.lcm_esd_check_table[0].para_list[0] = 156;
+
+params->dsi.noncont_clock_period = 2;
+params->dsi.clk_lp_per_line_enable = 1;
+}
+
+static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
+{
+    unsigned int i;
+
+    for(i = 0; i < count; i++) {
+       
+        unsigned cmd;
+        cmd = table[i].cmd;
+       
+        switch (cmd) {
+
+            case REGFLAG_DELAY :
+                MDELAY(table[i].count);
+                break;
+
+            case REGFLAG_END_OF_TABLE :
+                break;
+
+            default:
+                dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+        }
+    }
+
+}
+
+static struct LCM_setting_table lcm_initialization_setting[] = {
+{0XFF, 4, {0XAA, 0X55, 0X25, 0X01}},
+{0X6F, 1, {0X03}},
+{0XF4, 1, {0X60}},
+{0X6F, 1, {0X06}},
+{0XF4, 1, {0X01}},
+{0X6F, 1, {0X21}},
+{0XF7, 1, {0X01}},
+{REGFLAG_DELAY, 1, {}},
+{0X6F, 1, {0X21}},
+{0XF7, 1, {0X00}},
+{REGFLAG_DELAY, 1, {}},
+{REGFLAG_DELAY, 1, {}},
+{REGFLAG_DELAY, 1, {}},
+{0X6F, 1, {0X16}},
+{0XF7, 1, {0X10}},
+{REGFLAG_DELAY, 1, {}},
+{0XFF, 4, {0XAA, 0X55, 0X25, 0X00}},
+{0XFF, 4, {0XAA, 0X55, 0XA5, 0X80}},
+{0X6F, 2, {0X11, 0X00}},
+{0XF7, 2, {0X20, 0X00}},
+{0X6F, 1, {0X06}},
+{0XF7, 1, {0XA0}},
+{0X6F, 1, {0X19}},
+{0XF7, 1, {0X12}},
+{0X6F, 1, {0X02}},
+{0XF7, 1, {0X47}},
+{0X6F, 1, {0X17}},
+{0XF4, 1, {0X70}},
+{0X6F, 1, {0X01}},
+{0XF9, 1, {0X46}},
+{0XF0, 5, {0X55, 0XAA, 0X52, 0X08, 0X00}},
+{0XBD, 5, {0X01, 0XA0, 0X10, 0X10, 0X01}},
+{0XB8, 4, {0X00, 0X00, 0X00, 0X00}},
+{0XBB, 2, {0X24, 0X24}},
+{0XBC, 2, {0X00, 0X00}},
+{0XB6, 1, {0X04}},
+{0XC8, 1, {0X80}},
+{0XD9, 2, {0X01, 0X01}},
+{0XD4, 1, {0XC7}},
+{0XB1, 2, {0X60, 0X21}},
+{0XF0, 5, {0X55, 0XAA, 0X52, 0X08, 0X01}},
+{0XB0, 2, {0X09, 0X09}},
+{0XB1, 2, {0X09, 0X09}},
+{0XBC, 2, {0X90, 0X00}},
+{0XBD, 2, {0X90, 0X00}},
+{0XBE, 1, {0X5F}},
+{0XCA, 1, {0X00}},
+{0XC0, 1, {0X0C}},
+{0XB5, 2, {0X03, 0X03}},
+{0XB3, 2, {0X1E, 0X1E}},
+{0XB4, 2, {0X21, 0X21}},
+{0XB9, 2, {0X26, 0X26}},
+{0XBA, 2, {0X14, 0X14}},
+{0XF0, 5, {0X55, 0XAA, 0X52, 0X08, 0X02}},
+{0XB0, 16, {0X00, 0X0E, 0X00, 0X69, 0X00, 0X96, 0X00, 0XB5, 0X00, 0XD0, 0X00, 0XF4, 0X01, 0X11, 0X01, 0X3F}},
+{0XB1, 16, {0X01, 0X62, 0X01, 0X9C, 0X01, 0XC9, 0X02, 0X0E, 0X02, 0X44, 0X02, 0X48, 0X02, 0X74, 0X02, 0XA9}},
+{0XB2, 16, {0X02, 0XCB, 0X02, 0XF6, 0X03, 0X16, 0X03, 0X3F, 0X03, 0X5C, 0X03, 0X73, 0X03, 0X9B, 0X03, 0X9F}},
+{0XB3, 4, {0X03, 0XD7, 0X03, 0XE8}},
+{0XB4, 16, {0X00, 0X05, 0X00, 0X50, 0X00, 0X8D, 0X00, 0XAD, 0X00, 0XC4, 0X00, 0XEB, 0X01, 0X09, 0X01, 0X39}},
+{0XB5, 16, {0X01, 0X5E, 0X01, 0X97, 0X01, 0XC4, 0X02, 0X08, 0X02, 0X3D, 0X02, 0X3E, 0X02, 0X70, 0X02, 0XA4}},
+{0XB6, 16, {0X02, 0XC5, 0X02, 0XF2, 0X03, 0X11, 0X03, 0X3B, 0X03, 0X58, 0X03, 0X6C, 0X03, 0X96, 0X03, 0XCA}},
+{0XB7, 4, {0X03, 0XF5, 0X03, 0XF8}},
+{0XB8, 16, {0X00, 0X14, 0X00, 0X3B, 0X00, 0X6F, 0X00, 0X8E, 0X00, 0XA9, 0X00, 0XD1, 0X00, 0XF1, 0X01, 0X24}},
+{0XB9, 16, {0X01, 0X4C, 0X01, 0X8A, 0X01, 0XB9, 0X02, 0X03, 0X02, 0X3A, 0X02, 0X3B, 0X02, 0X6E, 0X02, 0XA4}},
+{0XBA, 16, {0X02, 0XC5, 0X02, 0XF4, 0X03, 0X16, 0X03, 0X4D, 0X03, 0X81, 0X03, 0XF9, 0X03, 0XFA, 0X03, 0XFB}},
+{0XBB, 4, {0X03, 0XFD, 0X03, 0XFE}},
+{0XBC, 16, {0X00, 0X0E, 0X00, 0X69, 0X00, 0X96, 0X00, 0XB5, 0X00, 0XD0, 0X00, 0XF4, 0X01, 0X11, 0X01, 0X3F}},
+{0XBD, 16, {0X01, 0X62, 0X01, 0X9C, 0X01, 0XC9, 0X02, 0X0E, 0X02, 0X44, 0X02, 0X48, 0X02, 0X74, 0X02, 0XA9}},
+{0XBE, 16, {0X02, 0XCB, 0X02, 0XF6, 0X03, 0X16, 0X03, 0X3F, 0X03, 0X5C, 0X03, 0X73, 0X03, 0X9B, 0X03, 0X9F}},
+{0XBF, 4, {0X03, 0XD7, 0X03, 0XE8}},
+{0XC0, 16, {0X00, 0X05, 0X00, 0X50, 0X00, 0X8D, 0X00, 0XAD, 0X00, 0XC4, 0X00, 0XEB, 0X01, 0X09, 0X01, 0X39}},
+{0XC1, 16, {0X01, 0X5E, 0X01, 0X97, 0X01, 0XC4, 0X02, 0X08, 0X02, 0X3D, 0X02, 0X3E, 0X02, 0X70, 0X02, 0XA4}},
+{0XC2, 16, {0X02, 0XC5, 0X02, 0XF2, 0X03, 0X11, 0X03, 0X3B, 0X03, 0X58, 0X03, 0X6C, 0X03, 0X96, 0X03, 0XCA}},
+{0XC3, 4, {0X03, 0XF5, 0X03, 0XF8}},
+{0XC4, 16, {0X00, 0X14, 0X00, 0X3B, 0X00, 0X6F, 0X00, 0X8E, 0X00, 0XA9, 0X00, 0XD1, 0X00, 0XF1, 0X01, 0X24}},
+{0XC5, 16, {0X01, 0X4C, 0X01, 0X8A, 0X01, 0XB9, 0X02, 0X03, 0X02, 0X3A, 0X02, 0X3B, 0X02, 0X6E, 0X02, 0XA4}},
+{0XC6, 16, {0X02, 0XC5, 0X02, 0XF4, 0X03, 0X16, 0X03, 0X4D, 0X03, 0X81, 0X03, 0XF9, 0X03, 0XFA, 0X03, 0XFB}},
+{0XC7, 4, {0X03, 0XFD, 0X03, 0XFE}},
+{0XF0, 5, {0X55, 0XAA, 0X52, 0X08, 0X06}},
+{0XB0, 2, {0X31, 0X2E}},
+{0XB1, 2, {0X10, 0X12}},
+{0XB2, 2, {0X16, 0X18}},
+{0XB3, 2, {0X31, 0X31}},
+{0XB4, 2, {0X31, 0X34}},
+{0XB5, 2, {0X34, 0X34}},
+{0XB6, 2, {0X34, 0X34}},
+{0XB7, 2, {0X34, 0X34}},
+{0XB8, 2, {0X33, 0X2D}},
+{0XB9, 2, {0X00, 0X02}},
+{0XBA, 2, {0X03, 0X01}},
+{0XBB, 2, {0X2D, 0X33}},
+{0XBC, 2, {0X34, 0X34}},
+{0XBD, 2, {0X34, 0X34}},
+{0XBE, 2, {0X34, 0X34}},
+{0XBF, 2, {0X34, 0X31}},
+{0XC0, 2, {0X31, 0X31}},
+{0XC1, 2, {0X19, 0X17}},
+{0XC2, 2, {0X13, 0X11}},
+{0XC3, 2, {0X2E, 0X31}},
+{0XE5, 2, {0X31, 0X31}},
+{0XC4, 2, {0X31, 0X2D}},
+{0XC5, 2, {0X19, 0X17}},
+{0XC6, 2, {0X13, 0X11}},
+{0XC7, 2, {0X31, 0X31}},
+{0XC8, 2, {0X31, 0X34}},
+{0XC9, 2, {0X34, 0X34}},
+{0XCA, 2, {0X34, 0X34}},
+{0XCB, 2, {0X34, 0X34}},
+{0XCC, 2, {0X33, 0X2E}},
+{0XCD, 2, {0X03, 0X01}},
+{0XCE, 2, {0X00, 0X02}},
+{0XCF, 2, {0X2E, 0X33}},
+{0XD0, 2, {0X34, 0X34}},
+{0XD1, 2, {0X34, 0X34}},
+{0XD2, 2, {0X34, 0X34}},
+{0XD3, 2, {0X34, 0X31}},
+{0XD4, 2, {0X31, 0X31}},
+{0XD5, 2, {0X10, 0X12}},
+{0XD6, 2, {0X16, 0X18}},
+{0XD7, 2, {0X2D, 0X31}},
+{0XE6, 2, {0X31, 0X31}},
+{0XD8, 5, {0X00, 0X00, 0X00, 0X00, 0X00}},
+{0XD9, 5, {0X00, 0X00, 0X00, 0X00, 0X00}},
+{0XE7, 1, {0X00}},
+{0XF0, 5, {0X55, 0XAA, 0X52, 0X08, 0X05}},
+{0XED, 1, {0X30}},
+{0XB0, 2, {0X17, 0X06}},
+{0XB8, 1, {0X00}},
+{0XC0, 1, {0X0D}},
+{0XC1, 1, {0X0B}},
+{0XC2, 1, {0X00}},
+{0XC3, 1, {0X00}},
+{0XC4, 1, {0X84}},
+{0XC5, 1, {0X82}},
+{0XC6, 1, {0X82}},
+{0XC7, 1, {0X80}},
+{0XC8, 2, {0X0B, 0X20}},
+{0XC9, 2, {0X07, 0X20}},
+{0XCA, 2, {0X01, 0X10}},
+{0XD1, 5, {0X03, 0X05, 0X05, 0X07, 0X00}},
+{0XD2, 5, {0X03, 0X05, 0X09, 0X03, 0X00}},
+{0XD3, 5, {0X00, 0X00, 0X6A, 0X07, 0X10}},
+{0XD4, 5, {0X30, 0X00, 0X6A, 0X07, 0X10}},
+{0XF0, 5, {0X55, 0XAA, 0X52, 0X08, 0X03}},
+{0XB0, 2, {0X00, 0X00}},
+{0XB1, 2, {0X00, 0X00}},
+{0XB2, 5, {0X05, 0X01, 0X13, 0X00, 0X00}},
+{0XB3, 5, {0X05, 0X01, 0X13, 0X00, 0X00}},
+{0XB4, 5, {0X05, 0X01, 0X13, 0X00, 0X00}},
+{0XB5, 5, {0X05, 0X01, 0X13, 0X00, 0X00}},
+{0XB6, 5, {0X02, 0X01, 0X13, 0X00, 0X00}},
+{0XB7, 5, {0X02, 0X01, 0X13, 0X00, 0X00}},
+{0XB8, 5, {0X02, 0X01, 0X13, 0X00, 0X00}},
+{0XB9, 5, {0X02, 0X01, 0X13, 0X00, 0X00}},
+{0XBA, 5, {0X53, 0X01, 0X13, 0X00, 0X00}},
+{0XBB, 5, {0X53, 0X01, 0X13, 0X00, 0X00}},
+{0XBC, 5, {0X53, 0X01, 0X13, 0X00, 0X00}},
+{0XBD, 5, {0X53, 0X01, 0X13, 0X00, 0X00}},
+{0XC4, 1, {0X60}},
+{0XC5, 1, {0X40}},
+{0XC6, 1, {0X64}},
+{0XC7, 1, {0X44}},
+{0X6F, 1, {0X11}},
+{0XF3, 1, {0X01}},
+{0X35, 1, {0X00}},
+{0X11, 1, {0X00}},
+{REGFLAG_DELAY, 150, {}},
+{0X29, 1, {0X00}},
+{REGFLAG_DELAY, 50, {}},
+};
+
+static void lcm_init(void)
+{
+    unsigned int data_array[16];   
+    SET_RESET_PIN(1);
+    SET_RESET_PIN(0);
+    MDELAY(50);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+   // lcm_initialization();
+    push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+}
+
+static void lcm_update(unsigned int x, unsigned int y,
+        unsigned int width, unsigned int height)
+{
+    unsigned int x0 = x;
+    unsigned int y0 = y;
+    unsigned int x1 = x0 + width - 1;
+    unsigned int y1 = y0 + height - 1;
+
+    unsigned char x0_MSB = ((x0>>8)&0xFF);
+    unsigned char x0_LSB = (x0&0xFF);
+    unsigned char x1_MSB = ((x1>>8)&0xFF);
+    unsigned char x1_LSB = (x1&0xFF);
+    unsigned char y0_MSB = ((y0>>8)&0xFF);
+    unsigned char y0_LSB = (y0&0xFF);
+    unsigned char y1_MSB = ((y1>>8)&0xFF);
+    unsigned char y1_LSB = (y1&0xFF);
+
+    unsigned int data_array[16];
+
+    data_array[0]= 0x00053902;
+    data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
+    data_array[2]= (x1_LSB);
+    dsi_set_cmdq(data_array, 3, 1);
+    //MDELAY(1);
+   
+    data_array[0]= 0x00053902;
+    data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
+    data_array[2]= (y1_LSB);
+    dsi_set_cmdq(data_array, 3, 1);
+    //MDELAY(1);
+   
+    data_array[0]= 0x00290508;
+    dsi_set_cmdq(data_array, 1, 1);
+    //MDELAY(1);
+   
+    data_array[0]= 0x002c3909;
+    dsi_set_cmdq(data_array, 1, 0);
+    //MDELAY(1);
+
+}
+
+static void lcm_suspend(void)
+{
+    unsigned int data_array[16];
+    data_array[0]=0x00280500;
+    dsi_set_cmdq(data_array,1,1);
+    MDELAY(10);
+    data_array[0]=0x00100500;
+    dsi_set_cmdq(data_array,1,1);
+    MDELAY(100);
+}
+
+
+static void lcm_resume(void)
+{
+    unsigned int data_array[16];
+    data_array[0]=0x00110500;
+    dsi_set_cmdq(data_array,1,1);
+    MDELAY(100);
+    data_array[0]=0x00290500;
+    dsi_set_cmdq(data_array,1,1);
+    MDELAY(10);
+}
+
+
+static unsigned int lcm_compare_id(void)
+{
+    unsigned int id=0;
+    unsigned char buffer[3];
+    unsigned int array[16]; 
+    unsigned int data_array[16];
+
+    SET_RESET_PIN(1);
+        MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(50);
+   
+    SET_RESET_PIN(1);
+    MDELAY(120);
+
+    data_array[0] = 0x00063902;
+    data_array[1] = 0x52AA55F0; 
+    data_array[2] = 0x00000108;               
+    dsi_set_cmdq(data_array, 3, 1);
+
+    array[0] = 0x00033700;// read id return two byte,version and id
+    dsi_set_cmdq(array, 1, 1);
+   
+    read_reg_v2(0xC5, buffer, 3);
+    id = buffer[1]; //we only need ID
+    #ifdef BUILD_LK
+        printf("%s, LK nt35590 debug: nt35590 id = 0x%08x buffer[0]=0x%08x,buffer[1]=0x%08x,buffer[2]=0x%08x\n", __func__, id,buffer[0],buffer[1],buffer[2]);
+    #else
+        printk("%s, LK nt35590 debug: nt35590 id = 0x%08x buffer[0]=0x%08x,buffer[1]=0x%08x,buffer[2]=0x%08x\n", __func__, id,buffer[0],buffer[1],buffer[2]);
+    #endif
+
+   // if(id == LCM_ID_NT35521)
+    if(buffer[0]==0x55 && buffer[1]==0x21)
+        return 1;
+    else
+        return 0;
+
+
+}
+
+
+
+
+static int err_count = 0;
+
+static unsigned int lcm_esd_check(void)
+{
+#ifndef BUILD_LK
+    unsigned char buffer[8] = {0};
+    unsigned int array[4];
+    int i =0;
+
+    array[0] = 0x00013700;   
+    dsi_set_cmdq(array, 1,1);
+    read_reg_v2(0x0A, buffer,8);
+
+    printk( "nt35521_JDI lcm_esd_check: buffer[0] = %d,buffer[1] = %d,buffer[2] = %d,buffer[3] = %d,buffer[4] = %d,buffer[5] = %d,buffer[6] = %d,buffer[7] = %d\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],buffer[6],buffer[7]);
+
+    if((buffer[0] != 0x9C))/*LCD work status error,need re-initalize*/
+    {
+        printk( "nt35521_JDI lcm_esd_check buffer[0] = %d\n",buffer[0]);
+        return TRUE;
+    }
+    else
+    {
+        if(buffer[3] != 0x02) //error data type is 0x02
+        {
+             //return FALSE;
+        err_count = 0;
+        }
+        else
+        {
+             //if(((buffer[4] != 0) && (buffer[4] != 0x40)) ||  (buffer[5] != 0x80))
+        if( (buffer[4] == 0x40) || (buffer[5] == 0x80))
+             {
+                  err_count = 0;
+             }
+             else
+             {
+                  err_count++;
+             }            
+             if(err_count >=2 )
+             {
+                 err_count = 0;
+                 printk( "nt35521_JDI lcm_esd_check buffer[4] = %d , buffer[5] = %d\n",buffer[4],buffer[5]);
+                 return TRUE;
+             }
+        }
+        return FALSE;
+    }
+#endif
+   
+}
+
+static unsigned int lcm_esd_recover(void)
+{
+    lcm_init();
+    return TRUE;
+}
+
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+LCM_DRIVER hct_nt35521s_dsi_vdo_hd_boe_50_xld= 
+{
+    .name			= "hct_nt35521s_dsi_vdo_hd_boe_50_xld",
+    .set_util_funcs = lcm_set_util_funcs,
+    .get_params     = lcm_get_params,
+    .init           = lcm_init,
+    .suspend        = lcm_suspend,
+    .resume         = lcm_resume,
+    .compare_id    = lcm_compare_id,
+#if 0//defined(LCM_DSI_CMD_MODE)
+//    .set_backlight	= lcm_setbacklight,
+    //.set_pwm        = lcm_setpwm,
+    //.get_pwm        = lcm_getpwm,
+    .update         = lcm_update
+#endif
+};
+

+ 8 - 0
dev/lcm/hct_otm1282_dsi_vdo_hd_auo/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y += hct_otm1282_dsi_vdo_hd_auo.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 880 - 0
dev/lcm/hct_otm1282_dsi_vdo_hd_auo/hct_otm1282_dsi_vdo_hd_auo.c

@@ -0,0 +1,880 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2008
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+#if defined(BUILD_LK)
+#include <platform/mt_gpio.h>
+#include <platform/mt_pmic.h>
+#else
+        #include <mt-plat/mt_gpio.h>
+//#include <mt-plat/mt_pm_ldo.h>
+#endif
+
+#if !defined(BUILD_LK)
+#include <linux/string.h>
+#endif
+#include "lcm_drv.h"
+
+#if defined(BUILD_LK)
+        #define LCM_DEBUG  printf
+        #define LCM_FUNC_TRACE() printf("huyl [uboot] %s\n",__func__)
+#else
+        #define LCM_DEBUG  printk
+        #define LCM_FUNC_TRACE() printk("huyl [kernel] %s\n",__func__)
+#endif
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH  (720)
+#define FRAME_HEIGHT (1280)
+
+#define LCM_ID_OTM1282 (0x1282)
+
+#ifndef TRUE
+    #define TRUE 1
+#endif
+
+#ifndef FALSE
+    #define FALSE 0
+#endif
+
+static unsigned int lcm_esd_test = FALSE;      ///only for ESD test
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v)    (lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n) (lcm_util.udelay(n))
+#define MDELAY(n) (lcm_util.mdelay(n))
+
+#define REGFLAG_DELAY                                                                   0XFE
+#define REGFLAG_END_OF_TABLE                                                            0x100   // END OF REGISTERS MARKER
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)                lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)           lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define wrtie_cmd(cmd)                                                                          lcm_util.dsi_write_cmd(cmd)
+#define write_regs(addr, pdata, byte_nums)                                      lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg(cmd)                                                                                   lcm_util.dsi_dcs_read_lcm_reg(cmd)
+#define read_reg_v2(cmd, buffer, buffer_size)                                   lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)   
+
+#define   LCM_DSI_CMD_MODE                                                      0
+
+struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+static struct LCM_setting_table lcm_initialization_setting[] = {
+
+{0x00,1,{0x00}},
+{0xff,3,{0x12,0x82,0x01}},
+
+{0x00,1,{0x80}},
+{0xff,2,{0x12,0x82}},
+
+{0x00,1,{0x92}},
+{0xff,2,{0x30,0x02}},//fae
+
+
+{0x00,1,{0xb4}},
+{0xc0,1,{0x40}},
+
+{0x00,1,{0x91}},
+{0xb3,2,{0x0c,0x10}},
+
+{0x00,1,{0xb3}},
+{0xc0,1,{0x33}},
+
+{0x00,1,{0x00}},
+{0x1c,1,{0x32}},//32
+
+{0x00,1,{0x84}},
+{0xa4,1,{0x00}},
+{0x00,1,{0x80}},
+{0xc0,14,{0x00,0x85,0x00,0x2c,0x2c,0x00,0x7b,0x2c,0x2c,0x00,0x7b,0x00,0x2c,0x2c}},
+
+{0x00,1,{0xa0}},
+{0xc0,7,{0x00,0x00,0x00,0x07,0x00,0x19,0x09}},
+
+{0x00,1,{0xd0}},
+{0xc0,7,{0x00,0x00,0x00,0x07,0x00,0x19,0x09}},
+
+{0x00,1,{0x80}},
+{0xc1,2,{0x55,0x55}},
+
+{0x00,1,{0x90}},
+{0xc1,3,{0x66,0x00,0x00}},
+
+{0x00,1,{0x80}},
+{0xc2,4,{0x83,0x01,0x45,0x45}},
+
+{0x00,1,{0x90}},
+{0xc2,15,{0xa9,0x2c,0x01,0x00,0x00,0xab,0x2c,0x01,0x00,0x00,0xaa,0x2c,0x01,0x00,0x00}},
+
+{0x00,1,{0xa0}},
+{0xc2,5,{0xa8,0x2c,0x01,0x00,0x00}},
+
+{0x00,1,{0xec}},
+{0xc2,1,{0x00}},
+
+{0x00,1,{0xfa}},
+{0xc2,3,{0x00,0x80,0x01}},
+
+{0x00,1,{0x80}},
+{0xc3,4,{0x83,0x01,0x45,0x45}},
+
+{0x00,1,{0x90}},
+{0xc3,15,{0xa9,0x2c,0x01,0x00,0x00,0xab,0x2c,0x01,0x00,0x00,0xaa,0x2c,0x01,0x00,0x00}},
+
+{0x00,1,{0xa0}},
+{0xc3,5,{0xa8,0x2c,0x01,0x00,0x00}},
+
+{0x00,1,{0xec}},
+{0xc3,1,{0x00}},
+
+{0x00,1,{0x90}},
+{0xcb,15,{0xc0,0x00,0xc0,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00}},
+
+{0x00,1,{0xa0}},
+{0xcb,15,{0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+{0x00,1,{0xb0}},
+{0xcb,15,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x50,0xc0,0x00,0x00,0x00,0x00}},
+
+{0x00,1,{0xc0}},
+{0xcb,15,{0xff,0x28,0xeb,0x28,0xeb,0x14,0x14,0x14,0x14,0x00,0x14,0x14,0xd7,0x28,0x28}},
+
+{0x00,1,{0xd0}},
+{0xcb,15,{0x28,0x28,0x14,0x14,0x14,0xd7,0x04,0xf7,0x04,0x14,0x14,0x14,0x14,0x04,0x04}},
+
+{0x00,1,{0xe0}},
+{0xcb,15,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x07,0x14,0x14,0x00,0x00}},
+
+{0x00,1,{0xf0}},
+{0xcb,12,{0x30,0x03,0xfc,0x03,0xf0,0x30,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+{0x00,1,{0x80}},
+{0xcc,10,{0x0f,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x10}},
+
+{0x00,1,{0xb0}},
+{0xcc,10,{0x0f,0x06,0x05,0x04,0x03,0x07,0x08,0x09,0x0a,0x10}},
+
+{0x00,1,{0x8a}},
+{0xcd,1,{0x0b}},
+
+{0x00,1,{0xa0}},
+{0xcd,15,{0x12,0x14,0x15,0x04,0x05,0x01,0x0a,0x2d,0x2d,0x2d,0x2d,0x2d,0x26,0x25,0x24}},
+
+{0x00,1,{0xb0}},
+{0xcd,15,{0x23,0x22,0x21,0x20,0x1f,0x2d,0x2d,0x2d,0x2d,0x13,0x0b,0x0c,0x2d,0x2d,0x2d}},
+
+{0x00,1,{0xc0}},
+{0xcd,10,{0x2d,0x2d,0x2d,0x27,0x28,0x29,0x2a,0x2b,0x1d,0x2d}},
+
+{0x00,1,{0xd0}},
+{0xcd,15,{0x12,0x14,0x15,0x02,0x03,0x01,0x0a,0x2d,0x2d,0x2d,0x2d,0x2d,0x26,0x25,0x24}},
+
+{0x00,1,{0xe0}},
+{0xcd,15,{0x23,0x22,0x21,0x20,0x1f,0x2d,0x2d,0x2d,0x2d,0x13,0x0b,0x0c,0x2d,0x2d,0x2d}},
+
+{0x00,1,{0xf0}},
+{0xcd,10,{0x2d,0x2d,0x2d,0x27,0x28,0x29,0x2a,0x2b,0x1d,0x2d}},
+
+{0x00,1,{0x00}},
+{0xd9,1,{0x6e}},
+
+{0x00,1,{0x00}},
+{0xd8,2,{0x33,0x33}},
+
+{0x00,1,{0x90}},
+{0xc5,4,{0x92,0xd6,0xad,0xb0}},
+
+{0x00,1,{0xa0}},
+{0xc5,4,{0x92,0xd6,0xad,0xb0}},
+
+#if 1
+{0x00,1,{0x00}},
+{0xe1,24,{0x1b,0x21,0x31,0x3f,0x49,0x52,0x5e,0x71,0x7d,0x8f,0x99,0xa0,0x5b,0x57,0x54,0x48,0x39,0x2a,0x20,0x1a,0x15,0x10,0x0c,0x0a}},
+{0x00,1,{0x00}},
+{0xe2,24,{0x1b,0x21,0x31,0x3f,0x49,0x52,0x5e,0x71,0x7d,0x8f,0x9a,0xa1,0x5b,0x57,0x54,0x48,0x39,0x2a,0x20,0x1a,0x15,0x10,0x0c,0x0a}},
+{0x00,1,{0x00}},
+{0xe3,24,{0x1b,0x21,0x31,0x3f,0x49,0x52,0x5e,0x71,0x7d,0x8f,0x99,0xa0,0x5b,0x57,0x54,0x48,0x39,0x2a,0x20,0x1a,0x15,0x10,0x0c,0x0a}},
+{0x00,1,{0x00}},
+{0xe4,24,{0x1b,0x21,0x31,0x3f,0x49,0x52,0x5e,0x71,0x7d,0x8f,0x9a,0xa1,0x5b,0x57,0x54,0x48,0x39,0x2a,0x20,0x1a,0x15,0x10,0x0c,0x0a}},
+{0x00,1,{0x00}},
+{0xe5,24,{0x1b,0x21,0x31,0x3f,0x49,0x52,0x5e,0x71,0x7d,0x8f,0x99,0xa0,0x5b,0x57,0x54,0x48,0x39,0x2a,0x20,0x1a,0x15,0x10,0x0c,0x0a}},
+{0x00,1,{0x00}},
+{0xe6,24,{0x1b,0x21,0x31,0x3f,0x49,0x52,0x5e,0x71,0x7d,0x8f,0x9a,0xa1,0x5b,0x57,0x54,0x48,0x39,0x2a,0x20,0x1a,0x15,0x10,0x0c,0x0a}},
+
+#else
+{0x00,1,{0x00}},
+{0xe1,24,{0x1b,0x21,0x2f,0x3c,0x46,0x4e,0x5b,0x6d,0x79,0x89,0x94,0x9b,0x60,0x5d,0x5a,0x50,0x42,0x34,0x2a,0x24,0x1f,0x19,0x18,0x17}},
+{0x00,1,{0x00}},
+{0xe2,24,{0x1b,0x21,0x2f,0x3c,0x46,0x4e,0x5b,0x6d,0x79,0x89,0x94,0x9b,0x60,0x5d,0x5a,0x50,0x42,0x34,0x2a,0x24,0x1f,0x19,0x18,0x17}},
+{0x00,1,{0x00}},
+{0xe3,24,{0x1b,0x21,0x2f,0x3c,0x46,0x4e,0x5b,0x6d,0x79,0x89,0x94,0x9b,0x60,0x5d,0x5a,0x50,0x42,0x34,0x2a,0x24,0x1f,0x19,0x18,0x17}},
+{0x00,1,{0x00}},
+{0xe4,24,{0x1b,0x21,0x2f,0x3c,0x46,0x4e,0x5b,0x6d,0x79,0x89,0x94,0x9b,0x60,0x5d,0x5a,0x50,0x42,0x34,0x2a,0x24,0x1f,0x19,0x18,0x17}},
+{0x00,1,{0x00}},
+{0xe5,24,{0x1b,0x21,0x2f,0x3c,0x46,0x4e,0x5b,0x6d,0x79,0x89,0x94,0x9b,0x60,0x5d,0x5a,0x50,0x42,0x34,0x2a,0x24,0x1f,0x19,0x18,0x17}},
+{0x00,1,{0x00}},
+{0xe6,24,{0x1b,0x21,0x2f,0x3c,0x46,0x4e,0x5b,0x6d,0x79,0x89,0x94,0x9b,0x60,0x5d,0x5a,0x50,0x42,0x34,0x2a,0x24,0x1f,0x19,0x18,0x17}},
+#endif
+
+{0x00,1,{0x93}},
+{0xf5,1,{0x10}},
+
+{0x00,1,{0x97}},
+{0xc5,2,{0x33,0x30}},
+
+{0x00,1,{0xa7}},
+{0xc5,2,{0x33,0x30}},
+
+{0x00,1,{0x80}},
+{0xa5,1,{0x0c}},
+
+{0x00,1,{0xb3}},
+{0xc0,1,{0x33}},
+
+{0x00,1,{0x80}},
+{0xc4,2,{0x04,0x0f}},
+
+{0x00,1,{0xa0}},
+{0xc1,2,{0xE8,0xe0}},
+
+{0x00,1,{0x00}},
+{0xff,3,{0xff,0xff,0xff}},
+
+/*
+{0x00,1,{0x00}},
+{0xff,3,{0x12,0x82,0x01}},
+	
+{0x00, 1 , {0x80}},
+{0xFF, 2 ,{0x12,0x82}},
+
+{0x00,1,{0x92}},
+{0xff,2,{0x30,0x02}},
+
+{0x00, 1 , {0x80}},
+{0xC0, 14 ,{0x00,0x85,0x00,0x2C,0x2C,0x00,0x7B,0x2C,0x2C,0x00,0x7B,0x00,0x2C,0x2C}},
+
+{0x00, 1 , {0xA0}},
+{0xC0,  7 ,{0x00,0x00,0x00,0x07,0x00,0x19,0x09}},
+
+{0x00, 1 , {0xD0}},
+{0xC0,  7 ,{0x00,0x00,0x07,0x0C,0x00,0x19,0x09}},
+
+{0x00, 1 , {0x80}},
+{0xC1,  2 ,{0x55,0x55}},
+
+{0x00, 1 , {0x90}},
+{0xC1,  3 ,{0x66,0x00,0x00}},
+
+{0x00, 1 , {0x80}},
+{0xC2,  4 ,{0x82,0x00,0x45,0x45}},
+
+{0x00, 1 , {0x90}},
+{0xC2, 15 ,{0xAB,0x2D,0x00,0x02,0x00,0xAA,0x2C,0x00,0x02,0x00,0xAB,0x2C,0x01,0x00,0x00}},
+
+{0x00, 1 , {0xA0}},
+{0xC2,  5 ,{0xA9,0x2C,0x01,0x00,0x00}},
+
+{0x00, 1 , {0xEC}},
+{0xC2,  1 ,{0x00}},
+
+{0x02,  1 ,{0xFA}},
+{0xC2,  3 ,{0x00,0x80,0x01}},
+
+{0x00, 1 , {0x80}},
+{0xC3,  4 ,{0x82,0x00,0x45,0x45}},
+
+{0x00, 1 , {0x90}},
+{0xC3, 15 ,{0xAB,0x2D,0x00,0x02,0x00,0xAA,0x2C,0x00,0x02,0x00,0xAB,0x2C,0x01,0x00,0x00}},
+
+{0x00, 1 , {0xA0}},
+{0xC3,  5 ,{0xA9,0x2C,0x01,0x00,0x00}},
+
+{0x00, 1 , {0xEC}},
+{0xC3,  1 ,{0x00}},
+
+{0x00, 1 , {0x90}},
+{0xCB, 15 ,{0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00}},
+
+{0x00, 1 , {0xA0}},
+{0xCB, 15 ,{0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+{0x00, 1 , {0xB0}},
+{0xCB, 15 ,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x50,0xC0,0x00,0x00,0x00,0x00}},
+
+{0x00, 1 , {0xC0}},
+{0xCB, 15 ,{0xFF,0x28,0xEB,0x28,0xEB,0x14,0x14,0x14,0x14,0x00,0x14,0x14,0xD7,0x28,0x28}},
+
+{0x00, 1 , {0xD0}},
+{0xCB, 15 ,{0x28,0x28,0x14,0x14,0x04,0xF7,0x04,0xF7,0x04,0x14,0x14,0x14,0x14,0x04,0x04}},
+
+{0x00, 1 , {0xE0}},
+{0xCB, 15 ,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x07,0x14,0x14,0x00,0x00}},
+
+{0x00, 1 , {0x80}},
+{0xF5,  1 ,{0x01}},
+
+{0x00, 1 , {0x81}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x91}},
+{0xB0,  1 ,{0x9E}},
+
+{0x00, 1 , {0x90}},
+{0xA5,  1 ,{0x00}},
+
+{0x00, 1 , {0xD2}},
+{0xF5,  1 ,{0x20}},
+
+{0x00, 1 , {0x81}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x83}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x87}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x89}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x91}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x93}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x95}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x97}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0x99}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0xA7}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0xC1}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0xC3}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0xC5}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0xC7}},
+{0xF5,  1 ,{0x18}},
+
+{0x00, 1 , {0xC9}},
+{0xF5,  1 ,{0x14}},
+
+{0x00, 1 , {0xF0}},
+{0xCB, 12 ,{0x30,0x03,0xFC,0x03,0xF0,0x30,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+{0x00, 1 , {0x80}},
+{0xCC, 10 ,{0x0F,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x10}},
+
+{0x00, 1 , {0xB0}},
+{0xCC, 10 ,{0x0F,0x04,0x03,0x06,0x05,0x07,0x08,0x09,0x0A,0x10}},
+
+{0x00, 1 , {0x8A}},
+{0xCD,  1 ,{0x0B}},
+
+{0x00, 1 , {0xA0}},
+{0xCD, 15 ,{0x12,0x14,0x15,0x02,0x03,0x01,0x0A,0x2D,0x2D,0x2D,0x2D,0x2D,0x26,0x25,0x24}},
+
+{0x00, 1 , {0xB0}},
+{0xCD, 15 ,{0x23,0x22,0x21,0x20,0x1F,0x2D,0x2D,0x2D,0x2D,0x13,0x0B,0x0C,0x2D,0x2D,0x2D}},
+
+{0x00, 1 , {0xC0}},
+{0xCD, 10 ,{0x2D,0x2D,0x2D,0x27,0x28,0x29,0x2A,0x2B,0x1D,0x2D}},
+
+{0x00, 1 , {0xD0}},
+{0xCD, 15 ,{0x12,0x14,0x15,0x02,0x03,0x01,0x0A,0x2D,0x2D,0x2D,0x2D,0x2D,0x26,0x25,0x24}},
+
+{0x00, 1 , {0xE0}},
+{0xCD, 15 ,{0x23,0x22,0x21,0x20,0x1F,0x2D,0x2D,0x2D,0x2D,0x13,0x0B,0x0C,0x2D,0x2D,0x2D}},
+
+{0x00, 1 , {0xF0}},
+{0xCD, 10 ,{0x2D,0x2D,0x2D,0x27,0x28,0x29,0x2A,0x2B,0x1D,0x2D}},
+
+{0x00, 1 , {0x90}},
+{0xB4,  1 ,{0x11}},
+
+{0x00, 1 , {0x81}},
+{0xC4,  1 ,{0x04}},
+
+{0x00, 1 , {0xC0}},
+{0xF5,  4 ,{0x00,0x00,0x00,0x00}},
+
+{0x00, 1 , {0x80}},
+{0xA4,  1 ,{0x08}},
+
+{0x00, 1 , {0x00}},
+{0xD9,  1 ,{0x74}},
+
+{0x00, 1 , {0x90}},
+{0xC5,  4 ,{0x92,0xD6,0xB6,0xB4}},
+
+{0x00, 1 , {0xA0}},
+{0xC5,  4 ,{0x92,0xD6,0xB6,0xB4}},
+
+{0x00, 1 , {0x00}},
+{0xD9,  1 ,{0x74}},
+
+{0x00, 1 , {0x00}},
+{0xD8,  2 ,{0x72,0x72}},
+
+{0x00, 1 , {0x90}},
+{0xC5,  4 ,{0x92,0xD6,0xB6,0xB4}},
+
+{0x00, 1 , {0xA0}},
+{0xC5,  4 ,{0x92,0xD6,0xB6,0xB4}},
+
+{0x00, 1 , {0x00}},
+{0xE1, 24 ,{0x29,0x3B,0x45,0x4E,0x57,0x5D,0x68,0x78,0x7F,0x8F,0x97,0x9C,0x5D,0x5C,0x5A,0x51,0x45,0x2B,0x27,0x25,0x1A,0x18,0x17,0x15}},
+
+{0x00, 1 , {0x00}},
+{0xE2, 24 ,{0x30,0x3A,0x46,0x50,0x57,0x5F,0x6A,0x78,0x82,0x8F,0x97,0x9D,0x5F,0x5C,0x5A,0x52,0x45,0x2C,0x28,0x26,0x19,0x16,0x15,0x12}},
+
+{0x00, 1 , {0xCA}},
+{0xCB,  2 ,{0xD4,0xD4}},
+
+{0x00, 1 , {0xD3}},
+{0xCB,  1 ,{0xD4}},
+
+{0x00, 1 , {0x90}},
+{0xB4,  1 ,{0x11}},
+
+{0x00,1,{0x00}},
+{0xff,3,{0xff,0xff,0xff}},
+*/
+
+{0x00,	1,	{0xb8}}, 
+{0xb0, 1,	{0x05}},
+
+
+{0x35,1,{0x00}},
+
+{0x11,1,{0x00}},//SLEEP OUT
+{REGFLAG_DELAY,120,{}},
+                                                                                                                        
+{0x29,1,{0x00}},//Display ON 
+{REGFLAG_DELAY,20,{}},  
+{REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+static struct LCM_setting_table lcm_sleep_out_setting[] = {
+    // Sleep Out
+        {0x11, 0, {0x00}},
+    {REGFLAG_DELAY, 120, {}},
+
+    // Display ON
+        {0x29, 0, {0x00}},
+        {REGFLAG_DELAY, 10, {}},
+        
+        {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+
+static struct LCM_setting_table lcm_sleep_mode_in_setting[] = {
+        // Display off sequence
+        {0x28, 0, {0x00}},
+        {REGFLAG_DELAY, 100, {}},
+
+    // Sleep Mode On
+        {0x10, 0, {0x00}},
+        {REGFLAG_DELAY, 200, {}},
+        {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+static struct LCM_setting_table lcm_compare_id_setting[] = {
+        // Display off sequence
+        {0xF0,  5,      {0x55, 0xaa, 0x52,0x08,0x00}},
+        {REGFLAG_DELAY, 10, {}},
+
+        {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+
+static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
+{
+        unsigned int i;
+
+    for(i = 0; i < count; i++) {
+                
+        unsigned cmd;
+        cmd = table[i].cmd;
+                
+        switch (cmd) {
+                        
+            case REGFLAG_DELAY :
+                MDELAY(table[i].count);
+                break;
+                                
+            case REGFLAG_END_OF_TABLE :
+                break;
+                                
+            default:
+                                dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+                                MDELAY(2);
+        }
+    }
+        
+}
+
+
+
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+    memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+
+            memset(params, 0, sizeof(LCM_PARAMS));
+        
+                params->type   = LCM_TYPE_DSI;
+
+                params->width  = FRAME_WIDTH;
+                params->height = FRAME_HEIGHT;
+
+                // enable tearing-free
+                params->dbi.te_mode                             = LCM_DBI_TE_MODE_DISABLED;
+                //params->dbi.te_edge_polarity          = LCM_POLARITY_RISING;
+
+
+                params->dsi.mode   = SYNC_EVENT_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE; 
+
+        
+                // DSI
+                /* Command mode setting */
+                 // 1 Three lane or Four lane
+                params->dsi.LANE_NUM                            = LCM_FOUR_LANE;
+                //The following defined the fomat for data coming from LCD engine.
+                params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
+                params->dsi.data_format.trans_seq   = LCM_DSI_TRANS_SEQ_MSB_FIRST;
+                params->dsi.data_format.padding     = LCM_DSI_PADDING_ON_LSB;
+                params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;
+
+                // Highly depends on LCD driver capability.
+                // Not support in MT6573
+                params->dsi.packet_size=256;
+
+                // Video mode setting           
+                params->dsi.intermediat_buffer_num = 2;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
+
+                params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
+          //      params->dsi.word_count=720*3;   
+
+                
+                params->dsi.vertical_sync_active                                = 4;//0x3;// 3    2
+                params->dsi.vertical_backporch                                  = 20;//0x10;// 20   1
+                params->dsi.vertical_frontporch                                 = 16;//0x10; // 1  12
+                params->dsi.vertical_active_line                                = FRAME_HEIGHT; 
+
+                params->dsi.horizontal_sync_active                              = 8;//0x0B;// 50  2
+                params->dsi.horizontal_backporch                                = 65;//0x40 ;
+                params->dsi.horizontal_frontporch                               = 75;//0x40 ;
+                params->dsi.horizontal_active_pixel                             = FRAME_WIDTH;
+
+    		params->dsi.cont_clock=0; //1;
+	
+		params->dsi.esd_check_enable = 1;
+		params->dsi.customization_esd_check_enable = 1;
+		params->dsi.lcm_esd_check_table[0].cmd = 0x0a;
+		params->dsi.lcm_esd_check_table[0].count = 1;
+		params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9c;
+#if 0
+params->dsi.HS_PRPR=3;
+params->dsi.CLK_HS_POST=22;
+params->dsi.DA_HS_EXIT=20;
+#endif
+
+
+            //params->dsi.LPX=8; 
+
+                // Bit rate calculation
+                // 1 Every lane speed
+#if 0
+                params->dsi.pll_div1=0;         // div1=0,1,2,3;div1_real=1,2,4,4 ----0: 546Mbps  1:273Mbps
+                params->dsi.pll_div2=1;         // div2=0,1,2,3;div1_real=1,2,4,4       
+        params->dsi.fbk_sel=1;           // fbk_sel=0,1,2,3;fbk_sel_real=1,2,4,4
+                params->dsi.fbk_div =20;    // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)        
+#else
+        params->dsi.PLL_CLOCK=240;//227;//254;//254//247
+#endif
+}
+
+static void lcm_init(void)
+{
+        SET_RESET_PIN(1);
+        MDELAY(50); 
+        SET_RESET_PIN(0);
+        MDELAY(50); 
+        
+        SET_RESET_PIN(1);
+        MDELAY(120);      
+
+        push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+}
+
+
+
+static void lcm_suspend(void)
+{
+#ifndef BUILD_LK
+#if 0
+        SET_RESET_PIN(1);
+          MDELAY(20);
+          SET_RESET_PIN(0);
+          MDELAY(20);
+
+          SET_RESET_PIN(1);
+          MDELAY(120);
+
+          push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+#else
+        push_table(lcm_sleep_mode_in_setting, sizeof(lcm_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);
+#endif
+#endif
+
+}
+
+
+static void lcm_resume(void)
+{
+#ifndef BUILD_LK
+
+        //lcm_init();
+        push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1);
+#endif
+}
+         
+#if (LCM_DSI_CMD_MODE)
+static void lcm_update(unsigned int x, unsigned int y,
+                       unsigned int width, unsigned int height)
+{
+        unsigned int x0 = x;
+        unsigned int y0 = y;
+        unsigned int x1 = x0 + width - 1;
+        unsigned int y1 = y0 + height - 1;
+
+        unsigned char x0_MSB = ((x0>>8)&0xFF);
+        unsigned char x0_LSB = (x0&0xFF);
+        unsigned char x1_MSB = ((x1>>8)&0xFF);
+        unsigned char x1_LSB = (x1&0xFF);
+        unsigned char y0_MSB = ((y0>>8)&0xFF);
+        unsigned char y0_LSB = (y0&0xFF);
+        unsigned char y1_MSB = ((y1>>8)&0xFF);
+        unsigned char y1_LSB = (y1&0xFF);
+
+        unsigned int data_array[16];
+
+        data_array[0]= 0x00053902;
+        data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
+        data_array[2]= (x1_LSB);
+        dsi_set_cmdq(data_array, 3, 1);
+        
+        data_array[0]= 0x00053902;
+        data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
+        data_array[2]= (y1_LSB);
+        dsi_set_cmdq(data_array, 3, 1);
+
+        data_array[0]= 0x00290508; //HW bug, so need send one HS packet
+        dsi_set_cmdq(data_array, 1, 1);
+        
+        data_array[0]= 0x002c3909;
+        dsi_set_cmdq(data_array, 1, 0);
+
+}
+#endif
+
+static unsigned int lcm_compare_id(void)
+{
+        unsigned int id0,id1,id=0;
+        unsigned char buffer[5];
+        unsigned int array[16];  
+
+//return 1;
+        SET_RESET_PIN(1);
+        SET_RESET_PIN(0);
+        MDELAY(1);
+        
+        SET_RESET_PIN(1);
+        MDELAY(20); 
+
+        array[0] = 0x00053700;// read id return two byte,version and id
+        dsi_set_cmdq(array, 1, 1);
+        
+        read_reg_v2(0xA1, buffer, 5);   //018B1283ff
+        id0 = buffer[2];
+        id1 = buffer[3];
+        id=(id0<<8)|id1;
+        
+    #ifdef BUILD_LK
+                printf("%s, LK otm1282a debug: otm1282a id = 0x%08x\n", __func__, id);
+    #else
+                printk("%s, kernel otm1282a horse debug: otm1282a id = 0x%08x\n", __func__, id);
+    #endif
+
+    if(id == LCM_ID_OTM1282)
+        return 1;
+    else
+        return 0;
+
+
+}
+
+//extern void hct_set_hs_read();
+//extern void hct_restore_HS_read();
+
+
+static unsigned int lcm_esd_check(void)
+{
+  #ifndef BUILD_LK
+        char  buffer[3];
+        int   array[4];
+
+        if(lcm_esd_test)
+        {
+                lcm_esd_test = FALSE;
+                return TRUE;
+        }
+
+
+	//hct_set_hs_read();
+	array[0] = 0x00013708;
+	dsi_set_cmdq(array, 1, 1);
+	 read_reg_v2(0x0a, buffer, 1);
+	// printk("otm1282 lcm_esd_check %x %x\n",buffer[0]);
+	//hct_restore_HS_read();
+
+
+      //  array[0] = 0x00013700;
+        //dsi_set_cmdq(array, 1, 1);
+
+     //   read_reg_v2(0x36, buffer, 1);
+        if(buffer[0]==0x9c)
+        {
+                return FALSE;
+        }
+        else
+        {                        
+                return TRUE;
+        }
+ #endif
+
+}
+
+static unsigned int lcm_esd_recover(void)
+{
+        lcm_init();
+        lcm_resume();
+
+        return TRUE;
+}
+
+LCM_DRIVER hct_otm1282_dsi_vdo_hd_auo = 
+{
+    .name                       = "hct_otm1282_dsi_vdo_hd_auo",
+        .set_util_funcs = lcm_set_util_funcs,
+        .get_params     = lcm_get_params,
+        .init           = lcm_init,
+        .suspend        = lcm_suspend,
+        .resume         = lcm_resume,
+        .compare_id    = lcm_compare_id,        
+#if (LCM_DSI_CMD_MODE)
+        //.set_backlight        = lcm_setbacklight,
+    .update         = lcm_update,
+#endif
+ //.esd_check = lcm_esd_check,
+ //.esd_recover=lcm_esd_recover,
+};

+ 8 - 0
dev/lcm/hct_otm1285a_dsi_vdo_hd_boe/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y += hct_otm1285a_dsi_vdo_hd_boe.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 756 - 0
dev/lcm/hct_otm1285a_dsi_vdo_hd_boe/hct_otm1285a_dsi_vdo_hd_boe.c

@@ -0,0 +1,756 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2008
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+
+#ifdef BUILD_LK
+#else
+#include <linux/string.h>
+#if defined(BUILD_UBOOT)
+#include <asm/arch/mt_gpio.h>
+#else
+        #include <mt-plat/mt_gpio.h>
+#endif
+#endif
+#include "lcm_drv.h"
+
+#if defined(BUILD_LK)
+#else
+
+#include <linux/proc_fs.h>   //proc file use 
+#endif
+
+
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH                                         (720)
+#define FRAME_HEIGHT                                        (1280)
+#define LCM_ID                       (0x1285)
+
+#define REGFLAG_DELAY               (0XFE)
+#define REGFLAG_END_OF_TABLE        (0x100) // END OF REGISTERS MARKER
+
+
+#define LCM_DSI_CMD_MODE                                    0
+
+#ifndef TRUE
+    #define TRUE 1
+#endif
+
+#ifndef FALSE
+    #define FALSE 0
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v)                                    (lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n)                                           (lcm_util.udelay(n))
+#define MDELAY(n)                                           (lcm_util.mdelay(n))
+
+static unsigned int lcm_esd_test = FALSE;      ///only for ESD test
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)    lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)       lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define wrtie_cmd(cmd)                                      lcm_util.dsi_write_cmd(cmd)
+#define write_regs(addr, pdata, byte_nums)                  lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg(cmd)                                           lcm_util.dsi_dcs_read_lcm_reg(cmd)
+#define read_reg_v2(cmd, buffer, buffer_size)               lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
+
+ struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+
+static struct LCM_setting_table lcm_initialization_setting[] = {
+    
+    /*
+    Note :
+
+    Data ID will depends on the following rule.
+    
+        count of parameters > 1 => Data ID = 0x39
+        count of parameters = 1 => Data ID = 0x15
+        count of parameters = 0 => Data ID = 0x05
+
+    Structure Format :
+
+    {DCS command, count of parameters, {parameter list}}
+    {REGFLAG_DELAY, milliseconds of time, {}},
+
+    ...
+
+    Setting ending by predefined flag
+    
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+    */
+{0x00,1,{0x00}},
+{0xFF,3,{0x12,0x85,0x01}},
+
+
+{0x00,1,{0x80}},
+{0xFF,2,{0x12,0x85}},
+
+
+{0x00,1,{0xC1}},
+{0xC5,1,{0x33}},
+
+
+{0x00,1,{0x93}},
+{0xC5,1,{0x12}}, //17
+
+
+{0x00,1,{0x95}},
+{0xC5,1,{0x19}},
+
+
+{0x00,1,{0x96}},
+{0xC5,1,{0x80}},
+
+
+{0x00,1,{0x97}},
+{0xC5,1,{0x16}},
+
+
+{0x00,1,{0x98}},
+{0xC5,2,{0x80,0x0F}},
+
+
+{0x00,1,{0x00}},
+{0xD8,2,{0x2E,0x2E}},
+
+
+{0x00,1,{0x00}},
+{0xD9,1,{0x83}}, //88
+
+
+{0x00,1,{0x80}},
+{0xC5,1,{0x34}},
+
+
+{0x00,1,{0x90}},
+{0xF5,14,{0x03,0x15,0x09,0x15,0x07,0x15,0x0C,0x15,0x0A,0x15,0x09,0x15,0x0A,0x15}},
+
+
+{0x00,1,{0xA0}},
+{0xF5,14,{0x12,0x11,0x03,0x15,0x09,0x15,0x11,0x15,0x08,0x15,0x07,0x15,0x09,0x15}},
+
+
+{0x00,1,{0xC0}},
+{0xF5,14,{0x0E,0x15,0x0E,0x15,0x00,0x15,0x00,0x15,0x2E,0x15,0x14,0x11,0x00,0x25}},
+
+
+{0x00,1,{0xD0}},
+{0xF5,15,{0x07,0x15,0x0A,0x15,0x10,0x11,0x00,0x10,0x90,0x90,0x90,0x02,0x90,0x00,0X00}},
+
+
+{0x00,1,{0x82}},
+{0xC0,3,{0x00,0x0e,0x0c}},
+
+
+{0x00,1,{0x80}},
+{0xC0,2,{0x00,0x70}},
+
+
+{0x00,1,{0x80}},
+{0xC1,4,{0x19,0x19,0x19,0x19}},
+
+
+{0x00,1,{0x90}},
+{0xC1,1,{0x77}},
+
+
+{0x00,1,{0x80}},
+{0xC2,8,{0x84,0x02,0x7B,0x12,0x85,0x01,0x5D,0xF0}},
+
+
+{0x00,1,{0xF0}},
+{0xC2,2,{0x00,0x00}},
+
+
+{0x00,1,{0x90}},
+{0xC2,15,{0x82,0x02,0x01,0x0D,0x05,0x81,0x02,0x01,0x0D,0x05,0x80,0x02,0x01,0x0D,0x05}},
+
+
+{0x00,1,{0xA0}},
+{0xC2,5,{0x83,0x02,0x01,0x0D,0x05}},
+
+
+{0x00,1,{0xEC}},
+{0xC2,2,{0x10,0x00}},
+
+
+{0x00,1,{0xA0}},
+{0xC0,1,{0x0B}},
+
+
+{0x00,1,{0xA3}},
+{0xC0,1,{0x00}},
+
+
+{0x00,1,{0xA5}},
+{0xC0,2,{0x18,0x05}},
+
+
+{0x00,1,{0x80}},
+{0xCC,12,{0x03,0x04,0x05,0x06,0x11,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B}},
+
+
+{0x00,1,{0xB0}},
+{0xCC,12,{0x06,0x05,0x04,0x03,0x0C,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B}},
+
+
+{0x00,1,{0x80}},
+{0xCD,15,{0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x01,0x02,0x14,0x13,0x12,0x0B,0x0B,0x0B}},
+
+
+{0x00,1,{0x80}},
+{0xCB,7,{0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+
+{0x00,1,{0xF0}},
+{0xCB,7,{0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF}},
+
+
+{0x00,1,{0xC0}},
+{0xCB,15,{0xFD,0xFD,0xFD,0xFD,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+
+{0x00,1,{0xD0}},
+{0xCB,12,{0x00,0x00,0x00,0x00,0xFD,0x00,0xFD,0xFD,0x05,0x00,0x00,0x00}},
+
+
+{0x00,1,{0x90}},
+{0xCB,15,{0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+
+{0x00,1,{0xA0}},
+{0xCB,12,{0x00,0x00,0x00,0x40,0x7F,0x40,0x7F,0x7F,0x7F,0x00,0x00,0x00}},
+
+
+{0x00,1,{0xE0}},
+{0xCC,4,{0x80,0xF0,0x00,0x00}},
+
+
+{0x00,1,{0xD0}},
+{0xCD,15,{0x01,0x00,0x03,0x00,0x13,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}},
+
+
+{0x00,1,{0xE0}},
+{0xCD,12,{0x10,0x11,0x12,0x05,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B}},
+
+
+{0x00,1,{0xA0}},
+{0xCD,15,{0x00,0x02,0x00,0x04,0x13,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}},
+
+
+{0x00,1,{0xB0}},
+{0xCD,12,{0x10,0x11,0x12,0x05,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B}},
+
+
+
+{0x00,1,{0xA2}},
+{0xC1,1,{0x00}},
+
+
+{0x00,1,{0xB3}},
+{0xC0,1,{0x00}},
+
+
+{0x00,1,{0xB4}},
+{0xC0,1,{0x40}},
+
+
+{0x00,1,{0x80}},
+{0xC4,1,{0x88}},
+
+
+{0x00,1,{0x83}},
+{0xC4,1,{0x20}},
+
+
+{0x00,1,{0x00}},
+{0x35,1,{0x01}},
+
+//--------------------CE  setting--------------------
+{0x00, 1 , {0xA3}},
+{0xB6,  1 ,{0x03}},
+
+{0x00, 1 , {0x00}},
+{0x59,  1 ,{0x00}},
+
+{0x00, 1 , {0xA0}},
+{0xD6, 12 ,{0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+
+{0x00, 1 , {0xB0}},
+{0xD6, 12 ,{0x00,0x00,0x5A,0xB3,0xB3,0xB3,0xB3,0xB3,0xB3,0xB3,0xB3,0xB3}},
+
+{0x00, 1 , {0xC0}},
+{0xD6, 12 ,{0x3C,0x00,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77}},
+
+{0x00, 1 , {0xD0}},
+{0xD6, 12 ,{0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C}},
+{0x55,  1 ,{0x80}},//0x00:off ;0x80:low;0x90:medium;0xb0:high   
+
+//--------------------CE  end  --------------------
+
+{0x00,1,{0x00}},
+//GAMMAA R+
+{0xE1,24,{0X0C,0X15,0X1E,0X2E,0X38,0X40,0X4C,0X5F,0X69,0X7C,0X89,0X92,0X67,0X61,0X5C,0X4D,0X3C,0X2C,0X22,0X1D,0X18,0X14,0X13,0X12}},
+
+
+{0x00,1,{0x00}},
+//GAMMAA R-
+{0xE2,24,{0X0C,0X15,0X1E,0X2E,0X38,0X40,0X4C,0X5F,0X69,0X7C,0X89,0X92,0X67,0X61,0X5C,0X4D,0X3C,0X2C,0X22,0X1D,0X18,0X14,0X13,0X12}},
+
+
+{0x00,1,{0x00}},
+//GAMMAA G+
+{0xE3,24,{0X0C,0X15,0X1E,0X2E,0X38,0X40,0X4C,0X5F,0X69,0X7C,0X89,0X92,0X67,0X61,0X5C,0X4D,0X3C,0X2C,0X22,0X1D,0X18,0X14,0X13,0X12}},
+
+
+{0x00,1,{0x00}},
+//GAMMAA G-
+{0xE4,24,{0X0C,0X15,0X1E,0X2E,0X38,0X40,0X4C,0X5F,0X69,0X7C,0X89,0X92,0X67,0X61,0X5C,0X4D,0X3C,0X2C,0X22,0X1D,0X18,0X14,0X13,0X12}},
+
+
+{0x00,1,{0x00}},
+//GAMMAA B+
+{0xE5,24,{0X0C,0X15,0X1E,0X2E,0X38,0X40,0X4C,0X5F,0X69,0X7C,0X89,0X92,0X67,0X61,0X5C,0X4D,0X3C,0X2C,0X22,0X1D,0X18,0X14,0X13,0X12}},
+
+
+{0x00,1,{0x00}},
+//GAMMAA B-
+{0xE6,24,{0X0C,0X15,0X1E,0X2E,0X38,0X40,0X4C,0X5F,0X69,0X7C,0X89,0X92,0X67,0X61,0X5C,0X4D,0X3C,0X2C,0X22,0X1D,0X18,0X14,0X13,0X12}},
+
+{REGFLAG_DELAY, 10, {}},
+
+/*
+{0x51,1,{0xFF}},
+
+{0x53,1,{0x2C}},
+
+{0x55,1,{0x00}},
+*/
+
+
+    {0x11,1,{0x00}},  
+    {REGFLAG_DELAY,120,{}},
+
+    {0x29,1,{0x00}},//Display ON 
+    {REGFLAG_DELAY,20,{}},  
+
+// Setting ending by predefined flag
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static struct LCM_setting_table lcm_sleep_out_setting[] = {
+    // Sleep Out
+    {0x11, 1, {0x00}},
+    {REGFLAG_DELAY, 120, {}},
+    // Display ON
+    //{0x2C, 1, {0x00}},
+    //{0x13, 1, {0x00}},
+    {0x29, 1, {0x00}},
+    {REGFLAG_DELAY, 20, {}},
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+
+static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = {
+    // Display off sequence
+    {0x28, 1, {0x00}},
+    {REGFLAG_DELAY, 20, {}},
+
+    // Sleep Mode On
+    {0x10, 1, {0x00}},
+    {REGFLAG_DELAY, 120, {}},
+
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static struct LCM_setting_table lcm_compare_id_setting[] = {
+    // Display off sequence
+    {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}},
+    {REGFLAG_DELAY, 10, {}},
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static struct LCM_setting_table lcm_backlight_level_setting[] = {
+    {0x51, 1, {0xFF}},
+    {REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+//static int vcom=0x40;
+static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
+{
+    unsigned int i;
+
+    for(i = 0; i < count; i++) {
+        
+        unsigned cmd;
+        cmd = table[i].cmd;
+        
+        switch (cmd) {
+			/*case 0xd9:
+			table[i].para_list[0]=vcom;
+			dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+            vcom+=2;
+			break;
+			*/
+            case REGFLAG_DELAY :
+                MDELAY(table[i].count);
+                break;
+                
+            case REGFLAG_END_OF_TABLE :
+                break;
+                
+            default:
+                dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
+        }
+    }
+    
+}
+
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+    memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+    memset(params, 0, sizeof(LCM_PARAMS));
+    params->type   = LCM_TYPE_DSI;
+    params->width  = FRAME_WIDTH;
+    params->height = FRAME_HEIGHT;
+
+    // enable tearing-free
+    params->dbi.te_mode             = LCM_DBI_TE_MODE_DISABLED;
+    params->dbi.te_edge_polarity        = LCM_POLARITY_RISING;
+
+
+
+    params->dsi.mode   = SYNC_EVENT_VDO_MODE;
+
+
+    // DSI
+    /* Command mode setting */
+    params->dsi.LANE_NUM                = LCM_FOUR_LANE;
+    //The following defined the fomat for data coming from LCD engine. 
+    params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
+    params->dsi.data_format.trans_seq   = LCM_DSI_TRANS_SEQ_MSB_FIRST; 
+    params->dsi.data_format.padding     = LCM_DSI_PADDING_ON_LSB;
+    params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;
+    // Highly depends on LCD driver capability.
+    // Not support in MT6573
+    params->dsi.packet_size=256;
+    // Video mode setting       
+    params->dsi.intermediat_buffer_num = 2;
+    params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
+    params->dsi.vertical_sync_active                = 4;
+    params->dsi.vertical_backporch                  = 16;
+    params->dsi.vertical_frontporch                 = 15;
+    params->dsi.vertical_active_line                = FRAME_HEIGHT; 
+    params->dsi.horizontal_sync_active              = 10;
+    params->dsi.horizontal_backporch                = 64;
+    params->dsi.horizontal_frontporch               = 64;
+    params->dsi.horizontal_blanking_pixel              = 60;
+    params->dsi.horizontal_active_pixel            = FRAME_WIDTH;
+    // Bit rate calculation
+#if 0
+    params->dsi.pll_div1=1;     // div1=0,1,2,3;div1_real=1,2,4,4
+    params->dsi.pll_div2=1;     // div2=0,1,2,3;div2_real=1,2,4,4
+    params->dsi.fbk_sel=1;       // fbk_sel=0,1,2,3;fbk_sel_real=1,2,4,4
+    params->dsi.fbk_div =30;        // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)    
+#else
+    params->dsi.PLL_CLOCK=230;//227;//254;//254//247
+#endif
+}
+
+static void lcm_init(void)
+{
+    SET_RESET_PIN(1);
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(20);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+
+    push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+#ifdef BUILD_LK
+    printf("[erick-lk]%s\n", __func__);
+#else
+    printk("[erick-k]%s\n", __func__);
+#endif
+}
+
+
+static void lcm_suspend(void)
+{
+#ifndef BUILD_LK
+    push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);   //wqtao. enable
+    #ifdef BUILD_LK
+        printf("[erick-lk]%s\n", __func__);
+    #else
+        printk("[erick-k]%s\n", __func__);
+    #endif
+#endif
+}
+
+
+static void lcm_resume(void)
+{
+#ifndef BUILD_LK
+    push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1);
+    #ifdef BUILD_LK
+        printf("[erick-lk]%s\n", __func__);
+    #else
+        printk("[erick-k]%s\n", __func__);
+    #endif
+#endif
+}
+
+#if (LCM_DSI_CMD_MODE)
+static void lcm_update(unsigned int x, unsigned int y,
+                       unsigned int width, unsigned int height)
+{
+    unsigned int x0 = x;
+    unsigned int y0 = y;
+    unsigned int x1 = x0 + width - 1;
+    unsigned int y1 = y0 + height - 1;
+
+    unsigned char x0_MSB = ((x0>>8)&0xFF);
+    unsigned char x0_LSB = (x0&0xFF);
+    unsigned char x1_MSB = ((x1>>8)&0xFF);
+    unsigned char x1_LSB = (x1&0xFF);
+    unsigned char y0_MSB = ((y0>>8)&0xFF);
+    unsigned char y0_LSB = (y0&0xFF);
+    unsigned char y1_MSB = ((y1>>8)&0xFF);
+    unsigned char y1_LSB = (y1&0xFF);
+
+    unsigned int data_array[16];
+
+
+    data_array[0]= 0x00053902;
+    data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
+    data_array[2]= (x1_LSB);
+    dsi_set_cmdq(data_array, 3, 1);
+
+    data_array[0]= 0x00053902;
+    data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
+    data_array[2]= (y1_LSB);
+    dsi_set_cmdq(data_array, 3, 1);
+
+    data_array[0]= 0x00290508; //HW bug, so need send one HS packet
+    dsi_set_cmdq(data_array, 1, 1);
+
+    data_array[0]= 0x002c3909;
+    dsi_set_cmdq(data_array, 1, 0);
+}
+#endif
+
+#if 0   //wqtao.        
+static void lcm_setbacklight(unsigned int level)
+{
+    unsigned int default_level = 145;
+    unsigned int mapped_level = 0;
+
+    //for LGE backlight IC mapping table
+    if(level > 255) 
+            level = 255;
+
+    if(level >0) 
+            mapped_level = default_level+(level)*(255-default_level)/(255);
+    else
+            mapped_level=0;
+
+    // Refresh value of backlight level.
+    lcm_backlight_level_setting[0].para_list[0] = mapped_level;
+
+    push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1);
+}
+#endif
+
+static unsigned int lcm_esd_check(void)
+{
+#ifndef BUILD_LK
+    if(lcm_esd_test)
+    {
+        lcm_esd_test = FALSE;
+        return TRUE;
+    }
+
+    /// please notice: the max return packet size is 1
+    /// if you want to change it, you can refer to the following marked code
+    /// but read_reg currently only support read no more than 4 bytes....
+    /// if you need to read more, please let BinHan knows.
+    /*
+            unsigned int data_array[16];
+            unsigned int max_return_size = 1;
+            
+            data_array[0]= 0x00003700 | (max_return_size << 16);    
+            
+            dsi_set_cmdq(&data_array, 1, 1);
+    */
+
+    if(read_reg(0x0a) == 0x9c)
+    {
+        return FALSE;
+    }
+    else
+    {            
+        return TRUE;
+    }
+#endif
+}
+
+static unsigned int lcm_esd_recover(void)
+{
+    unsigned char para = 0;
+
+    SET_RESET_PIN(1);
+    SET_RESET_PIN(0);
+    MDELAY(1);
+    SET_RESET_PIN(1);
+    MDELAY(120);
+      push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+    MDELAY(10);
+      push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1);
+    MDELAY(10);
+    dsi_set_cmdq_V2(0x35, 1, &para, 1);     ///enable TE
+    MDELAY(10);
+
+    return TRUE;
+}
+
+
+static unsigned int lcm_compare_id(void)
+{
+    unsigned int id = 0;
+    unsigned char buffer[5];
+    unsigned int array[16];
+
+    SET_RESET_PIN(1);   //NOTE:should reset LCM firstly
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(50);
+    SET_RESET_PIN(1);
+    MDELAY(50);
+
+    array[0] = 0x00053700;  // read id return two byte,version and id
+    dsi_set_cmdq(array, 1, 1);
+    read_reg_v2(0xa1, buffer, 5);
+    id = ((buffer[2] << 8) | buffer[3]);    //we only need ID
+
+#ifdef BUILD_LK
+    printf("[erick-lk]%s,  otm1285a id = 0x%08x\n", __func__, id);
+#else
+    printk("[erick-k]%s,  otm1285a id = 0x%08x\n", __func__, id);
+#endif
+    return (LCM_ID == id)?1:0;
+}
+
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+LCM_DRIVER hct_otm1285a_dsi_vdo_hd_boe = 
+{
+    .name           = "hct_otm1285a_dsi_vdo_hd_boe",
+    .set_util_funcs = lcm_set_util_funcs,
+    .get_params     = lcm_get_params,
+    .init           = lcm_init,
+    .suspend        = lcm_suspend,
+    .resume         = lcm_resume,   
+    .compare_id    = lcm_compare_id,    
+#if (LCM_DSI_CMD_MODE)
+    //.set_backlight    = lcm_setbacklight,
+    //.esd_check   = lcm_esd_check, 
+    //.esd_recover   = lcm_esd_recover, 
+    .update         = lcm_update,
+#endif  //wqtao
+};
+

+ 8 - 0
dev/lcm/hct_rm68200_dsi_vdo_hd_cpt/Makefile

@@ -0,0 +1,8 @@
+#
+# Makefile for misc devices that really don't fit anywhere else.
+#
+
+obj-y += hct_rm68200_dsi_vdo_hd_cpt.o
+
+ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
+

+ 723 - 0
dev/lcm/hct_rm68200_dsi_vdo_hd_cpt/hct_rm68200_dsi_vdo_hd_cpt.c

@@ -0,0 +1,723 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2008
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+#ifndef BUILD_LK
+#include <linux/string.h>
+#endif
+
+#include "lcm_drv.h"
+
+#ifdef BUILD_LK
+	#include <platform/mt_gpio.h>
+	#include <string.h>
+#elif defined(BUILD_UBOOT)
+	#include <asm/arch/mt_gpio.h>
+#else
+//	#include <mach/mt_gpio.h>
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Constants
+// ---------------------------------------------------------------------------
+
+#define FRAME_WIDTH  										(720)
+#define FRAME_HEIGHT 										(1280)
+#define LCM_ID                       						(0x1284)
+
+#define REGFLAG_DELAY             							(0XFFFE)
+#define REGFLAG_END_OF_TABLE      							(0xFFFF)	// END OF REGISTERS MARKER
+
+
+#define LCM_DSI_CMD_MODE									0
+
+#ifndef TRUE
+    #define TRUE 1
+#endif
+
+#ifndef FALSE
+    #define FALSE 0
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v)    								(lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n) 											(lcm_util.udelay(n))
+#define MDELAY(n) 											(lcm_util.mdelay(n))
+
+#define LCM_RM68200_ID 		(0x6820)
+
+static unsigned int lcm_esd_test = FALSE;      ///only for ESD test
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+#define dsi_set_cmdq_V2(cmd, count, ppara, force_update)	lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
+#define dsi_set_cmdq(pdata, queue_size, force_update)		lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
+#define wrtie_cmd(cmd)										lcm_util.dsi_write_cmd(cmd)
+#define write_regs(addr, pdata, byte_nums)					lcm_util.dsi_write_regs(addr, pdata, byte_nums)
+#define read_reg(cmd)											lcm_util.dsi_dcs_read_lcm_reg(cmd)
+#define read_reg_v2(cmd, buffer, buffer_size)				lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
+
+ struct LCM_setting_table {
+    unsigned cmd;
+    unsigned char count;
+    unsigned char para_list[64];
+};
+
+
+
+	/*
+Note :
+Data ID will depends on the following rule.
+count of parameters > 1      => Data ID = 0x39
+count of parameters = 1      => Data ID = 0x15
+count of parameters = 0      => Data ID = 0x05
+Struclcm_deep_sleep_mode_in_settingture Format :
+{DCS command, count of parameters, {parameter list}}
+{REGFLAG_DELAY, milliseconds of time, {}},
+...
+
+Setting ending by predefined flag
+{REGFLAG_END_OF_TABLE, 0x00, {}}
+*/
+//RM38200+HSD5.94 YKL CODE
+
+
+static struct LCM_setting_table lcm_initialization_setting[] = {
+	{0xFE,   1, {0x1}},
+{0x24,   1,{0xC0}},
+{0x25,   1,{0x53}},
+{0x26,   1, {0x0}},
+{0x2B,   1,{0xE5}},
+{0x27,   1, {0xA}},
+{0x29,   1, {0xA}},
+{0x2F,   1,{0x44}},
+{0x34,   1,{0x59}},
+{0x1B,   1, {0x0}},
+{0x12,   1, {0x8}},
+{0x46,   1,{0x90}},
+{0x52,   1,{0x8A}},
+{0x53,   1, {0x0}},
+{0x54,   1,{0x8A}},
+{0x55,   1, {0x0}},
+{0x5F,   1,{0x12}},
+{0xFE,   1, {0x3}},
+{ 0x0,   1, {0x5}},
+{ 0x1,   1,{0x16}},
+{ 0x2,   1, {0x1}},
+{ 0x3,   1, {0x8}},
+{ 0x4,   1, {0x0}},
+{ 0x5,   1, {0x0}},
+{ 0x6,   1,{0x50}},
+{ 0x7,   1, {0x0}},
+{ 0x8,   1, {0x0}},
+{ 0x9,   1, {0x0}},
+{ 0xA,   1, {0x0}},
+{ 0xB,   1, {0x0}},
+{ 0xC,   1, {0x0}},
+{ 0xD,   1, {0x0}},
+{ 0xE,   1, {0x5}},
+{ 0xF,   1, {0x6}},
+{0x10,   1, {0x7}},
+{0x11,   1, {0x8}},
+{0x12,   1, {0x0}},
+{0x13,   1,{0x40}},
+{0x14,   1, {0x0}},
+{0x15,   1,{0xC5}},
+{0x16,   1, {0x8}},
+{0x17,   1, {0x9}},
+{0x18,   1, {0xA}},
+{0x19,   1, {0xB}},
+{0x1A,   1, {0xC}},
+{0x1B,   1, {0x0}},
+{0x1C,   1,{0x40}},
+{0x1D,   1, {0x0}},
+{0x1E,   1,{0x85}},
+{0x1F,   1, {0x8}},
+{0x20,   1, {0x0}},
+{0x21,   1, {0x0}},
+{0x22,   1, {0x5}},
+{0x23,   1, {0x4}},
+{0x24,   1, {0x6}},
+{0x25,   1,{0x2D}},
+{0x26,   1, {0x0}},
+{0x27,   1, {0x8}},
+{0x28,   1, {0xA}},
+{0x29,   1,{0x2D}},
+{0x2A,   1, {0x0}},
+{0x2B,   1, {0x0}},
+{0x2D,   1, {0x0}},
+{0x2F,   1, {0x0}},
+{0x30,   1, {0x0}},
+{0x31,   1, {0x0}},
+{0x32,   1, {0x0}},
+{0x33,   1, {0x0}},
+{0x34,   1, {0x0}},
+{0x35,   1, {0x0}},
+{0x36,   1, {0x0}},
+{0x37,   1, {0x0}},
+{0x38,   1, {0x0}},
+{0x39,   1, {0x0}},
+{0x3A,   1, {0x0}},
+{0x3B,   1, {0x0}},
+{0x3D,   1, {0x0}},
+{0x3F,   1, {0x0}},
+{0x40,   1, {0x0}},
+{0x41,   1, {0x0}},
+{0x42,   1, {0x0}},
+{0x43,   1, {0x0}},
+{0x44,   1, {0x0}},
+{0x45,   1, {0x0}},
+{0x46,   1, {0x0}},
+{0x47,   1, {0x0}},
+{0x48,   1, {0x0}},
+{0x49,   1, {0x0}},
+{0x4A,   1, {0x0}},
+{0x4B,   1, {0x0}},
+{0x4C,   1, {0x0}},
+{0x4D,   1, {0x0}},
+{0x4E,   1, {0x0}},
+{0x4F,   1, {0x0}},
+{0x50,   1, {0x0}},
+{0x51,   1, {0x0}},
+{0x52,   1, {0x0}},
+{0x53,   1, {0x0}},
+{0x54,   1, {0x0}},
+{0x55,   1, {0x0}},
+{0x56,   1, {0x0}},
+{0x58,   1, {0x0}},
+{0x59,   1, {0x0}},
+{0x5A,   1, {0x0}},
+{0x5B,   1, {0x0}},
+{0x5C,   1, {0x0}},
+{0x5D,   1, {0x0}},
+{0x5E,   1, {0x0}},
+{0x5F,   1, {0x0}},
+{0x60,   1, {0x0}},
+{0x61,   1, {0x0}},
+{0x62,   1, {0x0}},
+{0x63,   1, {0x0}},
+{0x64,   1, {0x0}},
+{0x65,   1, {0x0}},
+{0x66,   1, {0x0}},
+{0x67,   1, {0x0}},
+{0x68,   1, {0x0}},
+{0x69,   1, {0x0}},
+{0x6A,   1, {0x0}},
+{0x6B,   1, {0x0}},
+{0x6C,   1, {0x0}},
+{0x6D,   1, {0x0}},
+{0x6E,   1, {0x0}},
+{0x6F,   1, {0x0}},
+{0x70,   1, {0x0}},
+{0x71,   1, {0x0}},
+{0x72,   1, {0x0}},
+{0x73,   1, {0x0}},
+{0x74,   1, {0x1}},
+{0x75,   1, {0x1}},
+{0x76,   1, {0x1}},
+{0x77,   1, {0x1}},
+{0x78,   1, {0x1}},
+{0x79,   1, {0x1}},
+{0x7A,   1, {0x0}},
+{0x7B,   1, {0x0}},
+{0x7C,   1, {0x0}},
+{0x7D,   1, {0x0}},
+{0x7E,   1, {0x1}},
+{0x7F,   1, {0x9}},
+{0x80,   1, {0xB}},
+{0x81,   1, {0xD}},
+{0x82,   1, {0xF}},
+{0x83,   1,{0x3F}},
+{0x84,   1,{0x3F}},
+{0x85,   1,{0x1C}},
+{0x86,   1,{0x1C}},
+{0x87,   1,{0x3F}},
+{0x88,   1,{0x3F}},
+{0x89,   1,{0x3F}},
+{0x8A,   1,{0x3F}},
+{0x8B,   1,{0x3F}},
+{0x8C,   1,{0x3F}},
+{0x8D,   1,{0x3F}},
+{0x8E,   1,{0x3F}},
+{0x8F,   1,{0x3F}},
+{0x90,   1,{0x3F}},
+{0x91,   1,{0x1D}},
+{0x92,   1,{0x1C}},
+{0x93,   1, {0x3}},
+{0x94,   1, {0x2}},
+{0x95,   1,{0x1C}},
+{0x96,   1,{0x1D}},
+{0x97,   1,{0x3F}},
+{0x98,   1,{0x3F}},
+{0x99,   1,{0x3F}},
+{0x9A,   1,{0x3F}},
+{0x9B,   1,{0x3F}},
+{0x9C,   1,{0x3F}},
+{0x9D,   1,{0x3F}},
+{0x9E,   1,{0x3F}},
+{0x9F,   1,{0x3F}},
+{0xA0,   1,{0x3F}},
+{0xA2,   1,{0x1C}},
+{0xA3,   1,{0x1C}},
+{0xA4,   1,{0x3F}},
+{0xA5,   1,{0x3F}},
+{0xA6,   1, {0xE}},
+{0xA7,   1, {0xC}},
+{0xA9,   1, {0xA}},
+{0xAA,   1, {0x8}},
+{0xAB,   1, {0x0}},
+{0xAC,   1, {0x2}},
+{0xAD,   1, {0xE}},
+{0xAE,   1, {0xC}},
+{0xAF,   1, {0xA}},
+{0xB0,   1, {0x8}},
+{0xB1,   1,{0x3F}},
+{0xB2,   1,{0x3F}},
+{0xB3,   1,{0x1C}},
+{0xB4,   1,{0x1C}},
+{0xB5,   1,{0x3F}},
+{0xB6,   1,{0x3F}},
+{0xB7,   1,{0x3F}},
+{0xB8,   1,{0x3F}},
+{0xB9,   1,{0x3F}},
+{0xBA,   1,{0x3F}},
+{0xBB,   1,{0x3F}},
+{0xBC,   1,{0x3F}},
+{0xBD,   1,{0x3F}},
+{0xBE,   1,{0x3F}},
+{0xBF,   1,{0x1C}},
+{0xC0,   1,{0x1D}},
+{0xC1,   1, {0x0}},
+{0xC2,   1, {0x1}},
+{0xC3,   1,{0x1D}},
+{0xC4,   1,{0x1C}},
+{0xC5,   1,{0x3F}},
+{0xC6,   1,{0x3F}},
+{0xC7,   1,{0x3F}},
+{0xC8,   1,{0x3F}},
+{0xC9,   1,{0x3F}},
+{0xCA,   1,{0x3F}},
+{0xCB,   1,{0x3F}},
+{0xCC,   1,{0x3F}},
+{0xCD,   1,{0x3F}},
+{0xCE,   1,{0x3F}},
+{0xCF,   1,{0x1C}},
+{0xD0,   1,{0x1C}},
+{0xD1,   1,{0x3F}},
+{0xD2,   1,{0x3F}},
+{0xD3,   1, {0x9}},
+{0xD4,   1, {0xB}},
+{0xD5,   1, {0xD}},
+{0xD6,   1, {0xF}},
+{0xD7,   1, {0x3}},
+{0xDF,   1, {0x0}},
+{0xDC,   1, {0x2}},
+{0xDE,   1, {0x8}},
+{0xFE,   1, {0xE}},
+{ 0x1,   1,{0x75}},
+{0xFE,   1, {0x4}},
+{0x60,   1, {0x0}},
+{0x61,   1, {0x6}},
+{0x62,   1, {0xA}},
+{0x63,   1, {0xC}},
+{0x64,   1, {0x4}},
+{0x65,   1,{0x10}},
+{0x66,   1, {0xE}},
+{0x67,   1, {0xA}},
+{0x68,   1,{0x17}},
+{0x69,   1, {0xC}},
+{0x6A,   1,{0x10}},
+{0x6B,   1, {0x7}},
+{0x6C,   1, {0xF}},
+{0x6D,   1, {0xB}},
+{0x6E,   1, {0x1}},
+{0x6F,   1, {0x0}},
+{0x70,   1, {0x0}},
+{0x71,   1, {0x6}},
+{0x72,   1, {0xA}},
+{0x73,   1, {0xC}},
+{0x74,   1, {0x4}},
+{0x75,   1,{0x10}},
+{0x76,   1, {0xE}},
+{0x77,   1, {0xA}},
+{0x78,   1,{0x17}},
+{0x79,   1, {0xC}},
+{0x7A,   1,{0x10}},
+{0x7B,   1, {0x7}},
+{0x7C,   1, {0xF}},
+{0x7D,   1, {0xB}},
+{0x7E,   1, {0x1}},
+{0x7F,   1, {0x0}},
+{0xFE,   1, {0x0}},
+{0x58,   1,{0xA9}},
+{0x35,   0,   {0}},
+{0x11,   1, {0x0}},
+{REGFLAG_DELAY, 120, {}},
+{0x29,   1, {0x0}},
+{REGFLAG_DELAY, 20, {}},
+{REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static struct LCM_setting_table lcm_sleep_out_setting[] = {
+	// Sleep Out
+	{0x11, 0, {0x00}},
+	{REGFLAG_DELAY, 120, {}},
+
+	// Display ON
+	{0x29, 0, {0x00}},
+	{REGFLAG_DELAY, 50, {}},
+
+	{REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+
+static struct LCM_setting_table lcm_sleep_in_setting[] = {
+	// Display off sequence
+	
+	{0x28, 0, {0x00}},
+	{REGFLAG_DELAY, 50, {}},
+
+	// Sleep Mode On
+	{0x10, 1, {0x00}},
+	{REGFLAG_DELAY, 150, {}},
+
+	{0x4f, 0, {0x01}},
+	{REGFLAG_DELAY, 150, {}},
+	
+
+	{REGFLAG_END_OF_TABLE, 0x00, {}}
+};
+
+static void push_table(struct LCM_setting_table *table, unsigned int count,
+		unsigned char force_update)
+{
+	unsigned int i;
+
+	for (i = 0; i < count; i++) {
+
+		unsigned cmd;
+		cmd = table[i].cmd;
+
+		switch (cmd) {
+
+		case REGFLAG_DELAY:
+			MDELAY(table[i].count);
+			break;
+
+		case REGFLAG_END_OF_TABLE:
+			break;
+
+		default:
+			dsi_set_cmdq_V2(cmd, table[i].count,
+					table[i].para_list, force_update);
+		}
+	}
+
+}
+
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS * util)
+{
+	memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+		memset(params, 0, sizeof(LCM_PARAMS));
+
+	params->dsi.LANE_NUM = 3;
+  params->dsi.packet_size = 256;
+  params->dsi.vertical_backporch = 14;
+  params->dsi.horizontal_sync_active = 4;
+  params->dsi.horizontal_frontporch = 8;
+  params->dsi.PLL_CLOCK = 236;
+  params->type = 2;
+  params->dsi.data_format.format = 2;
+  params->dsi.PS = 2;
+  params->dsi.vertical_sync_active = 2;
+  params->width = 720;
+  params->dsi.horizontal_active_pixel = 720;
+  params->height = 1280;
+  params->dsi.vertical_active_line = 1280;
+  params->dbi.te_mode = 0;
+  params->dbi.te_edge_polarity = 0;
+  params->dsi.data_format.color_order = 0;
+  params->dsi.data_format.trans_seq = 0;
+  params->dsi.data_format.padding = 0;
+  params->dsi.intermediat_buffer_num = 0;
+  params->dsi.mode = 1;
+  params->dsi.esd_check_enable = 1;
+  params->dsi.customization_esd_check_enable = 1;
+  params->dsi.cont_clock = 1;
+  params->dsi.vertical_frontporch = 16;
+  params->dsi.horizontal_backporch = 16;
+};
+
+static void lcm_init(void)
+{
+
+	SET_RESET_PIN(1);
+	MDELAY(10);
+	SET_RESET_PIN(0);
+	MDELAY(50);
+	SET_RESET_PIN(1);
+	MDELAY(120);
+
+	push_table(lcm_initialization_setting,sizeof(lcm_initialization_setting) /sizeof(struct LCM_setting_table), 1);
+}
+
+static void lcm_suspend(void)
+{
+	unsigned int array[16];
+	array[0] = 0x00FE1500;
+	dsi_set_cmdq(array, 1, 1);
+	MDELAY(50);
+	array[0] = 0x00011500;
+	dsi_set_cmdq(array, 1, 1);
+	MDELAY(50);
+	array[0] = 0x00280500;
+	dsi_set_cmdq(array, 1, 1);
+	MDELAY(50);
+	array[0] = 0x00100500;
+	dsi_set_cmdq(array, 1, 1);
+	MDELAY(50);
+	array[0] = 0x014F1500;
+	dsi_set_cmdq(array, 1, 1);
+	MDELAY(50);
+}
+
+
+static void lcm_resume(void)
+{   
+	lcm_init();
+}
+
+
+static void lcm_update(unsigned int x, unsigned int y,
+		unsigned int width, unsigned int height)
+{
+	unsigned int x0 = x;
+	unsigned int y0 = y;
+	unsigned int x1 = x0 + width - 1;
+	unsigned int y1 = y0 + height - 1;
+
+	unsigned char x0_MSB = ((x0 >> 8) & 0xFF);
+	unsigned char x0_LSB = (x0 & 0xFF);
+	unsigned char x1_MSB = ((x1 >> 8) & 0xFF);
+	unsigned char x1_LSB = (x1 & 0xFF);
+	unsigned char y0_MSB = ((y0 >> 8) & 0xFF);
+	unsigned char y0_LSB = (y0 & 0xFF);
+	unsigned char y1_MSB = ((y1 >> 8) & 0xFF);
+	unsigned char y1_LSB = (y1 & 0xFF);
+
+	unsigned int data_array[16];
+
+	data_array[0] = 0x00053902;
+	data_array[1] =
+		(x1_MSB << 24) | (x0_LSB << 16) | (x0_MSB << 8) | 0x2a;
+	data_array[2] = (x1_LSB);
+	data_array[3] = 0x00053902;
+	data_array[4] =
+		(y1_MSB << 24) | (y0_LSB << 16) | (y0_MSB << 8) | 0x2b;
+	data_array[5] = (y1_LSB);
+	data_array[6] = 0x002c3909;
+
+	dsi_set_cmdq(data_array, 7, 0);
+
+}
+
+
+static unsigned int lcm_compare_id(void)
+{
+		int array[4];
+		char buffer[5];
+		char id_high=0;
+		char id_low=0;
+		int id1=0;
+		int id2=0;
+
+		SET_RESET_PIN(1);
+		MDELAY(10);
+		SET_RESET_PIN(0);
+		MDELAY(10);
+		SET_RESET_PIN(1);
+		MDELAY(200);
+		array[0]=0x01FE1500;
+		dsi_set_cmdq(array,1, 1);
+
+		array[0] = 0x00013700;
+		dsi_set_cmdq(array, 1, 1);
+		read_reg_v2(0xde, buffer, 1);
+
+		id_high = buffer[0];
+		read_reg_v2(0xdf, buffer, 1);
+		id_low = buffer[0];
+		id1 = (id_high<<8) | id_low;
+
+		#if defined(BUILD_LK)
+		printf("rm68200a %s id1 = 0x%04x, id2 = 0x%04x\n", __func__, id1,id2);
+		#else
+		printk("rm68200a %s id1 = 0x%04x, id2 = 0x%04x\n", __func__, id1,id2);
+		#endif
+		return (LCM_RM68200_ID == id1)?1:0;
+
+}
+//no use
+static unsigned int lcm_esd_recover(void)
+{
+    unsigned char para = 0;
+	unsigned int data_array1[16];
+
+#ifndef BUILD_LK
+    printk("RM68190 lcm_esd_recover enter\n");
+#endif
+    
+
+    SET_RESET_PIN(1);
+    MDELAY(10);
+    SET_RESET_PIN(0);
+    MDELAY(30);
+    SET_RESET_PIN(1);
+    MDELAY(130);
+    #if 0
+	push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
+	MDELAY(10);
+	push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1);
+    	MDELAY(10);
+    #else
+        lcm_init();
+    #endif
+   
+   data_array1[0]= 0x00320500;
+   dsi_set_cmdq(data_array1, 1, 1);
+   MDELAY(50);
+
+    return 1;
+}
+static unsigned int lcm_esd_check(void)
+{
+    unsigned char buffer[1] ={0};
+    //unsigned int data_array[1];
+   // data_array[0] = 0x00013700;// read id return two byte,version and id 3 byte 
+  // dsi_set_cmdq(&data_array, 1, 1);
+   read_reg_v2(0x0a, buffer, 1);
+   
+#ifndef BUILD_LK
+    printk("RM68190 lcm_esd_check enter %x\n",buffer[0]);
+#endif
+#ifndef BUILD_LK
+        if(buffer[0] == 0x9C)
+        {
+          #ifndef BUILD_LK
+          printk("RM68190 lcm_esd_check false \n");
+          #endif
+
+            return false;
+        }
+        else
+        {      
+           #ifndef BUILD_LK
+          printk("RM68190 lcm_esd_check true \n");
+          #endif
+           //lcm_esd_recover();
+            return true;
+        }
+#endif
+}
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+LCM_DRIVER hct_rm68200_dsi_vdo_hd_cpt = 
+{
+	.name			= "hct_rm68200_dsi_vdo_hd_cpt",
+	.set_util_funcs = lcm_set_util_funcs,
+	.get_params     = lcm_get_params,
+	.init           = lcm_init,
+	.suspend        = lcm_suspend,
+	.resume         = lcm_resume,	
+	.compare_id     = lcm_compare_id,	
+    .esd_check   	= lcm_esd_check,	
+    .esd_recover   	= lcm_esd_recover,	
+#if (LCM_DSI_CMD_MODE)
+    .update         = lcm_update,
+#endif	//wqtao
+};
+

+ 22 - 1779
dev/lcm/mt65xx_lcm_list.c

@@ -48,1800 +48,43 @@
 #define LCD_DEBUG(fmt)  printk(fmt)
 #endif
 
-extern LCM_DRIVER otm1282a_hd720_dsi_vdo_60hz_lcm_drv;
-extern LCM_DRIVER otm1282a_hd720_dsi_vdo_lcm_drv;
-extern LCM_DRIVER vvx10f008b00_wuxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER r63319_wqhd_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER nt35598_wqhd_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER lp079x01_lcm_drv;
-extern LCM_DRIVER hx8369_lcm_drv;
-extern LCM_DRIVER hx8369_6575_lcm_drv;
-extern LCM_DRIVER hx8363_6575_dsi_lcm_drv;
-extern LCM_DRIVER hx8363_6575_dsi_hvga_lcm_drv;
-extern LCM_DRIVER hx8363_6575_dsi_qvga_lcm_drv;
-extern LCM_DRIVER hx8363b_wvga_dsi_cmd_drv;
-extern LCM_DRIVER bm8578_lcm_drv;
-extern LCM_DRIVER nt35582_mcu_lcm_drv;
-extern LCM_DRIVER nt35582_mcu_6575_lcm_drv;
-extern LCM_DRIVER nt35582_rgb_6575_lcm_drv;
-extern LCM_DRIVER hx8357b_lcm_drv;
-extern LCM_DRIVER hx8357c_hvga_dsi_cmd_drv;
-extern LCM_DRIVER hx8369_dsi_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_6575_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8369b_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8369b_wvga_dsi_vdo_drv;
-extern LCM_DRIVER hx8389b_qhd_dsi_vdo_drv;
-extern LCM_DRIVER hx8369_hvga_lcm_drv;
-extern LCM_DRIVER ili9481_lcm_drv;
-extern LCM_DRIVER nt35582_lcm_drv;
-extern LCM_DRIVER s6d0170_lcm_drv;
-extern LCM_DRIVER spfd5461a_lcm_drv;
-extern LCM_DRIVER ta7601_lcm_drv;
-extern LCM_DRIVER tft1p3037_lcm_drv;
-extern LCM_DRIVER ha5266_lcm_drv;
-extern LCM_DRIVER hsd070idw1_lcm_drv;
-extern LCM_DRIVER lg4571_lcm_drv;
-extern LCM_DRIVER lg4573b_wvga_dsi_vdo_lh430mv1_drv;
-extern LCM_DRIVER lvds_wsvga_lcm_drv;
-extern LCM_DRIVER lvds_wsvga_ti_lcm_drv;
-extern LCM_DRIVER lvds_wsvga_ti_n_lcm_drv;
-extern LCM_DRIVER nt35565_3d_lcm_drv;
-extern LCM_DRIVER tm070ddh03_lcm_drv;
-extern LCM_DRIVER r61408_lcm_drv;
-extern LCM_DRIVER r61408_wvga_dsi_cmd_drv;
-extern LCM_DRIVER nt35510_lcm_drv;
-extern LCM_DRIVER nt35510_dpi_lcm_drv;
-extern LCM_DRIVER nt35510_hvga_lcm_drv;
-extern LCM_DRIVER nt35510_qvga_lcm_drv;
-extern LCM_DRIVER nt35510_wvga_dsi_cmd_drv;
-extern LCM_DRIVER nt35510_6517_lcm_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6572_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6572_hvga_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6572_fwvga_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6572_qvga_drv;
-extern LCM_DRIVER nt35510_dsi_vdo_6572_drv;
-extern LCM_DRIVER nt35510_dpi_6572_lcm_drv;
-extern LCM_DRIVER nt35510_mcu_6572_lcm_drv;
-extern LCM_DRIVER nt51012_hd720_dsi_vdo_lcm_drv;
-extern LCM_DRIVER r63303_idisplay_lcm_drv;
-extern LCM_DRIVER hj080ia_lcm_drv;
-extern LCM_DRIVER hj101na02a_lcm_drv;
-extern LCM_DRIVER hj101na02a_8135_lcm_drv;
-extern LCM_DRIVER hsd070pfw3_lcm_drv;
-extern LCM_DRIVER hsd070pfw3_8135_lcm_drv;
-extern LCM_DRIVER cm_n070ice_dsi_vdo_lcm_drv;
-extern LCM_DRIVER ej101ia_lcm_drv;
-extern LCM_DRIVER scf0700m48ggu02_lcm_drv;
-extern LCM_DRIVER nt35510_fwvga_lcm_drv;
-#if defined(GN_SSD2825_SMD_S6E8AA)
-extern LCM_DRIVER gn_ssd2825_smd_s6e8aa;
-#endif
-extern LCM_DRIVER nt35517_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_bld_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_tm_lcm_drv;
-extern LCM_DRIVER otm1280a_hd720_dsi_cmd_drv;
-extern LCM_DRIVER otm8018b_dsi_vdo_lcm_drv;
-extern LCM_DRIVER otm8018b_dsi_vdo_txd_fwvga_lcm_drv;
-extern LCM_DRIVER nt35512_dsi_vdo_lcm_drv;
-extern LCM_DRIVER nt35512_wvga_dsi_vdo_boe_drv;
-extern LCM_DRIVER hx8369_rgb_6585_fpga_lcm_drv;
-extern LCM_DRIVER hx8369_rgb_6572_fpga_lcm_drv;
-extern LCM_DRIVER hx8369_mcu_6572_lcm_drv;
-extern LCM_DRIVER hx8369a_wvga_dsi_cmd_drv;
-extern LCM_DRIVER hx8369a_wvga_dsi_vdo_drv;
-extern LCM_DRIVER hx8389c_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_3lane_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_wvga_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_fwvgap_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_fwvga_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_fwvga_plus_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_qhd_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_cmd_hdplus_lcm_drv;;
-extern LCM_DRIVER hx8392a_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_vdo_2lane_lcm_drv;
-extern LCM_DRIVER hx8392a_dsi_vdo_3lane_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER ssd2075_hd720_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_fwvga_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_wvga_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_qhd_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_cmi_lcm_drv;
-extern LCM_DRIVER nt35516_qhd_dsi_cmd_ipsboe_lcm_drv;
-extern LCM_DRIVER nt35516_qhd_dsi_cmd_ipsboe_wvga_lcm_drv;
-extern LCM_DRIVER nt35516_qhd_dsi_cmd_ipsboe_fwvga_lcm_drv;
-extern LCM_DRIVER nt35516_qhd_dsi_cmd_ips9k1431_drv;
-extern LCM_DRIVER nt35516_qhd_dsi_cmd_tft9k1342_drv;
-extern LCM_DRIVER bp070ws1_lcm_drv;
-extern LCM_DRIVER bp101wx1_lcm_drv;
-extern LCM_DRIVER bp101wx1_n_lcm_drv;
-extern LCM_DRIVER nt35516_qhd_rav4_lcm_drv;
-extern LCM_DRIVER r63311_fhd_dsi_vdo_sharp_lcm_drv;
-extern LCM_DRIVER r81592_hvga_dsi_cmd_drv;
-extern LCM_DRIVER rm68190_dsi_vdo_lcm_drv;
-extern LCM_DRIVER nt35596_fhd_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_tps65132_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_vdo_truly_tps65132_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_vdo_truly_nt50358_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_extern_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_2th_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_720p_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_qhd_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_fwvga_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_wvga_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_tps65132_720p_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_6735_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_nt50358_6735_720p_lcm_drv;
-extern LCM_DRIVER nt35596_fhd_dsi_vdo_yassy_lcm_drv;
-extern LCM_DRIVER nt35596_hd720_dsi_vdo_truly_tps65132_lcm_drv;
-extern LCM_DRIVER nt35590_hd720_dsi_cmd_truly2_lcm_drv;
-extern LCM_DRIVER otm9608_wvga_dsi_cmd_drv;
-extern LCM_DRIVER otm9608_fwvga_dsi_cmd_drv;
-extern LCM_DRIVER otm9608_qhd_dsi_cmd_drv;
-extern LCM_DRIVER otm9608_qhd_dsi_vdo_drv;
-extern LCM_DRIVER nt35510_dbi_18bit_gionee_lcm_drv;
-extern LCM_DRIVER otm8009a_fwvga_dsi_cmd_tianma_lcm_drv;
-extern LCM_DRIVER otm8009a_fwvga_dsi_vdo_tianma_lcm_drv;
-extern LCM_DRIVER hx8389b_qhd_dsi_vdo_tianma_lcm_drv;
-extern LCM_DRIVER cm_otc3108bhv161_dsi_vdo_lcm_drv;
-extern LCM_DRIVER auo_b079xat02_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8389b_qhd_dsi_vdo_tianma055xdhp_lcm_drv;
-extern LCM_DRIVER cpt_claa101fp01_dsi_vdo_lcm_drv;
-extern LCM_DRIVER cpt_claa101fp01_dsi_vdo_8163_lcm_drv;
-extern LCM_DRIVER h070d_18dm_lcm_drv;
-extern LCM_DRIVER hx8394a_hd720_dsi_vdo_tianma_lcm_drv;
-extern LCM_DRIVER hx8394d_hd720_dsi_vdo_tianma_lcm_drv;
-extern LCM_DRIVER cpt_clap070wp03xg_sn65dsi83_lcm_drv;
-extern LCM_DRIVER nt35520_hd720_tm_lcm_drv;
-extern LCM_DRIVER nt35520_hd720_boe_lcm_drv;
-extern LCM_DRIVER nt35521_hd720_dsi_vdo_boe_lcm_drv;
-extern LCM_DRIVER nt35521_hd720_tm_lcm_drv;
-extern LCM_DRIVER r69429_wuxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER r69429_wuxga_dsi_cmd_lcm_drv;
-extern LCM_DRIVER rm68210_hd720_dsi_ufoe_cmd_lcm_drv;
-extern LCM_DRIVER r63311_fhd_dsi_vedio_lcm_drv;
-extern LCM_DRIVER otm1283a_6589_hd_dsi;
-extern LCM_DRIVER hx8394a_hd720_dsi_vdo_tianma_v2_lcm_drv;
-extern LCM_DRIVER clap070wp03xg_lvds_8163_lcm_drv;
-extern LCM_DRIVER cpt_clap070wp03xg_lvds_lcm_drv;
-extern LCM_DRIVER otm8018b_dsi_vdo_lcsh72_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_cmd_6571_lcm_drv;
-extern LCM_DRIVER hx8369_dsi_vdo_6571_lcm_drv;
-extern LCM_DRIVER hx8369_dbi_6571_lcm_drv;
-extern LCM_DRIVER hx8369_dpi_6571_lcm_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6571_lcm_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6571_hvga_lcm_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_6571_qvga_lcm_drv;
-extern LCM_DRIVER nt35510_dsi_vdo_6571_lcm_drv;
-extern LCM_DRIVER nt35510_dbi_6571_lcm_drv;
-extern LCM_DRIVER nt35510_dpi_6571_lcm_drv;
-extern LCM_DRIVER nt35590_dsi_cmd_6571_fwvga_lcm_drv;
-extern LCM_DRIVER nt35590_dsi_cmd_6571_qhd_lcm_drv;
-extern LCM_DRIVER it6151_edp_dsi_video_sharp_lcm_drv;
-extern LCM_DRIVER nt35517_qhd_dsi_vdo_lcm_drv;
-extern LCM_DRIVER otm1283a_hd720_dsi_vdo_tm_lcm_drv;
-extern LCM_DRIVER otm1284a_hd720_dsi_vdo_tm_lcm_drv;
-extern LCM_DRIVER otm1285a_hd720_dsi_vdo_tm_lcm_drv;
-extern LCM_DRIVER hx8389b_qhd_dsi_vdo_lgd_lcm_drv;
-extern LCM_DRIVER it6151_fhd_edp_dsi_video_auo_lcm_drv;
-extern LCM_DRIVER tf070mc_rgb_v18_mt6571_lcm_drv;
-extern LCM_DRIVER zs070ih5015b3h6_mt6571_lcm_drv;
-extern LCM_DRIVER a080ean01_dsi_vdo_lcm_drv;
-extern LCM_DRIVER it6121_g156xw01v1_lvds_vdo_lcm_drv;
-extern LCM_DRIVER cpt_clap070wp03xg_lvds_lcm_drv;
-extern LCM_DRIVER r63315_fhd_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER it6151_lp079qx1_edp_dsi_video_lcm_drv;
-extern LCM_DRIVER RX_498HX_615B_lcm_drv;
-extern LCM_DRIVER RX_498HX_615B_82_lcm_drv;
-extern LCM_DRIVER ili9806c_dsi_vdo_djn_fwvga_lcm_drv;
-extern LCM_DRIVER hx8389b_hd720_dsi_vdo_drv;
-extern LCM_DRIVER r69338_hd720_dsi_vdo_jdi_drv;
-extern LCM_DRIVER r69338_hd720_5in_dsi_vdo_jdi_dw8768_drv;
-extern LCM_DRIVER db7436_dsi_vdo_fwvga_drv;
-extern LCM_DRIVER r63417_fhd_dsi_cmd_truly_nt50358_lcm_drv;
-extern LCM_DRIVER r63417_fhd_dsi_cmd_truly_nt50358_hdplus_lcm_drv;
-extern LCM_DRIVER r63417_fhd_dsi_cmd_truly_nt50358_hdp1600_lcm_drv;
-extern LCM_DRIVER r63417_fhd_dsi_cmd_truly_nt50358_720p_lcm_drv;
-extern LCM_DRIVER r63417_fhd_dsi_cmd_truly_nt50358_qhd_lcm_drv;
-extern LCM_DRIVER r63417_fhd_dsi_cmd_truly_nt50358_fwvga_lcm_drv;
-extern LCM_DRIVER r63417_fhd_dsi_vdo_truly_nt50358_lcm_drv;
-extern LCM_DRIVER cm_n070ice_dsi_vdo_mt8173_lcm_drv;
-extern LCM_DRIVER r63419_wqhd_truly_phantom_cmd_lcm_drv;
-extern LCM_DRIVER r63419_wqhd_truly_phantom_vdo_lcm_drv;
-extern LCM_DRIVER r63419_fhd_truly_phantom_lcm_drv;
-extern LCM_DRIVER r63423_wqhd_truly_phantom_lcm_drv;
-extern LCM_DRIVER kd070d5450nha6_rgb_dpi_lcm_drv;
-extern LCM_DRIVER kr101ia2s_dsi_vdo_lcm_drv;
-extern LCM_DRIVER kr070ia4t_dsi_vdo_lcm_drv;
-extern LCM_DRIVER r69338_hd720_dsi_vdo_jdi_dw8755a_drv;
-extern LCM_DRIVER otm9605a_qhd_dsi_vdo_drv;
-extern LCM_DRIVER ili9806e_dsi_vdo_fwvga_drv;
-extern LCM_DRIVER ili9881c_hd_dsi_vdo_ilitek_nt50358_lcm_drv;
-extern LCM_DRIVER otm1906a_fhd_dsi_cmd_auto_lcm_drv;
-extern LCM_DRIVER clap070wp03xg_lvds_lcm_drv;
-extern LCM_DRIVER jd9366_wxga_dsi_vdo_fiti_kd_lcm_drv;
-extern LCM_DRIVER otm1906b_fhd_dsi_cmd_jdi_tps65132_lcm_drv;
-extern LCM_DRIVER otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797_lcm_drv;
-extern LCM_DRIVER otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797_lcm_drv;
-extern LCM_DRIVER nt35523_wxga_dsi_vdo_boe_lcm_drv;
-extern LCM_DRIVER nt35523_wxga_dsi_vdo_8163_lcm_drv;
-extern LCM_DRIVER nt35523_wsvga_dsi_vdo_boe_lcm_drv;
-extern LCM_DRIVER s6e3fa2_fhd1080_dsi_vdo_lcm_drv;
-extern LCM_DRIVER ek79023_dsi_wsvga_vdo_lcm_drv;
-extern LCM_DRIVER s6d7aa0_wxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx8394c_wxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER it6151_lp079qx1_edp_dsi_video_8163evb_lcm_drv;
-extern LCM_DRIVER sy20810800210132_wuxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER nt35521_hd_dsi_vdo_truly_nt50358_lcm_drv;
-extern LCM_DRIVER nt35521_hd_dsi_vdo_truly_nt50358_fwvga_lcm_drv;
-extern LCM_DRIVER nt35521_hd_dsi_vdo_truly_nt50358_qhd_lcm_drv;
-extern LCM_DRIVER nt35521_hd_dsi_vdo_truly_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_truly_nt50358_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_nt50358_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_truly_nt50358_laneswap_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_nt50358_laneswap_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_truly_nt50358_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_truly_rt4801_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_truly_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_hdp_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_hdp_19_9_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_hdp_1560_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_hdp_1680_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_hdp_20_9_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_720p_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_rt5081_qhd_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_truly_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_truly_rt5081_720p_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_truly_rt5081_qhd_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_rt4801_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_rt5081_720p_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_rt5081_qhd_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_rt5081_hdp_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_rt5081_hdp_19_9_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_720p_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_qhd_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_19_9_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_1560_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_1680_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_20_9_lcm_drv;
-extern LCM_DRIVER nt36672_fhdp_dsi_vdo_auo_lcm_drv;
-extern LCM_DRIVER nt36672_fhdp_dsi_vdo_auo_laneswap_lcm_drv;
-extern LCM_DRIVER nt35510_dsi_cmd_lcm_drv;
-extern LCM_DRIVER rm69032_dsi_cmd_lcm_drv;
-extern LCM_DRIVER st7789h2_dbi_lcm_drv;
-extern LCM_DRIVER ek79007_wsvgalnl_dsi_vdo_lcm_drv;
-extern LCM_DRIVER nt71397_wuxga_dsi_vdo_nt65902_lcm_drv;
-extern LCM_DRIVER nt35521_wxga_innolux_lcm_drv;
-extern LCM_DRIVER hx8394d_wxga_kd_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_truly_nt50358_720p_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_nt50358_720p_extern_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_truly_nt50358_720p_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_truly_nt50358_qhd_lcm_drv;
-extern LCM_DRIVER r69429_wqxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER nt35595_truly_fhd_dsi_vdo_lcm_drv;
-extern LCM_DRIVER cpt_clap070wp03xg_wxga_lvds_lcm_drv;
-extern LCM_DRIVER b080uan01_2_wuxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER nt36850_wqhd_dsi_2k_cmd_lcm_drv;
-extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_8163_lcm_drv;
-extern LCM_DRIVER s6e3ha3_wqhd_2k_cmd_lcm_drv;
-extern LCM_DRIVER s6e3fa3_fhd_cmd_lcm_drv;
-extern LCM_DRIVER db7400_hd720_dsi_vdo_dongbu_m1v_drv;
-extern LCM_DRIVER r69338_fhd_dsi_vdo_jdi_drv;
-extern LCM_DRIVER ft8707_fhd_dsi_vdo_lgd_drv;
-extern LCM_DRIVER db7400_hd720_dsi_vdo_dongbu_m4_drv;
-extern LCM_DRIVER lh570_hd720_dsi_vdo_lgd_phase3_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_nt50358_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_vdo_auo_nt50358_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_nt50358_720p_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_auo_nt50358_laneswap_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_auo_nt50358_laneswap_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_cmd_auo_nt50358_laneswap_mt6799_lcm_drv;
-extern LCM_DRIVER nt35695_fhd_dsi_vdo_auo_nt50358_laneswap_mt6799_lcm_drv;
-extern LCM_DRIVER auo_wuxga_dsi_vdo_lcm_drv;
-extern LCM_DRIVER claa101fp01_dsi_vdo_lcm_drv;
-extern LCM_DRIVER r61322_fhd_dsi_vdo_sharp_lfr_lcm_drv;
-extern LCM_DRIVER s6e3ha3_wqhd_2k_cmd_laneswap_drv;
-extern LCM_DRIVER nt36380_wqhd_vdo_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_nt50358_qhd_lcm_drv;
-extern LCM_DRIVER otm1287_wxga_dsi_vdo_auo_guoxian_lcm_drv;
-extern LCM_DRIVER jd9365_wxga_dsi_vdo_hsd_pingbo_lcm_drv;
-extern LCM_DRIVER ili9881c_hdp_dsi_vdo_ilitek_rt5081_lcm_drv;
-extern LCM_DRIVER oppo_tianma_td4310_fhdp_dsi_vdo_rt5081_lcm_drv;
-extern LCM_DRIVER nt35695B_fhd_dsi_cmd_auo_nt50358_hdp_lcm_drv;
-extern LCM_DRIVER nt36672_fhdp_dsi_vdo_tianma_nt50358_lcm_drv;
-extern LCM_DRIVER oppo_tianma_td4310_fhdp_dsi_vdo_nt50358_lcm_drv;
-extern LCM_DRIVER ili9881c_hd_dsi_vdo_ilitek_nt50358_3lane_lcm_drv;
-extern LCM_DRIVER ili9881c_hd_dsi_vdo_ilitek_nt50358_3lane_hdp1600_lcm_drv;
-extern LCM_DRIVER jd9365_hd720_dsi_lcm_drv;
-extern LCM_DRIVER otm1901a_fhd_dsi_vdo_tpv_lcm_drv;
-extern LCM_DRIVER r63350a_fhd_dsi_vdo_truly_lcm_drv;
-extern LCM_DRIVER nt35532_fhd_dsi_vdo_sharp_lcm_drv;
-extern LCM_DRIVER es6311_anx6585_zigzag_wxga_lcm_drv;
-extern LCM_DRIVER ili9881h_hdp_dsi_vdo_ilitek_rt5081_19_9_lcm_drv;
-extern LCM_DRIVER nt36672ah_hdp_dsi_vdo_tcl_csot_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_auo_rt4801_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_fhd_auo_rt4801_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_hdp_auo_rt4801_lcm_drv;
-/*6785 hx vdo*/
-extern LCM_DRIVER hx83112b_fhdp_dsi_vdo_auo_rt4801_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_vdo_fhd_auo_rt4801_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_vdo_hdp_auo_rt4801_lcm_drv;
-/*6785 otm vdo*/
-extern LCM_DRIVER otm1911a_fhdp_dsi_vdo_truly_rt4801_lcm_drv;
-extern LCM_DRIVER otm1911a_fhdp_dsi_vdo_fhd_truly_rt4801_lcm_drv;
-extern LCM_DRIVER otm1911a_fhdp_dsi_vdo_hdp_truly_rt4801_lcm_drv;
-/*6768 otm vdo */
-extern LCM_DRIVER otm1911a_fhdp_dsi_vdo_truly_rt5081_lcm_drv;
-extern LCM_DRIVER otm1911a_fhdp_dsi_vdo_truly_rt5081_hdp_lcm_drv;
-extern LCM_DRIVER otm1911a_fhdp_dsi_vdo_truly_rt5081_hdp_1560_lcm_drv;
-extern LCM_DRIVER sofeg01_fhdplus_dsi_cmd_samsung_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_auo_rt5081_lcm_drv;
-extern LCM_DRIVER ili9881c_hd720_td_tchd5031_6b_dsi_vdo_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_vdo_auo_rt5081_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_auo_rt5081_fhd_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_auo_rt5081_hdp_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_cmd_auo_rt5081_hdp_1560_lcm_drv;
-extern LCM_DRIVER hx83112b_fhdp_dsi_vdo_auo_rt5081_hdp_lcm_drv;
-extern LCM_DRIVER td4320_fhdp_dsi_vdo_auo_rt5081_lcm_drv;
-extern LCM_DRIVER td4320_fhdp_dsi_vdo_auo_rt4801_lcm_drv;
-extern LCM_DRIVER ft8201_wxga_vdo_incell_boe_lcm_drv;
-extern LCM_DRIVER nt51021h_wuxga_vdo_oncell_boe_lcm_drv;
-extern LCM_DRIVER nt36672a_fhdp_dsi_vdo_auo_cphy_lcm_drv;
-extern LCM_DRIVER nt36672c_fhdp_dsi_vdo_auo_cphy_lcm_drv;
-extern LCM_DRIVER nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_jdi_lcm_drv;
-extern LCM_DRIVER nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_tianma_lcm_drv;
-extern LCM_DRIVER nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_jdi_hfp_lcm_drv;
-extern LCM_DRIVER nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_tianma_hfp_lcm_drv;
-
-LCM_DRIVER *lcm_driver_list[] = {
-
-#if defined(NT36672AH_HDP_DSI_VDO_TCL_CSOT)
-	&nt36672ah_hdp_dsi_vdo_tcl_csot_lcm_drv,
-#endif
-#if defined(ILI9881C_HD_DSI_VDO_ILITEK_NT50358_3LANE)
-	&ili9881c_hd_dsi_vdo_ilitek_nt50358_3lane_lcm_drv,
-#endif
-#if defined(ILI9881C_HD_DSI_VDO_ILITEK_NT50358_3LANE_HDP1600)
-	&ili9881c_hd_dsi_vdo_ilitek_nt50358_3lane_hdp1600_lcm_drv,
-#endif
-#if defined(NT35595_FHD_DSI_CMD_TRULY_8163)
-	&nt35595_fhd_dsi_cmd_truly_8163_lcm_drv,
-#endif
-
-#if defined(OTM1284A_HD720_DSI_VDO_TM)
-	&otm1284a_hd720_dsi_vdo_tm_lcm_drv,
-#endif
-#if defined(R69338_FHD_DSI_VDO_JDI)
-	&r69338_fhd_dsi_vdo_jdi_drv,
-#endif
-#if defined(FT8707_FHD_DSI_VDO_LGD)
-	&ft8707_fhd_dsi_vdo_lgd_drv,
-#endif
-
-#if defined(OTM1285A_HD720_DSI_VDO_TM)
-	&otm1285a_hd720_dsi_vdo_tm_lcm_drv,
-#endif
-
-#if defined(EK79007_WSVGALNL_DSI_VDO)
-	&ek79007_wsvgalnl_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT71397_WUXGA_DSI_VDO_NT65902)
-	&nt71397_wuxga_dsi_vdo_nt65902_lcm_drv,
-#endif
-
-#if defined(S6E3FA2_FHD1080_DSI_VDO)
-	&s6e3fa2_fhd1080_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(OTM1283A_HD720_DSI_VDO_TM)
-	&otm1283a_hd720_dsi_vdo_tm_lcm_drv,
-#endif
-#if defined(IT6151_LP079QX1_EDP_DSI_VIDEO)
-	&it6151_lp079qx1_edp_dsi_video_lcm_drv,
-#endif
-
-#if defined(VVX10F008B00_WUXGA_DSI_VDO)
-	&vvx10f008b00_wuxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(KD070D5450NHA6_RGB_DPI)
-	&kd070d5450nha6_rgb_dpi_lcm_drv,
-#endif
-
-#if defined(KR101IA2S_DSI_VDO)
-	&kr101ia2s_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(KR070IA4T_DSI_VDO)
-	&kr070ia4t_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8394A_HD720_DSI_VDO_TIANMA_V2)
-	&hx8394a_hd720_dsi_vdo_tianma_v2_lcm_drv,
-#endif
-
-#if defined(OTM1283A)
-	&otm1283a_6589_hd_dsi,
-#endif
-#if defined(OTM1282A_HD720_DSI_VDO_60HZ)
-	&otm1282a_hd720_dsi_vdo_60hz_lcm_drv,
-#endif
-#if defined(OTM8018B_DSI_VDO_TXD_FWVGA)
-	&otm8018b_dsi_vdo_txd_fwvga_lcm_drv,
-#endif
-
-#if defined(TF070MC_RGB_V18_MT6571)
-	&tf070mc_rgb_v18_mt6571_lcm_drv,
-#endif
-
-#if defined(ZS070IH5015B3H6_RGB_MT6571)
-	&zs070ih5015b3h6_mt6571_lcm_drv,
-#endif
-
-#if defined(OTM1282A_HD720_DSI_VDO)
-	&otm1282a_hd720_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT36672_FHDP_DSI_VDO_AUO)
-	&nt36672_fhdp_dsi_vdo_auo_lcm_drv,
-#endif
-
-#if defined(NT36672_FHDP_DSI_VDO_AUO_LANESWAP)
-	&nt36672_fhdp_dsi_vdo_auo_laneswap_lcm_drv,
-#endif
-
-#if defined(R63311_FHD_DSI_VDO)
-	&r63311_fhd_dsi_vedio_lcm_drv,
-#endif
-
-#if defined(R63315_FHD_DSI_VDO_TRULY)
-	&r63315_fhd_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(NT35517_QHD_DSI_VDO)
-	&nt35517_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(ILI9881C_HD_DSI_VDO_ILITEK_NT50358)
-	&ili9881c_hd_dsi_vdo_ilitek_nt50358_lcm_drv,
-#endif
-
-#if defined(ILI9806E_DSI_VDO_FWVGA)
-	&ili9806e_dsi_vdo_fwvga_drv,
-#endif
-
-#if defined(LP079X01)
-	&lp079x01_lcm_drv,
-#endif
-
-#if defined(HX8369)
-	&hx8369_lcm_drv,
-#endif
-
-#if defined(HX8369_6575)
-	&hx8369_6575_lcm_drv,
-#endif
-
-#if defined(HX8394D_WXGA_DSI_VIDEO_KD)
-	&hx8394d_wxga_kd_lcm_drv,
-#endif
-
-#if defined(BM8578)
-	&bm8578_lcm_drv,
-#endif
-
-#if defined(NT35582_MCU)
-	&nt35582_mcu_lcm_drv,
-#endif
-
-#if defined(NT35582_MCU_6575)
-	&nt35582_mcu_6575_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD_TRULY2)
-	&nt35590_hd720_dsi_cmd_truly2_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_VDO_TRULY)
-	&nt35590_hd720_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(SSD2075_HD720_DSI_VDO_TRULY)
-	&ssd2075_hd720_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD)
-	&nt35590_hd720_dsi_cmd_drv,
-#endif
-
-#if defined(NT35521_HD_DSI_VDO_TRULY_NT50358)
-	&nt35521_hd_dsi_vdo_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35521_HD_DSI_VDO_TRULY_NT50358_FWVGA)
-	&nt35521_hd_dsi_vdo_truly_nt50358_fwvga_lcm_drv,
-#endif
-
-#if defined(NT35521_HD_DSI_VDO_TRULY_NT50358_QHD)
-	&nt35521_hd_dsi_vdo_truly_nt50358_qhd_lcm_drv,
-#endif
-
-#if defined(NT35521_HD_DSI_VDO_TRULY_RT5081)
-	&nt35521_hd_dsi_vdo_truly_rt5081_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD_AUO)
-	&nt35590_hd720_dsi_cmd_auo_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD_AUO_WVGA)
-	&nt35590_hd720_dsi_cmd_auo_wvga_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD_AUO_QHD)
-	&nt35590_hd720_dsi_cmd_auo_qhd_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD_AUO_FWVGA)
-	&nt35590_hd720_dsi_cmd_auo_fwvga_lcm_drv,
-#endif
-
-#if defined(NT35590_HD720_DSI_CMD_CMI)
-	&nt35590_hd720_dsi_cmd_cmi_lcm_drv,
-#endif
-
-#if defined(NT35582_RGB_6575)
-	&nt35582_rgb_6575_lcm_drv,
-#endif
-
-#if  defined(NT51012_HD720_DSI_VDO)
-	&nt51012_hd720_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8369_RGB_6585_FPGA)
-	&hx8369_rgb_6585_fpga_lcm_drv,
-#endif
-
-#if defined(HX8369_RGB_6572_FPGA)
-	&hx8369_rgb_6572_fpga_lcm_drv,
-#endif
-
-#if defined(HX8369_MCU_6572)
-	&hx8369_mcu_6572_lcm_drv,
-#endif
-
-#if defined(HX8369A_WVGA_DSI_CMD)
-	&hx8369a_wvga_dsi_cmd_drv,
-#endif
-
-#if defined(HX8369A_WVGA_DSI_VDO)
-	&hx8369a_wvga_dsi_vdo_drv,
-#endif
-
-#if defined(HX8357B)
-	&hx8357b_lcm_drv,
-#endif
-
-#if defined(HX8357C_HVGA_DSI_CMD)
-	&hx8357c_hvga_dsi_cmd_drv,
-#endif
-
-#if defined(R61408)
-	&r61408_lcm_drv,
-#endif
-
-#if defined(R61408_WVGA_DSI_CMD)
-	&r61408_wvga_dsi_cmd_drv,
-#endif
-
-#if defined(HX8369_DSI_VDO)
-	&hx8369_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8369_DSI)
-	&hx8369_dsi_lcm_drv,
-#endif
-
-#if defined(HX8369_6575_DSI)
-	&hx8369_dsi_6575_lcm_drv,
-#endif
-
-#if defined(HX8369_6575_DSI_NFC_ZTE)
-	&hx8369_dsi_6575_lcm_drv,
-#endif
-
-#if defined(HX8369_6575_DSI_HVGA)
-	&hx8369_dsi_6575_hvga_lcm_drv,
-#endif
-
-#if defined(HX8369_6575_DSI_QVGA)
-	&hx8369_dsi_6575_qvga_lcm_drv,
-#endif
-
-#if defined(HX8369_HVGA)
-	&hx8369_hvga_lcm_drv,
-#endif
-
-#if defined(NT35510)
-	&nt35510_lcm_drv,
-#endif
-
-#if defined(NT35510_RGB_6575)
-	&nt35510_dpi_lcm_drv,
-#endif
-
-#if defined(NT35510_HVGA)
-	&nt35510_hvga_lcm_drv,
-#endif
-
-#if defined(NT35510_QVGA)
-	&nt35510_qvga_lcm_drv,
-#endif
-
-#if defined(NT35510_WVGA_DSI_CMD)
-	&nt35510_wvga_dsi_cmd_drv,
-#endif
-
-#if defined(NT35510_6517)
-	&nt35510_6517_lcm_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6572)
-	&nt35510_dsi_cmd_6572_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6572_HVGA)
-	&nt35510_dsi_cmd_6572_hvga_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6572_FWVGA)
-	&nt35510_dsi_cmd_6572_fwvga_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6572_QVGA)
-	&nt35510_dsi_cmd_6572_qvga_drv,
-#endif
-
-#if defined(NT35510_DSI_VDO_6572)
-	&nt35510_dsi_vdo_6572_drv,
-#endif
-
-#if defined(NT35510_DPI_6572)
-	&nt35510_dpi_6572_lcm_drv,
-#endif
-
-#if defined(NT35510_MCU_6572)
-	&nt35510_mcu_6572_lcm_drv,
-#endif
-
-#if defined(ILI9481)
-	&ili9481_lcm_drv,
-#endif
-
-#if defined(NT35582)
-	&nt35582_lcm_drv,
-#endif
-
-#if defined(S6D0170)
-	&s6d0170_lcm_drv,
-#endif
-
-#if defined(SPFD5461A)
-	&spfd5461a_lcm_drv,
-#endif
-
-#if defined(TA7601)
-	&ta7601_lcm_drv,
-#endif
-
-#if defined(TFT1P3037)
-	&tft1p3037_lcm_drv,
-#endif
-
-#if defined(HA5266)
-	&ha5266_lcm_drv,
-#endif
-
-#if defined(HSD070IDW1)
-	&hsd070idw1_lcm_drv,
-#endif
-
-#if defined(HX8363_6575_DSI)
-	&hx8363_6575_dsi_lcm_drv,
-#endif
-
-#if defined(HX8363_6575_DSI_HVGA)
-	&hx8363_6575_dsi_hvga_lcm_drv,
-#endif
-
-#if defined(HX8363B_WVGA_DSI_CMD)
-	&hx8363b_wvga_dsi_cmd_drv,
-#endif
-
-#if defined(LG4571)
-	&lg4571_lcm_drv,
-#endif
-
-#if defined(LG4573B_WVGA_DSI_VDO_LH430MV1)
-	&lg4573b_wvga_dsi_vdo_lh430mv1_drv,
-#endif
-
-#if defined(LVDS_WSVGA)
-	&lvds_wsvga_lcm_drv,
-#endif
-
-#if defined(LVDS_WSVGA_TI)
-	&lvds_wsvga_ti_lcm_drv,
-#endif
-
-#if defined(LVDS_WSVGA_TI_N)
-	&lvds_wsvga_ti_n_lcm_drv,
-#endif
-
-#if defined(NT35565_3D)
-	&nt35565_3d_lcm_drv,
-#endif
-
-#if defined(TM070DDH03)
-	&tm070ddh03_lcm_drv,
-#endif
-#if defined(R63303_IDISPLAY)
-	&r63303_idisplay_lcm_drv,
-#endif
-
-#if defined(HX8369B_DSI_VDO)
-	&hx8369b_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8369B_WVGA_DSI_VDO)
-	&hx8369b_wvga_dsi_vdo_drv,
-#endif
-
-#if defined(HX8369B_QHD_DSI_VDO)
-	&hx8389b_qhd_dsi_vdo_drv,
-#endif
-
-#if defined(HX8389B_HD720_DSI_VDO)
-	&hx8389b_hd720_dsi_vdo_drv,
-#endif
-
-#if defined(GN_SSD2825_SMD_S6E8AA)
-	&gn_ssd2825_smd_s6e8aa,
-#endif
-#if defined(HX8369_TM_DSI)
-	&hx8369_dsi_tm_lcm_drv,
-#endif
-
-#if defined(HX8369_BLD_DSI)
-	&hx8369_dsi_bld_lcm_drv,
-#endif
-
-#if defined(HJ080IA)
-	&hj080ia_lcm_drv,
-#endif
-
-#if defined(HJ101NA02A)
-	&hj101na02a_lcm_drv,
-#endif
-
-#if defined(HJ101NA02A_8135)
-	&hj101na02a_8135_lcm_drv,
-#endif
-
-#if defined(HSD070PFW3)
-	&hsd070pfw3_lcm_drv,
-#endif
-
-#if defined(HSD070PFW3_8135)
-	&hsd070pfw3_8135_lcm_drv,
-#endif
-
-#if defined(EJ101IA)
-	&ej101ia_lcm_drv,
-#endif
-
-#if defined(SCF0700M48GGU02)
-	&scf0700m48ggu02_lcm_drv,
-#endif
-
-#if defined(OTM1280A_HD720_DSI_CMD)
-	&otm1280a_hd720_dsi_cmd_drv,
-#endif
-
-#if defined(OTM8018B_DSI_VDO)
-	&otm8018b_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT35512_DSI_VDO)
-	&nt35512_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT35512_WVGA_DSI_VDO_BOE)
-	&nt35512_wvga_dsi_vdo_boe_drv,
-#endif
-
-#if defined(HX8389C_DSI_VDO)
-	&hx8389c_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD)
-	&hx8392a_dsi_cmd_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD_3LANE)
-	&hx8392a_dsi_cmd_3lane_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD_WVGA)
-	&hx8392a_dsi_cmd_wvga_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD_FWVGA)
-	&hx8392a_dsi_cmd_fwvga_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD_FWVGAP)
-	&hx8392a_dsi_cmd_fwvgap_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD_FWVGA_PLUS)
-	&hx8392a_dsi_cmd_fwvga_plus_lcm_drv,
-#endif
-#if defined(HX8392A_DSI_CMD_QHD)
-	&hx8392a_dsi_cmd_qhd_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_CMD_HDPLUS)
-	&hx8392a_dsi_cmd_hdplus_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_VDO)
-	&hx8392a_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_VDO_2LANE)
-	&hx8392a_dsi_vdo_2lane_lcm_drv,
-#endif
-
-#if defined(HX8392A_DSI_VDO_3LANE)
-	&hx8392a_dsi_vdo_3lane_lcm_drv,
-#endif
-
-#if defined(NT35516_QHD_DSI_CMD_IPSBOE)
-	&nt35516_qhd_dsi_cmd_ipsboe_lcm_drv,
-#endif
-
-#if defined(NT35516_QHD_DSI_CMD_IPSBOE_WVGA)
-	&nt35516_qhd_dsi_cmd_ipsboe_wvga_lcm_drv,
-#endif
-
-#if defined(NT35516_QHD_DSI_CMD_IPSBOE_FWVGA)
-	&nt35516_qhd_dsi_cmd_ipsboe_fwvga_lcm_drv,
-#endif
-
-#if defined(NT35516_QHD_DSI_CMD_IPS9K1431)
-	&nt35516_qhd_dsi_cmd_ips9k1431_drv,
-#endif
-
-#if defined(NT35516_QHD_DSI_CMD_TFT9K1342)
-	&nt35516_qhd_dsi_cmd_tft9k1342_drv,
-#endif
-
-#if defined(NT35516_QHD_DSI_VEDIO)
-	&nt35516_qhd_rav4_lcm_drv,
-#endif
-
-#if defined(BP070WS1)
-	&bp070ws1_lcm_drv,
-#endif
-
-#if defined(BP101WX1)
-	&bp101wx1_lcm_drv,
-#endif
-
-#if defined(BP101WX1_N)
-	&bp101wx1_n_lcm_drv,
-#endif
-
-#if defined(CM_N070ICE_DSI_VDO)
-	&cm_n070ice_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(CM_N070ICE_DSI_VDO_MT8135)
-	&cm_n070ice_dsi_vdo_mt8135_lcm_drv,
-#endif
-
-#if defined(CM_OTC3108BH161_DSI_VDO)
-	&cm_otc3108bhv161_dsi_vdo_lcm_drv,
-#endif
-#if defined(NT35510_FWVGA)
-	&nt35510_fwvga_lcm_drv,
-#endif
-
-#if defined(R63311_FHD_DSI_VDO_SHARP)
-	&r63311_fhd_dsi_vdo_sharp_lcm_drv,
-#endif
-
-#if defined(R81592_HVGA_DSI_CMD)
-	&r81592_hvga_dsi_cmd_drv,
-#endif
-
-#if defined(RM68190_QHD_DSI_VDO)
-	&rm68190_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT35596_FHD_DSI_VDO_TRULY)
-	&nt35596_fhd_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_VDO_TRULY)
-	&nt35595_fhd_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(R63319_WQHD_DSI_VDO_TRULY)
-	&r63319_wqhd_dsi_vdo_truly_lcm_drv,
-#endif
-
-
-#if defined(NT35598_WQHD_DSI_VDO_TRULY)
-	&nt35598_wqhd_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_TPS65132)
-	&nt35595_fhd_dsi_cmd_truly_tps65132_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_VDO_TRULY_TPS65132)
-	&nt35595_fhd_dsi_vdo_truly_tps65132_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_TPS65132_720P)
-	&nt35595_fhd_dsi_cmd_truly_tps65132_720p_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY)
-	&nt35595_fhd_dsi_cmd_truly_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_VDO_TRULY_NT50358)
-	&nt35595_fhd_dsi_vdo_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_720P)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_720p_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_QHD)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_qhd_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_FWVGA)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_fwvga_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_WVGA)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_wvga_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_6735)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_6735_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_6735_720P)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_6735_720p_lcm_drv,
-#endif
-
-#if defined(NT35596_FHD_DSI_VDO_YASSY)
-	&nt35596_fhd_dsi_vdo_yassy_lcm_drv,
-#endif
-
-#if defined(NT35596_HD720_DSI_VDO_TRULY_TPS65132)
-	&nt35596_hd720_dsi_vdo_truly_tps65132_lcm_drv,
-#endif
-
-#if defined(AUO_B079XAT02_DSI_VDO)
-	&auo_b079xat02_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(OTM9608_WVGA_DSI_CMD)
-	&otm9608_wvga_dsi_cmd_drv,
-#endif
-
-#if defined(OTM9608_FWVGA_DSI_CMD)
-	&otm9608_fwvga_dsi_cmd_drv,
-#endif
-
-#if defined(OTM9608_QHD_DSI_CMD)
-	&otm9608_qhd_dsi_cmd_drv,
-#endif
-
-#if defined(OTM9608_QHD_DSI_VDO)
-	&otm9608_qhd_dsi_vdo_drv,
-#endif
-
-#if defined(NT35510_DBI_18BIT_GIONEE)
-	&nt35510_dbi_18bit_gionee_lcm_drv,
-#endif
-
-#if defined(OTM8009A_FWVGA_DSI_CMD_TIANMA)
-	&otm8009a_fwvga_dsi_cmd_tianma_lcm_drv,
-#endif
-
-#if defined(OTM8009A_FWVGA_DSI_VDO_TIANMA)
-	&otm8009a_fwvga_dsi_vdo_tianma_lcm_drv,
-#endif
-
-#if defined(HX8389B_QHD_DSI_VDO_TIANMA)
-	&hx8389b_qhd_dsi_vdo_tianma_lcm_drv,
-#endif
-#if defined(HX8389B_QHD_DSI_VDO_TIANMA055XDHP)
-	&hx8389b_qhd_dsi_vdo_tianma055xdhp_lcm_drv,
-#endif
-
-#if defined(CPT_CLAA101FP01_DSI_VDO)
-	&cpt_claa101fp01_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(CPT_CLAA101FP01_DSI_VDO_8163)
-	&cpt_claa101fp01_dsi_vdo_8163_lcm_drv,
-#endif
-
-#if defined(IT6151_EDP_DSI_VIDEO_SHARP)
-	&it6151_edp_dsi_video_sharp_lcm_drv,
-#endif
-
-#if defined(CPT_CLAP070WP03XG_SN65DSI83)
-	&cpt_clap070wp03xg_sn65dsi83_lcm_drv,
-#endif
-#if defined(NT35520_HD720_DSI_CMD_TM)
-	&nt35520_hd720_tm_lcm_drv,
-#endif
-#if defined(NT35520_HD720_DSI_CMD_BOE)
-	&nt35520_hd720_boe_lcm_drv,
-#endif
-#if defined(NT35521_HD720_DSI_VDO_BOE)
-	&nt35521_hd720_dsi_vdo_boe_lcm_drv,
-#endif
-#if defined(NT35521_HD720_DSI_VIDEO_TM)
-	&nt35521_hd720_tm_lcm_drv,
-#endif
-#if defined(NT35521_WXGA_DSI_VIDEO_INNOLUX)
-	&nt35521_wxga_innolux_lcm_drv,
-#endif
-#if defined(R69338_HD720_DSI_VDO_JDI_DW8755A)
-	&r69338_hd720_dsi_vdo_jdi_dw8755a_drv,
-#endif
-#if defined(H070D_18DM)
-	&h070d_18dm_lcm_drv,
-#endif
-#if defined(R69429_WUXGA_DSI_VDO)
-	&r69429_wuxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(HX8394D_HD720_DSI_VDO_TIANMA)
-	&hx8394d_hd720_dsi_vdo_tianma_lcm_drv,
-#endif
-
-#if defined(HX8394A_HD720_DSI_VDO_TIANMA)
-	&hx8394a_hd720_dsi_vdo_tianma_lcm_drv,
-#endif
-
-#if defined(R69429_WUXGA_DSI_CMD)
-	&r69429_wuxga_dsi_cmd_lcm_drv,
-#endif
-
-#if defined(RM68210_HD720_DSI_UFOE_CMD)
-	&rm68210_hd720_dsi_ufoe_cmd_lcm_drv,
-#endif
-
-#if defined(CLAP070WP03XG_LVDS_8163)
-	&clap070wp03xg_lvds_8163_lcm_drv,
-#endif
-
-#if defined(CPT_CLAP070WP03XG_LVDS)
-	&cpt_clap070wp03xg_lvds_lcm_drv,
-#endif
-
-#if defined(OTM8018B_DSI_VDO_LCSH72)
-	&otm8018b_dsi_vdo_lcsh72_lcm_drv,
-#endif
-
-#if defined(HX8369_DSI_CMD_6571)
-	&hx8369_dsi_cmd_6571_lcm_drv,
-#endif
-
-#if defined(HX8369_DSI_VDO_6571)
-	&hx8369_dsi_vdo_6571_lcm_drv,
-#endif
-
-#if defined(RX_498HX_615B_82)
-	&RX_498HX_615B_82_lcm_drv,
-#endif
-
-#if defined(HX8369_DBI_6571)
-	&hx8369_dbi_6571_lcm_drv,
-#endif
-#if defined(RX_498HX_615B)
-	&RX_498HX_615B_lcm_drv,
-#endif
-
-#if defined(HX8369_DPI_6571)
-	&hx8369_dpi_6571_lcm_drv,
-#endif
-
-#if defined(HX8389B_QHD_DSI_VDO_LGD)
-	&hx8389b_qhd_dsi_vdo_lgd_lcm_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6571)
-	&nt35510_dsi_cmd_6571_lcm_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6571_HVGA)
-	&nt35510_dsi_cmd_6571_hvga_lcm_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD_6571_QVGA)
-	&nt35510_dsi_cmd_6571_qvga_lcm_drv,
-#endif
-
-#if defined(NT35510_DSI_VDO_6571)
-	&nt35510_dsi_vdo_6571_lcm_drv,
-#endif
-
-#if defined(NT35510_DBI_6571)
-	&nt35510_dbi_6571_lcm_drv,
-#endif
-
-#if defined(NT35510_DPI_6571)
-	&nt35510_dpi_6571_lcm_drv,
-#endif
-
-#if defined(NT35590_DSI_CMD_6571_FWVGA)
-	&nt35590_dsi_cmd_6571_fwvga_lcm_drv,
-#endif
-
-#if defined(NT35590_DSI_CMD_6571_QHD)
-	&nt35590_dsi_cmd_6571_qhd_lcm_drv,
-#endif
-
-#if defined(NT35517_QHD_DSI_VIDEO)
-	&nt35517_qhd_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(IT6151_FHD_EDP_DSI_VIDEO_AUO)
-	&it6151_fhd_edp_dsi_video_auo_lcm_drv,
-#endif
-
-#if defined(A080EAN01_DSI_VDO)
-	&a080ean01_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(IT6121_G156XW01V1_LVDS_VDO)
-	&it6121_g156xw01v1_lvds_vdo_lcm_drv,
-#endif
-
-#if defined(ILI9806C_DSI_VDO_DJN_FWVGA)
-	&ili9806c_dsi_vdo_djn_fwvga_lcm_drv,
-#endif
-
-#if defined(R69338_HD720_DSI_VDO_JDI)
-	&r69338_hd720_dsi_vdo_jdi_drv,
-#endif
-
-#if defined(R69338_HD720_5IN_DSI_VDO_JDI_DW8768)
-	&r69338_hd720_5in_dsi_vdo_jdi_dw8768_drv,
-#endif
-
-#if defined(DB7436_DSI_VDO_FWVGA)
-	&db7436_dsi_vdo_fwvga_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358)
-	&r63417_fhd_dsi_cmd_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(CM_N070ICE_DSI_VDO_MT8173)
-	&cm_n070ice_dsi_vdo_mt8173_lcm_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_HDPLUS)
-	&r63417_fhd_dsi_cmd_truly_nt50358_hdplus_lcm_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_HDP1600)
-	&r63417_fhd_dsi_cmd_truly_nt50358_hdp1600_lcm_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_720P)
-	&r63417_fhd_dsi_cmd_truly_nt50358_720p_lcm_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_QHD)
-	&r63417_fhd_dsi_cmd_truly_nt50358_qhd_lcm_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_FWVGA)
-	&r63417_fhd_dsi_cmd_truly_nt50358_fwvga_lcm_drv,
-#endif
-
-#if defined(R63417_FHD_DSI_VDO_TRULY_NT50358)
-	&r63417_fhd_dsi_vdo_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(R63419_WQHD_TRULY_PHANTOM_2K_CMD_OK)
-	&r63419_wqhd_truly_phantom_cmd_lcm_drv,
-#endif
-
-#if defined(R63419_WQHD_TRULY_PHANTOM_2K_CMD_OK_WS3142)
-	&r63419_wqhd_truly_phantom_cmd_lcm_drv,
-#endif
-
-#if defined(R63419_WQHD_TRULY_PHANTOM_2K_VDO_OK)
-	&r63419_wqhd_truly_phantom_vdo_lcm_drv,
-#endif
-
-#if defined(R63419_WQHD_TRULY_PHANTOM_2K_VDO_OK_WS3142)
-	&r63419_wqhd_truly_phantom_vdo_lcm_drv,
-#endif
-
-#if defined(R63419_FHD_TRULY_PHANTOM_2K_CMD_OK)
-	&r63419_fhd_truly_phantom_lcm_drv,
-#endif
-
-#if defined(R63419_FHD_TRULY_PHANTOM_2K_CMD_OK_WS3142)
-	&r63419_fhd_truly_phantom_lcm_drv,
-#endif
-
-#if defined(R63423_WQHD_TRULY_PHANTOM_2K_CMD_OK)
-	&r63423_wqhd_truly_phantom_lcm_drv,
-#endif
-
-#if defined(NT35523_WXGA_DSI_VDO_BOE)
-	&nt35523_wxga_dsi_vdo_boe_lcm_drv,
-#endif
-
-#if defined(NT35523_WXGA_DSI_VDO_8163)
-        &nt35523_wxga_dsi_vdo_8163_lcm_drv,
-#endif
-
-#if defined(NT35523_WSVGA_DSI_VDO_BOE)
-	&nt35523_wsvga_dsi_vdo_boe_lcm_drv,
-#endif
-
-#if defined(EK79023_DSI_WSVGA_VDO)
-	&ek79023_dsi_wsvga_vdo_lcm_drv,
-#endif
-
-#if defined(OTM9605A_QHD_DSI_VDO)
-	&otm9605a_qhd_dsi_vdo_drv,
-#endif
-
-#if defined(OTM1906A_FHD_DSI_CMD_AUTO)
-	&otm1906a_fhd_dsi_cmd_auto_lcm_drv,
-#endif
-
-#if defined(CLAP070WP03XG_LVDS)
-	&clap070wp03xg_lvds_lcm_drv,
-#endif
-
-#if defined(JD936X_WXGA_DSI_VDO)
-	&jd9366_wxga_dsi_vdo_fiti_kd_lcm_drv,
-#endif
-
-#if defined(S6D7AA0_WXGA_DSI_VDO)
-	&s6d7aa0_wxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(SY20810800210132_WUXGA_DSI_VDO)
-	&sy20810800210132_wuxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(OTM1906B_FHD_DSI_CMD_JDI_TPS65132)
-	&otm1906b_fhd_dsi_cmd_jdi_tps65132_lcm_drv,
-#endif
-
-#if defined(OTM1906B_FHD_DSI_CMD_JDI_TPS65132_MT6797)
-	&otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797_lcm_drv,
-#endif
-
-#if defined(OTM1906B_FHD_DSI_VDO_JDI_TPS65132_MT6797)
-        &otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797_lcm_drv,
-#endif
-
-#if defined(HX8394C_WXGA_DSI_VDO)
-	&hx8394c_wxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(IT6151_LP079QX1_EDP_DSI_VIDEO_8163EVB)
-	&it6151_lp079qx1_edp_dsi_video_8163evb_lcm_drv,
-#endif
-
-#if defined(NT35510_DSI_CMD)
-	&nt35510_dsi_cmd_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_TRULY_NT50358)
-	&nt35695B_fhd_dsi_cmd_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_TRULY_NT50358)
-	&nt35695_fhd_dsi_cmd_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_NT50358)
-	&nt35695_fhd_dsi_vdo_truly_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_TRULY_NT50358_LANESWAP)
-	&nt35695_fhd_dsi_cmd_truly_nt50358_laneswap_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_NT50358_LANESWAP)
-	&nt35695_fhd_dsi_vdo_truly_nt50358_laneswap_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_TRULY_NT50358_720P)
-	&nt35695_fhd_dsi_cmd_truly_nt50358_720p_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_NT50358_720P_EXTERN)
-	&nt35695B_fhd_dsi_cmd_auo_nt50358_720p_extern_lcm_drv,
-#endif
-
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_NT50358_720P)
-	&nt35695_fhd_dsi_vdo_truly_nt50358_720p_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_TRULY_NT50358_QHD)
-	&nt35695_fhd_dsi_cmd_truly_nt50358_qhd_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_TRULY_RT4801)
-	&nt35695_fhd_dsi_cmd_truly_rt4801_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_TRULY_RT5081)
-	&nt35695_fhd_dsi_cmd_truly_rt5081_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_HDP)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_hdp_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_HDP_19_9)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_hdp_19_9_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_HDP_1560)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_hdp_1560_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_HDP_1680)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_hdp_1680_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_HDP_20_9)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_hdp_20_9_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_720P)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_720p_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_TRULY_RT5081_QHD)
-	&nt35695_fhd_dsi_vdo_truly_rt5081_qhd_lcm_drv,
-#endif
-#if defined(NT35695B_FHD_DSI_CMD_TRULY_RT5081)
-	&nt35695B_fhd_dsi_cmd_truly_rt5081_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_TRULY_RT5081_720P)
-	&nt35695B_fhd_dsi_cmd_truly_rt5081_720p_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_TRULY_RT5081_QHD)
-	&nt35695B_fhd_dsi_cmd_truly_rt5081_qhd_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_RT4801)
-	&nt35695B_fhd_dsi_cmd_auo_rt4801_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_RT5081)
-	&nt35695B_fhd_dsi_cmd_auo_rt5081_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_RT5081_720P)
-	&nt35695B_fhd_dsi_cmd_auo_rt5081_720p_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_RT5081_QHD)
-	&nt35695B_fhd_dsi_cmd_auo_rt5081_qhd_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_RT5081_HDP)
-	&nt35695B_fhd_dsi_cmd_auo_rt5081_hdp_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_RT5081_HDP_19_9)
-	&nt35695B_fhd_dsi_cmd_auo_rt5081_hdp_19_9_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081)
-	&nt35695B_fhd_dsi_vdo_auo_rt5081_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_720P)
-	&nt35695B_fhd_dsi_vdo_auo_rt5081_720p_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_QHD)
-	&nt35695B_fhd_dsi_vdo_auo_rt5081_qhd_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_HDP)
-	&nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_HDP_19_9)
-	&nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_19_9_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_HDP_1560)
-    &nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_1560_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_HDP_1680)
-    &nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_1680_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_RT5081_HDP_20_9)
-	&nt35695B_fhd_dsi_vdo_auo_rt5081_hdp_20_9_lcm_drv,
-#endif
-
-#if defined(RM69032_DSI_CMD)
-	&rm69032_dsi_cmd_lcm_drv,
-#endif
-
-#if defined(ST7789H2_DBI)
-	&st7789h2_dbi_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_EXTERN)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_extern_lcm_drv,
-#endif
-
-#if defined(NT35595_FHD_DSI_CMD_TRULY_NT50358_2TH)
-	&nt35595_fhd_dsi_cmd_truly_nt50358_2th_lcm_drv,
-#endif
-
-#if  defined(R69429_WQXGA_DSI_VDO)
-	&r69429_wqxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT35595_TRULY_FHD_DSI_VDO)
-	&nt35595_truly_fhd_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(CPT_CLAP070WP03XG_WXGA_LVDS)
-	&cpt_clap070wp03xg_wxga_lvds_lcm_drv,
-#endif
-
-#if defined(B080UAN01_2_WUXGA_DSI_VDO)
-	&b080uan01_2_wuxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT36850_WQHD_DSI_2K_CMD)
-    &nt36850_wqhd_dsi_2k_cmd_lcm_drv,
-#endif
-
-#if defined(S6E3HA3_WQHD_2K_CMD)
-    &s6e3ha3_wqhd_2k_cmd_lcm_drv,
-#endif
-
-#if defined(S6E3FA3_FHD_CMD)
-    &s6e3fa3_fhd_cmd_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_AUO_NT50358_LANESWAP)
-    &nt35695_fhd_dsi_cmd_auo_nt50358_laneswap_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_AUO_NT50358_LANESWAP)
-    &nt35695_fhd_dsi_vdo_auo_nt50358_laneswap_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_CMD_AUO_NT50358_LANESWAP_MT6799)
-    &nt35695_fhd_dsi_cmd_auo_nt50358_laneswap_mt6799_lcm_drv,
-#endif
-
-#if defined(NT35695_FHD_DSI_VDO_AUO_NT50358_LANESWAP_MT6799)
-    &nt35695_fhd_dsi_vdo_auo_nt50358_laneswap_mt6799_lcm_drv,
-#endif
-
-#if defined(AUO_WUXGA_DSI_VDO)
-	&auo_wuxga_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_NT50358)
-	&nt35695B_fhd_dsi_cmd_auo_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_VDO_AUO_NT50358)
-	&nt35695B_fhd_dsi_vdo_auo_nt50358_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_NT50358_720P)
-	&nt35695B_fhd_dsi_cmd_auo_nt50358_720p_lcm_drv,
-#endif
-
-#if defined(CLAA101FP01_DSI_VDO)
-	&claa101fp01_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(R61322_FHD_DSI_VDO_SHARP_LFR)
-	&r61322_fhd_dsi_vdo_sharp_lfr_lcm_drv,
-#endif
-
-#if defined(S6E3HA3_WQHD_2K_CMD_LANESWAP)
-	&s6e3ha3_wqhd_2k_cmd_laneswap_drv,
-#endif
-
-#if defined(NT36380_WQHD_VDO_OK)
-	&nt36380_wqhd_vdo_lcm_drv,
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_NT50358_HDP)
-	&nt35695B_fhd_dsi_cmd_auo_nt50358_hdp_lcm_drv,
-
-#endif
-
-#if defined(NT35695B_FHD_DSI_CMD_AUO_NT50358_QHD)
-	&nt35695B_fhd_dsi_cmd_auo_nt50358_qhd_lcm_drv,
-#endif
-
-#if defined(OTM1287_WXGA_DSI_VDO_AUO_GUOXIAN)
-	&otm1287_wxga_dsi_vdo_auo_guoxian_lcm_drv,
-#endif
-
-#if defined(JD9365_WXGA_DSI_VDO_HSD_PINGBO)
-	&jd9365_wxga_dsi_vdo_hsd_pingbo_lcm_drv,
-#endif
-
-#if defined(ILI9881C_HDP_DSI_VDO_ILITEK_RT5081)
-	&ili9881c_hdp_dsi_vdo_ilitek_rt5081_lcm_drv,
-#endif
-
-#if defined(OPPO_TIANMA_TD4310_FHDP_DSI_VDO_RT5081)
-	&oppo_tianma_td4310_fhdp_dsi_vdo_rt5081_lcm_drv,
-#endif
-
-#if defined(NT36672_FHDP_DSI_VDO_TIANMA_NT50358)
-    &nt36672_fhdp_dsi_vdo_tianma_nt50358_lcm_drv,
-#endif
-
-#if defined(OPPO_TIANMA_TD4310_FHDP_DSI_VDO_NT50358)
-	&oppo_tianma_td4310_fhdp_dsi_vdo_nt50358_lcm_drv,
-#endif
-
-#if defined(JD9365_HD720_DSI)
-	&jd9365_hd720_dsi_lcm_drv,
-#endif
-
-#if defined(OTM1901A_FHD_DSI_VDO_TPV)
-	&otm1901a_fhd_dsi_vdo_tpv_lcm_drv,
-#endif
-
-#if defined(R63350A_FHD_DSI_VDO_TRULY)
-	&r63350a_fhd_dsi_vdo_truly_lcm_drv,
-#endif
-
-#if defined(NT35532_FHD_DSI_VDO_SHARP)
-	&nt35532_fhd_dsi_vdo_sharp_lcm_drv,
-#endif
-
-#if defined(ES6311_ANX6585_ZIGZAG_WXGA)
-	&es6311_anx6585_zigzag_wxga_lcm_drv,
-#endif
-
-#if defined(ILI9881H_HDP_DSI_VDO_ILITEK_RT5081_19_9)
-	&ili9881h_hdp_dsi_vdo_ilitek_rt5081_19_9_lcm_drv,
-#endif
-/*6785 hx cmd*/
-#if defined(HX83112B_FHDP_DSI_CMD_AUO_RT4801)
-	&hx83112b_fhdp_dsi_cmd_auo_rt4801_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_CMD_FHD_AUO_RT4801)
-	&hx83112b_fhdp_dsi_cmd_fhd_auo_rt4801_lcm_drv,
-#endif
-#if defined(HX83112B_FHDP_DSI_CMD_HDP_AUO_RT4801)
-	&hx83112b_fhdp_dsi_cmd_hdp_auo_rt4801_lcm_drv,
-#endif
-/*6785 hx vdo*/
-#if defined(HX83112B_FHDP_DSI_VDO_AUO_RT4801)
-	&hx83112b_fhdp_dsi_vdo_auo_rt4801_lcm_drv,
-#endif
-#if defined(HX83112B_FHDP_DSI_VDO_FHD_AUO_RT4801)
-	&hx83112b_fhdp_dsi_vdo_fhd_auo_rt4801_lcm_drv,
-#endif
-#if defined(HX83112B_FHDP_DSI_VDO_HDP_AUO_RT4801)
-	&hx83112b_fhdp_dsi_vdo_hdp_auo_rt4801_lcm_drv,
-#endif
-
-/*6785 otm vdo*/
-#if defined(OTM1911A_FHDP_DSI_VDO_TRULY_RT4801)
-	&otm1911a_fhdp_dsi_vdo_truly_rt4801_lcm_drv,
-#endif
-#if defined(OTM1911A_FHDP_DSI_VDO_FHD_TRULY_RT4801)
-	&otm1911a_fhdp_dsi_vdo_fhd_truly_rt4801_lcm_drv,
-#endif
-
-#if defined(OTM1911A_FHDP_DSI_VDO_HDP_TRULY_RT4801)
-	&otm1911a_fhdp_dsi_vdo_hdp_truly_rt4801_lcm_drv,
-#endif
-
-/*6768 otm vdo */
-#if defined(OTM1911A_FHDP_DSI_VDO_TRULY_RT5081)
-	&otm1911a_fhdp_dsi_vdo_truly_rt5081_lcm_drv,
-#endif
-
-#if defined(OTM1911A_FHDP_DSI_VDO_TRULY_RT5081_HDP)
-	&otm1911a_fhdp_dsi_vdo_truly_rt5081_hdp_lcm_drv,
-#endif
-
-#if defined(OTM1911A_FHDP_DSI_VDO_TRULY_RT5081_HDP_1560)
-	&otm1911a_fhdp_dsi_vdo_truly_rt5081_hdp_1560_lcm_drv,
-#endif
-
-#if defined(SOFEG01_FHDPLUS_DSI_CMD_SAMSUNG)
-	&sofeg01_fhdplus_dsi_cmd_samsung_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_CMD_AUO_RT5081)
-	&hx83112b_fhdp_dsi_cmd_auo_rt5081_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_VDO_AUO_RT5081)
-	&hx83112b_fhdp_dsi_vdo_auo_rt5081_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_CMD_AUO_RT5081_FHD)
-	&hx83112b_fhdp_dsi_cmd_auo_rt5081_fhd_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_CMD_AUO_RT5081_HDP)
-	&hx83112b_fhdp_dsi_cmd_auo_rt5081_hdp_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_CMD_AUO_RT5081_HDP_1560)
-	&hx83112b_fhdp_dsi_cmd_auo_rt5081_hdp_1560_lcm_drv,
-#endif
-
-#if defined(HX83112B_FHDP_DSI_VDO_AUO_RT5081_HDP)
-        &hx83112b_fhdp_dsi_vdo_auo_rt5081_hdp_lcm_drv,
-#endif
-
-#if defined(TD4320_FHDP_DSI_VDO_AUO_RT5081)
-	&td4320_fhdp_dsi_vdo_auo_rt5081_lcm_drv,
-#endif
-
-#if defined(TD4320_FHDP_DSI_VDO_AUO_RT4801)
-	&td4320_fhdp_dsi_vdo_auo_rt4801_lcm_drv,
-#endif
+extern LCM_DRIVER hct_otm1285a_dsi_vdo_hd_boe;
+extern LCM_DRIVER hct_ili9881_dsi_vdo_hd_cpt;
+extern LCM_DRIVER hct_hx8394f_dsi_vdo_hd_cmi;
+extern LCM_DRIVER hct_otm1282_dsi_vdo_hd_auo;
+extern LCM_DRIVER hct_rm68200_dsi_vdo_hd_cpt;
+extern LCM_DRIVER hct_nt35521s_dsi_vdo_hd_boe_50_xld;
+extern LCM_DRIVER hct_hx8394d_dsi_vdo_hd_cmi;
 
-#if defined(ILI9881C_HD720_TD_TCHD5031_6B_DSI_VDO)
-	&ili9881c_hd720_td_tchd5031_6b_dsi_vdo_lcm_drv,
-#endif
-
-#if defined(FT8201_WXGA_VDO_INCELL_BOE)
-	&ft8201_wxga_vdo_incell_boe_lcm_drv,
-#endif
-
-#if defined(NT51021H_WUXGA_VDO_ONCELL_BOE)
-	&nt51021h_wuxga_vdo_oncell_boe_lcm_drv,
-#endif
-
-#if defined(NT36672A_FHDP_DSI_VDO_AUO_CPHY)
-	&nt36672a_fhdp_dsi_vdo_auo_cphy_lcm_drv,
-#endif
-
-#if defined(NT36672C_FHDP_DSI_VDO_AUO_CPHY)
-	&nt36672c_fhdp_dsi_vdo_auo_cphy_lcm_drv,
-#endif
-
-#if defined(NT36672C_FHDP_DSI_VDO_AUO_CPHY_90HZ_JDI)
-	&nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_jdi_lcm_drv,
-#endif
-
-#if defined(NT36672C_FHDP_DSI_VDO_AUO_CPHY_90HZ_TIANMA)
-	&nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_tianma_lcm_drv,
-#endif
-
-#if defined(NT36672C_FHDP_DSI_VDO_AUO_CPHY_90HZ_JDI_HFP)
-	&nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_jdi_hfp_lcm_drv,
-#endif
-
-#if defined(NT36672C_FHDP_DSI_VDO_AUO_CPHY_90HZ_TIANMA_HFP)
-	&nt36672c_fhdp_dsi_vdo_auo_cphy_90hz_tianma_hfp_lcm_drv,
-#endif
-};
-
-#if defined(MTK_LCM_DEVICE_TREE_SUPPORT)
-unsigned char lcm_name_list[][128] = {
-#if defined(HX8392A_DSI_CMD)
-	"hx8392a_dsi_cmd",
-#endif
-
-#if defined(HX8392A_DSI_VDO)
-	"hx8392a_vdo_cmd",
-#endif
-
-#if defined(OTM9608_QHD_DSI_CMD)
-	"otm9608a_qhd_dsi_cmd",
-#endif
-
-#if defined(OTM9608_QHD_DSI_VDO)
-	"otm9608a_qhd_dsi_vdo",
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358)
-	"r63417_fhd_dsi_cmd_truly_nt50358_drv",
-#endif
-
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_HDPLUS)
-	"r63417_fhd_dsi_cmd_truly_nt50358_hdplus_drv",
+LCM_DRIVER *lcm_driver_list[] = {
+#if defined(HCT_OTM1285A_DSI_VDO_HD_BOE)
+       &hct_otm1285a_dsi_vdo_hd_boe,
 #endif
 
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_HDP1600)
-	"r63417_fhd_dsi_cmd_truly_nt50358_hdp1600_drv",
+#if defined(HCT_ILI9881_DSI_VDO_HD_CPT)
+       &hct_ili9881_dsi_vdo_hd_cpt,
 #endif
 
-#if defined(R63417_FHD_DSI_CMD_TRULY_NT50358_FWVGA)
-	"r63417_fhd_dsi_cmd_truly_nt50358_fwvga_drv",
+#if defined(HCT_HX8394F_DSI_VDO_HD_CMI)
+       &hct_hx8394f_dsi_vdo_hd_cmi,
 #endif
 
-#if defined(R63417_FHD_DSI_VDO_TRULY_NT50358)
-	"r63417_fhd_dsi_vdo_truly_nt50358_drv",
+#if defined(HCT_OTM1282_DSI_VDO_HD_AUO)
+       &hct_otm1282_dsi_vdo_hd_auo,
 #endif
 
-#if defined(R63419_WQHD_TRULY_PHANTOM_2K_CMD_OK_WS3142)
-	"r63419_wqhd_truly_phantom_2k_cmd_ok",
+#if defined(HCT_RM68200_DSI_VDO_HD_CPT)
+       &hct_rm68200_dsi_vdo_hd_cpt,
 #endif
 
-#if defined(NT35695_FHD_DSI_CMD_TRULY_NT50358)
-	"nt35695_fhd_dsi_cmd_truly_nt50358_drv",
+#if defined(HCT_NT35521S_DSI_VDO_HD_BOE_50_XLD)
+       &hct_nt35521s_dsi_vdo_hd_boe_50_xld,
 #endif
 
-#if defined(NT35521_HD_DSI_VDO_TRULY_RT5081)
-	"nt35521_hd_dsi_vdo_truly_rt5081_drv",
+#if defined(HCT_HX8394D_DSI_VDO_HD_CMI)
+       &hct_hx8394d_dsi_vdo_hd_cmi,
 #endif
-
 };
-#endif
 
 #define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__)
 #define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line)

BIN
dev/logo/hd720/hd720_kernel.bmp


BIN
dev/logo/hd720/hd720_uboot.bmp


+ 24 - 0
project/X5.mk

@@ -0,0 +1,24 @@
+LOCAL_DIR := $(GET_LOCAL_DIR)
+TARGET := X5
+MODULES += app/mt_boot \
+           dev/lcm
+MTK_EMMC_SUPPORT = yes
+DEFINES += MTK_NEW_COMBO_EMMC_SUPPORT
+MTK_KERNEL_POWER_OFF_CHARGING = yes
+MTK_LCM_PHYSICAL_ROTATION = 0
+CUSTOM_LK_LCM = "hct_hx8394f_dsi_vdo_hd_cmi hct_rm68200_dsi_vdo_hd_cpt hct_ili9881_dsi_vdo_hd_cpt hct_otm1282_dsi_vdo_hd_auo hct_otm1285a_dsi_vdo_hd_boe hct_nt35521s_dsi_vdo_hd_boe_50_xld hct_hx8394d_dsi_vdo_hd_cmi"
+MTK_SECURITY_SW_SUPPORT = yes
+MTK_SEC_FASTBOOT_UNLOCK_SUPPORT = yes
+MTK_VERIFIED_BOOT_SUPPORT = yes
+BOOT_LOGO := hd720
+#DEFINES += WITH_DEBUG_DCC=1
+#DEFINES += WITH_DEBUG_UART=1
+#DEFINES += WITH_DEBUG_FBCON=1
+#DEFINES += MACH_FPGA=y
+#DEFINES += MACH_FPGA_NO_DISPLAY
+TRUSTONIC_TEE_SUPPORT=no
+MTK_GOOGLE_TRUSTY_SUPPORT=no
+MTK_DM_VERITY_OFF = no
+MTK_MRDUMP_ENABLE := no
+MTK_USERIMAGES_USE_F2FS = yes
+SYSTEM_AS_ROOT = yes

BIN
target/X5/dct/dct/codegen.dws


+ 9 - 8
target/X5/include/target/cust_battery.h

@@ -21,7 +21,7 @@ typedef enum
 	Cust_CC_400MA  = 0xD,
 	Cust_CC_200MA  = 0xE,
 	Cust_CC_70MA   = 0xF,
-	Cust_CC_0MA	   = 0xDD
+	Cust_CC_0MA    = 0xDD
 }cust_charging_current_enum;
 
 typedef struct{	
@@ -38,8 +38,10 @@ typedef struct{
 #define RECHARGING_VOLTAGE      4110
 
 /* Charging Current Setting */
-#define USB_CHARGER_CURRENT					Cust_CC_450MA
-#define AC_CHARGER_CURRENT					Cust_CC_650MA	
+//#define USB_CHARGER_CURRENT					Cust_CC_450MA
+#define USB_CHARGER_CURRENT					Cust_CC_900MA
+//#define AC_CHARGER_CURRENT					Cust_CC_650MA
+#define AC_CHARGER_CURRENT					Cust_CC_1200MA		
 
 /* Battery Meter Solution */
 #define CONFIG_ADC_SOLUTION 	1
@@ -62,11 +64,9 @@ VBAT_TO_PERCENT Batt_VoltToPercent_Table[] = {
 
 /* Precise Tunning */
 //#define BATTERY_AVERAGE_SIZE 	600
-#define BATTERY_AVERAGE_SIZE 	60
-
-
+//#define BATTERY_AVERAGE_SIZE 	60
+#define BATTERY_AVERAGE_SIZE 	30 //fixed value
 #define CHARGING_IDLE_MODE	 1
-
 #define CHARGING_PICTURE	 1
 
 /* Common setting */
@@ -82,7 +82,8 @@ VBAT_TO_PERCENT Batt_VoltToPercent_Table[] = {
 #define BACKLIGHT_KEY 10					// camera key
 
 /* Teperature related setting */
-#define RBAT_PULL_UP_R             39000
+#define RBAT_PULL_UP_R             16900
+#define RBAT_PULL_DOWN_R	   27000
 #define RBAT_PULL_UP_VOLT          1800
 #define TBAT_OVER_CRITICAL_LOW     68237
 //#define TBAT_OVER_CRITICAL_LOW     483954