CHROMIUM: ARM: tegra: aebl: Update EMC tables to match kernel.

This depends on:
* http://gerrit.chromium.org/gerrit/5206
    Tegra: pmu: Fix the pmu_read and pmu_write
* http://gerrit.chromium.org/gerrit/5238
    CHROMIUM: ARM: tegra: Don't call board_emc_init() before
    bi_arch_number set.

This should have been done at the same time as these kernel CLs:
* http://gerrit.chromium.org/gerrit/4516
    CHROMIUM: arm: tegra: Modify DVFS EMC table to support all sku of Aebl-DVT

BUG=chromium-os:18648
TEST=Added print statements and saw proper init.
TEST=Booted on aebl and saw things were OK.

Reviewed-on: http://gerrit.chromium.org/gerrit/5254
Tested-by: Doug Anderson <[email protected]>
Reviewed-by: Hung-Te Lin <[email protected]>
(cherry picked from commit 098bf3e25be1471a63b5c8824f02990c560ae9fe)

Change-Id: I2d23f27d7108b711760c15b166821ec126224fc1
diff --git a/board/nvidia/common/emc.c b/board/nvidia/common/emc.c
index 07fda2b..3609ef8 100644
--- a/board/nvidia/common/emc.c
+++ b/board/nvidia/common/emc.c
@@ -634,7 +634,7 @@
 	}
 }
 
-static const struct tegra_emc_table aebl_emc_tables[] = {
+static const struct tegra_emc_table aebl_emc_tables_Micron_380Mhz[] = {
 	{
 		.rate = 190000,   /* SDRAM frequency */
 		.regs = {
@@ -652,7 +652,7 @@
 			0x00000001,   /* REXT */
 			0x00000003,   /* WDV */
 			0x00000004,   /* QUSE */
-			0x00000005,   /* QRST */
+			0x00000003,   /* QRST */
 			0x00000009,   /* QSAFE */
 			0x0000000c,   /* RDV */
 			0x0000059f,   /* REFRESH */
@@ -676,7 +676,7 @@
 			0x00000000,   /* ODT_READ */
 			0x00000083,   /* FBIO_CFG5 */
 			0xa06204ae,   /* CFG_DIG_DLL */
-			0x007e8010,   /* DLL_XFORM_DQS */
+			0x007e4010,   /* DLL_XFORM_DQS */
 			0x00000000,   /* DLL_XFORM_QUSE */
 			0x00000000,   /* ZCAL_REF_CNT */
 			0x00000000,   /* ZCAL_WAIT_CNT */
@@ -738,9 +738,137 @@
 	}
 };
 
+static const struct tegra_emc_table aebl_emc_tables_Hynix_380Mhz[] = {
+	{
+		.rate = 190000,   /* SDRAM frequency */
+		.regs = {
+			0x0000000c,   /* RC */
+			0x00000026,   /* RFC */
+			0x00000009,   /* RAS */
+			0x00000003,   /* RP */
+			0x00000004,   /* R2W */
+			0x00000004,   /* W2R */
+			0x00000002,   /* R2P */
+			0x0000000c,   /* W2P */
+			0x00000003,   /* RD_RCD */
+			0x00000003,   /* WR_RCD */
+			0x00000002,   /* RRD */
+			0x00000001,   /* REXT */
+			0x00000004,   /* WDV */
+			0x00000005,   /* QUSE */
+			0x00000004,   /* QRST */
+			0x00000009,   /* QSAFE */
+			0x0000000d,   /* RDV */
+			0x0000059f,   /* REFRESH */
+			0x00000000,   /* BURST_REFRESH_NUM */
+			0x00000003,   /* PDEX2WR */
+			0x00000003,   /* PDEX2RD */
+			0x00000003,   /* PCHG2PDEN */
+			0x00000003,   /* ACT2PDEN */
+			0x00000001,   /* AR2PDEN */
+			0x0000000b,   /* RW2PDEN */
+			0x000000c8,   /* TXSR */
+			0x00000003,   /* TCKE */
+			0x00000007,   /* TFAW */
+			0x00000004,   /* TRPAB */
+			0x0000000f,   /* TCLKSTABLE */
+			0x00000002,   /* TCLKSTOP */
+			0x00000000,   /* TREFBW */
+			0x00000000,   /* QUSE_EXTRA */
+			0x00000003,   /* FBIO_CFG6 */
+			0x00000000,   /* ODT_WRITE */
+			0x00000000,   /* ODT_READ */
+			0x00000083,   /* FBIO_CFG5 */
+			0xa06204ae,   /* CFG_DIG_DLL */
+			0x007e0010,   /* DLL_XFORM_DQS */
+			0x00000000,   /* DLL_XFORM_QUSE */
+			0x00000000,   /* ZCAL_REF_CNT */
+			0x00000000,   /* ZCAL_WAIT_CNT */
+			0x00000000,   /* AUTO_CAL_INTERVAL */
+			0x00000000,   /* CFG_CLKTRIM_0 */
+			0x00000000,   /* CFG_CLKTRIM_1 */
+			0x00000000,   /* CFG_CLKTRIM_2 */
+		}
+	}, {
+		.rate = 380000,   /* SDRAM frequency */
+		.regs = {
+			0x00000017,   /* RC */
+			0x0000004b,   /* RFC */
+			0x00000012,   /* RAS */
+			0x00000006,   /* RP */
+			0x00000004,   /* R2W */
+			0x00000005,   /* W2R */
+			0x00000003,   /* R2P */
+			0x0000000c,   /* W2P */
+			0x00000006,   /* RD_RCD */
+			0x00000006,   /* WR_RCD */
+			0x00000003,   /* RRD */
+			0x00000001,   /* REXT */
+			0x00000004,   /* WDV */
+			0x00000005,   /* QUSE */
+			0x00000004,   /* QRST */
+			0x00000009,   /* QSAFE */
+			0x0000000d,   /* RDV */
+			0x00000b5f,   /* REFRESH */
+			0x00000000,   /* BURST_REFRESH_NUM */
+			0x00000003,   /* PDEX2WR */
+			0x00000003,   /* PDEX2RD */
+			0x00000006,   /* PCHG2PDEN */
+			0x00000006,   /* ACT2PDEN */
+			0x00000001,   /* AR2PDEN */
+			0x00000011,   /* RW2PDEN */
+			0x000000c8,   /* TXSR */
+			0x00000003,   /* TCKE */
+			0x0000000e,   /* TFAW */
+			0x00000007,   /* TRPAB */
+			0x0000000f,   /* TCLKSTABLE */
+			0x00000002,   /* TCLKSTOP */
+			0x00000000,   /* TREFBW */
+			0x00000000,   /* QUSE_EXTRA */
+			0x00000003,   /* FBIO_CFG6 */
+			0x00000000,   /* ODT_WRITE */
+			0x00000000,   /* ODT_READ */
+			0x00000083,   /* FBIO_CFG5 */
+			0xe044048b,   /* CFG_DIG_DLL */
+			0x007da010,   /* DLL_XFORM_DQS */
+			0x00000000,   /* DLL_XFORM_QUSE */
+			0x00000000,   /* ZCAL_REF_CNT */
+			0x00000000,   /* ZCAL_WAIT_CNT */
+			0x00000000,   /* AUTO_CAL_INTERVAL */
+			0x00000000,   /* CFG_CLKTRIM_0 */
+			0x00000000,   /* CFG_CLKTRIM_1 */
+			0x00000000,   /* CFG_CLKTRIM_2 */
+		}
+	}
+};
+
+struct tegra_board_emc_table aebl_emc[] = {
+	{
+		.table		= aebl_emc_tables_Micron_380Mhz,
+		.table_size	= ARRAY_SIZE(aebl_emc_tables_Micron_380Mhz),
+		.name		= "Mircron 380MHz",
+	},
+	{
+		.table		= aebl_emc_tables_Hynix_380Mhz,
+		.table_size	= ARRAY_SIZE(aebl_emc_tables_Hynix_380Mhz),
+		.name		= "Hynix 380MHz",
+	},
+};
+
 void aebl_emc_init(void)
 {
-	tegra_set_emc(aebl_emc_tables, ARRAY_SIZE(aebl_emc_tables));
+	u32 reg;
+	int ram_id;
+
+	reg = readl(NV_PA_APB_MISC_BASE + STRAP_OPT);
+	ram_id = (reg & RAM_ID_MASK) >> RAM_CODE_SHIFT;
+
+	if (ram_id >= ARRAY_SIZE(aebl_emc) || !aebl_emc[ram_id].table) {
+		tegra_set_emc(NULL, 0);
+	} else {
+		tegra_set_emc(aebl_emc[ram_id].table,
+			       aebl_emc[ram_id].table_size);
+	}
 }
 
 /* These values are not final, but they do work on the board */