clrbits_le32(&davinci_syscfg1_regs->ddr_slew,
                (1 << DDR_SLEW_CMOSEN_BIT));
 
+       /*
+        * SDRAM Configuration Register (SDCR):
+        * First set the BOOTUNLOCK bit to make configuration bits
+        * writeable.
+        */
        setbits_le32(&dv_ddr2_regs_ctrl->sdbcr, DV_DDR_BOOTUNLOCK);
 
-       writel((CONFIG_SYS_DA850_DDR2_SDBCR & ~0xf0000000) |
-               (readl(&dv_ddr2_regs_ctrl->sdbcr) & 0xf0000000), /*rsv Bytes*/
-               &dv_ddr2_regs_ctrl->sdbcr);
-       writel(CONFIG_SYS_DA850_DDR2_SDBCR2, &dv_ddr2_regs_ctrl->sdbcr2);
+       /*
+        * Write the new value of these bits and clear BOOTUNLOCK.
+        * At the same time, set the TIMUNLOCK bit to allow changing
+        * the timing registers
+        */
+       tmp = CONFIG_SYS_DA850_DDR2_SDBCR;
+       tmp &= ~(0x1 << DV_DDR_SDCR_BOOTUNLOCK_SHIFT);
+       tmp |= (0x1 << DV_DDR_SDCR_TIMUNLOCK_SHIFT);
+       writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);
 
+       /* write memory configuration and timing */
+       writel(CONFIG_SYS_DA850_DDR2_SDBCR2, &dv_ddr2_regs_ctrl->sdbcr2);
        writel(CONFIG_SYS_DA850_DDR2_SDTIMR, &dv_ddr2_regs_ctrl->sdtimr);
        writel(CONFIG_SYS_DA850_DDR2_SDTIMR2, &dv_ddr2_regs_ctrl->sdtimr2);
 
-       clrbits_le32(&dv_ddr2_regs_ctrl->sdbcr,
-               (1 << DV_DDR_SDCR_TIMUNLOCK_SHIFT));
+       /* clear the TIMUNLOCK bit and write the value of the CL field */
+       tmp &= ~(0x1 << DV_DDR_SDCR_TIMUNLOCK_SHIFT);
+       writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);
 
        /*
         * LPMODEN and MCLKSTOPEN must be set!