Tegra2: Do pinmux_init more early.

Do pinmux_init early to make LCD power signals keep on
low level before LCD power on.
Add the delay T1 between between panel power on and data out.

Note: Other corresponding change is:
      http://gerrit.chromium.org/gerrit/3308

BUG=chrome-os-partner:1957
TEST=test on Kaen, Foxconn confirmed the timing already
can meet panel spec about power on sequence.

Change-Id: I22636a8c8d1f6ee715babe7828c80613a8f3ba1c
Signed-off-by: Dilan Lee <dilee@nvidia.com>
Reviewed-on: http://gerrit.chromium.org/gerrit/3309
Reviewed-by: Simon Glass <sjg@chromium.org>
diff --git a/board/tegra2/generic/board.c b/board/tegra2/generic/board.c
index 3d3d82c..924bbb1 100644
--- a/board/tegra2/generic/board.c
+++ b/board/tegra2/generic/board.c
@@ -1,4 +1,4 @@
-/*
+/*
  *  (C) Copyright 2010
  *  NVIDIA Corporation <www.nvidia.com>
  *
@@ -36,6 +36,7 @@
 #include "sdmmc/nvboot_clocks_int.h"
 #include "board.h"
 #include <asm/arch/gpio.h>
+#include "lcd/gpinit/gp-util.h"
 
 /******************************************************************************
  * PLL CONFIGURATION & PARAMETERS for different clock generators:
@@ -118,6 +119,11 @@
 void board_usb_init(void);
 void board_spi_init(void);
 
+static void pinmux_init(void)
+{
+	tegra_pinmux_config_table(tegra2_gp_pinmux, tegra2_gp_pinmux_tab_len);
+}
+
 /*
  * Routine: board_init
  * Description: Early hardware init.
@@ -131,6 +137,12 @@
 	/* board id for Linux */
 	gd->bd->bi_arch_number = LINUX_MACH_TYPE;
 
+	/*
+	 * do pinmux_init early to make LCD power signals
+	 * keep on low level before LCD power on
+	 */
+	pinmux_init();
+
 #ifdef CONFIG_TEGRA2_LCD
 	gd->fb_base = LCD_FB_ADDR;
 #endif
diff --git a/board/tegra2/generic/lcd/gpinit/gp-util.c b/board/tegra2/generic/lcd/gpinit/gp-util.c
index 3f16adf..f85a491 100644
--- a/board/tegra2/generic/lcd/gpinit/gp-util.c
+++ b/board/tegra2/generic/lcd/gpinit/gp-util.c
@@ -32,6 +32,7 @@
 	.backlight = TEGRA_PANEL_GPIO_BACKLIGHT,
 	.backlight_vdd = TEGRA_PANEL_GPIO_BACKLIGHT_VDD,
 	.panel_power_enable = TEGRA_PANEL_GPIO_EN_VDD_PNL,
+	.T1 = TEGRA_PANEL_PANEL_PON_TO_DATA_MS,
 	.T3 = TEGRA_PANEL_DATA_TO_BACKLIGHTPWR_MS,
 	.T5 = TEGRA_PANEL_BACKLIGHTPWR_TO_VPWM_MS,
 	.T6 = TEGRA_PANEL_VPWM_TO_VEN_MS,
@@ -44,15 +45,11 @@
 	tegra_clk_init_from_table(tegra2_gp_clk_init_table);
 }
 
-static void pinmux_init(void)
-{
-	tegra_pinmux_config_table(tegra2_gp_pinmux, tegra2_gp_pinmux_tab_len);
-}
-
 #ifdef	TEGRA_PANEL_POWERON_SEQUENCE
 void mdelay(int ms)
 {
-	udelay(ms * 1000);
+	if (ms)
+		udelay(ms * 1000);
 }
 
 static void poweron_panel(void)
@@ -67,6 +64,9 @@
 	tg2_gpio_set_value_ex(
 		tegra_panel_sequence_table.panel_power_enable, 1);
 
+	/* Panel power-on to Data Time */
+	mdelay(tegra_panel_sequence_table.T1);
+
 	/* Enable LVDS */
 	tg2_gpio_direction_output_ex(
 		tegra_panel_sequence_table.lvds_enable, 1);
@@ -114,7 +114,6 @@
 void gpinit(void)
 {
 	clk_init();
-	pinmux_init();
 	poweron_3d();
 
 #ifdef	TEGRA_PANEL_POWERON_SEQUENCE
diff --git a/board/tegra2/generic/lcd/gpinit/gpinit.h b/board/tegra2/generic/lcd/gpinit/gpinit.h
index b7df6e5..490709a 100644
--- a/board/tegra2/generic/lcd/gpinit/gpinit.h
+++ b/board/tegra2/generic/lcd/gpinit/gpinit.h
@@ -214,6 +214,7 @@
  * backlight          : LCD signal enable pin
  * backlight_vdd      : backlight power pin
  * panel_power_enable : panel power pin
+ * T1                 : delay between Panel power-on and Data
  * T3                 : delay between Data and Backlight Rise
  * T5                 : delay between Backlight and Vpwm Rise
  * T6                 : delay between Vpwm and Ven Rise
@@ -223,6 +224,7 @@
 	unsigned  backlight;
 	unsigned  backlight_vdd;
 	unsigned  panel_power_enable;
+	unsigned  T1;
 	unsigned  T3;
 	unsigned  T5;
 	unsigned  T6;