Merge "target: msm8226: Fix spmi lockup issue"
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 23a0736..4b887f0 100755
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -65,7 +65,6 @@
 #include "mmc.h"
 #include "devinfo.h"
 #include "board.h"
-
 #include "scm.h"
 
 extern  bool target_use_signed_kernel(void);
@@ -124,7 +123,7 @@
 /* Assuming unauthorized kernel image by default */
 static int auth_kernel_img = 0;
 
-static device_info device = {DEVICE_MAGIC, 0, 0, 0};
+static device_info device = {DEVICE_MAGIC, 0, 0, 0, 0};
 
 struct atag_ptbl_entry
 {
@@ -161,6 +160,7 @@
 char charger_screen_enabled[MAX_RSP_SIZE];
 char sn_buf[13];
 char display_panel_buf[MAX_PANEL_BUF_SIZE];
+char panel_display_mode[MAX_RSP_SIZE];
 
 extern int emmc_recovery_init(void);
 
@@ -521,6 +521,12 @@
 	/* Perform target specific cleanup */
 	target_uninit();
 
+	/* Turn off splash screen if enabled */
+#if DISPLAY_SPLASH_SCREEN
+	target_display_shutdown();
+#endif
+
+
 	dprintf(INFO, "booting linux @ %p, ramdisk @ %p (%d), tags/device tree @ %p\n",
 		entry, ramdisk, ramdisk_size, tags_phys);
 
@@ -604,6 +610,49 @@
 	}
 }
 
+static bool check_format_bit()
+{
+	bool ret = false;
+	int index;
+	uint64_t offset;
+	struct boot_selection_info *in = NULL;
+	char *buf = NULL;
+
+	index = partition_get_index("bootselect");
+	if (index == INVALID_PTN)
+	{
+		dprintf(INFO, "Unable to locate /bootselect partition\n");
+		return ret;
+	}
+	offset = partition_get_offset(index);
+	if(!offset)
+	{
+		dprintf(INFO, "partition /bootselect doesn't exist\n");
+		return ret;
+	}
+	buf = (char *) memalign(CACHE_LINE, ROUNDUP(page_size, CACHE_LINE));
+	ASSERT(buf);
+	if (mmc_read(offset, (unsigned int *)buf, page_size))
+	{
+		dprintf(INFO, "mmc read failure /bootselect %d\n", page_size);
+		free(buf);
+		return ret;
+	}
+	in = (struct boot_selection_info *) buf;
+	if ((in->signature == BOOTSELECT_SIGNATURE) &&
+			(in->version == BOOTSELECT_VERSION)) {
+		if ((in->state_info & BOOTSELECT_FORMAT) &&
+				!(in->state_info & BOOTSELECT_FACTORY))
+			ret = true;
+	} else {
+		dprintf(CRITICAL, "Signature: 0x%08x or version: 0x%08x mismatched of /bootselect\n",
+				in->signature, in->version);
+		ASSERT(0);
+	}
+	free(buf);
+	return ret;
+}
+
 int boot_linux_from_mmc(void)
 {
 	struct boot_img_hdr *hdr = (void*) buf;
@@ -626,6 +675,9 @@
 	uint32_t dt_actual;
 	uint32_t dt_hdr_size;
 #endif
+	if (check_format_bit())
+		boot_into_recovery = 1;
+
 	if (!boot_into_recovery) {
 		memset(ffbm_mode_string, '\0', sizeof(ffbm_mode_string));
 		rcode = get_ffbm(ffbm_mode_string, sizeof(ffbm_mode_string));
@@ -1914,6 +1966,16 @@
 	fastboot_okay("");
 }
 
+void cmd_oem_select_display_panel(const char *arg, void *data, unsigned size)
+{
+	dprintf(INFO, "Selecting display panel %s\n", arg);
+	if (arg)
+		strlcpy(device.display_panel, arg,
+			sizeof(device.display_panel));
+	write_device_info(&device);
+	fastboot_okay("");
+}
+
 void cmd_oem_unlock(const char *arg, void *data, unsigned sz)
 {
 	if(!device.is_unlocked)
@@ -1926,13 +1988,15 @@
 
 void cmd_oem_devinfo(const char *arg, void *data, unsigned sz)
 {
-	char response[64];
+	char response[128];
 	snprintf(response, sizeof(response), "\tDevice tampered: %s", (device.is_tampered ? "true" : "false"));
 	fastboot_info(response);
 	snprintf(response, sizeof(response), "\tDevice unlocked: %s", (device.is_unlocked ? "true" : "false"));
 	fastboot_info(response);
 	snprintf(response, sizeof(response), "\tCharger screen enabled: %s", (device.charger_screen_enabled ? "true" : "false"));
 	fastboot_info(response);
+	snprintf(response, sizeof(response), "\tDisplay panel: %s", (device.display_panel));
+	fastboot_info(response);
 	fastboot_okay("");
 }
 
@@ -2145,6 +2209,8 @@
 			cmd_oem_enable_charger_screen);
 	fastboot_register("oem disable-charger-screen",
 			cmd_oem_disable_charger_screen);
+	fastboot_register("oem select-display-panel",
+			cmd_oem_select_display_panel);
 	/* publish variables and their values */
 	fastboot_publish("product",  TARGET(BOARD));
 	fastboot_publish("kernel",   "lk");
@@ -2168,6 +2234,10 @@
 			device.charger_screen_enabled);
 	fastboot_publish("charger-screen-enabled",
 			(const char *) charger_screen_enabled);
+	snprintf(panel_display_mode, MAX_RSP_SIZE, "%s",
+			device.display_panel);
+	fastboot_publish("display-panel",
+			(const char *) panel_display_mode);
 }
 
 void aboot_init(const struct app_descriptor *app)
@@ -2191,6 +2261,14 @@
 
 	read_device_info(&device);
 
+	/* Display splash screen if enabled */
+#if DISPLAY_SPLASH_SCREEN
+	dprintf(SPEW, "Display Init: Start\n");
+	target_display_init(device.display_panel);
+	dprintf(SPEW, "Display Init: Done\n");
+#endif
+
+
 	target_serialno((unsigned char *) sn_buf);
 	dprintf(SPEW,"serial number: %s\n",sn_buf);
 
diff --git a/app/aboot/devinfo.h b/app/aboot/devinfo.h
index 558aaf9..a0d8743 100644
--- a/app/aboot/devinfo.h
+++ b/app/aboot/devinfo.h
@@ -1,5 +1,5 @@
 /*
- * * Copyright (c) 2011, The Linux Foundation. All rights reserved.
+ * * Copyright (c) 2011,2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -34,6 +34,7 @@
 
 #define DEVICE_MAGIC "ANDROID-BOOT!"
 #define DEVICE_MAGIC_SIZE 13
+#define MAX_PANEL_ID_LEN 64
 
 struct device_info
 {
@@ -41,6 +42,7 @@
 	bool is_unlocked;
 	bool is_tampered;
 	bool charger_screen_enabled;
+	char display_panel[MAX_PANEL_ID_LEN];
 };
 
 #endif
diff --git a/app/aboot/fastboot.c b/app/aboot/fastboot.c
index 67bd760..b4e4922 100644
--- a/app/aboot/fastboot.c
+++ b/app/aboot/fastboot.c
@@ -2,7 +2,7 @@
  * Copyright (c) 2009, Google Inc.
  * All rights reserved.
  *
- * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -302,24 +302,38 @@
 static int usb_write(void *buf, unsigned len)
 {
 	int r;
+	uint32_t xfer;
+	unsigned char *_buf = buf;
+	int count = 0;
 
 	if (fastboot_state == STATE_ERROR)
 		goto oops;
 
-	req->buf = PA((addr_t)buf);
-	req->length = len;
-	req->complete = req_complete;
-	r = udc_request_queue(in, req);
-	if (r < 0) {
-		dprintf(INFO, "usb_write() queue failed\n");
-		goto oops;
+	while (len > 0) {
+		xfer = (len > MAX_USBFS_BULK_SIZE) ? MAX_USBFS_BULK_SIZE : len;
+		req->buf = PA((addr_t)_buf);
+		req->length = xfer;
+		req->complete = req_complete;
+		r = udc_request_queue(in, req);
+		if (r < 0) {
+			dprintf(INFO, "usb_write() queue failed\n");
+			goto oops;
+		}
+		event_wait(&txn_done);
+		if (txn_status < 0) {
+			dprintf(INFO, "usb_write() transaction failed\n");
+			goto oops;
+		}
+
+		count += req->length;
+		_buf += req->length;
+		len -= req->length;
+
+		/* short transfer? */
+		if (req->length != xfer) break;
 	}
-	event_wait(&txn_done);
-	if (txn_status < 0) {
-		dprintf(INFO, "usb_write() transaction failed\n");
-		goto oops;
-	}
-	return req->length;
+
+	return count;
 
 oops:
 	fastboot_state = STATE_ERROR;
diff --git a/app/aboot/recovery.h b/app/aboot/recovery.h
index fa034e0..204312b 100644
--- a/app/aboot/recovery.h
+++ b/app/aboot/recovery.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -29,11 +29,22 @@
 #ifndef _BOOTLOADER_RECOVERY_H
 #define _BOOTLOADER_RECOVERY_H
 
-#define UPDATE_MAGIC       "MSM-RADIO-UPDATE"
-#define UPDATE_MAGIC_SIZE  16
-#define UPDATE_VERSION     0x00010000
-#define FFBM_MODE_BUF_SIZE 8
+#define UPDATE_MAGIC         "MSM-RADIO-UPDATE"
+#define UPDATE_MAGIC_SIZE    16
+#define UPDATE_VERSION       0x00010000
+#define FFBM_MODE_BUF_SIZE   8
+#define BOOTSELECT_SIGNATURE ('B' | ('S' << 8) | ('e' << 16) | ('l' << 24))
+#define BOOTSELECT_VERSION   0x00010001
+#define BOOTSELECT_FORMAT    (1 << 31)
+#define BOOTSELECT_FACTORY   (1 << 30)
 
+/* bootselect partition format structure */
+struct boot_selection_info {
+	uint32_t signature;                // Contains value BOOTSELECT_SIGNATURE defined above
+	uint32_t version;
+	uint32_t boot_partition_selection; // Decodes which partitions to boot: 0-Windows,1-Android
+	uint32_t state_info;               // Contains factory and format bit as definded above
+};
 
 /* Recovery Message */
 struct recovery_message {
diff --git a/dev/gcdb/display/gcdb_display.c b/dev/gcdb/display/gcdb_display.c
index 52a6ae7..4a15406 100755
--- a/dev/gcdb/display/gcdb_display.c
+++ b/dev/gcdb/display/gcdb_display.c
@@ -257,11 +257,11 @@
 	memcpy(dsi_video_mode_phy_db.laneCfg, panel_lane_config, LANE_SIZE);
 }
 
-int gcdb_display_init(uint32_t rev, void *base)
+int gcdb_display_init(const char *panel_name, uint32_t rev, void *base)
 {
 	int ret = NO_ERROR;
 
-	if (!oem_panel_select(&panelstruct, &(panel.panel_info),
+	if (!oem_panel_select(panel_name, &panelstruct, &(panel.panel_info),
 				 &dsi_video_mode_phy_db)) {
 		dprintf(CRITICAL, "Target panel init not found!\n");
 		ret = ERR_NOT_SUPPORTED;
diff --git a/dev/gcdb/display/gcdb_display.h b/dev/gcdb/display/gcdb_display.h
index 6259896..b2fb974 100755
--- a/dev/gcdb/display/gcdb_display.h
+++ b/dev/gcdb/display/gcdb_display.h
@@ -58,7 +58,7 @@
 						struct msm_panel_info *pinfo);
 int target_ldo_ctrl(uint8_t enable);
 
-int gcdb_display_init(uint32_t rev, void *base);
+int gcdb_display_init(const char *panel_name, uint32_t rev, void *base);
 void gcdb_display_shutdown();
 
 #endif /*_GCDB_DISPLAY_H_ */
diff --git a/dev/gcdb/display/include/panel_jdi_1080p_video.h b/dev/gcdb/display/include/panel_jdi_1080p_video.h
index e390da4..187d85e 100755
--- a/dev/gcdb/display/include/panel_jdi_1080p_video.h
+++ b/dev/gcdb/display/include/panel_jdi_1080p_video.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -54,7 +54,7 @@
 /* Panel resolution                                                          */
 /*---------------------------------------------------------------------------*/
 static struct panel_resolution jdi_1080p_video_panel_res = {
-  1080, 1920, 96, 64, 16, 0, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  1080, 1920, 96, 64, 16, 0, 4, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
 /*---------------------------------------------------------------------------*/
@@ -149,7 +149,7 @@
 /* Panel Timing                                                              */
 /*---------------------------------------------------------------------------*/
 static const uint32_t jdi_1080p_video_timings[] = {
-  0xe1, 0x37, 0x25, 0x00, 0x67, 0x6b, 0x2a, 0x3a,  0x59, 0x03, 0x04, 0x00
+  0xe7, 0x36, 0x24, 0x00, 0x66, 0x6a, 0x2a, 0x3a,  0x2d, 0x03, 0x04, 0x00
 };
 
 
diff --git a/dev/gcdb/display/include/panel_nt35590_720p_video.h b/dev/gcdb/display/include/panel_nt35590_720p_video.h
index ce740a7..9dff1a3 100755
--- a/dev/gcdb/display/include/panel_nt35590_720p_video.h
+++ b/dev/gcdb/display/include/panel_nt35590_720p_video.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -54,7 +54,7 @@
 /* Panel resolution                                                          */
 /*---------------------------------------------------------------------------*/
 static struct panel_resolution nt35590_720p_video_panel_res = {
-  720, 1280, 140, 164, 8, 0, 6, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  720, 1280, 140, 164, 8, 0, 6, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
 /*---------------------------------------------------------------------------*/
@@ -2387,475 +2387,488 @@
 0x29, 0x00, 0xFF, 0xFF,  };
 
 
+static char nt35590_720p_video_on_cmd464[] = {
+0x02, 0x00, 0x29, 0xC0,
+0xFF, 0x00, 0xFF, 0xFF,  };
+
+
+static char nt35590_720p_video_on_cmd465[] = {
+0x06, 0x00, 0x29, 0xC0,
+0x3B, 0x03, 0x06, 0x03,
+0x02, 0x02, 0xFF, 0xFF,  };
+
+
 
 
 static struct mipi_dsi_cmd nt35590_720p_video_on_command[] = {
-{ 0x8 , nt35590_720p_video_on_cmd0},
-{ 0x8 , nt35590_720p_video_on_cmd1},
-{ 0x8 , nt35590_720p_video_on_cmd2},
-{ 0x8 , nt35590_720p_video_on_cmd3},
-{ 0x8 , nt35590_720p_video_on_cmd4},
-{ 0x8 , nt35590_720p_video_on_cmd5},
-{ 0x8 , nt35590_720p_video_on_cmd6},
-{ 0x8 , nt35590_720p_video_on_cmd7},
-{ 0x8 , nt35590_720p_video_on_cmd8},
-{ 0x8 , nt35590_720p_video_on_cmd9},
-{ 0x8 , nt35590_720p_video_on_cmd10},
-{ 0x8 , nt35590_720p_video_on_cmd11},
-{ 0x8 , nt35590_720p_video_on_cmd12},
-{ 0x8 , nt35590_720p_video_on_cmd13},
-{ 0x8 , nt35590_720p_video_on_cmd14},
-{ 0x8 , nt35590_720p_video_on_cmd15},
-{ 0x8 , nt35590_720p_video_on_cmd16},
-{ 0x8 , nt35590_720p_video_on_cmd17},
-{ 0x8 , nt35590_720p_video_on_cmd18},
-{ 0x8 , nt35590_720p_video_on_cmd19},
-{ 0x8 , nt35590_720p_video_on_cmd20},
-{ 0x8 , nt35590_720p_video_on_cmd21},
-{ 0x8 , nt35590_720p_video_on_cmd22},
-{ 0x8 , nt35590_720p_video_on_cmd23},
-{ 0x8 , nt35590_720p_video_on_cmd24},
-{ 0x8 , nt35590_720p_video_on_cmd25},
-{ 0x8 , nt35590_720p_video_on_cmd26},
-{ 0x8 , nt35590_720p_video_on_cmd27},
-{ 0x8 , nt35590_720p_video_on_cmd28},
-{ 0x8 , nt35590_720p_video_on_cmd29},
-{ 0x8 , nt35590_720p_video_on_cmd30},
-{ 0x8 , nt35590_720p_video_on_cmd31},
-{ 0x8 , nt35590_720p_video_on_cmd32},
-{ 0x8 , nt35590_720p_video_on_cmd33},
-{ 0x8 , nt35590_720p_video_on_cmd34},
-{ 0x8 , nt35590_720p_video_on_cmd35},
-{ 0x8 , nt35590_720p_video_on_cmd36},
-{ 0x8 , nt35590_720p_video_on_cmd37},
-{ 0x8 , nt35590_720p_video_on_cmd38},
-{ 0x8 , nt35590_720p_video_on_cmd39},
-{ 0x8 , nt35590_720p_video_on_cmd40},
-{ 0x8 , nt35590_720p_video_on_cmd41},
-{ 0x8 , nt35590_720p_video_on_cmd42},
-{ 0x8 , nt35590_720p_video_on_cmd43},
-{ 0x8 , nt35590_720p_video_on_cmd44},
-{ 0x8 , nt35590_720p_video_on_cmd45},
-{ 0x8 , nt35590_720p_video_on_cmd46},
-{ 0x8 , nt35590_720p_video_on_cmd47},
-{ 0x8 , nt35590_720p_video_on_cmd48},
-{ 0x8 , nt35590_720p_video_on_cmd49},
-{ 0x8 , nt35590_720p_video_on_cmd50},
-{ 0x8 , nt35590_720p_video_on_cmd51},
-{ 0x8 , nt35590_720p_video_on_cmd52},
-{ 0x8 , nt35590_720p_video_on_cmd53},
-{ 0x8 , nt35590_720p_video_on_cmd54},
-{ 0x8 , nt35590_720p_video_on_cmd55},
-{ 0x8 , nt35590_720p_video_on_cmd56},
-{ 0x8 , nt35590_720p_video_on_cmd57},
-{ 0x8 , nt35590_720p_video_on_cmd58},
-{ 0x8 , nt35590_720p_video_on_cmd59},
-{ 0x8 , nt35590_720p_video_on_cmd60},
-{ 0x8 , nt35590_720p_video_on_cmd61},
-{ 0x8 , nt35590_720p_video_on_cmd62},
-{ 0x8 , nt35590_720p_video_on_cmd63},
-{ 0x8 , nt35590_720p_video_on_cmd64},
-{ 0x8 , nt35590_720p_video_on_cmd65},
-{ 0x8 , nt35590_720p_video_on_cmd66},
-{ 0x8 , nt35590_720p_video_on_cmd67},
-{ 0x8 , nt35590_720p_video_on_cmd68},
-{ 0x8 , nt35590_720p_video_on_cmd69},
-{ 0x8 , nt35590_720p_video_on_cmd70},
-{ 0x8 , nt35590_720p_video_on_cmd71},
-{ 0x8 , nt35590_720p_video_on_cmd72},
-{ 0x8 , nt35590_720p_video_on_cmd73},
-{ 0x8 , nt35590_720p_video_on_cmd74},
-{ 0x8 , nt35590_720p_video_on_cmd75},
-{ 0x8 , nt35590_720p_video_on_cmd76},
-{ 0x8 , nt35590_720p_video_on_cmd77},
-{ 0x8 , nt35590_720p_video_on_cmd78},
-{ 0x8 , nt35590_720p_video_on_cmd79},
-{ 0x8 , nt35590_720p_video_on_cmd80},
-{ 0x8 , nt35590_720p_video_on_cmd81},
-{ 0x8 , nt35590_720p_video_on_cmd82},
-{ 0x8 , nt35590_720p_video_on_cmd83},
-{ 0x8 , nt35590_720p_video_on_cmd84},
-{ 0x8 , nt35590_720p_video_on_cmd85},
-{ 0x8 , nt35590_720p_video_on_cmd86},
-{ 0x8 , nt35590_720p_video_on_cmd87},
-{ 0x8 , nt35590_720p_video_on_cmd88},
-{ 0x8 , nt35590_720p_video_on_cmd89},
-{ 0x8 , nt35590_720p_video_on_cmd90},
-{ 0x8 , nt35590_720p_video_on_cmd91},
-{ 0x8 , nt35590_720p_video_on_cmd92},
-{ 0x8 , nt35590_720p_video_on_cmd93},
-{ 0x8 , nt35590_720p_video_on_cmd94},
-{ 0x8 , nt35590_720p_video_on_cmd95},
-{ 0x8 , nt35590_720p_video_on_cmd96},
-{ 0x8 , nt35590_720p_video_on_cmd97},
-{ 0x8 , nt35590_720p_video_on_cmd98},
-{ 0x8 , nt35590_720p_video_on_cmd99},
-{ 0x8 , nt35590_720p_video_on_cmd100},
-{ 0x8 , nt35590_720p_video_on_cmd101},
-{ 0x8 , nt35590_720p_video_on_cmd102},
-{ 0x8 , nt35590_720p_video_on_cmd103},
-{ 0x8 , nt35590_720p_video_on_cmd104},
-{ 0x8 , nt35590_720p_video_on_cmd105},
-{ 0x8 , nt35590_720p_video_on_cmd106},
-{ 0x8 , nt35590_720p_video_on_cmd107},
-{ 0x8 , nt35590_720p_video_on_cmd108},
-{ 0x8 , nt35590_720p_video_on_cmd109},
-{ 0x8 , nt35590_720p_video_on_cmd110},
-{ 0x8 , nt35590_720p_video_on_cmd111},
-{ 0x8 , nt35590_720p_video_on_cmd112},
-{ 0x8 , nt35590_720p_video_on_cmd113},
-{ 0x8 , nt35590_720p_video_on_cmd114},
-{ 0x8 , nt35590_720p_video_on_cmd115},
-{ 0x8 , nt35590_720p_video_on_cmd116},
-{ 0x8 , nt35590_720p_video_on_cmd117},
-{ 0x8 , nt35590_720p_video_on_cmd118},
-{ 0x8 , nt35590_720p_video_on_cmd119},
-{ 0x8 , nt35590_720p_video_on_cmd120},
-{ 0x8 , nt35590_720p_video_on_cmd121},
-{ 0x8 , nt35590_720p_video_on_cmd122},
-{ 0x8 , nt35590_720p_video_on_cmd123},
-{ 0x8 , nt35590_720p_video_on_cmd124},
-{ 0x8 , nt35590_720p_video_on_cmd125},
-{ 0x8 , nt35590_720p_video_on_cmd126},
-{ 0x8 , nt35590_720p_video_on_cmd127},
-{ 0x8 , nt35590_720p_video_on_cmd128},
-{ 0x8 , nt35590_720p_video_on_cmd129},
-{ 0x8 , nt35590_720p_video_on_cmd130},
-{ 0x8 , nt35590_720p_video_on_cmd131},
-{ 0x8 , nt35590_720p_video_on_cmd132},
-{ 0x8 , nt35590_720p_video_on_cmd133},
-{ 0x8 , nt35590_720p_video_on_cmd134},
-{ 0x8 , nt35590_720p_video_on_cmd135},
-{ 0x8 , nt35590_720p_video_on_cmd136},
-{ 0x8 , nt35590_720p_video_on_cmd137},
-{ 0x8 , nt35590_720p_video_on_cmd138},
-{ 0x8 , nt35590_720p_video_on_cmd139},
-{ 0x8 , nt35590_720p_video_on_cmd140},
-{ 0x8 , nt35590_720p_video_on_cmd141},
-{ 0x8 , nt35590_720p_video_on_cmd142},
-{ 0x8 , nt35590_720p_video_on_cmd143},
-{ 0x8 , nt35590_720p_video_on_cmd144},
-{ 0x8 , nt35590_720p_video_on_cmd145},
-{ 0x8 , nt35590_720p_video_on_cmd146},
-{ 0x8 , nt35590_720p_video_on_cmd147},
-{ 0x8 , nt35590_720p_video_on_cmd148},
-{ 0x8 , nt35590_720p_video_on_cmd149},
-{ 0x8 , nt35590_720p_video_on_cmd150},
-{ 0x8 , nt35590_720p_video_on_cmd151},
-{ 0x8 , nt35590_720p_video_on_cmd152},
-{ 0x8 , nt35590_720p_video_on_cmd153},
-{ 0x8 , nt35590_720p_video_on_cmd154},
-{ 0x8 , nt35590_720p_video_on_cmd155},
-{ 0x8 , nt35590_720p_video_on_cmd156},
-{ 0x8 , nt35590_720p_video_on_cmd157},
-{ 0x8 , nt35590_720p_video_on_cmd158},
-{ 0x8 , nt35590_720p_video_on_cmd159},
-{ 0x8 , nt35590_720p_video_on_cmd160},
-{ 0x8 , nt35590_720p_video_on_cmd161},
-{ 0x8 , nt35590_720p_video_on_cmd162},
-{ 0x8 , nt35590_720p_video_on_cmd163},
-{ 0x8 , nt35590_720p_video_on_cmd164},
-{ 0x8 , nt35590_720p_video_on_cmd165},
-{ 0x8 , nt35590_720p_video_on_cmd166},
-{ 0x8 , nt35590_720p_video_on_cmd167},
-{ 0x8 , nt35590_720p_video_on_cmd168},
-{ 0x8 , nt35590_720p_video_on_cmd169},
-{ 0x8 , nt35590_720p_video_on_cmd170},
-{ 0x8 , nt35590_720p_video_on_cmd171},
-{ 0x8 , nt35590_720p_video_on_cmd172},
-{ 0x8 , nt35590_720p_video_on_cmd173},
-{ 0x8 , nt35590_720p_video_on_cmd174},
-{ 0x8 , nt35590_720p_video_on_cmd175},
-{ 0x8 , nt35590_720p_video_on_cmd176},
-{ 0x8 , nt35590_720p_video_on_cmd177},
-{ 0x8 , nt35590_720p_video_on_cmd178},
-{ 0x8 , nt35590_720p_video_on_cmd179},
-{ 0x8 , nt35590_720p_video_on_cmd180},
-{ 0x8 , nt35590_720p_video_on_cmd181},
-{ 0x8 , nt35590_720p_video_on_cmd182},
-{ 0x8 , nt35590_720p_video_on_cmd183},
-{ 0x8 , nt35590_720p_video_on_cmd184},
-{ 0x8 , nt35590_720p_video_on_cmd185},
-{ 0x8 , nt35590_720p_video_on_cmd186},
-{ 0x8 , nt35590_720p_video_on_cmd187},
-{ 0x8 , nt35590_720p_video_on_cmd188},
-{ 0x8 , nt35590_720p_video_on_cmd189},
-{ 0x8 , nt35590_720p_video_on_cmd190},
-{ 0x8 , nt35590_720p_video_on_cmd191},
-{ 0x8 , nt35590_720p_video_on_cmd192},
-{ 0x8 , nt35590_720p_video_on_cmd193},
-{ 0x8 , nt35590_720p_video_on_cmd194},
-{ 0x8 , nt35590_720p_video_on_cmd195},
-{ 0x8 , nt35590_720p_video_on_cmd196},
-{ 0x8 , nt35590_720p_video_on_cmd197},
-{ 0x8 , nt35590_720p_video_on_cmd198},
-{ 0x8 , nt35590_720p_video_on_cmd199},
-{ 0x8 , nt35590_720p_video_on_cmd200},
-{ 0x8 , nt35590_720p_video_on_cmd201},
-{ 0x8 , nt35590_720p_video_on_cmd202},
-{ 0x8 , nt35590_720p_video_on_cmd203},
-{ 0x8 , nt35590_720p_video_on_cmd204},
-{ 0x8 , nt35590_720p_video_on_cmd205},
-{ 0x8 , nt35590_720p_video_on_cmd206},
-{ 0x8 , nt35590_720p_video_on_cmd207},
-{ 0x8 , nt35590_720p_video_on_cmd208},
-{ 0x8 , nt35590_720p_video_on_cmd209},
-{ 0x8 , nt35590_720p_video_on_cmd210},
-{ 0x8 , nt35590_720p_video_on_cmd211},
-{ 0x8 , nt35590_720p_video_on_cmd212},
-{ 0x8 , nt35590_720p_video_on_cmd213},
-{ 0x8 , nt35590_720p_video_on_cmd214},
-{ 0x8 , nt35590_720p_video_on_cmd215},
-{ 0x8 , nt35590_720p_video_on_cmd216},
-{ 0x8 , nt35590_720p_video_on_cmd217},
-{ 0x8 , nt35590_720p_video_on_cmd218},
-{ 0x8 , nt35590_720p_video_on_cmd219},
-{ 0x8 , nt35590_720p_video_on_cmd220},
-{ 0x8 , nt35590_720p_video_on_cmd221},
-{ 0x8 , nt35590_720p_video_on_cmd222},
-{ 0x8 , nt35590_720p_video_on_cmd223},
-{ 0x8 , nt35590_720p_video_on_cmd224},
-{ 0x8 , nt35590_720p_video_on_cmd225},
-{ 0x8 , nt35590_720p_video_on_cmd226},
-{ 0x8 , nt35590_720p_video_on_cmd227},
-{ 0x8 , nt35590_720p_video_on_cmd228},
-{ 0x8 , nt35590_720p_video_on_cmd229},
-{ 0x8 , nt35590_720p_video_on_cmd230},
-{ 0x8 , nt35590_720p_video_on_cmd231},
-{ 0x8 , nt35590_720p_video_on_cmd232},
-{ 0x8 , nt35590_720p_video_on_cmd233},
-{ 0x8 , nt35590_720p_video_on_cmd234},
-{ 0x8 , nt35590_720p_video_on_cmd235},
-{ 0x8 , nt35590_720p_video_on_cmd236},
-{ 0x8 , nt35590_720p_video_on_cmd237},
-{ 0x8 , nt35590_720p_video_on_cmd238},
-{ 0x8 , nt35590_720p_video_on_cmd239},
-{ 0x8 , nt35590_720p_video_on_cmd240},
-{ 0x8 , nt35590_720p_video_on_cmd241},
-{ 0x8 , nt35590_720p_video_on_cmd242},
-{ 0x8 , nt35590_720p_video_on_cmd243},
-{ 0x8 , nt35590_720p_video_on_cmd244},
-{ 0x8 , nt35590_720p_video_on_cmd245},
-{ 0x8 , nt35590_720p_video_on_cmd246},
-{ 0x8 , nt35590_720p_video_on_cmd247},
-{ 0x8 , nt35590_720p_video_on_cmd248},
-{ 0x8 , nt35590_720p_video_on_cmd249},
-{ 0x8 , nt35590_720p_video_on_cmd250},
-{ 0x8 , nt35590_720p_video_on_cmd251},
-{ 0x8 , nt35590_720p_video_on_cmd252},
-{ 0x8 , nt35590_720p_video_on_cmd253},
-{ 0x8 , nt35590_720p_video_on_cmd254},
-{ 0x8 , nt35590_720p_video_on_cmd255},
-{ 0x8 , nt35590_720p_video_on_cmd256},
-{ 0x8 , nt35590_720p_video_on_cmd257},
-{ 0x8 , nt35590_720p_video_on_cmd258},
-{ 0x8 , nt35590_720p_video_on_cmd259},
-{ 0x8 , nt35590_720p_video_on_cmd260},
-{ 0x8 , nt35590_720p_video_on_cmd261},
-{ 0x8 , nt35590_720p_video_on_cmd262},
-{ 0x8 , nt35590_720p_video_on_cmd263},
-{ 0x8 , nt35590_720p_video_on_cmd264},
-{ 0x8 , nt35590_720p_video_on_cmd265},
-{ 0x8 , nt35590_720p_video_on_cmd266},
-{ 0x8 , nt35590_720p_video_on_cmd267},
-{ 0x8 , nt35590_720p_video_on_cmd268},
-{ 0x8 , nt35590_720p_video_on_cmd269},
-{ 0x8 , nt35590_720p_video_on_cmd270},
-{ 0x8 , nt35590_720p_video_on_cmd271},
-{ 0x8 , nt35590_720p_video_on_cmd272},
-{ 0x8 , nt35590_720p_video_on_cmd273},
-{ 0x8 , nt35590_720p_video_on_cmd274},
-{ 0x8 , nt35590_720p_video_on_cmd275},
-{ 0x8 , nt35590_720p_video_on_cmd276},
-{ 0x8 , nt35590_720p_video_on_cmd277},
-{ 0x8 , nt35590_720p_video_on_cmd278},
-{ 0x8 , nt35590_720p_video_on_cmd279},
-{ 0x8 , nt35590_720p_video_on_cmd280},
-{ 0x8 , nt35590_720p_video_on_cmd281},
-{ 0x8 , nt35590_720p_video_on_cmd282},
-{ 0x8 , nt35590_720p_video_on_cmd283},
-{ 0x8 , nt35590_720p_video_on_cmd284},
-{ 0x8 , nt35590_720p_video_on_cmd285},
-{ 0x8 , nt35590_720p_video_on_cmd286},
-{ 0x8 , nt35590_720p_video_on_cmd287},
-{ 0x8 , nt35590_720p_video_on_cmd288},
-{ 0x8 , nt35590_720p_video_on_cmd289},
-{ 0x8 , nt35590_720p_video_on_cmd290},
-{ 0x8 , nt35590_720p_video_on_cmd291},
-{ 0x8 , nt35590_720p_video_on_cmd292},
-{ 0x8 , nt35590_720p_video_on_cmd293},
-{ 0x8 , nt35590_720p_video_on_cmd294},
-{ 0x8 , nt35590_720p_video_on_cmd295},
-{ 0x8 , nt35590_720p_video_on_cmd296},
-{ 0x8 , nt35590_720p_video_on_cmd297},
-{ 0x8 , nt35590_720p_video_on_cmd298},
-{ 0x8 , nt35590_720p_video_on_cmd299},
-{ 0x8 , nt35590_720p_video_on_cmd300},
-{ 0x8 , nt35590_720p_video_on_cmd301},
-{ 0x8 , nt35590_720p_video_on_cmd302},
-{ 0x8 , nt35590_720p_video_on_cmd303},
-{ 0x8 , nt35590_720p_video_on_cmd304},
-{ 0x8 , nt35590_720p_video_on_cmd305},
-{ 0x8 , nt35590_720p_video_on_cmd306},
-{ 0x8 , nt35590_720p_video_on_cmd307},
-{ 0x8 , nt35590_720p_video_on_cmd308},
-{ 0x8 , nt35590_720p_video_on_cmd309},
-{ 0x8 , nt35590_720p_video_on_cmd310},
-{ 0x8 , nt35590_720p_video_on_cmd311},
-{ 0x8 , nt35590_720p_video_on_cmd312},
-{ 0x8 , nt35590_720p_video_on_cmd313},
-{ 0x8 , nt35590_720p_video_on_cmd314},
-{ 0x8 , nt35590_720p_video_on_cmd315},
-{ 0x8 , nt35590_720p_video_on_cmd316},
-{ 0x8 , nt35590_720p_video_on_cmd317},
-{ 0x8 , nt35590_720p_video_on_cmd318},
-{ 0x8 , nt35590_720p_video_on_cmd319},
-{ 0x8 , nt35590_720p_video_on_cmd320},
-{ 0x8 , nt35590_720p_video_on_cmd321},
-{ 0x8 , nt35590_720p_video_on_cmd322},
-{ 0x8 , nt35590_720p_video_on_cmd323},
-{ 0x8 , nt35590_720p_video_on_cmd324},
-{ 0x8 , nt35590_720p_video_on_cmd325},
-{ 0x8 , nt35590_720p_video_on_cmd326},
-{ 0x8 , nt35590_720p_video_on_cmd327},
-{ 0x8 , nt35590_720p_video_on_cmd328},
-{ 0x8 , nt35590_720p_video_on_cmd329},
-{ 0x8 , nt35590_720p_video_on_cmd330},
-{ 0x8 , nt35590_720p_video_on_cmd331},
-{ 0x8 , nt35590_720p_video_on_cmd332},
-{ 0x8 , nt35590_720p_video_on_cmd333},
-{ 0x8 , nt35590_720p_video_on_cmd334},
-{ 0x8 , nt35590_720p_video_on_cmd335},
-{ 0x8 , nt35590_720p_video_on_cmd336},
-{ 0x8 , nt35590_720p_video_on_cmd337},
-{ 0x8 , nt35590_720p_video_on_cmd338},
-{ 0x8 , nt35590_720p_video_on_cmd339},
-{ 0x8 , nt35590_720p_video_on_cmd340},
-{ 0x8 , nt35590_720p_video_on_cmd341},
-{ 0x8 , nt35590_720p_video_on_cmd342},
-{ 0x8 , nt35590_720p_video_on_cmd343},
-{ 0x8 , nt35590_720p_video_on_cmd344},
-{ 0x8 , nt35590_720p_video_on_cmd345},
-{ 0x8 , nt35590_720p_video_on_cmd346},
-{ 0x8 , nt35590_720p_video_on_cmd347},
-{ 0x8 , nt35590_720p_video_on_cmd348},
-{ 0x8 , nt35590_720p_video_on_cmd349},
-{ 0x8 , nt35590_720p_video_on_cmd350},
-{ 0x8 , nt35590_720p_video_on_cmd351},
-{ 0x8 , nt35590_720p_video_on_cmd352},
-{ 0x8 , nt35590_720p_video_on_cmd353},
-{ 0x8 , nt35590_720p_video_on_cmd354},
-{ 0x8 , nt35590_720p_video_on_cmd355},
-{ 0x8 , nt35590_720p_video_on_cmd356},
-{ 0x8 , nt35590_720p_video_on_cmd357},
-{ 0x8 , nt35590_720p_video_on_cmd358},
-{ 0x8 , nt35590_720p_video_on_cmd359},
-{ 0x8 , nt35590_720p_video_on_cmd360},
-{ 0x8 , nt35590_720p_video_on_cmd361},
-{ 0x8 , nt35590_720p_video_on_cmd362},
-{ 0x8 , nt35590_720p_video_on_cmd363},
-{ 0x8 , nt35590_720p_video_on_cmd364},
-{ 0x8 , nt35590_720p_video_on_cmd365},
-{ 0x8 , nt35590_720p_video_on_cmd366},
-{ 0x8 , nt35590_720p_video_on_cmd367},
-{ 0x8 , nt35590_720p_video_on_cmd368},
-{ 0x8 , nt35590_720p_video_on_cmd369},
-{ 0x8 , nt35590_720p_video_on_cmd370},
-{ 0x8 , nt35590_720p_video_on_cmd371},
-{ 0x8 , nt35590_720p_video_on_cmd372},
-{ 0x8 , nt35590_720p_video_on_cmd373},
-{ 0x8 , nt35590_720p_video_on_cmd374},
-{ 0x8 , nt35590_720p_video_on_cmd375},
-{ 0x8 , nt35590_720p_video_on_cmd376},
-{ 0x8 , nt35590_720p_video_on_cmd377},
-{ 0x8 , nt35590_720p_video_on_cmd378},
-{ 0x8 , nt35590_720p_video_on_cmd379},
-{ 0x8 , nt35590_720p_video_on_cmd380},
-{ 0x8 , nt35590_720p_video_on_cmd381},
-{ 0x8 , nt35590_720p_video_on_cmd382},
-{ 0x8 , nt35590_720p_video_on_cmd383},
-{ 0x8 , nt35590_720p_video_on_cmd384},
-{ 0x8 , nt35590_720p_video_on_cmd385},
-{ 0x8 , nt35590_720p_video_on_cmd386},
-{ 0x8 , nt35590_720p_video_on_cmd387},
-{ 0x8 , nt35590_720p_video_on_cmd388},
-{ 0x8 , nt35590_720p_video_on_cmd389},
-{ 0x8 , nt35590_720p_video_on_cmd390},
-{ 0x8 , nt35590_720p_video_on_cmd391},
-{ 0x8 , nt35590_720p_video_on_cmd392},
-{ 0x8 , nt35590_720p_video_on_cmd393},
-{ 0x8 , nt35590_720p_video_on_cmd394},
-{ 0x8 , nt35590_720p_video_on_cmd395},
-{ 0x8 , nt35590_720p_video_on_cmd396},
-{ 0x8 , nt35590_720p_video_on_cmd397},
-{ 0x8 , nt35590_720p_video_on_cmd398},
-{ 0x8 , nt35590_720p_video_on_cmd399},
-{ 0x8 , nt35590_720p_video_on_cmd400},
-{ 0x8 , nt35590_720p_video_on_cmd401},
-{ 0x8 , nt35590_720p_video_on_cmd402},
-{ 0x8 , nt35590_720p_video_on_cmd403},
-{ 0x8 , nt35590_720p_video_on_cmd404},
-{ 0x8 , nt35590_720p_video_on_cmd405},
-{ 0x8 , nt35590_720p_video_on_cmd406},
-{ 0x8 , nt35590_720p_video_on_cmd407},
-{ 0x8 , nt35590_720p_video_on_cmd408},
-{ 0x8 , nt35590_720p_video_on_cmd409},
-{ 0x8 , nt35590_720p_video_on_cmd410},
-{ 0x8 , nt35590_720p_video_on_cmd411},
-{ 0x8 , nt35590_720p_video_on_cmd412},
-{ 0x8 , nt35590_720p_video_on_cmd413},
-{ 0x8 , nt35590_720p_video_on_cmd414},
-{ 0x8 , nt35590_720p_video_on_cmd415},
-{ 0x8 , nt35590_720p_video_on_cmd416},
-{ 0x8 , nt35590_720p_video_on_cmd417},
-{ 0x8 , nt35590_720p_video_on_cmd418},
-{ 0x8 , nt35590_720p_video_on_cmd419},
-{ 0x8 , nt35590_720p_video_on_cmd420},
-{ 0x8 , nt35590_720p_video_on_cmd421},
-{ 0x8 , nt35590_720p_video_on_cmd422},
-{ 0x8 , nt35590_720p_video_on_cmd423},
-{ 0x8 , nt35590_720p_video_on_cmd424},
-{ 0x8 , nt35590_720p_video_on_cmd425},
-{ 0x8 , nt35590_720p_video_on_cmd426},
-{ 0x8 , nt35590_720p_video_on_cmd427},
-{ 0x8 , nt35590_720p_video_on_cmd428},
-{ 0x8 , nt35590_720p_video_on_cmd429},
-{ 0x8 , nt35590_720p_video_on_cmd430},
-{ 0x8 , nt35590_720p_video_on_cmd431},
-{ 0x8 , nt35590_720p_video_on_cmd432},
-{ 0x8 , nt35590_720p_video_on_cmd433},
-{ 0x8 , nt35590_720p_video_on_cmd434},
-{ 0x8 , nt35590_720p_video_on_cmd435},
-{ 0x8 , nt35590_720p_video_on_cmd436},
-{ 0x8 , nt35590_720p_video_on_cmd437},
-{ 0x8 , nt35590_720p_video_on_cmd438},
-{ 0x8 , nt35590_720p_video_on_cmd439},
-{ 0x8 , nt35590_720p_video_on_cmd440},
-{ 0x8 , nt35590_720p_video_on_cmd441},
-{ 0x8 , nt35590_720p_video_on_cmd442},
-{ 0x8 , nt35590_720p_video_on_cmd443},
-{ 0x8 , nt35590_720p_video_on_cmd444},
-{ 0x8 , nt35590_720p_video_on_cmd445},
-{ 0x8 , nt35590_720p_video_on_cmd446},
-{ 0x8 , nt35590_720p_video_on_cmd447},
-{ 0x8 , nt35590_720p_video_on_cmd448},
-{ 0x8 , nt35590_720p_video_on_cmd449},
-{ 0x8 , nt35590_720p_video_on_cmd450},
-{ 0x8 , nt35590_720p_video_on_cmd451},
-{ 0x8 , nt35590_720p_video_on_cmd452},
-{ 0x8 , nt35590_720p_video_on_cmd453},
-{ 0x8 , nt35590_720p_video_on_cmd454},
-{ 0x8 , nt35590_720p_video_on_cmd455},
-{ 0x8 , nt35590_720p_video_on_cmd456},
-{ 0x8 , nt35590_720p_video_on_cmd457},
-{ 0x8 , nt35590_720p_video_on_cmd458},
-{ 0x8 , nt35590_720p_video_on_cmd459},
-{ 0x8 , nt35590_720p_video_on_cmd460},
-{ 0x8 , nt35590_720p_video_on_cmd461},
-{ 0x8 , nt35590_720p_video_on_cmd462},
-{ 0x8 , nt35590_720p_video_on_cmd463}
+{ 0x8 , nt35590_720p_video_on_cmd0,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd1,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd2,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd3,  0x10},
+{ 0x8 , nt35590_720p_video_on_cmd4,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd5,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd6,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd7,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd8,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd9,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd10,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd11,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd12,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd13,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd14,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd15,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd16,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd17,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd18,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd19,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd20,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd21,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd22,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd23,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd24,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd25,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd26,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd27,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd28,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd29,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd30,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd31,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd32,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd33,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd34,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd35,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd36,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd37,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd38,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd39,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd40,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd41,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd42,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd43,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd44,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd45,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd46,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd47,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd48,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd49,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd50,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd51,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd52,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd53,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd54,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd55,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd56,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd57,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd58,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd59,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd60,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd61,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd62,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd63,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd64,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd65,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd66,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd67,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd68,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd69,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd70,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd71,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd72,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd73,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd74,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd75,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd76,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd77,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd78,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd79,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd80,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd81,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd82,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd83,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd84,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd85,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd86,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd87,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd88,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd89,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd90,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd91,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd92,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd93,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd94,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd95,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd96,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd97,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd98,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd99,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd100,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd101,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd102,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd103,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd104,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd105,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd106,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd107,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd108,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd109,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd110,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd111,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd112,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd113,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd114,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd115,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd116,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd117,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd118,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd119,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd120,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd121,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd122,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd123,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd124,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd125,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd126,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd127,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd128,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd129,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd130,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd131,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd132,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd133,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd134,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd135,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd136,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd137,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd138,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd139,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd140,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd141,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd142,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd143,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd144,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd145,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd146,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd147,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd148,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd149,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd150,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd151,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd152,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd153,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd154,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd155,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd156,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd157,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd158,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd159,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd160,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd161,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd162,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd163,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd164,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd165,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd166,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd167,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd168,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd169,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd170,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd171,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd172,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd173,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd174,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd175,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd176,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd177,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd178,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd179,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd180,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd181,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd182,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd183,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd184,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd185,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd186,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd187,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd188,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd189,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd190,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd191,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd192,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd193,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd194,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd195,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd196,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd197,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd198,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd199,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd200,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd201,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd202,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd203,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd204,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd205,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd206,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd207,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd208,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd209,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd210,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd211,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd212,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd213,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd214,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd215,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd216,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd217,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd218,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd219,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd220,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd221,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd222,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd223,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd224,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd225,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd226,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd227,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd228,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd229,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd230,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd231,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd232,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd233,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd234,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd235,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd236,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd237,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd238,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd239,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd240,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd241,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd242,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd243,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd244,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd245,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd246,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd247,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd248,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd249,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd250,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd251,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd252,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd253,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd254,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd255,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd256,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd257,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd258,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd259,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd260,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd261,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd262,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd263,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd264,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd265,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd266,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd267,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd268,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd269,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd270,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd271,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd272,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd273,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd274,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd275,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd276,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd277,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd278,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd279,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd280,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd281,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd282,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd283,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd284,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd285,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd286,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd287,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd288,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd289,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd290,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd291,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd292,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd293,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd294,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd295,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd296,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd297,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd298,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd299,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd300,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd301,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd302,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd303,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd304,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd305,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd306,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd307,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd308,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd309,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd310,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd311,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd312,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd313,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd314,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd315,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd316,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd317,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd318,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd319,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd320,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd321,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd322,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd323,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd324,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd325,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd326,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd327,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd328,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd329,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd330,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd331,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd332,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd333,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd334,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd335,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd336,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd337,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd338,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd339,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd340,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd341,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd342,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd343,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd344,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd345,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd346,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd347,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd348,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd349,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd350,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd351,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd352,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd353,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd354,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd355,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd356,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd357,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd358,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd359,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd360,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd361,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd362,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd363,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd364,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd365,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd366,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd367,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd368,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd369,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd370,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd371,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd372,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd373,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd374,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd375,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd376,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd377,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd378,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd379,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd380,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd381,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd382,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd383,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd384,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd385,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd386,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd387,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd388,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd389,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd390,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd391,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd392,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd393,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd394,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd395,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd396,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd397,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd398,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd399,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd400,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd401,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd402,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd403,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd404,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd405,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd406,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd407,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd408,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd409,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd410,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd411,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd412,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd413,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd414,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd415,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd416,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd417,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd418,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd419,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd420,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd421,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd422,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd423,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd424,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd425,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd426,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd427,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd428,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd429,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd430,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd431,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd432,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd433,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd434,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd435,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd436,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd437,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd438,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd439,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd440,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd441,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd442,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd443,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd444,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd445,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd446,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd447,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd448,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd449,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd450,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd451,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd452,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd453,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd454,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd455,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd456,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd457,  0x64},
+{ 0x8 , nt35590_720p_video_on_cmd458,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd459,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd460,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd461,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd462,  0x00},
+{ 0x8 , nt35590_720p_video_on_cmd463,  0x78},
+{ 0x8 , nt35590_720p_video_on_cmd464,  0x00},
+{ 0xc , nt35590_720p_video_on_cmd465,  0x00}
 };
-#define NT35590_720P_VIDEO_ON_COMMAND 464
+#define NT35590_720P_VIDEO_ON_COMMAND 466
 
 
 static char nt35590_720p_videooff_cmd0[] = {
@@ -2869,8 +2882,8 @@
 
 
 static struct mipi_dsi_cmd nt35590_720p_video_off_command[] = {
-{ 0x4 , nt35590_720p_videooff_cmd0},
-{ 0x4 , nt35590_720p_videooff_cmd1}
+{ 0x4 , nt35590_720p_videooff_cmd0,  0x32},
+{ 0x4 , nt35590_720p_videooff_cmd1,  0x78}
 };
 #define NT35590_720P_VIDEO_OFF_COMMAND 2
 
diff --git a/dev/gcdb/display/panel_display.c b/dev/gcdb/display/panel_display.c
index 4651051..e34d966 100644
--- a/dev/gcdb/display/panel_display.c
+++ b/dev/gcdb/display/panel_display.c
@@ -38,6 +38,7 @@
 #include <err.h>
 #include <reg.h>
 #include <mdp5.h>
+#include <string.h>
 
 
 /*---------------------------------------------------------------------------*/
@@ -325,3 +326,28 @@
 
 	return ret;
 }
+
+int32_t panel_name_to_id(struct panel_list supp_panels[],
+			  uint32_t supp_panels_size,
+			  const char *panel_name)
+{
+	uint32_t i;
+	int32_t panel_id = ERR_NOT_FOUND;
+
+	if (!panel_name) {
+		dprintf(CRITICAL, "Invalid panel name\n");
+		return panel_id;
+	}
+
+	/* Remove any leading whitespaces */
+	panel_name += strspn(panel_name, " ");
+	for (i = 0; i < supp_panels_size; i++) {
+		if (!strncmp(panel_name, supp_panels[i].name,
+			MAX_PANEL_ID_LEN)) {
+			panel_id = supp_panels[i].id;
+			break;
+		}
+	}
+
+	return panel_id;
+}
diff --git a/dev/gcdb/display/panel_display.h b/dev/gcdb/display/panel_display.h
index d805715..676bd69 100755
--- a/dev/gcdb/display/panel_display.h
+++ b/dev/gcdb/display/panel_display.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -44,6 +44,8 @@
 #define DUAL_PIPE_FLAG 0x2
 #define PIPE_SWAP_FLAG 0x4
 #define SPLIT_DISPLAY_FLAG 0x8
+
+#define MAX_PANEL_ID_LEN 64
 /*---------------------------------------------------------------------------*/
 /* struct definition                                                         */
 /*---------------------------------------------------------------------------*/
@@ -60,6 +62,10 @@
 	struct backlight            *backlightinfo;
 };
 
+struct panel_list {
+	char name[MAX_PANEL_ID_LEN];
+	uint32_t id;
+};
 
 /*---------------------------------------------------------------------------*/
 /* API                                                                       */
@@ -79,4 +85,7 @@
 int oem_panel_on();
 int oem_panel_off();
 
+/* OEM support API */
+int32_t panel_name_to_id(struct panel_list supp_panels[],
+	uint32_t supp_panels_size, const char *panel_name);
 #endif /*_PLATFORM_DISPLAY_H_ */
diff --git a/dev/pmic/pm8x41/include/pm8x41.h b/dev/pmic/pm8x41/include/pm8x41.h
index 82d3c1d..512657f 100644
--- a/dev/pmic/pm8x41/include/pm8x41.h
+++ b/dev/pmic/pm8x41/include/pm8x41.h
@@ -201,8 +201,10 @@
 int pm8x41_ldo_control(struct pm8x41_ldo *ldo, uint8_t enable);
 uint8_t pm8x41_get_pmic_rev();
 uint8_t pm8x41_get_pon_reason();
+uint32_t pm8x41_get_pwrkey_is_pressed();
 void pm8x41_config_output_mpp(struct pm8x41_mpp *mpp);
 void pm8x41_enable_mpp(struct pm8x41_mpp *mpp, enum mpp_en_ctl enable);
 uint8_t pm8x41_get_is_cold_boot();
 void pm8x41_diff_clock_ctrl(uint8_t enable);
+void pm8x41_clear_pmic_watchdog(void);
 #endif
diff --git a/dev/pmic/pm8x41/include/pm8x41_hw.h b/dev/pmic/pm8x41/include/pm8x41_hw.h
index 7664f37..a1c2e6d 100644
--- a/dev/pmic/pm8x41/include/pm8x41_hw.h
+++ b/dev/pmic/pm8x41/include/pm8x41_hw.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -78,9 +78,11 @@
 #define PON_RESIN_N_RESET_S2_CTL              0x846  /* bit 7: S2_RESET_EN, bit 0:3 : RESET_TYPE  */
 #define PON_PS_HOLD_RESET_CTL                 0x85A  /* bit 7: S2_RESET_EN, bit 0:3 : RESET_TYPE  */
 #define PON_PS_HOLD_RESET_CTL2                0x85B
+#define PMIC_WD_RESET_S2_CTL2                 0x857
 
 /* PON Peripheral register bit values */
 #define RESIN_ON_INT_BIT                      1
+#define KPDPWR_ON_INT_BIT                     0
 #define RESIN_BARK_INT_BIT                    4
 #define S2_RESET_EN_BIT                       7
 
diff --git a/dev/pmic/pm8x41/include/pm_vib.h b/dev/pmic/pm8x41/include/pm_vib.h
new file mode 100644
index 0000000..9b10327
--- /dev/null
+++ b/dev/pmic/pm8x41/include/pm_vib.h
@@ -0,0 +1,38 @@
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __DEV_PMIC_VIB_VIBRATOR_H
+#define __DEV_PMIC_VIB_VIBRATOR_H
+
+#define QPNP_VIB_EN_CTL             0x1c046
+#define QPNP_VIB_VTG_CTL            0x1c041
+#define QPNP_VIB_VTG_SET_MASK       0x1F
+#define QPNP_VIB_DEFAULT_VTG_LVL    22
+
+void pm_vib_turn_on(void);
+void pm_vib_turn_off(void);
+#endif/* __DEV_PMIC_VIB_VIBRATOR_H */
diff --git a/dev/pmic/pm8x41/pm8x41.c b/dev/pmic/pm8x41/pm8x41.c
index 4ea7643..035c442 100644
--- a/dev/pmic/pm8x41/pm8x41.c
+++ b/dev/pmic/pm8x41/pm8x41.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -219,6 +219,19 @@
 	return (rt_sts & BIT(RESIN_ON_INT_BIT));
 }
 
+/* Return 1 if power key is pressed */
+uint32_t pm8x41_get_pwrkey_is_pressed()
+{
+	uint8_t pwr_sts = 0;
+
+	pwr_sts = REG_READ(PON_INT_RT_STS);
+
+	if (pwr_sts & BIT(KPDPWR_ON_INT_BIT))
+		return 1;
+	else
+		return 0;
+}
+
 void pm8x41_v2_reset_configure(uint8_t reset_type)
 {
 	uint8_t val;
@@ -461,3 +474,8 @@
 
 	return batt_is_broken;
 }
+
+void pm8x41_clear_pmic_watchdog(void)
+{
+	pm8x41_reg_write(PMIC_WD_RESET_S2_CTL2, 0x0);
+}
diff --git a/dev/pmic/pm8x41/pm8x41_vib.c b/dev/pmic/pm8x41/pm8x41_vib.c
new file mode 100644
index 0000000..7dbba77
--- /dev/null
+++ b/dev/pmic/pm8x41/pm8x41_vib.c
@@ -0,0 +1,60 @@
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <bits.h>
+#include <debug.h>
+#include <reg.h>
+#include <pm8x41.h>
+#include <pm_vib.h>
+
+#define QPNP_VIB_EN    BIT(7)
+
+/* Turn on vibrator */
+void pm_vib_turn_on(void)
+{
+	uint8_t val;
+
+	val = pm8x41_reg_read(QPNP_VIB_VTG_CTL);
+	val &= ~QPNP_VIB_VTG_SET_MASK;
+	val |= (QPNP_VIB_DEFAULT_VTG_LVL & QPNP_VIB_VTG_SET_MASK);
+	pm8x41_reg_write(QPNP_VIB_VTG_CTL, val);
+
+	val = pm8x41_reg_read(QPNP_VIB_EN_CTL);
+	val |= QPNP_VIB_EN;
+	pm8x41_reg_write(QPNP_VIB_EN_CTL, val);
+}
+
+/* Turn off vibrator */
+void pm_vib_turn_off(void)
+{
+	uint8_t val;
+
+	val = pm8x41_reg_read(QPNP_VIB_EN_CTL);
+	val &= ~QPNP_VIB_EN;
+	pm8x41_reg_write(QPNP_VIB_EN_CTL, val);
+}
diff --git a/dev/pmic/pm8x41/rules.mk b/dev/pmic/pm8x41/rules.mk
index 1cecf27..3713a4e 100644
--- a/dev/pmic/pm8x41/rules.mk
+++ b/dev/pmic/pm8x41/rules.mk
@@ -6,3 +6,8 @@
 	$(LOCAL_DIR)/pm8x41.o \
 	$(LOCAL_DIR)/pm8x41_adc.o \
 	$(LOCAL_DIR)/pm8x41_wled.o
+
+ifeq ($(ENABLE_PON_VIB_SUPPORT),true)
+OBJS += \
+	$(LOCAL_DIR)/pm8x41_vib.o
+endif
diff --git a/dev/vib/include/vibrator.h b/dev/vib/include/vibrator.h
new file mode 100644
index 0000000..d6fb8bf
--- /dev/null
+++ b/dev/vib/include/vibrator.h
@@ -0,0 +1,37 @@
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __DEV_VIB_VIBRATOR_H
+#define __DEV_VIB_VIBRATOR_H
+
+#define VIB_TIMER_DEFAULT_TIMEOUT   250
+
+void vib_turn_on(void);
+void vib_turn_off(void);
+void vib_timed_turn_on(const uint32_t);
+void wait_vib_timeout(void);
+#endif				/* __DEV_VIB_VIBRATOR_H */
diff --git a/dev/vib/rules.mk b/dev/vib/rules.mk
new file mode 100644
index 0000000..e9e1d10
--- /dev/null
+++ b/dev/vib/rules.mk
@@ -0,0 +1,6 @@
+LOCAL_DIR := $(GET_LOCAL_DIR)
+
+INCLUDES += -I$(LOCAL_DIR)/include
+
+OBJS += \
+	$(LOCAL_DIR)/vibrator.o
diff --git a/dev/vib/vibrator.c b/dev/vib/vibrator.c
new file mode 100644
index 0000000..e8cb8c7
--- /dev/null
+++ b/dev/vib/vibrator.c
@@ -0,0 +1,83 @@
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <debug.h>
+#include <reg.h>
+#include <stdlib.h>
+#include <kernel/timer.h>
+#include <platform/timer.h>
+#include <vibrator.h>
+#include <pm_vib.h>
+
+#define CHECK_VIB_TIMER_FREQUENCY    50
+
+static struct timer vib_timer;
+static uint32_t vib_timeout;
+
+/* Function to turn on vibrator */
+void vib_turn_on()
+{
+	pm_vib_turn_on();
+}
+
+/* Function to turn off vibrator */
+void vib_turn_off()
+{
+	pm_vib_turn_off();
+}
+
+/* Function to turn off vibrator when the vib_timer is expired. */
+static enum handler_return vib_timer_func(struct timer *v_timer, void *arg)
+{
+	timer_cancel(&vib_timer);
+	vib_turn_off();
+	vib_timeout=1;
+
+	return INT_RESCHEDULE;
+}
+
+/*
+ * Function to turn on vibrator.
+ * vibrate_time - the time of phone vibrate.
+ */
+void vib_timed_turn_on(const uint32_t vibrate_time)
+{
+	vib_turn_on();
+	vib_timeout=0;
+	timer_initialize(&vib_timer);
+	timer_set_oneshot(&vib_timer, vibrate_time, vib_timer_func, NULL);
+}
+
+/* Wait for vibrator timer expired */
+void wait_vib_timeout(void)
+{
+	while (!vib_timeout) {
+		/* every 50ms to check if the vibrator timer is timeout*/
+		thread_sleep(CHECK_VIB_TIMER_FREQUENCY);
+	}
+}
diff --git a/include/dev/udc.h b/include/dev/udc.h
index 0dd1f86..aa1aadd 100644
--- a/include/dev/udc.h
+++ b/include/dev/udc.h
@@ -34,7 +34,7 @@
 struct udc_request {
 	void *buf;
 	unsigned length;
-	void (*complete)(struct udc_request *req, unsigned actual, int status);
+	void (*complete)();
 	void *context;
 };
 
diff --git a/include/target.h b/include/target.h
index 45f1605..dfd5521 100644
--- a/include/target.h
+++ b/include/target.h
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2008 Travis Geiselbrecht
  *
- * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files
@@ -51,5 +51,6 @@
 struct mmc_device *target_mmc_device();
 
 bool target_display_panel_node(char *pbuf, uint16_t buf_size);
-
+void target_display_init(const char *panel_name);
+void target_display_shutdown(void);
 #endif
diff --git a/platform/apq8084/include/platform/iomap.h b/platform/apq8084/include/platform/iomap.h
index b7e3eda..6e1e38b 100644
--- a/platform/apq8084/include/platform/iomap.h
+++ b/platform/apq8084/include/platform/iomap.h
@@ -183,7 +183,7 @@
 #define INT_CTRL                    0x110
 #define CMD_MODE_DMA_SW_TRIGGER     0x090
 
-#define EOT_PACKET_CTRL             0x0C8
+#define EOT_PACKET_CTRL             0x0CC
 #define MISR_CMD_CTRL               0x0A0
 #define MISR_VIDEO_CTRL             0x0A4
 #define VIDEO_MODE_CTRL             0x010
diff --git a/platform/msm8226/include/platform/iomap.h b/platform/msm8226/include/platform/iomap.h
index 1f1b335..5b537e8 100644
--- a/platform/msm8226/include/platform/iomap.h
+++ b/platform/msm8226/include/platform/iomap.h
@@ -202,7 +202,7 @@
 #define INT_CTRL                    0x110
 #define CMD_MODE_DMA_SW_TRIGGER     0x090
 
-#define EOT_PACKET_CTRL             0x0C8
+#define EOT_PACKET_CTRL             0x0CC
 #define MISR_CMD_CTRL               0x0A0
 #define MISR_VIDEO_CTRL             0x0A4
 #define VIDEO_MODE_CTRL             0x010
diff --git a/platform/msm8974/include/platform/iomap.h b/platform/msm8974/include/platform/iomap.h
index 5c9d7dc..182f454 100644
--- a/platform/msm8974/include/platform/iomap.h
+++ b/platform/msm8974/include/platform/iomap.h
@@ -256,7 +256,7 @@
 #define INT_CTRL                    0x110
 #define CMD_MODE_DMA_SW_TRIGGER     0x090
 
-#define EOT_PACKET_CTRL             0x0C8
+#define EOT_PACKET_CTRL             0x0CC
 #define MISR_CMD_CTRL               0x0A0
 #define MISR_VIDEO_CTRL             0x0A4
 #define VIDEO_MODE_CTRL             0x010
diff --git a/platform/msm_shared/board.c b/platform/msm_shared/board.c
index 3e93888..5591ecd 100644
--- a/platform/msm_shared/board.c
+++ b/platform/msm_shared/board.c
@@ -88,7 +88,7 @@
 		board.pmic_info[0].pmic_type = board_info_v7.pmic_type;
 		board.pmic_info[0].pmic_version = board_info_v7.pmic_version;
 	}
-	else if (format == 8)
+	else if (format == 8 || format == 9)
 	{
 		board_info_len = sizeof(board_info_v8);
 
diff --git a/platform/msm_shared/crypto5_eng.c b/platform/msm_shared/crypto5_eng.c
index 3fecd61..17fbf88 100644
--- a/platform/msm_shared/crypto5_eng.c
+++ b/platform/msm_shared/crypto5_eng.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -348,14 +348,21 @@
 					 void *ctx_ptr,
 					 crypto_auth_alg_type auth_alg)
 {
-    crypto_SHA256_ctx *sha256_ctx = (crypto_SHA256_ctx *) ctx_ptr;
-    uint32_t i = 0;
-    uint32_t iv_len = SHA256_INIT_VECTOR_SIZE;
-    uint32_t *auth_iv = sha256_ctx->auth_iv;
-    uint32_t seg_cfg_val;
-    uint32_t total_bytes_to_write = sha256_ctx->bytes_to_write;
-    uint32_t bytes_to_write = total_bytes_to_write;
-    uint32_t burst_mask;
+	crypto_SHA256_ctx *sha256_ctx = (crypto_SHA256_ctx *) ctx_ptr;
+	crypto_SHA1_ctx *sha1_ctx = (crypto_SHA1_ctx *) ctx_ptr;
+	uint32_t i = 0;
+	uint32_t iv_len = 0;
+	uint32_t *auth_iv = sha1_ctx->auth_iv;
+	uint32_t seg_cfg_val;
+
+	if(auth_alg == CRYPTO_AUTH_ALG_SHA1)
+	{
+		iv_len = SHA1_INIT_VECTOR_SIZE;
+	}
+	else if(auth_alg == CRYPTO_AUTH_ALG_SHA256)
+	{
+		iv_len = SHA256_INIT_VECTOR_SIZE;
+	}
 
     seg_cfg_val = crypto5_get_sha_cfg(ctx_ptr, auth_alg);
 
@@ -368,7 +375,9 @@
 	/* Initialize CE pointers. */
 	REG_WRITE_QUEUE_INIT(dev);
 
-    REG_WRITE_QUEUE(dev, CRYPTO_AUTH_SEG_CFG(dev->base), seg_cfg_val);
+	/* For authentication operation set the encryption cfg reg to 0 as per HPG */
+	REG_WRITE_QUEUE(dev, CRYPTO_ENCR_SEG_CFG(dev->base), 0);
+	REG_WRITE_QUEUE(dev, CRYPTO_AUTH_SEG_CFG(dev->base), seg_cfg_val);
 
     for (i = 0; i < iv_len; i++)
     {
@@ -378,31 +387,77 @@
 			REG_WRITE_QUEUE(dev, CRYPTO_AUTH_IVn(dev->base, i), (*(auth_iv + i)));
     }
 
-	/* Check if the transfer length is a 8 beat burst multiple. */
-	burst_mask = CRYPTO_BURST_LEN - 1;
-	if (bytes_to_write & burst_mask)
-	{
-		/* Add trailer to make it a burst multiple. */
-		total_bytes_to_write = (bytes_to_write + burst_mask) & (~burst_mask);
-	}
-
-	sha256_ctx->bytes_to_write = total_bytes_to_write;
-
 	/* Typecast with crypto_SHA1_ctx because offset of auth_bytecnt
 	 * in both crypto_SHA1_ctx and crypto_SHA256_ctx are same.
 	 */
-    REG_WRITE_QUEUE(dev, CRYPTO_AUTH_BYTECNTn(dev->base, 0), ((crypto_SHA1_ctx *) ctx_ptr)->auth_bytecnt[0]);
-    REG_WRITE_QUEUE(dev, CRYPTO_AUTH_BYTECNTn(dev->base, 1), ((crypto_SHA1_ctx *) ctx_ptr)->auth_bytecnt[1]);
+	REG_WRITE_QUEUE(dev, CRYPTO_AUTH_BYTECNTn(dev->base, 0), ((crypto_SHA1_ctx *) ctx_ptr)->auth_bytecnt[0]);
+	REG_WRITE_QUEUE(dev, CRYPTO_AUTH_BYTECNTn(dev->base, 1), ((crypto_SHA1_ctx *) ctx_ptr)->auth_bytecnt[1]);
+}
 
-	/* Assume no header, always. */
-	REG_WRITE_QUEUE(dev, CRYPTO_AUTH_SEG_START(dev->base), 0);
+/* Function: crypto5_set_auth_cfg
+ * Arg     : dev, ptr to data buffer, buffer_size, burst_mask for alignment
+ * Return  : aligned buffer incase of unaligned data_ptr and total no. of bytes
+ *           passed to crypto HW(includes header and trailer size).
+ * Flow    : If data buffer is aligned, we just configure the crypto auth
+ *           registers for start, size of data etc. If buffer is unaligned
+ *           we align it to burst(64-byte) boundary and also make the no. of
+ *           bytes a multiple of 64 for bam and then configure the registers
+ *           for header/trailer settings.
+ */
 
-    REG_WRITE_QUEUE(dev, CRYPTO_AUTH_SEG_SIZE(dev->base), bytes_to_write);
-    REG_WRITE_QUEUE(dev, CRYPTO_SEG_SIZE(dev->base), total_bytes_to_write);
-    REG_WRITE_QUEUE(dev, CRYPTO_GOPROC(dev->base), GOPROC_GO);
+static void crypto5_set_auth_cfg(struct crypto_dev *dev, uint8_t **buffer,
+							uint8_t *data_ptr,
+							uint32_t burst_mask,
+							uint32_t bytes_to_write,
+							uint32_t *total_bytes_to_write)
+{
+	uint32_t minor_ver = 0;
+	uint32_t auth_seg_start = 0;
 
+	/* Bits 23:16 - minor version */
+        minor_ver = (readl(CRYPTO_VERSION(dev->base)) & 0x00FF0000) >> 16;
+
+	/* A H/W bug on Crypto 5.0.0 enforces a rule that the desc lengths must
+	 * be burst aligned. Here we use the header/trailer crypto register settings.
+         * buffer                : The previous 64 byte aligned address for data_ptr.
+         * CRYPTO_AUTH_SEG_START : Number of bytes to skip to reach the address data_ptr.
+         * CRYPTO_AUTH_SEG_SIZE  : Number of  bytes to be sent to crypto HW.
+         * CRYPTO_SEG_SIZE       : CRYPTO_AUTH_SEG_START + CRYPTO_AUTH_SEG_SIZE.
+         * Function: We pick a previous 64 byte aligned address buffer, and tell crypto to
+         * skip (data_ptr - buffer) number of bytes.
+         * This bug is fixed in 5.1.0 onwards.*/
+
+	if(minor_ver == 0)
+	{
+		if ((uint32_t) data_ptr & (CRYPTO_BURST_LEN - 1))
+		{
+			dprintf(CRITICAL, "Data start not aligned at burst length.\n");
+
+			*buffer = (uint8_t *)ROUNDDOWN((uint32_t)data_ptr, CRYPTO_BURST_LEN);
+
+			/* Header & Trailer */
+			*total_bytes_to_write = ((bytes_to_write +(data_ptr - *buffer) + burst_mask) & (~burst_mask));
+
+			auth_seg_start = (data_ptr - *buffer);
+		}
+		else
+		{
+			/* No header */
+			/* Add trailer to make it a burst multiple as 5.0.x HW mandates data to be a multiple of 64. */
+			*total_bytes_to_write = (bytes_to_write + burst_mask) & (~burst_mask);
+		}
+	}
+	else
+	{
+		/* No header. 5.1 crypto HW doesnt require alignment as partial reads and writes are possible*/
+		*total_bytes_to_write = bytes_to_write;
+	}
+
+	REG_WRITE_QUEUE(dev, CRYPTO_AUTH_SEG_START(dev->base), auth_seg_start);
+	REG_WRITE_QUEUE(dev, CRYPTO_AUTH_SEG_SIZE(dev->base), bytes_to_write);
+	REG_WRITE_QUEUE(dev, CRYPTO_SEG_SIZE(dev->base), *total_bytes_to_write);
+	REG_WRITE_QUEUE(dev, CRYPTO_GOPROC(dev->base), GOPROC_GO);
 	REG_WRITE_QUEUE_DONE(dev, BAM_DESC_LOCK_FLAG | BAM_DESC_INT_FLAG);
-
 	REG_WRITE_EXEC(&dev->bam, 1, CRYPTO_WRITE_PIPE_INDEX);
 }
 
@@ -414,19 +469,23 @@
 	crypto_SHA256_ctx *sha256_ctx = (crypto_SHA256_ctx *) ctx_ptr;
 	uint32_t wr_flags = BAM_DESC_NWD_FLAG | BAM_DESC_INT_FLAG | BAM_DESC_EOT_FLAG;
 	uint32_t ret_status;
+	uint8_t *buffer = NULL;
+	uint32_t total_bytes_to_write = 0;
 
-	/* A H/W bug on Crypto 5.0.0 enforces a rule that the desc lengths must be burst aligned. */
-	if ((uint32_t) data_ptr & (CRYPTO_BURST_LEN - 1))
+	crypto5_set_auth_cfg(dev, &buffer, data_ptr, CRYPTO_BURST_LEN - 1, sha256_ctx->bytes_to_write,
+											&total_bytes_to_write);
+
+	if(buffer)
 	{
-		dprintf(CRITICAL, "Crypto send data failed\n");
-		dprintf(CRITICAL, "Data start not aligned at burst length.\n");
-		ret_status = CRYPTO_ERR_FAIL;
-		goto CRYPTO_SEND_DATA_ERR;
+		arch_clean_invalidate_cache_range((addr_t) buffer, total_bytes_to_write);
+
+		bam_status = ADD_WRITE_DESC(&dev->bam, buffer, total_bytes_to_write, wr_flags);
 	}
-
-	arch_clean_invalidate_cache_range((addr_t) data_ptr, sha256_ctx->bytes_to_write);
-
-	bam_status = ADD_WRITE_DESC(&dev->bam, data_ptr, sha256_ctx->bytes_to_write, wr_flags);
+	else
+	{
+		arch_clean_invalidate_cache_range((addr_t) data_ptr, total_bytes_to_write);
+		bam_status = ADD_WRITE_DESC(&dev->bam, data_ptr, total_bytes_to_write, wr_flags);
+	}
 
 	if (bam_status)
 	{
diff --git a/platform/msm_shared/debug.c b/platform/msm_shared/debug.c
index 3349db7..28c053e 100644
--- a/platform/msm_shared/debug.c
+++ b/platform/msm_shared/debug.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2009, Google Inc.
  * All rights reserved.
- * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -39,6 +39,10 @@
 #include <platform/timer.h>
 #include <platform.h>
 
+#if PON_VIB_SUPPORT
+#include <vibrator.h>
+#endif
+
 static void write_dcc(char c)
 {
 	uint32_t timeout = 10;
@@ -134,6 +138,9 @@
 
 void platform_halt(void)
 {
+#if PON_VIB_SUPPORT
+	vib_turn_off();
+#endif
 	if (set_download_mode(NORMAL_DLOAD) == 0)
 	{
 		dprintf(CRITICAL, "HALT: reboot into dload mode...\n");
diff --git a/platform/msm_shared/display.c b/platform/msm_shared/display.c
index e9b1e7b..03a1bb0 100644
--- a/platform/msm_shared/display.c
+++ b/platform/msm_shared/display.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -184,7 +184,7 @@
 		break;
 	case MIPI_VIDEO_PANEL:
 		dprintf(INFO, "Turn on MIPI_VIDEO_PANEL.\n");
-		ret = mdp_dsi_video_on();
+		ret = mdp_dsi_video_on(pinfo);
 		if (ret)
 			goto msm_display_on_out;
 		ret = mipi_dsi_on();
@@ -193,7 +193,7 @@
 		break;
 	case MIPI_CMD_PANEL:
 		dprintf(INFO, "Turn on MIPI_CMD_PANEL.\n");
-		ret = mdp_dma_on();
+		ret = mdp_dma_on(pinfo);
 		if (ret)
 			goto msm_display_on_out;
 		mdp_rev = mdp_get_revision();
@@ -221,7 +221,7 @@
 		break;
 	case EDP_PANEL:
 		dprintf(INFO, "Turn on EDP PANEL.\n");
-		ret = mdp_edp_on();
+		ret = mdp_edp_on(pinfo);
 		if (ret)
 			goto msm_display_on_out;
 		break;
diff --git a/platform/msm_shared/hsusb.c b/platform/msm_shared/hsusb.c
index 02a15db..a739f9b 100644
--- a/platform/msm_shared/hsusb.c
+++ b/platform/msm_shared/hsusb.c
@@ -2,7 +2,7 @@
  * Copyright (c) 2008, Google Inc.
  * All rights reserved.
  *
- * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -476,7 +476,7 @@
 static struct udc_request *ep0req;
 
 static void
-ep0_setup_ack_complete(struct udc_endpoint *ep, struct usb_request *req)
+ep0_setup_ack_complete()
 {
 	uint32_t mode;
 
diff --git a/platform/msm_shared/image_verify.c b/platform/msm_shared/image_verify.c
index cf1253f..edca3bc 100644
--- a/platform/msm_shared/image_verify.c
+++ b/platform/msm_shared/image_verify.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011,2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011,2013-2014 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -99,6 +99,23 @@
 		goto cleanup;
 	}
 
+	/*
+	 * Calculate hash of image and save calculated hash on TZ.
+	 */
+	hash_size =
+	    (hash_type == CRYPTO_AUTH_ALG_SHA256) ? SHA256_SIZE : SHA1_SIZE;
+	hash_find(image_ptr, image_size, (unsigned char *)&digest, hash_type);
+#ifdef TZ_SAVE_KERNEL_HASH
+	if (hash_type == CRYPTO_AUTH_ALG_SHA256) {
+		save_kernel_hash_cmd(digest);
+		dprintf(INFO, "Image hash saved.\n");
+	} else
+		dprintf(INFO, "image_verify: hash is not SHA-256.\n");
+#endif
+
+	/*
+	 * Decrypt the pre-calculated expected image hash.
+	 */
 	ret = image_decrypt_signature(signature_ptr, plain_text);
 	if (ret == -1) {
 		dprintf(CRITICAL, "ERROR: Image Invalid! Decryption failed!\n");
@@ -106,17 +123,8 @@
 	}
 
 	/*
-	 * Calculate hash of image for comparison
+	 * Compare the expected hash with the calculated hash.
 	 */
-	hash_size =
-	    (hash_type == CRYPTO_AUTH_ALG_SHA256) ? SHA256_SIZE : SHA1_SIZE;
-	hash_find(image_ptr, image_size, (unsigned char *)&digest, hash_type);
-#ifdef TZ_SAVE_KERNEL_HASH
-	if (hash_type == CRYPTO_AUTH_ALG_SHA256)
-		save_kernel_hash_cmd(digest);
-	else
-		dprintf(INFO, "image_verify: hash is not SHA-256.\n");
-#endif
 	if (memcmp(plain_text, digest, hash_size) != 0) {
 		dprintf(CRITICAL,
 			"ERROR: Image Invalid! Please use another image!\n");
diff --git a/platform/msm_shared/include/mdp3.h b/platform/msm_shared/include/mdp3.h
index 8dff686..9ca4abf 100644
--- a/platform/msm_shared/include/mdp3.h
+++ b/platform/msm_shared/include/mdp3.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -56,5 +56,5 @@
 
 /* defining no-op functions that are implemented only for mdp5 */
 int mdp_edp_config(struct msm_panel_info *pinfo, struct fbcon_config *fb);
-int mdp_edp_on(void);
+int mdp_edp_on(struct msm_panel_info *pinfo);
 int mdp_edp_off(void);
diff --git a/platform/msm_shared/include/mdp4.h b/platform/msm_shared/include/mdp4.h
index c988dee..d979645 100644
--- a/platform/msm_shared/include/mdp4.h
+++ b/platform/msm_shared/include/mdp4.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -104,7 +104,7 @@
 void mdp_disable(void);
 void mdp_start_dma(void);
 int mdp_dsi_video_off();
-int mdp_dsi_video_on();
+int mdp_dsi_video_on(struct msm_panel_info *pinfo);
 int mdp_dsi_video_config(struct msm_panel_info *pinfo, struct fbcon_config *fb);
 int mdp_lcdc_config(struct msm_panel_info *pinfo, struct fbcon_config *fb);
 int mdp_lcdc_on();
@@ -114,7 +114,7 @@
 
 /* defining no-op functions that are implemented only for mdp5 */
 int mdp_edp_config(struct msm_panel_info *pinfo, struct fbcon_config *fb);
-int mdp_edp_on(void);
+int mdp_edp_on(struct msm_panel_info *pinfo);
 int mdp_edp_off(void);
 
 #endif
diff --git a/platform/msm_shared/include/mdp5.h b/platform/msm_shared/include/mdp5.h
index 149162f..54dc82f 100644
--- a/platform/msm_shared/include/mdp5.h
+++ b/platform/msm_shared/include/mdp5.h
@@ -34,6 +34,8 @@
 
 #define MDP_VP_0_RGB_0_BASE                     REG_MDP(0x1E00)
 #define MDP_VP_0_RGB_1_BASE                     REG_MDP(0x2200)
+#define MDP_VP_0_DMA_0_BASE                     REG_MDP(0x2A00)
+#define MDP_VP_0_DMA_1_BASE                     REG_MDP(0x2E00)
 
 #define PIPE_SSPP_SRC0_ADDR                     0x14
 #define PIPE_SSPP_SRC_YSTRIDE                   0x24
@@ -86,6 +88,8 @@
 #define MDSS_MDP_HW_REV_103    MDSS_MDP_REV(1, 3, 0) /* 8084 v1.0 */
 #define MDSS_MDP_HW_REV_200    MDSS_MDP_REV(2, 0, 0) /* 8092 v1.0 */
 
+#define MDSS_MAX_LINE_BUF_WIDTH 2048
+
 #define MDP_HW_REV                              REG_MDP(0x0100)
 #define MDP_INTR_EN                             REG_MDP(0x0110)
 #define MDP_INTR_CLEAR                          REG_MDP(0x0118)
@@ -143,16 +147,8 @@
 #define MDP_CLK_CTRL6                           REG_MDP(0x03C4)
 #define MDP_CLK_CTRL7                           REG_MDP(0x04D0)
 
-#define MMSS_MDP_CLIENT_ID_UNUSED               0x00000000
-#define MMSS_MDP_1_1_CLIENT_ID_RGB0             0x00000007
-#define MMSS_MDP_1_2_CLIENT_ID_RGB0             0x00000010
-#define MMSS_MDP_1_2_CLIENT_ID_RGB1             0x00000011
-
-#define MMSS_MDP_MAX_SMP_SIZE                   0x00001000
-#define MMSS_MDP_SMP_ALLOC_W_0                  REG_MDP(0x0180)
-#define MMSS_MDP_SMP_ALLOC_W_1                  REG_MDP(0x0184)
-#define MMSS_MDP_SMP_ALLOC_R_0                  REG_MDP(0x0230)
-#define MMSS_MDP_SMP_ALLOC_R_1                  REG_MDP(0x0234)
+#define MMSS_MDP_SMP_ALLOC_W_BASE               REG_MDP(0x0180)
+#define MMSS_MDP_SMP_ALLOC_R_BASE               REG_MDP(0x0230)
 
 #define MDP_QOS_REMAPPER_CLASS_0                REG_MDP(0x02E0)
 #define MDP_QOS_REMAPPER_CLASS_1                REG_MDP(0x02E4)
@@ -182,10 +178,10 @@
 int mdp_dsi_video_config(struct msm_panel_info *pinfo, struct fbcon_config *fb);
 int mipi_dsi_cmd_config(struct fbcon_config mipi_fb_cfg,
 			unsigned short num_of_lanes);
-int mdp_dsi_video_on(void);
-int mdp_dma_on(void);
+int mdp_dsi_video_on(struct msm_panel_info *pinfo);
+int mdp_dma_on(struct msm_panel_info *pinfo);
 int mdp_edp_config(struct msm_panel_info *pinfo, struct fbcon_config *fb);
-int mdp_edp_on(void);
+int mdp_edp_on(struct msm_panel_info *pinfo);
 int mdp_edp_off(void);
 void mdp_disable(void);
 
diff --git a/platform/msm_shared/include/mmc_sdhci.h b/platform/msm_shared/include/mmc_sdhci.h
index 1eb9745..d704d8c 100644
--- a/platform/msm_shared/include/mmc_sdhci.h
+++ b/platform/msm_shared/include/mmc_sdhci.h
@@ -294,6 +294,7 @@
 	uint32_t pwrctl_base;  /* Base address for power control registers */
 	uint16_t bus_width;    /* Bus width used */
 	uint32_t max_clk_rate; /* Max clock rate supported */
+	uint8_t hs400_support; /* SDHC HS400 mode supported or not */
 };
 
 /* mmc device structure */
diff --git a/platform/msm_shared/include/msm_panel.h b/platform/msm_shared/include/msm_panel.h
index 1d8ebad..4407074 100755
--- a/platform/msm_shared/include/msm_panel.h
+++ b/platform/msm_shared/include/msm_panel.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -189,6 +189,8 @@
 	uint32_t wait_cycle;
 	uint32_t clk_rate;
 	uint32_t rotation;
+	/*  Enable if DMA pipe used for handoff */
+	uint32_t use_dma_pipe;
 	char     lowpowerstop;
 
 	struct lcd_panel_info lcd;
diff --git a/platform/msm_shared/include/scm.h b/platform/msm_shared/include/scm.h
index b2ae7a9..6b9efb5 100644
--- a/platform/msm_shared/include/scm.h
+++ b/platform/msm_shared/include/scm.h
@@ -174,6 +174,9 @@
 #define SCM_SVC_ES                      0x10
 #define SCM_SAVE_PARTITION_HASH_ID      0x01
 
+#define SCM_SVC_PWR                     0x9
+#define SCM_IO_DISABLE_PMIC_ARBITER     0x1
+
 enum ap_ce_channel_type {
 AP_CE_REGISTER_USE = 0,
 AP_CE_ADM_USE = 1
@@ -187,6 +190,8 @@
 
 void set_tamper_fuse_cmd();
 
+int scm_halt_pmic_arbiter();
+
 /**
  * struct scm_command - one SCM command buffer
  * @len: total available memory for command and response
diff --git a/platform/msm_shared/include/shutdown_detect.h b/platform/msm_shared/include/shutdown_detect.h
new file mode 100644
index 0000000..23690c9
--- /dev/null
+++ b/platform/msm_shared/include/shutdown_detect.h
@@ -0,0 +1,33 @@
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __PLATFORM_MSM_SHARED_SHUTDOWN_DETECT_H
+#define __PLATFORM_MSM_SHARED_SHUTDOWN_DETECT_H
+
+void shutdown_detect(void);
+#endif				/* __PLATFORM_MSM_SHARED_SHUTDOWN_DETECT_H */
diff --git a/platform/msm_shared/mdp3.c b/platform/msm_shared/mdp3.c
index d83fa9e..2cde8ea 100644
--- a/platform/msm_shared/mdp3.c
+++ b/platform/msm_shared/mdp3.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -169,7 +169,7 @@
 	return mdp_rev;
 }
 
-int mdp_dsi_video_on()
+int mdp_dsi_video_on(struct msm_panel_info *pinfo)
 {
 	int ret = 0;
 
@@ -178,7 +178,7 @@
 	return ret;
 }
 
-int mdp_dma_on()
+int mdp_dma_on(struct msm_panel_info *pinfo)
 {
 	int ret = 0;
 	mdelay(100);
@@ -202,7 +202,7 @@
 	return NO_ERROR;
 }
 
-int mdp_edp_on(void)
+int mdp_edp_on(struct msm_panel_info *pinfo)
 {
 	return NO_ERROR;
 }
diff --git a/platform/msm_shared/mdp4.c b/platform/msm_shared/mdp4.c
index b3ade80..7b7c0cf 100644
--- a/platform/msm_shared/mdp4.c
+++ b/platform/msm_shared/mdp4.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -229,7 +229,7 @@
 	writel(0x00000003, MDP_OVERLAYPROC0_CFG);
 }
 
-int mdp_dma_on(void)
+int mdp_dma_on(struct msm_panel_info *pinfo)
 {
 	int ret = 0;
 
@@ -364,7 +364,7 @@
 	return ret;
 }
 
-int mdp_dsi_video_on()
+int mdp_dsi_video_on(struct msm_panel_info *pinfo)
 {
 	int ret = NO_ERROR;
 
@@ -414,7 +414,7 @@
 	return NO_ERROR;
 }
 
-int mdp_edp_on(void)
+int mdp_edp_on(struct msm_panel_info *pinfo)
 {
 	return NO_ERROR;
 }
diff --git a/platform/msm_shared/mdp5.c b/platform/msm_shared/mdp5.c
index 2cbf408..e1106bf 100644
--- a/platform/msm_shared/mdp5.c
+++ b/platform/msm_shared/mdp5.c
@@ -79,10 +79,10 @@
 	writel(0x40000000, MDP_CLK_CTRL4);
 }
 
-static void mdss_rgb_pipe_config(struct fbcon_config *fb, struct msm_panel_info
+static void mdss_source_pipe_config(struct fbcon_config *fb, struct msm_panel_info
 		*pinfo, uint32_t pipe_base)
 {
-	uint32_t src_size, out_size, stride;
+	uint32_t src_size, out_size, stride, pipe_swap;
 	uint32_t fb_off = 0;
 
 	/* write active region size*/
@@ -91,11 +91,13 @@
 
 	if (pinfo->lcdc.dual_pipe) {
 		out_size = (fb->height << 16) + (fb->width / 2);
-		if ((pinfo->lcdc.pipe_swap == TRUE) && (pipe_base ==
-					MDP_VP_0_RGB_0_BASE))
+		pipe_swap = (pinfo->lcdc.pipe_swap == TRUE) ? 1 : 0;
+
+		if (pipe_swap && ((pipe_base == MDP_VP_0_RGB_0_BASE) ||
+				(pipe_base == MDP_VP_0_DMA_0_BASE)))
 			fb_off = (pinfo->xres / 2);
-		else if ((pinfo->lcdc.pipe_swap != TRUE) && (pipe_base ==
-					MDP_VP_0_RGB_1_BASE))
+		else if (!pipe_swap && ((pipe_base == MDP_VP_0_RGB_1_BASE) ||
+				(pipe_base == MDP_VP_0_DMA_1_BASE)))
 			fb_off = (pinfo->xres / 2);
 	}
 
@@ -150,32 +152,67 @@
 	}
 }
 
-void mdss_smp_setup(struct msm_panel_info *pinfo)
+static uint32_t mdss_smp_alloc(uint32_t client_id, uint32_t smp_cnt,
+	uint32_t fixed_smp_cnt, uint32_t free_smp_offset)
 {
-	uint32_t smp_cnt = 0, reg_rgb0 = 0, reg_rgb1 = 0, shift = 0;
-	uint32_t xres, bpp;
-	uint32_t rgb0_client_id = MMSS_MDP_CLIENT_ID_UNUSED;
-	uint32_t rgb1_client_id = MMSS_MDP_1_2_CLIENT_ID_RGB1;
-	uint32_t mdss_mdp_rev = readl(MDP_HW_REV);
+	uint32_t i, j;
+	uint32_t reg_val = 0;
 
-	xres = pinfo->xres;
-	bpp = pinfo->bpp;
-
-	if (mdss_mdp_rev == MDSS_MDP_HW_REV_100
-		|| mdss_mdp_rev >= MDSS_MDP_HW_REV_102)
-		rgb0_client_id = MMSS_MDP_1_2_CLIENT_ID_RGB0;
-	else if (mdss_mdp_rev >= MDSS_MDP_HW_REV_101)
-		rgb0_client_id = MMSS_MDP_1_1_CLIENT_ID_RGB0;
-
-	if (pinfo->lcdc.dual_pipe) {
-		/* Each pipe driving half the screen */
-		xres /= 2;
+	for (i = fixed_smp_cnt, j = 0; i < smp_cnt; i++) {
+		/* max 3 MMB per register */
+		reg_val |= client_id << (((j++) % 3) * 8);
+		if ((j % 3) == 0) {
+			writel(reg_val, MMSS_MDP_SMP_ALLOC_W_BASE +
+				free_smp_offset);
+			writel(reg_val, MMSS_MDP_SMP_ALLOC_R_BASE +
+				free_smp_offset);
+			reg_val = 0;
+			free_smp_offset += 4;
+		}
 	}
 
-	smp_cnt = ((xres) * (bpp / 8) * 2) +
-		MMSS_MDP_MAX_SMP_SIZE - 1;
+	if (j % 3) {
+		writel(reg_val, MMSS_MDP_SMP_ALLOC_W_BASE + free_smp_offset);
+		writel(reg_val, MMSS_MDP_SMP_ALLOC_R_BASE + free_smp_offset);
+		free_smp_offset += 4;
+	}
 
-	smp_cnt /= MMSS_MDP_MAX_SMP_SIZE;
+	return free_smp_offset;
+}
+
+static void mdss_smp_setup(struct msm_panel_info *pinfo, uint32_t left_pipe,
+		uint32_t right_pipe)
+
+{
+	uint32_t left_sspp_client_id, right_sspp_client_id;
+	uint32_t bpp = 3, free_smp_offset = 0, xres = MDSS_MAX_LINE_BUF_WIDTH;
+	uint32_t smp_cnt, smp_size = 4096, fixed_smp_cnt = 0;
+	uint32_t mdss_mdp_rev = readl(MDP_HW_REV);
+
+	if ((mdss_mdp_rev >= MDSS_MDP_HW_REV_103) &&
+		(mdss_mdp_rev < MDSS_MDP_HW_REV_200)) {
+		smp_size = 8192;
+		fixed_smp_cnt = 2;
+		free_smp_offset = 0xC;
+	}
+
+	if (pinfo->use_dma_pipe)
+		right_sspp_client_id = 0xD; /* 13 */
+	else
+		right_sspp_client_id = 0x11; /* 17 */
+
+	if (MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_101))
+		left_sspp_client_id = (pinfo->use_dma_pipe) ? 0x4 : 0x07; /* 4 or 7 */
+	else
+		left_sspp_client_id = (pinfo->use_dma_pipe) ? 0xA : 0x10; /* 10 or 16 */
+
+	/* Each pipe driving half the screen */
+	if (pinfo->lcdc.dual_pipe)
+		xres /= 2;
+
+	/* bpp = bytes per pixel of input image */
+	smp_cnt = (xres * bpp * 2) + smp_size - 1;
+	smp_cnt /= smp_size;
 
 	if (smp_cnt > 4) {
 		dprintf(CRITICAL, "ERROR: %s: Out of SMP's, cnt=%d! \n", __func__,
@@ -183,31 +220,21 @@
 		ASSERT(0); /* Max 4 SMPs can be allocated per client */
 	}
 
-	writel(smp_cnt * 0x40, MDP_VP_0_RGB_0_BASE + REQPRIORITY_FIFO_WATERMARK0);
-	writel(smp_cnt * 0x80, MDP_VP_0_RGB_0_BASE + REQPRIORITY_FIFO_WATERMARK1);
-	writel(smp_cnt * 0xc0, MDP_VP_0_RGB_0_BASE + REQPRIORITY_FIFO_WATERMARK2);
+	writel(smp_cnt * 0x40, left_pipe + REQPRIORITY_FIFO_WATERMARK0);
+	writel(smp_cnt * 0x80, left_pipe + REQPRIORITY_FIFO_WATERMARK1);
+	writel(smp_cnt * 0xc0, left_pipe + REQPRIORITY_FIFO_WATERMARK2);
 
 	if (pinfo->lcdc.dual_pipe) {
-		writel(smp_cnt * 0x40, MDP_VP_0_RGB_1_BASE + REQPRIORITY_FIFO_WATERMARK0);
-		writel(smp_cnt * 0x80, MDP_VP_0_RGB_1_BASE + REQPRIORITY_FIFO_WATERMARK1);
-		writel(smp_cnt * 0xc0, MDP_VP_0_RGB_1_BASE + REQPRIORITY_FIFO_WATERMARK2);
+		writel(smp_cnt * 0x40, right_pipe + REQPRIORITY_FIFO_WATERMARK0);
+		writel(smp_cnt * 0x80, right_pipe + REQPRIORITY_FIFO_WATERMARK1);
+		writel(smp_cnt * 0xc0, right_pipe + REQPRIORITY_FIFO_WATERMARK2);
 	}
 
-	while((smp_cnt > 0) && !(shift > 16)) {
-		reg_rgb0 |= ((rgb0_client_id) << (shift));
-		reg_rgb1 |= ((rgb1_client_id) << (shift));
-		smp_cnt--;
-		shift += 8;
-	}
-
-	/* Allocate SMP blocks */
-	writel(reg_rgb0, MMSS_MDP_SMP_ALLOC_W_0);
-	writel(reg_rgb0, MMSS_MDP_SMP_ALLOC_R_0);
-
-	if (pinfo->lcdc.dual_pipe) {
-		writel(reg_rgb1, MMSS_MDP_SMP_ALLOC_W_1);
-		writel(reg_rgb1, MMSS_MDP_SMP_ALLOC_R_1);
-	}
+	free_smp_offset = mdss_smp_alloc(left_sspp_client_id, smp_cnt,
+		fixed_smp_cnt, free_smp_offset);
+	if (pinfo->lcdc.dual_pipe)
+		mdss_smp_alloc(right_sspp_client_id, smp_cnt, fixed_smp_cnt,
+			free_smp_offset);
 }
 
 void mdss_intf_tg_setup(struct msm_panel_info *pinfo, uint32_t intf_base)
@@ -298,7 +325,7 @@
 void mdss_layer_mixer_setup(struct fbcon_config *fb, struct msm_panel_info
 		*pinfo)
 {
-	uint32_t mdp_rgb_size, height, width;
+	uint32_t mdp_rgb_size, height, width, val;
 
 	height = fb->height;
 	width = fb->width;
@@ -321,7 +348,10 @@
 	writel(0xFF, MDP_VP_0_MIXER_0_BASE + LAYER_3_BLEND0_FG_ALPHA);
 
 	/* Baselayer for layer mixer 0 */
-	writel(0x0000200, MDP_CTL_0_BASE + CTL_LAYER_0);
+	if (pinfo->use_dma_pipe)
+		writel(0x0040000, MDP_CTL_0_BASE + CTL_LAYER_0);
+	else
+		writel(0x0000200, MDP_CTL_0_BASE + CTL_LAYER_0);
 
 	if (pinfo->lcdc.dual_pipe) {
 		writel(mdp_rgb_size, MDP_VP_0_MIXER_1_BASE + LAYER_0_OUT_SIZE);
@@ -336,10 +366,11 @@
 		writel(0xFF, MDP_VP_0_MIXER_1_BASE + LAYER_3_BLEND0_FG_ALPHA);
 
 		/* Baselayer for layer mixer 1 */
+		val = pinfo->use_dma_pipe ? 0x200000 : 0x1000;
 		if (pinfo->lcdc.split_display)
-			writel(0x1000, MDP_CTL_1_BASE + CTL_LAYER_1);
+			writel(val, MDP_CTL_1_BASE + CTL_LAYER_1);
 		else
-			writel(0x01000, MDP_CTL_0_BASE + CTL_LAYER_1);
+			writel(val, MDP_CTL_0_BASE + CTL_LAYER_1);
 	}
 }
 
@@ -370,6 +401,7 @@
 	int ret = NO_ERROR;
 	struct lcdc_panel_info *lcdc = NULL;
 	uint32_t intf_sel = 0x100;
+	uint32_t left_pipe, right_pipe;
 
 	mdss_intf_tg_setup(pinfo, MDP_INTF_1_BASE);
 
@@ -378,14 +410,23 @@
 
 	mdp_clk_gating_ctrl();
 
+	if (pinfo->use_dma_pipe) {
+		left_pipe = MDP_VP_0_DMA_0_BASE;
+		right_pipe = MDP_VP_0_DMA_1_BASE;
+	} else {
+		left_pipe = MDP_VP_0_RGB_0_BASE;
+		right_pipe = MDP_VP_0_RGB_1_BASE;
+	}
+
 	mdss_vbif_setup();
-	mdss_smp_setup(pinfo);
+	mdss_smp_setup(pinfo, left_pipe, right_pipe);
 
 	mdss_qos_remapper_setup();
 
-	mdss_rgb_pipe_config(fb, pinfo, MDP_VP_0_RGB_0_BASE);
+	mdss_source_pipe_config(fb, pinfo, left_pipe);
+
 	if (pinfo->lcdc.dual_pipe)
-		mdss_rgb_pipe_config(fb, pinfo, MDP_VP_0_RGB_1_BASE);
+		mdss_source_pipe_config(fb, pinfo, right_pipe);
 
 	mdss_layer_mixer_setup(fb, pinfo);
 
@@ -409,24 +450,31 @@
 {
 	int ret = NO_ERROR;
 	struct lcdc_panel_info *lcdc = NULL;
+	uint32_t left_pipe, right_pipe;
 
 	mdss_intf_tg_setup(pinfo, MDP_INTF_0_BASE);
 
+	if (pinfo->use_dma_pipe) {
+		left_pipe = MDP_VP_0_DMA_0_BASE;
+		right_pipe = MDP_VP_0_DMA_1_BASE;
+	} else {
+		left_pipe = MDP_VP_0_RGB_0_BASE;
+		right_pipe = MDP_VP_0_RGB_1_BASE;
+	}
+
 	mdp_clk_gating_ctrl();
 
 	mdss_vbif_setup();
-	mdss_smp_setup(pinfo);
+	mdss_smp_setup(pinfo, left_pipe, right_pipe);
 
 	mdss_qos_remapper_setup();
 
-	mdss_rgb_pipe_config(fb, pinfo, MDP_VP_0_RGB_0_BASE);
+	mdss_source_pipe_config(fb, pinfo, left_pipe);
 	if (pinfo->lcdc.dual_pipe)
-		mdss_rgb_pipe_config(fb, pinfo, MDP_VP_0_RGB_1_BASE);
-
+		mdss_source_pipe_config(fb, pinfo, right_pipe);
 
 	mdss_layer_mixer_setup(fb, pinfo);
 
-
 	if (pinfo->lcdc.dual_pipe)
 		writel(0x181F10, MDP_CTL_0_BASE + CTL_TOP);
 	else
@@ -445,6 +493,7 @@
 {
 	uint32_t intf_sel = BIT(8);
 	int ret = NO_ERROR;
+	uint32_t left_pipe, right_pipe;
 
 	struct lcdc_panel_info *lcdc = NULL;
 	uint32_t mdss_mdp_intf_off = 0;
@@ -471,13 +520,22 @@
 
 	writel(intf_sel, MDP_DISP_INTF_SEL);
 
+	if (pinfo->use_dma_pipe) {
+		left_pipe = MDP_VP_0_DMA_0_BASE;
+		right_pipe = MDP_VP_0_DMA_1_BASE;
+	} else {
+		left_pipe = MDP_VP_0_RGB_0_BASE;
+		right_pipe = MDP_VP_0_RGB_1_BASE;
+	}
+
 	mdss_vbif_setup();
-	mdss_smp_setup(pinfo);
+	mdss_smp_setup(pinfo, left_pipe, right_pipe);
 	mdss_qos_remapper_setup();
 
-	mdss_rgb_pipe_config(fb, pinfo, MDP_VP_0_RGB_0_BASE);
+	mdss_source_pipe_config(fb, pinfo, left_pipe);
+
 	if (pinfo->lcdc.dual_pipe)
-		mdss_rgb_pipe_config(fb, pinfo, MDP_VP_0_RGB_1_BASE);
+		mdss_source_pipe_config(fb, pinfo, right_pipe);
 
 	mdss_layer_mixer_setup(fb, pinfo);
 
@@ -492,13 +550,18 @@
 	return ret;
 }
 
-int mdp_dsi_video_on(void)
+int mdp_dsi_video_on(struct msm_panel_info *pinfo)
 {
-	int ret = NO_ERROR;
-	writel(0x32048, MDP_CTL_0_BASE + CTL_FLUSH);
-	writel(0x32090, MDP_CTL_1_BASE + CTL_FLUSH);
+	if (pinfo->use_dma_pipe) {
+		writel(0x22840, MDP_CTL_0_BASE + CTL_FLUSH);
+		writel(0x25080, MDP_CTL_1_BASE + CTL_FLUSH);
+	} else {
+		writel(0x22048, MDP_CTL_0_BASE + CTL_FLUSH);
+		writel(0x24090, MDP_CTL_1_BASE + CTL_FLUSH);
+	}
 	writel(0x01, MDP_INTF_1_TIMING_ENGINE_EN  + mdss_mdp_intf_offset());
-	return ret;
+
+	return NO_ERROR;
 }
 
 int mdp_dsi_video_off()
@@ -531,10 +594,15 @@
 	return NO_ERROR;
 }
 
-int mdp_dma_on(void)
+int mdp_dma_on(struct msm_panel_info *pinfo)
 {
-	writel(0x32048, MDP_CTL_0_BASE + CTL_FLUSH);
-	writel(0x32090, MDP_CTL_1_BASE + CTL_FLUSH);
+	if (pinfo->use_dma_pipe) {
+		writel(0x22840, MDP_CTL_0_BASE + CTL_FLUSH);
+		writel(0x25080, MDP_CTL_1_BASE + CTL_FLUSH);
+	} else {
+		writel(0x22048, MDP_CTL_0_BASE + CTL_FLUSH);
+		writel(0x24090, MDP_CTL_1_BASE + CTL_FLUSH);
+	}
 	writel(0x01, MDP_CTL_0_BASE + CTL_START);
 	return NO_ERROR;
 }
@@ -544,9 +612,12 @@
 
 }
 
-int mdp_edp_on(void)
+int mdp_edp_on(struct msm_panel_info *pinfo)
 {
-	writel(0x32048, MDP_CTL_0_BASE + CTL_FLUSH);
+	if (pinfo->use_dma_pipe)
+		writel(0x22840, MDP_CTL_0_BASE + CTL_FLUSH);
+	else
+		writel(0x22048, MDP_CTL_0_BASE + CTL_FLUSH);
 	writel(0x01, MDP_INTF_0_TIMING_ENGINE_EN  + mdss_mdp_intf_offset());
 	return NO_ERROR;
 }
diff --git a/platform/msm_shared/mipi_dsi.c b/platform/msm_shared/mipi_dsi.c
index 4b86359..3fa2e28 100644
--- a/platform/msm_shared/mipi_dsi.c
+++ b/platform/msm_shared/mipi_dsi.c
@@ -599,7 +599,7 @@
 
 	writel(0, DSI_CTRL);
 
-	writel(0, DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, DSI_ERR_INT_MASK0);
 
 	DST_FORMAT = 0;		// RGB565
 	dprintf(SPEW, "DSI_Video_Mode - Dst Format: RGB565\n");
@@ -680,7 +680,7 @@
 	writel(0x0000001e, DSI_CLK_CTRL);
 	writel(0x0000003e, DSI_CLK_CTRL);
 
-	writel(0x10000000, DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, DSI_ERR_INT_MASK0);
 
 	// writel(0, DSI_CTRL);
 
@@ -713,9 +713,9 @@
 	writel(interleav << 30 | 0 << 24 | 0 << 20 | DLNx_EN << 4 | 0x105,
 	       DSI_CTRL);
 	mdelay(10);
-	writel(0x10000000, DSI_COMMAND_MODE_DMA_CTRL);
+	writel(0x14000000, DSI_COMMAND_MODE_DMA_CTRL);
 	writel(0x10000000, DSI_MISR_CMD_CTRL);
-	writel(0x00000040, DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, DSI_ERR_INT_MASK0);
 	writel(0x1, DSI_EOT_PACKET_CTRL);
 	// writel(0x0, MDP_OVERLAYPROC0_START);
 	mdp_start_dma();
@@ -944,7 +944,7 @@
 
 	writel(0, ctl_base + CTRL);
 
-	writel(0, ctl_base + DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, ctl_base + ERR_INT_MASK0);
 
 	writel(0x02020202, ctl_base + INT_CTRL);
 
@@ -1091,7 +1091,7 @@
 
 	writel(0, DSI_CTRL);
 
-	writel(0, DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, DSI_ERR_INT_MASK0);
 
 	writel(0x02020202, DSI_INT_CTRL);
 
@@ -1191,7 +1191,7 @@
 
 	writel(0, ctl_base + CTRL);
 
-	writel(0, ctl_base + ERR_INT_MASK0);
+	writel(0x13ff3fe0, ctl_base + ERR_INT_MASK0);
 
 	writel(0x02020202, ctl_base + INT_CTRL);
 
@@ -1207,8 +1207,9 @@
 	writel(0x13c2c, ctl_base + COMMAND_MODE_MDP_DCS_CMD_CTRL);
 	writel(interleav << 30 | 0 << 24 | 0 << 20 | lane_en << 4 | 0x105,
 	       ctl_base + CTRL);
-	writel(0x10000000, ctl_base + COMMAND_MODE_DMA_CTRL);
+	writel(0x14000000, ctl_base + COMMAND_MODE_DMA_CTRL);
 	writel(0x10000000, ctl_base + MISR_CMD_CTRL);
+	writel(0x1, ctl_base + EOT_PACKET_CTRL);
 #endif
 
 	return 0;
@@ -1240,7 +1241,7 @@
 	writel(0x0000001e, DSI_CLK_CTRL);
 	writel(0x0000003e, DSI_CLK_CTRL);
 
-	writel(0x10000000, DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, DSI_ERR_INT_MASK0);
 
 
 	DST_FORMAT = 8;		// RGB888
@@ -1269,9 +1270,9 @@
 	writel(0x13c2c, DSI_COMMAND_MODE_MDP_DCS_CMD_CTRL);
 	writel(interleav << 30 | 0 << 24 | 0 << 20 | DLNx_EN << 4 | 0x105,
 	       DSI_CTRL);
-	writel(0x10000000, DSI_COMMAND_MODE_DMA_CTRL);
+	writel(0x14000000, DSI_COMMAND_MODE_DMA_CTRL);
 	writel(0x10000000, DSI_MISR_CMD_CTRL);
-	writel(0x00000040, DSI_ERR_INT_MASK0);
+	writel(0x13ff3fe0, DSI_ERR_INT_MASK0);
 	writel(0x1, DSI_EOT_PACKET_CTRL);
 
 	return NO_ERROR;
diff --git a/platform/msm_shared/mipi_dsi_phy.c b/platform/msm_shared/mipi_dsi_phy.c
index 62cabf0..834b335 100644
--- a/platform/msm_shared/mipi_dsi_phy.c
+++ b/platform/msm_shared/mipi_dsi_phy.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -199,9 +199,9 @@
 
 void mdss_dsi_uniphy_pll_lock_detect_setting(uint32_t ctl_base)
 {
-	writel(0x04, ctl_base + 0x0264); /* LKDetect CFG2 */
+	writel(0x0c, ctl_base + 0x0264); /* LKDetect CFG2 */
 	udelay(100);
-	writel(0x05, ctl_base + 0x0264); /* LKDetect CFG2 */
+	writel(0x0d, ctl_base + 0x0264); /* LKDetect CFG2 */
 	mdelay(1);
 }
 
diff --git a/platform/msm_shared/mmc_sdhci.c b/platform/msm_shared/mmc_sdhci.c
index 0883c53..f7a82f3 100644
--- a/platform/msm_shared/mmc_sdhci.c
+++ b/platform/msm_shared/mmc_sdhci.c
@@ -844,9 +844,15 @@
 	/* Run the clock @ 400 Mhz */
 	if (host->caps.hs400_support && mmc_card_supports_hs400_mode(card))
 	{
-		clock_config_mmc(host->msm_host->slot, SDHCI_CLK_400MHZ);
 		/* Save the timing value, before changing the clock */
 		MMC_SAVE_TIMING(host, MMC_HS400_TIMING);
+		/*
+		* Set the MCI_CLK divider before changing the sdcc core
+		* core clk to ensure card receives no more than 200 MHZ
+		* clock frequency
+		*/
+		sdhci_msm_set_mci_clk(host);
+		clock_config_mmc(host->msm_host->slot, SDHCI_CLK_400MHZ);
 	}
 	else
 	{
@@ -993,6 +999,10 @@
 	/* Save the timing value, before changing the clock */
 	MMC_SAVE_TIMING(host, MMC_HS400_TIMING);
 	sdhci_set_uhs_mode(host, SDHCI_SDR104_MODE);
+	/*
+	* Enable HS400 mode
+	*/
+	sdhci_msm_set_mci_clk(host);
 
 	/* 7. Execute Tuning for hs400 mode */
 	if ((mmc_ret = sdhci_msm_execute_tuning(host, width)))
@@ -1025,6 +1035,7 @@
 
 	host->base = cfg->sdhc_base;
 	host->sdhc_event = &sdhc_event;
+	host->caps.hs400_support = cfg->hs400_support;
 
 	data = (struct sdhci_msm_data *) malloc(sizeof(struct sdhci_msm_data));
 	ASSERT(data);
@@ -1690,7 +1701,16 @@
 	else
 		cmd.cmd_index = CMD18_READ_MULTIPLE_BLOCK;
 
-	cmd.argument = blk_addr;
+	/*
+	 * Standard emmc cards use byte mode addressing
+	 * convert the block address to byte address before
+	 * sending the command
+	 */
+	if (card->type == MMC_TYPE_STD_MMC)
+		cmd.argument = blk_addr * card->block_size;
+	else
+		cmd.argument = blk_addr;
+
 	cmd.cmd_type = SDHCI_CMD_TYPE_NORMAL;
 	cmd.resp_type = SDHCI_CMD_RESP_R1;
 	cmd.trans_mode = SDHCI_MMC_READ;
@@ -1762,7 +1782,16 @@
 	else
 		cmd.cmd_index = CMD25_WRITE_MULTIPLE_BLOCK;
 
-	cmd.argument = blk_addr;
+	/*
+	 * Standard emmc cards use byte mode addressing
+	 * convert the block address to byte address before
+	 * sending the command
+	 */
+	if (card->type == MMC_TYPE_STD_MMC)
+		cmd.argument = blk_addr * card->block_size;
+	else
+		cmd.argument = blk_addr;
+
 	cmd.cmd_type = SDHCI_CMD_TYPE_NORMAL;
 	cmd.resp_type = SDHCI_CMD_RESP_R1;
 	cmd.trans_mode = SDHCI_MMC_WRITE;
@@ -1824,7 +1853,15 @@
 	else
 		cmd.cmd_index = CMD32_ERASE_WR_BLK_START;
 
-	cmd.argument = erase_start;
+	/*
+	 * Standard emmc cards use byte mode addressing
+	 * convert the block address to byte address before
+	 * sending the command
+	 */
+	if (card->type == MMC_TYPE_STD_MMC)
+		cmd.argument = erase_start * card->block_size;
+	else
+		cmd.argument = erase_start;
 	cmd.cmd_type = SDHCI_CMD_TYPE_NORMAL;
 	cmd.resp_type = SDHCI_CMD_RESP_R1;
 
@@ -1859,7 +1896,15 @@
 	else
 		cmd.cmd_index = CMD33_ERASE_WR_BLK_END;
 
-	cmd.argument = erase_end;
+	/*
+	 * Standard emmc cards use byte mode addressing
+	 * convert the block address to byte address before
+	 * sending the command
+	 */
+	if (card->type == MMC_TYPE_STD_MMC)
+		cmd.argument = erase_end * card->block_size;
+	else
+		cmd.argument = erase_end;
 	cmd.cmd_type = SDHCI_CMD_TYPE_NORMAL;
 	cmd.resp_type = SDHCI_CMD_RESP_R1;
 
diff --git a/platform/msm_shared/rules.mk b/platform/msm_shared/rules.mk
index 7f48e01..98f1da0 100755
--- a/platform/msm_shared/rules.mk
+++ b/platform/msm_shared/rules.mk
@@ -132,7 +132,8 @@
             $(LOCAL_DIR)/crypto5_wrapper.o \
 			$(LOCAL_DIR)/dev_tree.o \
 			$(LOCAL_DIR)/gpio.o \
-			$(LOCAL_DIR)/dload_util.o
+			$(LOCAL_DIR)/dload_util.o \
+			$(LOCAL_DIR)/shutdown_detect.o
 endif
 
 ifeq ($(PLATFORM),mpq8092)
@@ -171,7 +172,8 @@
             $(LOCAL_DIR)/qpic_nand.o \
             $(LOCAL_DIR)/dev_tree.o \
             $(LOCAL_DIR)/scm.o \
-            $(LOCAL_DIR)/gpio.o
+            $(LOCAL_DIR)/gpio.o \
+            $(LOCAL_DIR)/shutdown_detect.o
 endif
 
 ifeq ($(PLATFORM),apq8084)
diff --git a/platform/msm_shared/scm.c b/platform/msm_shared/scm.c
index 8adc0d2..5592f20 100644
--- a/platform/msm_shared/scm.c
+++ b/platform/msm_shared/scm.c
@@ -29,6 +29,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <err.h>
+#include <asm.h>
+#include <bits.h>
 #include <arch/ops.h>
 #include "scm.h"
 
@@ -41,6 +43,14 @@
 #  define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 #endif
 
+#define SCM_CLASS_REGISTER         (0x2 << 8)
+#define SCM_MASK_IRQS              BIT(5)
+#define SCM_ATOMIC(svc, cmd, n)    ((((((svc) & 0x3f) << 10)|((cmd) & 0x3ff)) << 12) | \
+                                   SCM_CLASS_REGISTER | \
+                                   SCM_MASK_IRQS | \
+                                   ((n) & 0xf))
+
+
 /**
  * alloc_scm_command() - Allocate an SCM command
  * @cmd_size: size of the command buffer
@@ -122,6 +132,32 @@
 }
 
 /**
+* scm_call_automic: Make scm call with one or no argument
+* @svc: service id
+* @cmd: command id
+* @ arg1: argument
+*/
+
+static int scm_call_atomic(uint32_t svc, uint32_t cmd, uint32_t arg1)
+{
+	uint32_t context_id;
+	register uint32_t r0 __asm__("r0") = SCM_ATOMIC(svc, cmd, 1);
+	register uint32_t r1 __asm__("r1") = &context_id;
+	register uint32_t r2 __asm__("r2") = arg1;
+
+	__asm__ volatile(
+		__asmeq("%0", "r0")
+		__asmeq("%1", "r0")
+		__asmeq("%2", "r1")
+		__asmeq("%3", "r2")
+		"smc    #0  @ switch to secure world\n"
+		: "=r" (r0)
+		: "r" (r0), "r" (r1), "r" (r2)
+		: "r3");
+	return r0;
+}
+
+/**
  * scm_call() - Send an SCM command
  * @svc_id: service identifier
  * @cmd_id: command identifier
@@ -561,3 +597,11 @@
 	return resp_buf;
 }
 
+int scm_halt_pmic_arbiter()
+{
+	int ret = 0;
+
+	ret = scm_call_atomic(SCM_SVC_PWR, SCM_IO_DISABLE_PMIC_ARBITER, 0);
+
+	return ret;
+}
diff --git a/platform/msm_shared/sdhci.c b/platform/msm_shared/sdhci.c
index 547f4ec..9c4e8ed 100644
--- a/platform/msm_shared/sdhci.c
+++ b/platform/msm_shared/sdhci.c
@@ -264,13 +264,6 @@
 
 	REG_WRITE16(host, ctrl, SDHCI_HOST_CTRL2_REG);
 
-	/*
-	 * SDHC spec does not have matching UHS mode
-	 * So we use Vendor specific registers to enable
-	 * HS400 mode
-	 */
-	sdhci_msm_set_mci_clk(host);
-
 	/* Run the clock back */
 	sdhci_clk_supply(host, clk_val);
 }
diff --git a/platform/msm_shared/shutdown_detect.c b/platform/msm_shared/shutdown_detect.c
new file mode 100644
index 0000000..a51c9ae
--- /dev/null
+++ b/platform/msm_shared/shutdown_detect.c
@@ -0,0 +1,160 @@
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <debug.h>
+#include <reg.h>
+#include <stdlib.h>
+#include <pm8x41.h>
+#include <pm8x41_hw.h>
+#include <kernel/timer.h>
+#include <platform/timer.h>
+#include <shutdown_detect.h>
+
+/* sleep clock is 32.768 khz, 0x8000 count per second */
+#define MPM_SLEEP_TIMETICK_COUNT    0x8000
+#define PWRKEY_LONG_PRESS_COUNT     0xC000
+#define QPNP_DEFAULT_TIMEOUT        250
+#define PWRKEY_DETECT_FREQUENCY     50
+
+static struct timer pon_timer;
+static uint32_t pon_timer_complete = 0;
+
+/*
+ * Function to check if the the power key is pressed long enough.
+ * Return 0 if boot time more than PWRKEY_LONG_PRESS_COUNT.
+ * Return 1 if boot time less than PWRKEY_LONG_PRESS_COUNT.
+ */
+static uint32_t is_pwrkey_time_expired()
+{
+	/* power on button tied in with PMIC KPDPWR. */
+	uint32_t sclk_count = platform_get_sclk_count();
+
+	/* Here check if the long press power-key lasts for 1.5s */
+	if (sclk_count > PWRKEY_LONG_PRESS_COUNT)
+		return 0;
+	else
+		return 1;
+}
+
+/*
+ * Function to check if the power on reason is power key triggered.
+ * Return 1 if it is triggered by power key.
+ * Return 0 if it is not triggered by power key.
+ */
+static uint32_t is_pwrkey_pon_reason()
+{
+	uint8_t pon_reason = pm8x41_get_pon_reason();
+
+	if (pm8x41_get_is_cold_boot() && (pon_reason == KPDPWR_N))
+		return 1;
+	else
+		return 0;
+}
+
+/*
+ * Main timer handle: check every PWRKEY_DETECT_FREQUENCY to see
+ * if power key is pressed.
+ * Shutdown the device if power key is release before
+ * (PWRKEY_LONG_PRESS_COUNT/MPM_SLEEP_TIMETICK_COUNT) seconds.
+ */
+static enum handler_return long_press_pwrkey_timer_func(struct timer *p_timer,
+	void *arg)
+{
+	uint32_t sclk_count = platform_get_sclk_count();
+
+	/*
+	 * The following condition is treated as the power key
+	 * is pressed long enough.
+	 * 1. if the power key is pressed last for PWRKEY_LONG_PRESS_COUNT.
+	 */
+	if (sclk_count > PWRKEY_LONG_PRESS_COUNT) {
+		timer_cancel(p_timer);
+		pon_timer_complete = 1;
+	} else {
+		if (pm8x41_get_pwrkey_is_pressed()) {
+			/*
+			 * For normal man response is > 0.1 secs, so we use 0.05 secs default
+			 * for software to be safely detect if there is a key release action.
+			 */
+			timer_set_oneshot(p_timer, PWRKEY_DETECT_FREQUENCY,
+				long_press_pwrkey_timer_func, NULL);
+		} else {
+			shutdown_device();
+		}
+	}
+
+	return INT_RESCHEDULE;
+}
+
+/*
+ * Function to wait until the power key is pressed long enough
+ */
+static void wait_for_long_pwrkey_pressed()
+{
+	uint32_t sclk_count = 0;
+
+	while (!pon_timer_complete) {
+		sclk_count = platform_get_sclk_count();
+		if (sclk_count > PWRKEY_LONG_PRESS_COUNT) {
+			timer_cancel(&pon_timer);
+			break;
+		}
+	}
+}
+
+/*
+ * Function to support for shutdown detection
+ * If below condition is met, the function will shut down
+ * the device. Otherwise it will do nothing and return to
+ * normal boot.
+ * condition:
+ * 1. it is triggered by power key &&
+ * 2. the power key is released before
+ * (PWRKEY_LONG_PRESS_COUNT/MPM_SLEEP_TIMETICK_COUNT) seconds.
+ */
+void shutdown_detect()
+{
+	/*
+	 * If it is booted by power key tirigger.
+	 * Initialize pon_timer and call long_press_pwrkey_timer_func
+	 * function to check if the power key is last press long enough.
+	 */
+	if (is_pwrkey_pon_reason() && is_pwrkey_time_expired()) {
+		timer_initialize(&pon_timer);
+		timer_set_oneshot(&pon_timer, 0, long_press_pwrkey_timer_func, NULL);
+
+		/*
+		 * Wait until long press power key timeout
+		 *
+		 * It will be confused to end users if we shutdown the device
+		 * after the splash screen displayed. But it can be moved the
+		 * wait here if the boot time is much more considered.
+		 */
+		wait_for_long_pwrkey_pressed();
+	}
+}
diff --git a/platform/msm_shared/uart_dm.c b/platform/msm_shared/uart_dm.c
index f551a7a..c92a34f 100644
--- a/platform/msm_shared/uart_dm.c
+++ b/platform/msm_shared/uart_dm.c
@@ -29,6 +29,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <debug.h>
+#include <kernel/thread.h>
 #include <reg.h>
 #include <sys/types.h>
 #include <platform/iomap.h>
@@ -339,6 +340,8 @@
 		}
 	}
 
+	//We need to make sure the DM_NO_CHARS_FOR_TX&DM_TF are are programmed atmoically.
+	enter_critical_section();
 	/* We are here. FIFO is ready to be written. */
 	/* Write number of characters to be written */
 	writel(num_of_chars, MSM_BOOT_UART_DM_NO_CHARS_FOR_TX(base));
@@ -366,6 +369,7 @@
 		tx_char_left = num_of_chars - (i + 1) * 4;
 		tx_data = tx_data + num_chars_written;
 	}
+	exit_critical_section();
 
 	return MSM_BOOT_UART_DM_E_SUCCESS;
 }
diff --git a/project/msm8226.mk b/project/msm8226.mk
index 1e94e03..2c97294 100644
--- a/project/msm8226.mk
+++ b/project/msm8226.mk
@@ -10,6 +10,9 @@
 EMMC_BOOT := 1
 ENABLE_SDHCI_SUPPORT := 1
 
+#enable power on vibrator feature
+ENABLE_PON_VIB_SUPPORT := true
+
 #DEFINES += WITH_DEBUG_DCC=1
 DEFINES += WITH_DEBUG_UART=1
 DEFINES += WITH_DEBUG_LOG_BUF=1
@@ -26,6 +29,10 @@
 #Disable thumb mode
 ENABLE_THUMB := false
 
+ifeq ($(ENABLE_PON_VIB_SUPPORT),true)
+DEFINES += PON_VIB_SUPPORT=1
+endif
+
 ifeq ($(ENABLE_SDHCI_SUPPORT),1)
 DEFINES += MMC_SDHCI_SUPPORT=1
 endif
diff --git a/project/msm8610.mk b/project/msm8610.mk
index 72eaf81..5bcad33 100644
--- a/project/msm8610.mk
+++ b/project/msm8610.mk
@@ -10,8 +10,12 @@
 EMMC_BOOT := 1
 ENABLE_SDHCI_SUPPORT := 1
 
+#enable power on vibrator feature
+ENABLE_PON_VIB_SUPPORT := true
+
 #DEFINES += WITH_DEBUG_DCC=1
 DEFINES += WITH_DEBUG_UART=1
+DEFINES += WITH_DEBUG_LOG_BUF=1
 #DEFINES += WITH_DEBUG_FBCON=1
 DEFINES += DEVICE_TREE=1
 #DEFINES += MMC_BOOT_BAM=1
@@ -28,6 +32,10 @@
 #is with the linker and file a bug report.
 ENABLE_THUMB := false
 
+ifeq ($(ENABLE_PON_VIB_SUPPORT),true)
+DEFINES += PON_VIB_SUPPORT=1
+endif
+
 ifeq ($(ENABLE_SDHCI_SUPPORT),1)
 DEFINES += MMC_SDHCI_SUPPORT=1
 endif
diff --git a/target/apq8084/oem_panel.c b/target/apq8084/oem_panel.c
index eeae271..3b487c6 100644
--- a/target/apq8084/oem_panel.c
+++ b/target/apq8084/oem_panel.c
@@ -153,7 +153,7 @@
 	return ret;
 }
 
-bool oem_panel_select(struct panel_struct *panelstruct,
+bool oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
 			struct msm_panel_info *pinfo,
 			struct mdss_dsi_phy_ctrl *phy_db)
 {
diff --git a/target/apq8084/target_display.c b/target/apq8084/target_display.c
old mode 100644
new mode 100755
index 517ea1b..fd6f766
--- a/target/apq8084/target_display.c
+++ b/target/apq8084/target_display.c
@@ -242,16 +242,16 @@
 	return NO_ERROR;
 }
 
-void display_init(void)
+void target_display_init(const char *panel_name)
 {
 	uint32_t ret = 0;
-	ret = gcdb_display_init(MDP_REV_50, MIPI_FB_ADDR);
+	ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
 	if (ret) {
 		msm_display_off();
 	}
 }
 
-void display_shutdown(void)
+void target_display_shutdown(void)
 {
 	gcdb_display_shutdown();
 }
diff --git a/target/init.c b/target/init.c
index 7875a4f..8eeb906 100644
--- a/target/init.c
+++ b/target/init.c
@@ -146,6 +146,14 @@
 	return false;
 }
 
+__WEAK void target_display_init(const char *panel_name)
+{
+}
+
+__WEAK void target_display_shutdown(void)
+{
+}
+
 __WEAK uint8_t target_panel_auto_detect_enabled()
 {
 	return 0;
diff --git a/target/msm7627a/init.c b/target/msm7627a/init.c
index 502cb54..41c9611 100644
--- a/target/msm7627a/init.c
+++ b/target/msm7627a/init.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2009, Google Inc.
  * All rights reserved.
- * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -186,12 +186,6 @@
 	keypad_init();
 #endif
 
-	/* Display splash screen if enabled */
-#if DISPLAY_SPLASH_SCREEN
-	display_init();
-	dprintf(SPEW, "Diplay initialized\n");
-#endif
-
 	if (target_is_emmc_boot()) {
 		/* Must wait for modem-up before we can intialize MMC.
 		 */
diff --git a/target/msm7627a/target_display.c b/target/msm7627a/target_display.c
old mode 100644
new mode 100755
index 0c4d073..94270b5
--- a/target/msm7627a/target_display.c
+++ b/target/msm7627a/target_display.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012, 2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -69,7 +69,7 @@
 	}
 	return ret;
 }
-void display_init(void)
+void target_display_init(const char *panel_name)
 {
 	unsigned mach_type;
 	mach_type = board_machtype();
@@ -155,7 +155,7 @@
 	display_enabled = 1;
 }
 
-void display_shutdown(void)
+void target_display_shutdown(void)
 {
 	dprintf(SPEW, "display_shutdown()\n");
 	if (display_enabled)
diff --git a/target/msm8226/init.c b/target/msm8226/init.c
index 3da5c15..74baa49 100644
--- a/target/msm8226/init.c
+++ b/target/msm8226/init.c
@@ -48,6 +48,8 @@
 #include <scm.h>
 #include <stdlib.h>
 #include <partition_parser.h>
+#include <shutdown_detect.h>
+#include <vibrator.h>
 
 extern  bool target_use_signed_kernel(void);
 static void set_sdc_power_ctrl(void);
@@ -65,6 +67,7 @@
 #define CRYPTO_ENGINE_CMD_ARRAY_SIZE       20
 
 #define TLMM_VOL_UP_BTN_GPIO    106
+#define VIBRATE_TIME    250
 
 #define SSD_CE_INSTANCE         1
 
@@ -247,12 +250,10 @@
 
 	target_sdc_init();
 
-	/* Display splash screen if enabled */
-#if DISPLAY_SPLASH_SCREEN
-	dprintf(SPEW, "Display Init: Start\n");
-	display_init();
-	dprintf(SPEW, "Display Init: Done\n");
-#endif
+	shutdown_detect();
+
+	/* turn on vibrator to indicate that phone is booting up to end user */
+	vib_timed_turn_on(VIBRATE_TIME);
 
 	if (target_use_signed_kernel())
 		target_crypto_init_params();
@@ -375,6 +376,24 @@
 	dprintf(CRITICAL, "Rebooting failed\n");
 }
 
+/* Configure PMIC and Drop PS_HOLD for shutdown */
+void shutdown_device()
+{
+	dprintf(CRITICAL, "Going down for shutdown.\n");
+
+	/* Configure PMIC for shutdown */
+	pm8x41_reset_configure(PON_PSHOLD_SHUTDOWN);
+
+	/* Drop PS_HOLD for MSM */
+	writel(0x00, MPM2_MPM_PS_HOLD);
+
+	mdelay(5000);
+
+	dprintf(CRITICAL, "shutdown failed\n");
+
+	ASSERT(0);
+}
+
 crypto_engine_type board_ce_type(void)
 {
 	return CRYPTO_ENGINE_TYPE_HW;
@@ -393,6 +412,9 @@
 
 void target_uninit(void)
 {
+	/* wait for the vibrator timer is expried */
+	wait_vib_timeout();
+
 	mmc_put_card_to_sleep(dev);
 
 	if (target_is_ssd_enabled())
@@ -503,6 +525,8 @@
 	dload_util_write_cookie(mode == NORMAL_DLOAD ?
 		DLOAD_MODE_ADDR : EMERGENCY_DLOAD_MODE_ADDR, mode);
 
+	pm8x41_clear_pmic_watchdog();
+
 	return 0;
 }
 
diff --git a/target/msm8226/oem_panel.c b/target/msm8226/oem_panel.c
index f23aded..8326442 100755
--- a/target/msm8226/oem_panel.c
+++ b/target/msm8226/oem_panel.c
@@ -52,6 +52,7 @@
 #define DISPLAY_MAX_PANEL_DETECTION 2
 
 #define SSD2080M_720P_VIDEO_PANEL_ON_DELAY 200
+#define MAX_PANEL_ID_LEN 64
 
 /*---------------------------------------------------------------------------*/
 /* static panel selection variable                                           */
@@ -78,6 +79,21 @@
 	HW_PLATFORM_SUBTYPE_SKUG = 5,
 };
 
+/*
+ * The list of panels that are supported on this target.
+ * Any panel in this list can be selected using fastboot oem command.
+ */
+static struct panel_list supp_panels[] = {
+	{"toshiba_720p_video", TOSHIBA_720P_VIDEO_PANEL},
+	{"nt35590_720p_cmd", NT35590_720P_CMD_PANEL},
+	{"nt35590_720p_video", NT35590_720P_VIDEO_PANEL},
+	{"nt35596_1080p_video", NT35596_1080P_VIDEO_PANEL},
+	{"hx8394a_720p_video", HX8394A_720P_VIDEO_PANEL},
+	{"nt35521_720p_video", NT35521_720P_VIDEO_PANEL},
+	{"ssd2080m_720p_video", SSD2080M_720P_VIDEO_PANEL},
+	{"jdi_1080p_video", JDI_1080P_VIDEO_PANEL},
+};
+
 static uint32_t panel_id;
 
 int oem_panel_rotation()
@@ -119,6 +135,12 @@
 	return NO_ERROR;
 }
 
+static void mdss_source_pipe_select(struct msm_panel_info *pinfo)
+{
+	/* Use DMA pipe for splash logo on 8x26 */
+	pinfo->use_dma_pipe = 1;
+}
+
 static void init_panel_data(struct panel_struct *panelstruct,
 			struct msm_panel_info *pinfo,
 			struct mdss_dsi_phy_ctrl *phy_db)
@@ -306,7 +328,7 @@
 
 static uint32_t auto_pan_loop = 0;
 
-bool oem_panel_select(struct panel_struct *panelstruct,
+bool oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
 			struct msm_panel_info *pinfo,
 			struct mdss_dsi_phy_ctrl *phy_db)
 {
@@ -315,10 +337,24 @@
 	uint32_t nt35590_panel_id = NT35590_720P_VIDEO_PANEL;
 	uint32_t hw_subtype = board_hardware_subtype();
 	bool ret = true;
+	int32_t panel_override_id;
 
-#if DISPLAY_TYPE_CMD_MODE
-	nt35590_panel_id = NT35590_720P_CMD_PANEL;
-#endif
+	if (panel_name) {
+		panel_override_id = panel_name_to_id(supp_panels,
+				ARRAY_SIZE(supp_panels), panel_name);
+
+		if (panel_override_id < 0) {
+			dprintf(CRITICAL, "Not able to search the panel:%s\n",
+					 panel_name + strspn(panel_name, " "));
+		} else if (panel_override_id < UNKNOWN_PANEL) {
+			/* panel override using fastboot oem command */
+			panel_id = panel_override_id;
+
+			dprintf(INFO, "OEM panel override:%s\n",
+					panel_name + strspn(panel_name, " "));
+			goto panel_init;
+		}
+	}
 
 	switch (hw_id) {
 	case HW_PLATFORM_QRD:
@@ -367,7 +403,9 @@
 		return false;
 	}
 
+panel_init:
 	init_panel_data(panelstruct, pinfo, phy_db);
+	mdss_source_pipe_select(pinfo);
 
 	return ret;
 }
diff --git a/target/msm8226/rules.mk b/target/msm8226/rules.mk
index f5c9596..d31f2bc 100755
--- a/target/msm8226/rules.mk
+++ b/target/msm8226/rules.mk
@@ -18,7 +18,6 @@
 DEFINES += DISPLAY_SPLASH_SCREEN=1
 DEFINES += DISPLAY_TYPE_MIPI=1
 DEFINES += DISPLAY_TYPE_DSI6G=1
-DEFINES += DISPLAY_TYPE_CMD_MODE=0
 
 MODULES += \
 	dev/keys \
@@ -26,6 +25,7 @@
 	dev/pmic/pm8x41 \
 	dev/panel/msm \
 	dev/gcdb/display \
+	dev/vib \
 	lib/libfdt
 
 DEFINES += \
diff --git a/target/msm8226/target_display.c b/target/msm8226/target_display.c
index c89c1ac..2e608c8 100755
--- a/target/msm8226/target_display.c
+++ b/target/msm8226/target_display.c
@@ -341,13 +341,13 @@
 	return ret;
 }
 
-void display_init(void)
+void target_display_init(const char *panel_name)
 {
         uint32_t panel_loop = 0;
         uint32_t ret = 0;
 
 	do {
-		ret = gcdb_display_init(MDP_REV_50, MIPI_FB_ADDR);
+		ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
 		if (!ret || ret == ERR_NOT_SUPPORTED) {
 			break;
 		} else {
@@ -359,7 +359,7 @@
 
 }
 
-void display_shutdown(void)
+void target_display_shutdown(void)
 {
 	gcdb_display_shutdown();
 }
diff --git a/target/msm8610/init.c b/target/msm8610/init.c
index 1fd5e23..d085765 100644
--- a/target/msm8610/init.c
+++ b/target/msm8610/init.c
@@ -49,11 +49,14 @@
 #include <partition_parser.h>
 #include <platform/clock.h>
 #include <platform/timer.h>
+#include <shutdown_detect.h>
+#include <vibrator.h>
 
 #define PMIC_ARB_CHANNEL_NUM    0
 #define PMIC_ARB_OWNER_ID       0
 
 #define TLMM_VOL_UP_BTN_GPIO    72
+#define VIBRATE_TIME    250
 
 enum target_subtype {
 	HW_PLATFORM_SUBTYPE_SKUAA = 1,
@@ -164,15 +167,18 @@
 
 	target_sdc_init();
 
-	/* Display splash screen if enabled */
-	dprintf(SPEW, "Display Init: Start\n");
-	display_init();
-	dprintf(SPEW, "Display Init: Done\n");
+	shutdown_detect();
+
+	/* turn on vibrator to indicate that phone is booting up to end user */
+	vib_timed_turn_on(VIBRATE_TIME);
 }
 
 void target_uninit(void)
 {
         mmc_put_card_to_sleep(dev);
+
+	/* wait for the vibrator timer is expried */
+	wait_vib_timeout();
 }
 
 #define SSD_CE_INSTANCE         1
@@ -316,11 +322,17 @@
 
 void reboot_device(unsigned reboot_reason)
 {
+	int ret = 0;
+
 	writel(reboot_reason, RESTART_REASON_ADDR);
 
 	/* Configure PMIC for warm reset */
 	pm8x41_reset_configure(PON_PSHOLD_WARM_RESET);
 
+	ret = scm_halt_pmic_arbiter();
+	if (ret)
+		dprintf(CRITICAL , "Failed to halt pmic arbiter: %d\n", ret);
+
 	/* Drop PS_HOLD for MSM */
 	writel(0x00, MPM2_MPM_PS_HOLD);
 
@@ -424,3 +436,21 @@
 {
 	return dev;
 }
+
+/* Configure PMIC and Drop PS_HOLD for shutdown */
+void shutdown_device()
+{
+	dprintf(CRITICAL, "Going down for shutdown.\n");
+
+	/* Configure PMIC for shutdown */
+	pm8x41_reset_configure(PON_PSHOLD_SHUTDOWN);
+
+	/* Drop PS_HOLD for MSM */
+	writel(0x00, MPM2_MPM_PS_HOLD);
+
+	mdelay(5000);
+
+	dprintf(CRITICAL, "shutdown failed\n");
+
+	ASSERT(0);
+}
diff --git a/target/msm8610/oem_panel.c b/target/msm8610/oem_panel.c
index 8ea0a5e..e1fad7c 100644
--- a/target/msm8610/oem_panel.c
+++ b/target/msm8610/oem_panel.c
@@ -221,7 +221,7 @@
 	return true;
 }
 
-bool oem_panel_select(struct panel_struct *panelstruct,
+bool oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
 			struct msm_panel_info *pinfo,
 			struct mdss_dsi_phy_ctrl *phy_db)
 {
diff --git a/target/msm8610/rules.mk b/target/msm8610/rules.mk
index 909e673..7ffcfe1 100644
--- a/target/msm8610/rules.mk
+++ b/target/msm8610/rules.mk
@@ -25,6 +25,7 @@
 	dev/pmic/pm8x41 \
 	dev/panel/msm \
 	dev/gcdb/display \
+	dev/vib \
 	lib/libfdt
 
 DEFINES += \
diff --git a/target/msm8610/target_display.c b/target/msm8610/target_display.c
old mode 100644
new mode 100755
index fde805a..4b963b8
--- a/target/msm8610/target_display.c
+++ b/target/msm8610/target_display.c
@@ -162,12 +162,12 @@
 	return 0;
 }
 
-void display_init(void)
+void target_display_init(const char *panel_name)
 {
-	gcdb_display_init(MDP_REV_304, MIPI_FB_ADDR);
+	gcdb_display_init(panel_name, MDP_REV_304, MIPI_FB_ADDR);
 }
 
-void display_shutdown(void)
+void target_display_shutdown(void)
 {
 	gcdb_display_shutdown();
 }
diff --git a/target/msm8960/init.c b/target/msm8960/init.c
index 72d9463..dcee3b4 100755
--- a/target/msm8960/init.c
+++ b/target/msm8960/init.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2009, Google Inc.
  * All rights reserved.
- * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -142,12 +142,6 @@
 		dprintf(CRITICAL,"Keyboard is not supported for platform: %d\n",platform_id);
 	};
 
-	/* Display splash screen if enabled */
-#if DISPLAY_SPLASH_SCREEN
-	display_init();
-	dprintf(SPEW, "Diplay initialized\n");
-#endif
-
 	if ((platform_id == MSM8960) || (platform_id == MSM8960AB) ||
 		(platform_id == APQ8060AB) || (platform_id == MSM8260AB) ||
 		(platform_id == MSM8660AB) || (platform_id == MSM8660A) ||
diff --git a/target/msm8960/target_display.c b/target/msm8960/target_display.c
old mode 100644
new mode 100755
index 39a3aeb..2eec1ea
--- a/target/msm8960/target_display.c
+++ b/target/msm8960/target_display.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -255,7 +255,7 @@
 	return 0;
 }
 
-void display_init(void)
+void target_display_init(const char *panel_name)
 {
 	int target_id = board_target_id();
 
@@ -345,7 +345,7 @@
 	display_enable = 1;
 }
 
-void display_shutdown(void)
+void target_display_shutdown(void)
 {
 	if (display_enable) {
 		msm_display_off();
diff --git a/target/msm8974/init.c b/target/msm8974/init.c
index 2e6c151..20d3b02 100644
--- a/target/msm8974/init.c
+++ b/target/msm8974/init.c
@@ -351,15 +351,6 @@
 
 	if (target_use_signed_kernel())
 		target_crypto_init_params();
-	/* Display splash screen if enabled */
-#if DISPLAY_SPLASH_SCREEN
-	dprintf(INFO, "Display Init: Start\n");
-	if (board_hardware_subtype() != HW_PLATFORM_SUBTYPE_CDP_INTERPOSER)
-	{
-		display_init();
-	}
-	dprintf(INFO, "Display Init: Done\n");
-#endif
 
 	/*
 	 * Set drive strength & pull ctrl for
diff --git a/target/msm8974/oem_panel.c b/target/msm8974/oem_panel.c
index 0bda609..1634cd4 100755
--- a/target/msm8974/oem_panel.c
+++ b/target/msm8974/oem_panel.c
@@ -232,7 +232,7 @@
 
 static uint32_t auto_pan_loop = 0;
 
-bool oem_panel_select(struct panel_struct *panelstruct,
+bool oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
 			struct msm_panel_info *pinfo,
 			struct mdss_dsi_phy_ctrl *phy_db)
 {
diff --git a/target/msm8974/target_display.c b/target/msm8974/target_display.c
old mode 100644
new mode 100755
index c32cef0..b8dc850
--- a/target/msm8974/target_display.c
+++ b/target/msm8974/target_display.c
@@ -58,40 +58,76 @@
 	.full_current_scale = 0x19
 };
 
-static uint32_t dsi_pll_enable_seq(uint32_t ctl_base)
+static uint32_t dsi_pll_lock_status(uint32_t ctl_base)
 {
-	uint32_t rc = 0;
+	uint32_t counter, status;
 
+	udelay(100);
+	mdss_dsi_uniphy_pll_lock_detect_setting(ctl_base);
+
+	status = readl(ctl_base + 0x02c0) & 0x01;
+	for (counter = 0; counter < 5 && !status; counter++) {
+		udelay(100);
+		status = readl(ctl_base + 0x02c0) & 0x01;
+	}
+
+	return status;
+}
+
+static uint32_t dsi_pll_enable_seq_b(uint32_t ctl_base)
+{
 	mdss_dsi_uniphy_pll_sw_reset(ctl_base);
 
 	writel(0x01, ctl_base + 0x0220); /* GLB CFG */
-	mdelay(1);
+	udelay(1);
 	writel(0x05, ctl_base + 0x0220); /* GLB CFG */
-	mdelay(1);
+	udelay(200);
 	writel(0x07, ctl_base + 0x0220); /* GLB CFG */
-	mdelay(1);
+	udelay(500);
 	writel(0x0f, ctl_base + 0x0220); /* GLB CFG */
-	mdelay(1);
+	udelay(500);
 
-	mdss_dsi_uniphy_pll_lock_detect_setting(ctl_base);
+	return dsi_pll_lock_status(ctl_base);
+}
 
-	while (!(readl(ctl_base + 0x02c0) & 0x01)) {
-		mdss_dsi_uniphy_pll_sw_reset(ctl_base);
-		writel(0x01, ctl_base + 0x0220); /* GLB CFG */
-		mdelay(1);
-		writel(0x05, ctl_base + 0x0220); /* GLB CFG */
-		mdelay(1);
-		writel(0x07, ctl_base + 0x0220); /* GLB CFG */
-		mdelay(1);
-		writel(0x05, ctl_base + 0x0220); /* GLB CFG */
-		mdelay(1);
-		writel(0x07, ctl_base + 0x0220); /* GLB CFG */
-		mdelay(1);
-		writel(0x0f, ctl_base + 0x0220); /* GLB CFG */
-		mdelay(2);
-		mdss_dsi_uniphy_pll_lock_detect_setting(ctl_base);
+static uint32_t dsi_pll_enable_seq_d(uint32_t ctl_base)
+{
+	mdss_dsi_uniphy_pll_sw_reset(ctl_base);
+
+	writel(0x01, ctl_base + 0x0220); /* GLB CFG */
+	udelay(1);
+	writel(0x05, ctl_base + 0x0220); /* GLB CFG */
+	udelay(200);
+	writel(0x07, ctl_base + 0x0220); /* GLB CFG */
+	udelay(250);
+	writel(0x05, ctl_base + 0x0220); /* GLB CFG */
+	udelay(200);
+	writel(0x07, ctl_base + 0x0220); /* GLB CFG */
+	udelay(500);
+	writel(0x0f, ctl_base + 0x0220); /* GLB CFG */
+	udelay(500);
+
+	return dsi_pll_lock_status(ctl_base);
+}
+
+static void dsi_pll_enable_seq(uint32_t ctl_base)
+{
+	uint32_t counter, status;
+
+	for (counter = 0; counter < 3; counter++) {
+		status = dsi_pll_enable_seq_b(ctl_base);
+		if (status)
+			break;
+		status = dsi_pll_enable_seq_d(ctl_base);
+		if (status)
+			break;
+		status = dsi_pll_enable_seq_d(ctl_base);
+		if(status)
+			break;
 	}
-	return rc;
+
+	if (!status)
+		dprintf(CRITICAL, "Pll lock sequence failed\n");
 }
 
 static int msm8974_wled_backlight_ctrl(uint8_t enable)
@@ -330,7 +366,7 @@
 	return 0;
 }
 
-void display_init(void)
+void target_display_init(const char *panel_name)
 {
 	uint32_t hw_id = board_hardware_id();
 	uint32_t panel_loop = 0;
@@ -353,7 +389,8 @@
 		break;
 	default:
 		do {
-			ret = gcdb_display_init(MDP_REV_50, MIPI_FB_ADDR);
+			ret = gcdb_display_init(panel_name, MDP_REV_50,
+				MIPI_FB_ADDR);
 			if (!ret || ret == ERR_NOT_SUPPORTED) {
 				break;
 			} else {
@@ -366,7 +403,7 @@
 	}
 }
 
-void display_shutdown(void)
+void target_display_shutdown(void)
 {
 	uint32_t hw_id = board_hardware_id();
 	switch (hw_id) {