From: Peter A. Bigot <pab@pabigot.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] ARM: omap3: Implement dpll5 (HSUSB clk) workaround for OMAP36xx/AM/DM37xx according to errata sprz318e.
Date: Wed, 14 Aug 2013 21:53:16 -0500 [thread overview]
Message-ID: <520C429C.6020009@pabigot.com> (raw)
In-Reply-To: <1373355797-28758-1-git-send-email-anaumann@ultratronik.de>
On 07/09/2013 02:43 AM, Naumann Andreas wrote:
> In chapter 'Advisory 2.1 USB Host Clock Drift Causes USB Spec Non-compliance in Certain Configurations' of the TI Errata it is recommended to use certain div/mult values for the DPLL5 clock setup.
> So far u-boot used the old 34xx values, so I added the errata recommended values specificly for 36xx init only.
> Also, the FSEL registers exist no longer, so removed them from init.
>
> Tested this on a AM3703 board with 19.2MHz oscillator, which previously couldnt lock the dpll5 (kernel complained). As a consequence the EHCI USB port wasnt usable in U-Boot and kernel. With this patch, kernel panics disappear and USB working fine in u-boot and kernel.
>
> Signed-off-by: Andreas Naumann <anaumann@ultratronik.de>
While this patch works with Linux that has been patched for this
erratum, it will cause problems with some unpatched versions of Linux.
In particular, this patch sets CM_CLKSEL4_PLL to generate (nearly)
960MHz, and CM_CLKSEL5_PLL to divide by 8 to produce the required
120MHz, as recommended by sprz318e advisory 2.1.
Version 3.5 of Linux, and possibly others, configure CM_CLKSEL4_PLL
(named "dpll5_ck") to generate 120MHz and leaves CM_CLKSEL5_PLL
unmodified since its clock (named "dpll5_m2_ck") does not support set
rate. If u-boot has configured a divisor of 8, the result is that the
actual clock speed is 15MHz and USB does not work.
Not sure how this ought to be resolved; in my case I'm going to skip the
u-boot patch and just use the Linux patch.
Peter
>
> ---
> arch/arm/cpu/armv7/omap3/clock.c | 20 +++++++++++++++++++-
> arch/arm/cpu/armv7/omap3/lowlevel_init.S | 18 ++++++++++++++++++
> arch/arm/include/asm/arch-omap3/clocks_omap3.h | 22 ++++++++++++++++++++++
> 3 files changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/cpu/armv7/omap3/clock.c b/arch/arm/cpu/armv7/omap3/clock.c
> index 81cc859..68833ba 100644
> --- a/arch/arm/cpu/armv7/omap3/clock.c
> +++ b/arch/arm/cpu/armv7/omap3/clock.c
> @@ -491,6 +491,24 @@ static void dpll4_init_36xx(u32 sil_index, u32 clk_index)
> wait_on_value(ST_PERIPH_CLK, 2, &prcm_base->idlest_ckgen, LDELAY);
> }
>
> +static void dpll5_init_36xx(u32 sil_index, u32 clk_index)
> +{
> + struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> + dpll_param *ptr = (dpll_param *) get_36x_per2_dpll_param();
> +
> + /* Moving it to the right sysclk base */
> + ptr = ptr + clk_index;
> +
> + /* PER2 DPLL (DPLL5) */
> + sr32(&prcm_base->clken2_pll, 0, 3, PLL_STOP);
> + wait_on_value(1, 0, &prcm_base->idlest2_ckgen, LDELAY);
> + sr32(&prcm_base->clksel5_pll, 0, 5, ptr->m2); /* set M2 (usbtll_fck) */
> + sr32(&prcm_base->clksel4_pll, 8, 11, ptr->m); /* set m (11-bit multiplier) */
> + sr32(&prcm_base->clksel4_pll, 0, 7, ptr->n); /* set n (7-bit divider)*/
> + sr32(&prcm_base->clken2_pll, 0, 3, PLL_LOCK); /* lock mode */
> + wait_on_value(1, 1, &prcm_base->idlest2_ckgen, LDELAY);
> +}
> +
> static void mpu_init_36xx(u32 sil_index, u32 clk_index)
> {
> struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> @@ -595,7 +613,7 @@ void prcm_init(void)
>
> dpll3_init_36xx(0, clk_index);
> dpll4_init_36xx(0, clk_index);
> - dpll5_init_34xx(0, clk_index);
> + dpll5_init_36xx(0, clk_index);
> iva_init_36xx(0, clk_index);
> mpu_init_36xx(0, clk_index);
>
> diff --git a/arch/arm/cpu/armv7/omap3/lowlevel_init.S b/arch/arm/cpu/armv7/omap3/lowlevel_init.S
> index eacfef8..66a1b48 100644
> --- a/arch/arm/cpu/armv7/omap3/lowlevel_init.S
> +++ b/arch/arm/cpu/armv7/omap3/lowlevel_init.S
> @@ -480,6 +480,19 @@ per_36x_dpll_param:
> .word 26000, 432, 12, 9, 16, 9, 4, 3, 1
> .word 38400, 360, 15, 9, 16, 5, 4, 3, 1
>
> +per2_36x_dpll_param:
> +/* 12MHz */
> +.word PER2_36XX_M_12, PER2_36XX_N_12, 0, PER2_36XX_M2_12
> +/* 13MHz */
> +.word PER2_36XX_M_13, PER2_36XX_N_13, 0, PER2_36XX_M2_13
> +/* 19.2MHz */
> +.word PER2_36XX_M_19P2, PER2_36XX_N_19P2, 0, PER2_36XX_M2_19P2
> +/* 26MHz */
> +.word PER2_36XX_M_26, PER2_36XX_N_26, 0, PER2_36XX_M2_26
> +/* 38.4MHz */
> +.word PER2_36XX_M_38P4, PER2_36XX_N_38P4, 0, PER2_36XX_M2_38P4
> +
> +
> ENTRY(get_36x_mpu_dpll_param)
> adr r0, mpu_36x_dpll_param
> mov pc, lr
> @@ -499,3 +512,8 @@ ENTRY(get_36x_per_dpll_param)
> adr r0, per_36x_dpll_param
> mov pc, lr
> ENDPROC(get_36x_per_dpll_param)
> +
> +ENTRY(get_36x_per2_dpll_param)
> + adr r0, per2_36x_dpll_param
> + mov pc, lr
> +ENDPROC(get_36x_per2_dpll_param)
> diff --git a/arch/arm/include/asm/arch-omap3/clocks_omap3.h b/arch/arm/include/asm/arch-omap3/clocks_omap3.h
> index 5925ac4..59e61e8 100644
> --- a/arch/arm/include/asm/arch-omap3/clocks_omap3.h
> +++ b/arch/arm/include/asm/arch-omap3/clocks_omap3.h
> @@ -336,4 +336,26 @@
> #define PER_36XX_FSEL_38P4 0x07
> #define PER_36XX_M2_38P4 0x09
>
> +/* 36XX PER2 DPLL */
> +
> +#define PER2_36XX_M_12 0x50
> +#define PER2_36XX_N_12 0x00
> +#define PER2_36XX_M2_12 0x08
> +
> +#define PER2_36XX_M_13 0x1BB
> +#define PER2_36XX_N_13 0x05
> +#define PER2_36XX_M2_13 0x08
> +
> +#define PER2_36XX_M_19P2 0x32
> +#define PER2_36XX_N_19P2 0x00
> +#define PER2_36XX_M2_19P2 0x08
> +
> +#define PER2_36XX_M_26 0x1BB
> +#define PER2_36XX_N_26 0x0B
> +#define PER2_36XX_M2_26 0x08
> +
> +#define PER2_36XX_M_38P4 0x19
> +#define PER2_36XX_N_38P4 0x00
> +#define PER2_36XX_M2_38P4 0x08
> +
> #endif /* endif _CLOCKS_OMAP3_H_ */
>
>
next prev parent reply other threads:[~2013-08-15 2:53 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-09 7:43 [U-Boot] [PATCH] ARM: omap3: Implement dpll5 (HSUSB clk) workaround for OMAP36xx/AM/DM37xx according to errata sprz318e Andreas Naumann
2013-08-15 2:53 ` Peter A. Bigot [this message]
2013-08-16 13:38 ` [U-Boot] " Tom Rini
2013-08-16 14:34 ` Peter A. Bigot
2013-08-16 15:07 ` Robert Nelson
2013-08-16 15:30 ` Robert Nelson
2013-08-20 8:50 ` Andreas Naumann
2013-08-20 9:45 ` Roger Quadros
2013-08-20 10:15 ` Andreas Naumann
2013-08-20 12:57 ` Robert Nelson
2013-08-16 13:35 ` Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=520C429C.6020009@pabigot.com \
--to=pab@pabigot.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.