#include <asm/fsl_ddr_sdram.h>
 #include <asm/fsl_ddr_dimm_params.h>
 
-static void get_spd(ddr3_spd_eeprom_t *spd, unsigned char i2c_address)
+static void get_spd(generic_spd_eeprom_t *spd, unsigned char i2c_address)
 {
        i2c_read(i2c_address, 0, 1, (uchar *)spd, sizeof(ddr3_spd_eeprom_t));
 }
        return get_ddr_freq(0);
 }
 
-void fsl_ddr_get_spd(ddr3_spd_eeprom_t *ctrl_dimms_spd,
+void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
                      unsigned int ctrl_num)
 {
        unsigned int i;
  *  cpo 2-0x1E (30)
  */
 
-
-/* XXX: these values need to be checked for all interleaving modes.  */
-/* XXX: No reliable dual-rank 800 MHz setting has been found.  It may
- *      seem reliable, but errors will appear when memory intensive
- *      program is run. */
-/* XXX: Single rank at 800 MHz is OK.  */
 const board_specific_parameters_t board_specific_parameters[][20] = {
        {
        /*      memory controller 0                     */
        /*        lo|  hi|  num|  clk| cpo|wrdata|2T    */
        /*       mhz| mhz|ranks|adjst|    | delay|      */
-               {  0, 333,    2,    6,   7,    3,  0},
-               {334, 400,    2,    6,   9,    3,  0},
-               {401, 549,    2,    6,  11,    3,  0},
-               {550, 680,    2,    1,  10,    5,  0},
-               {681, 850,    2,    1,  12,    5,  1},
-               {  0, 333,    1,    6,   7,    3,  0},
-               {334, 400,    1,    6,   9,    3,  0},
-               {401, 549,    1,    6,  11,    3,  0},
-               {550, 680,    1,    1,  10,    5,  0},
-               {681, 850,    1,    1,  12,    5,  0}
+#ifdef CONFIG_FSL_DDR2
+               {  0, 333,    2,    4,   0x1f,    2,  0},
+               {334, 400,    2,    4,   0x1f,    2,  0},
+               {401, 549,    2,    4,   0x1f,    2,  0},
+               {550, 680,    2,    4,   0x1f,    3,  0},
+               {681, 850,    2,    4,   0x1f,    4,  0},
+               {  0, 333,    1,    4,   0x1f,    2,  0},
+               {334, 400,    1,    4,   0x1f,    2,  0},
+               {401, 549,    1,    4,   0x1f,    2,  0},
+               {550, 680,    1,    4,   0x1f,    3,  0},
+               {681, 850,    1,    4,   0x1f,    4,  0}
+#else
+               {  0, 850,    2,    4,   0x1f,    4,  0},
+               {  0, 850,    1,    4,   0x1f,    4,  0}
+#endif
        },
 };
 
         * odt_wr_cfg to 3 for the even CS, 0 for the odd CS.
         */
        for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
-               if (i&1) {      /* odd CS */
                        popts->cs_local_opts[i].odt_rd_cfg = 0;
-                       popts->cs_local_opts[i].odt_wr_cfg = 0;
-               } else {        /* even CS */
-                       if (CONFIG_DIMM_SLOTS_PER_CTLR == 1) {
-                               popts->cs_local_opts[i].odt_rd_cfg = 0;
-                               popts->cs_local_opts[i].odt_wr_cfg = 4;
-                       } else if (CONFIG_DIMM_SLOTS_PER_CTLR == 2) {
-                               popts->cs_local_opts[i].odt_rd_cfg = 3;
-                               popts->cs_local_opts[i].odt_wr_cfg = 3;
-                       }
-               }
+                       popts->cs_local_opts[i].odt_wr_cfg = 1;
        }
 
        /* Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr
         *      - number of DIMMs installed
         */
        popts->half_strength_driver_enable = 0;
+       popts->wrlvl_en = 1;
+       /* Write leveling override */
+       popts->wrlvl_override = 1;
+       popts->wrlvl_sample = 0xa;
+       popts->wrlvl_start = 0x7;
+       /* Rtt and Rtt_WR override */
+       popts->rtt_override = 1;
+       popts->rtt_override_value = DDR3_RTT_120_OHM;
+       popts->rtt_wr_override_value = 0; /* Rtt_WR= dynamic ODT off */
 }