diff mbox

[U-Boot,1/8] arm/davinci: fix DDR2/mDDR memory controller initialization for Omap L138

Message ID 1339535752-21565-1-git-send-email-mikhail.kshevetskiy@gmail.com
State Deferred
Delegated to: Tom Rini
Headers show

Commit Message

Mikhail Kshevetskiy June 12, 2012, 9:15 p.m. UTC
follow section 15.2.13.1 (Initializing Following Device Power Up or Reset) of
OMAP-L138 DSP+ARM Processor Technical Reference Manual

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com>
---
 arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c |   25 ++++++++++++++++-------
 arch/arm/include/asm/arch-davinci/hardware.h    |    1 +
 2 files changed, 19 insertions(+), 7 deletions(-)

Comments

Christian Riesch June 21, 2012, 7:37 a.m. UTC | #1
Hi Mikhail,

On Tue, Jun 12, 2012 at 11:15 PM, Mikhail Kshevetskiy
<mikhail.kshevetskiy@gmail.com> wrote:
> follow section 15.2.13.1 (Initializing Following Device Power Up or Reset) of
> OMAP-L138 DSP+ARM Processor Technical Reference Manual

Thanks for fixing this! Just out of curiosity: Did you hit any problem
or were you just comparing the code with the reference manual?

>
> Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com>
> ---
>  arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c |   25 ++++++++++++++++-------
>  arch/arm/include/asm/arch-davinci/hardware.h    |    1 +
>  2 files changed, 19 insertions(+), 7 deletions(-)

Acked-by: Christian Riesch <christian.riesch@omicron.at>

For the calimain board

Tested-by: Christian Riesch <christian.riesch@omicron.at>

Regards, Christian
Christian Riesch June 21, 2012, 7:53 a.m. UTC | #2
Hi Mikhail,

On Tue, Jun 12, 2012 at 11:15 PM, Mikhail Kshevetskiy
<mikhail.kshevetskiy@gmail.com> wrote:
> follow section 15.2.13.1 (Initializing Following Device Power Up or Reset) of
> OMAP-L138 DSP+ARM Processor Technical Reference Manual
>
> Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com>

Your patch causes a few checkpatch warnings, see below.

> ---
>  arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c |   25 ++++++++++++++++-------
>  arch/arm/include/asm/arch-davinci/hardware.h    |    1 +
>  2 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c b/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
> index df7d6a2..9682407 100644
> --- a/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
> +++ b/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
> @@ -190,13 +190,21 @@ int da850_ddr_setup(void)
>
>                setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_LOCK);
>                setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_POWERDWN);
> -
> -               setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);
>        }
> -
> +       setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);
>        writel(CONFIG_SYS_DA850_DDR2_DDRPHYCR, &dv_ddr2_regs_ctrl->ddrphycr);
> -       clrbits_le32(&davinci_syscfg1_regs->ddr_slew,
> -               (1 << DDR_SLEW_CMOSEN_BIT));
> +
> +       if (CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT)){

missing whitespace before {

> +               /* DDR2 */
> +               clrbits_le32(&davinci_syscfg1_regs->ddr_slew,
> +                       (1 << DDR_SLEW_DDR_PDENA_BIT) |
> +                       (1 << DDR_SLEW_CMOSEN_BIT));
> +       }else{

missing whitespaces before and after "else".

> +               /* MOBILE DDR */
> +               setbits_le32(&davinci_syscfg1_regs->ddr_slew,
> +                       (1 << DDR_SLEW_DDR_PDENA_BIT) |
> +                       (1 << DDR_SLEW_CMOSEN_BIT));
> +       }
>
>        /*
>         * SDRAM Configuration Register (SDCR):
> @@ -216,7 +224,10 @@ int da850_ddr_setup(void)
>        writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);
>
>        /* write memory configuration and timing */
> -       writel(CONFIG_SYS_DA850_DDR2_SDBCR2, &dv_ddr2_regs_ctrl->sdbcr2);
> +       if (!(CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT))){

missing whitespace before {

Please fix these warnings and resubmit. Thank you!
Regards, Christian

> +               /* MOBILE DDR only*/
> +               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);
>
> @@ -240,7 +251,7 @@ int da850_ddr_setup(void)
>
>        /* disable self refresh */
>        clrbits_le32(&dv_ddr2_regs_ctrl->sdrcr,
> -               DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_LPMODEN);
> +               DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_MCLKSTOPEN);
>        writel(CONFIG_SYS_DA850_DDR2_PBBPR, &dv_ddr2_regs_ctrl->pbbpr);
>
>        return 0;
> diff --git a/arch/arm/include/asm/arch-davinci/hardware.h b/arch/arm/include/asm/arch-davinci/hardware.h
> index b145c6e..56e5743 100644
> --- a/arch/arm/include/asm/arch-davinci/hardware.h
> +++ b/arch/arm/include/asm/arch-davinci/hardware.h
> @@ -505,6 +505,7 @@ struct davinci_syscfg1_regs {
>        ((struct davinci_syscfg1_regs *)DAVINCI_SYSCFG1_BASE)
>
>  #define DDR_SLEW_CMOSEN_BIT    4
> +#define DDR_SLEW_DDR_PDENA_BIT 5
>
>  #define VTP_POWERDWN           (1 << 6)
>  #define VTP_LOCK               (1 << 7)
> --
> 1.7.10
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Mikhail Kshevetskiy June 26, 2012, 10:32 a.m. UTC | #3
On Thu, 21 Jun 2012 09:37:09 +0200
Christian Riesch <christian.riesch@omicron.at> wrote:

> Hi Mikhail,
> 
> On Tue, Jun 12, 2012 at 11:15 PM, Mikhail Kshevetskiy
> <mikhail.kshevetskiy@gmail.com> wrote:
> > follow section 15.2.13.1 (Initializing Following Device Power Up or Reset) of
> > OMAP-L138 DSP+ARM Processor Technical Reference Manual
> 
> Thanks for fixing this! Just out of curiosity: Did you hit any problem
> or were you just comparing the code with the reference manual?

Hard to say, I faced with memory initialization problem (caused by
hardware bug). Before I hit a real problem, I study omap documentation and
find disagreements with the code. So i just fix it. 

> >
> > Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com>
> > ---
> >  arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c |   25 ++++++++++++++++-------
> >  arch/arm/include/asm/arch-davinci/hardware.h    |    1 +
> >  2 files changed, 19 insertions(+), 7 deletions(-)
> 
> Acked-by: Christian Riesch <christian.riesch@omicron.at>
> 
> For the calimain board
> 
> Tested-by: Christian Riesch <christian.riesch@omicron.at>
> 
> Regards, Christian
diff mbox

Patch

diff --git a/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c b/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
index df7d6a2..9682407 100644
--- a/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
+++ b/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c
@@ -190,13 +190,21 @@  int da850_ddr_setup(void)
 
 		setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_LOCK);
 		setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_POWERDWN);
-
-		setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);
 	}
-
+	setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);
 	writel(CONFIG_SYS_DA850_DDR2_DDRPHYCR, &dv_ddr2_regs_ctrl->ddrphycr);
-	clrbits_le32(&davinci_syscfg1_regs->ddr_slew,
-		(1 << DDR_SLEW_CMOSEN_BIT));
+
+	if (CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT)){
+		/* DDR2 */
+		clrbits_le32(&davinci_syscfg1_regs->ddr_slew,
+			(1 << DDR_SLEW_DDR_PDENA_BIT) |
+			(1 << DDR_SLEW_CMOSEN_BIT));
+	}else{
+		/* MOBILE DDR */
+		setbits_le32(&davinci_syscfg1_regs->ddr_slew,
+			(1 << DDR_SLEW_DDR_PDENA_BIT) |
+			(1 << DDR_SLEW_CMOSEN_BIT));
+	}
 
 	/*
 	 * SDRAM Configuration Register (SDCR):
@@ -216,7 +224,10 @@  int da850_ddr_setup(void)
 	writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);
 
 	/* write memory configuration and timing */
-	writel(CONFIG_SYS_DA850_DDR2_SDBCR2, &dv_ddr2_regs_ctrl->sdbcr2);
+	if (!(CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT))){
+		/* MOBILE DDR only*/
+		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);
 
@@ -240,7 +251,7 @@  int da850_ddr_setup(void)
 
 	/* disable self refresh */
 	clrbits_le32(&dv_ddr2_regs_ctrl->sdrcr,
-		DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_LPMODEN);
+		DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_MCLKSTOPEN);
 	writel(CONFIG_SYS_DA850_DDR2_PBBPR, &dv_ddr2_regs_ctrl->pbbpr);
 
 	return 0;
diff --git a/arch/arm/include/asm/arch-davinci/hardware.h b/arch/arm/include/asm/arch-davinci/hardware.h
index b145c6e..56e5743 100644
--- a/arch/arm/include/asm/arch-davinci/hardware.h
+++ b/arch/arm/include/asm/arch-davinci/hardware.h
@@ -505,6 +505,7 @@  struct davinci_syscfg1_regs {
 	((struct davinci_syscfg1_regs *)DAVINCI_SYSCFG1_BASE)
 
 #define DDR_SLEW_CMOSEN_BIT	4
+#define DDR_SLEW_DDR_PDENA_BIT	5
 
 #define VTP_POWERDWN		(1 << 6)
 #define VTP_LOCK		(1 << 7)