[U-Boot] [PATCH] am335x:Handle worst case scenario for Errata 1.0.24
Dan Murphy
dmurphy at ti.com
Tue Jul 23 20:52:47 CEST 2013
On 07/22/2013 09:42 AM, Tom Rini wrote:
> From: Steve Kipisz <s-kipisz2 at ti.com>
>
> In Errata 1.0.24, if the board is running at OPP50 and has a warm reset,
> the boot ROM sets the frequencies for OPP100. This patch attempts to
> drop the frequencies back to OPP50 as soon as possible in the SPL. Then
> later the voltages and frequencies up set higher.
>
> Cc: Enric Balletbo i Serra <eballetbo at iseebcn.com>
> Cc: Lars Poeschel <poeschel at lemonage.de>
> Signed-off-by: Steve Kipisz <s-kipisz2 at ti.com>
> [trini: Adapt to current framework]
> Signed-off-by: Tom Rini <trini at ti.com>
> ---
> arch/arm/cpu/armv7/am33xx/board.c | 2 +
> arch/arm/cpu/armv7/am33xx/clock_am33xx.c | 72 ++++++++++++++--------
> arch/arm/include/asm/arch-am33xx/clocks_am33xx.h | 3 +
> arch/arm/include/asm/arch-am33xx/sys_proto.h | 1 +
> board/ti/am335x/board.c | 11 ++++
> include/configs/pcm051.h | 1 +
> include/power/tps65217.h | 1 +
> 7 files changed, 67 insertions(+), 24 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c
> index 9356501..03427da 100644
> --- a/arch/arm/cpu/armv7/am33xx/board.c
> +++ b/arch/arm/cpu/armv7/am33xx/board.c
> @@ -158,6 +158,8 @@ int arch_misc_init(void)
> */
> __weak void am33xx_spl_board_init(void)
> {
> + mpu_pll_config_val(CONFIG_SYS_MPUCLK);
> + core_pll_config(OPP_100);
> }
>
> void rtc32k_enable(void)
> diff --git a/arch/arm/cpu/armv7/am33xx/clock_am33xx.c b/arch/arm/cpu/armv7/am33xx/clock_am33xx.c
> index 9c4d0b4..ef06814 100644
> --- a/arch/arm/cpu/armv7/am33xx/clock_am33xx.c
> +++ b/arch/arm/cpu/armv7/am33xx/clock_am33xx.c
> @@ -50,12 +50,17 @@
>
> /* Core PLL Fdll = 1 GHZ, */
> #define COREPLL_M 1000
> +#define COREPLL_M_OPP50 50
> #define COREPLL_N (OSC-1)
>
> #define COREPLL_M4 10 /* CORE_CLKOUTM4 = 200 MHZ */
> #define COREPLL_M5 8 /* CORE_CLKOUTM5 = 250 MHZ */
> #define COREPLL_M6 4 /* CORE_CLKOUTM6 = 500 MHZ */
>
> +#define COREPLL_M4_OPP50 1
> +#define COREPLL_M5_OPP50 1
> +#define COREPLL_M6_OPP50 1
> +
> /*
> * USB PHY clock is 960 MHZ. Since, this comes directly from Fdll, Fdll
> * frequency needs to be set to 960 MHZ. Hence,
> @@ -274,12 +279,7 @@ void mpu_pll_config_val(int mpull_m)
> ;
> }
>
> -static void mpu_pll_config(void)
> -{
> - mpu_pll_config_val(CONFIG_SYS_MPUCLK);
> -}
> -
> -static void core_pll_config(void)
> +void core_pll_config(int opp)
> {
> u32 clkmode, clksel, div_m4, div_m5, div_m6;
>
> @@ -293,29 +293,53 @@ static void core_pll_config(void)
> writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllcore);
>
> while (readl(&cmwkup->idlestdpllcore) != ST_MN_BYPASS)
> - ;
> + ;
> + if (opp == OPP_50) {
> + clksel = clksel & (~CLK_SEL_MASK);
> + clksel = clksel | ((COREPLL_M_OPP50 << CLK_SEL_SHIFT)
> + | COREPLL_N);
> + writel(clksel, &cmwkup->clkseldpllcore);
>
> - clksel = clksel & (~CLK_SEL_MASK);
> - clksel = clksel | ((COREPLL_M << CLK_SEL_SHIFT) | COREPLL_N);
> - writel(clksel, &cmwkup->clkseldpllcore);
> + div_m4 = div_m4 & ~CLK_DIV_MASK;
> + div_m4 = div_m4 | COREPLL_M4_OPP50;
> + writel(div_m4, &cmwkup->divm4dpllcore);
>
> - div_m4 = div_m4 & ~CLK_DIV_MASK;
> - div_m4 = div_m4 | COREPLL_M4;
> - writel(div_m4, &cmwkup->divm4dpllcore);
> + div_m5 = div_m5 & ~CLK_DIV_MASK;
> + div_m5 = div_m5 | COREPLL_M5_OPP50;
> + writel(div_m5, &cmwkup->divm5dpllcore);
>
> - div_m5 = div_m5 & ~CLK_DIV_MASK;
> - div_m5 = div_m5 | COREPLL_M5;
> - writel(div_m5, &cmwkup->divm5dpllcore);
> + div_m6 = div_m6 & ~CLK_DIV_MASK;
> + div_m6 = div_m6 | COREPLL_M6_OPP50;
> + writel(div_m6, &cmwkup->divm6dpllcore);
>
> - div_m6 = div_m6 & ~CLK_DIV_MASK;
> - div_m6 = div_m6 | COREPLL_M6;
> - writel(div_m6, &cmwkup->divm6dpllcore);
> + clkmode = clkmode | CLK_MODE_SEL;
> + writel(clkmode, &cmwkup->clkmoddpllcore);
>
> - clkmode = clkmode | CLK_MODE_SEL;
> - writel(clkmode, &cmwkup->clkmoddpllcore);
> + while (readl(&cmwkup->idlestdpllcore) != ST_DPLL_CLK)
> + ;
> + } else {
> + clksel = clksel & (~CLK_SEL_MASK);
> + clksel = clksel | ((COREPLL_M << CLK_SEL_SHIFT) | COREPLL_N);
> + writel(clksel, &cmwkup->clkseldpllcore);
> +
> + div_m4 = div_m4 & ~CLK_DIV_MASK;
> + div_m4 = div_m4 | COREPLL_M4;
> + writel(div_m4, &cmwkup->divm4dpllcore);
> +
> + div_m5 = div_m5 & ~CLK_DIV_MASK;
> + div_m5 = div_m5 | COREPLL_M5;
> + writel(div_m5, &cmwkup->divm5dpllcore);
> +
> + div_m6 = div_m6 & ~CLK_DIV_MASK;
> + div_m6 = div_m6 | COREPLL_M6;
> + writel(div_m6, &cmwkup->divm6dpllcore);
> +
> + clkmode = clkmode | CLK_MODE_SEL;
> + writel(clkmode, &cmwkup->clkmoddpllcore);
>
> - while (readl(&cmwkup->idlestdpllcore) != ST_DPLL_CLK)
> + while (readl(&cmwkup->idlestdpllcore) != ST_DPLL_CLK)
> ;
> + }
> }
>
> static void per_pll_config(void)
> @@ -398,8 +422,8 @@ void enable_emif_clocks(void)
> */
> void pll_init()
> {
> - mpu_pll_config();
> - core_pll_config();
> + mpu_pll_config_val(MPUPLL_M_300);
> + core_pll_config(OPP_50);
> per_pll_config();
>
> /* Enable the required interconnect clocks */
> diff --git a/arch/arm/include/asm/arch-am33xx/clocks_am33xx.h b/arch/arm/include/asm/arch-am33xx/clocks_am33xx.h
> index 834f24f..58daa79 100644
> --- a/arch/arm/include/asm/arch-am33xx/clocks_am33xx.h
> +++ b/arch/arm/include/asm/arch-am33xx/clocks_am33xx.h
> @@ -19,6 +19,9 @@
> #ifndef _CLOCKS_AM33XX_H_
> #define _CLOCKS_AM33XX_H_
>
> +#define OPP_50 50
> +#define OPP_100 100
> +
> /* MAIN PLL Fdll = 550 MHz, by default */
> #ifndef CONFIG_SYS_MPUCLK
> #define CONFIG_SYS_MPUCLK 550
> diff --git a/arch/arm/include/asm/arch-am33xx/sys_proto.h b/arch/arm/include/asm/arch-am33xx/sys_proto.h
> index 98dc830..fb88796 100644
> --- a/arch/arm/include/asm/arch-am33xx/sys_proto.h
> +++ b/arch/arm/include/asm/arch-am33xx/sys_proto.h
> @@ -34,6 +34,7 @@ void save_omap_boot_params(void);
> void setup_clocks_for_console(void);
> void mpu_pll_config_val(int mpull_m);
> void ddr_pll_config(unsigned int ddrpll_M);
> +void core_pll_config(int opp);
>
> void sdelay(unsigned long);
>
> diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c
> index 3ab2a2f..69fc274 100644
> --- a/board/ti/am335x/board.c
> +++ b/board/ti/am335x/board.c
> @@ -371,6 +371,14 @@ void am33xx_spl_board_init(void)
> usb_cur_lim, USB_INPUT_CUR_LIMIT_MASK))
> printf("tps65217_reg_write failure\n");
puts("...") when we don't have format characters
>
> + /* Set DCDC3 (CORE) voltage to 1.125V */
> + if (tps65217_voltage_update(DEFDCDC3, DCDC_VOLT_SEL_1125MV)) {
What is the magic number mean? I believe I made the same comment in the actual driver file as well.
> + printf("tps65217_voltage_update failure\n");
puts("...") when we don't have format characters
> + return;
> + }
> +
> + /* Set CORE Frequencies to OPP100 */
> + core_pll_config(OPP_100);
>
> /* Set DCDC2 (MPU) voltage */
> if (tps65217_voltage_update(DEFDCDC2, mpu_vdd)) {
Same as above
> @@ -448,6 +456,9 @@ void am33xx_spl_board_init(void)
> /* Second, update the CORE voltage. */
> if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3))
> return;
> +
> + /* Set CORE Frequencies to OPP100 */
> + core_pll_config(OPP_100);
> }
>
> /* Set MPU Frequency to what we detected now that voltages are set */
> diff --git a/include/configs/pcm051.h b/include/configs/pcm051.h
> index 9b16c47..f4b4d62 100644
> --- a/include/configs/pcm051.h
> +++ b/include/configs/pcm051.h
> @@ -204,6 +204,7 @@
> /* Defines for SPL */
> #define CONFIG_SPL
> #define CONFIG_SPL_FRAMEWORK
> +#define CONFIG_SPL_BOARD_INIT
> /*
> * Place the image at the start of the ROM defined image space.
> * We limit our size to the ROM-defined downloaded image area, and use the
> diff --git a/include/power/tps65217.h b/include/power/tps65217.h
> index bb8cbda..854acc5 100644
> --- a/include/power/tps65217.h
> +++ b/include/power/tps65217.h
> @@ -76,6 +76,7 @@
> #define USB_INPUT_CUR_LIMIT_1300MA 0x02
> #define USB_INPUT_CUR_LIMIT_1800MA 0x03
>
> +#define DCDC_VOLT_SEL_1125MV 0x09
> #define DCDC_VOLT_SEL_1275MV 0x0F
> #define DCDC_VOLT_SEL_1325MV 0x11
>
--
------------------
Dan Murphy
More information about the U-Boot
mailing list