[U-Boot] [PATCHv3 1/2] armv8/fsl-lsch2: refactor the clock system initialization
Z.Q. Hou
zhiqiang.hou at nxp.com
Tue Dec 27 11:36:04 CET 2016
> -----Original Message-----
> From: Zhiqiang Hou [mailto:Zhiqiang.Hou at nxp.com]
> Sent: 2016年12月27日 15:36
> To: u-boot at lists.denx.de; albert.u.boot at aribaud.net; york sun
> <york.sun at nxp.com>; Mingkai Hu <mingkai.hu at nxp.com>; Prabhakar
> Kushwaha <prabhakar.kushwaha at nxp.com>; Calvin Johnson
> <calvin.johnson at nxp.com>
> Cc: Z.Q. Hou <zhiqiang.hou at nxp.com>
> Subject: [PATCHv3 1/2] armv8/fsl-lsch2: refactor the clock system initialization
>
> From: Hou Zhiqiang <Zhiqiang.Hou at nxp.com>
>
> Up to now, there are 3 kind of SoCs under Layerscape Chassis 2, like LS1043A,
> LS1046A and LS1012A. But the clocks tree has a lot of differences, for instance,
> the IP modules have different dividers to derive its clock from Platform PLL.
> And the core cluster PLL and platform PLL maybe have different reference
> clocks, such as LS1012A. Another problem is which clock/PLL should be
> described by sys_info->freq_systembus, it is confused in Layerscape Chissis 2.
>
> This patch is to bind the sys_info->freq_systembus to the Platform PLL, and
> handle the different divider of IP modules separately between different SoCs,
> and separate reference clocks of core cluster PLL and platform PLL.
>
> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou at nxp.com>
> ---
> V3:
> - Generate the patch set base on the latest
> git://git.denx.de/u-boot-fsl-qoriq.git.
> - Use the Kconfig instead of header file to add CONFIG_*
>
> arch/arm/cpu/armv8/fsl-layerscape/Kconfig | 76
> ++++++++++++++++++++++
> arch/arm/cpu/armv8/fsl-layerscape/cpu.c | 3 +-
> .../arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c | 68
> ++++++++++++++----- .../include/asm/arch-fsl-layerscape/immap_lsch2.h |
> 1 +
> include/configs/ls1012a_common.h | 6 +-
> include/configs/ls1043a_common.h | 3 +-
> include/configs/ls1046a_common.h | 3 +-
> include/configs/ls2080aqds.h | 2 -
> include/configs/ls2080ardb.h | 1 -
> 9 files changed, 134 insertions(+), 29 deletions(-)
>
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> index cc0dc88..de1e5a4 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> @@ -87,6 +87,82 @@ config MAX_CPUS
> cores, count the reserved ports. This will allocate enough memory
> in spin table to properly handle all cores.
>
> +menu "Layerscape clock tree configuration"
> + depends on FSL_LSCH2 || FSL_LSCH3
> +
> +config SYS_FSL_CLK
> + bool "Enable clock tree initialization"
> + default y
> +
> +config CLUSTER_CLK_FREQ
> + int "Reference clock of core cluster"
> + depends on ARCH_LS1012A
> + default 100000000
> + help
> + This number is the reference clock frequency of core PLL.
> + For most platforms, the core PLL and Platform PLL have the same
> + reference clock, but for some platforms, LS1012A for instance,
> + they are provided sepatately.
> +
> +config SYS_FSL_PCLK_DIV
> + int "Platform clock divider"
> + default 1 if ARCH_LS1043A
> + default 1 if ARCH_LS1046A
> + default 2
> + help
> + This is the divider that is used to derive Platform clock from
> + Platform PLL, in another word:
> + Platform_clk = Platform_PLL_freq / this_divider
> +
> +config SYS_FSL_DSPI_CLK_DIV
> + int "DSPI clock divider"
> + default 1 if ARCH_LS1043A
> + default 2
> + help
> + This is the divider that is used to derive DSPI clock from Platform
> + PLL, in another word DSPI_clk = Platform_PLL_freq / this_divider.
There is a description error, the IP modules' clock should be derived from Platform clock instead of Platform PLL. Will fix next version.
> +
> +config SYS_FSL_DUART_CLK_DIV
> + int "DUART clock divider"
> + default 1 if ARCH_LS1043A
> + default 2
> + help
> + This is the divider that is used to derive DUART clock from Platform
> + PLL, in another word DUART_clk = Platform_PLL_freq / this_divider.
> +
> +config SYS_FSL_I2C_CLK_DIV
> + int "I2C clock divider"
> + default 1 if ARCH_LS1043A
> + default 2
> + help
> + This is the divider that is used to derive I2C clock from Platform
> + PLL, in another word I2C_clk = Platform_PLL_freq / this_divider.
> +
> +config SYS_FSL_IFC_CLK_DIV
> + int "IFC clock divider"
> + default 1 if ARCH_LS1043A
> + default 2
> + help
> + This is the divider that is used to derive IFC clock from Platform
> + PLL, in another word IFC_clk = Platform_PLL_freq / this_divider.
> +
> +config SYS_FSL_LPUART_CLK_DIV
> + int "LPUART clock divider"
> + default 1 if ARCH_LS1043A
> + default 2
> + help
> + This is the divider that is used to derive LPUART clock from Platform
> + PLL, in another word LPUART_clk = Platform_PLL_freq / this_divider.
> +
> +config SYS_FSL_SDHC_CLK_DIV
> + int "SDHC clock divider"
> + default 1 if ARCH_LS1043A
> + default 2
> + help
> + This is the divider that is used to derive SDHC clock from Platform
> + PLL, in another word SDHC_clk = Platform_PLL_freq / this_divider.
> +endmenu
> +
> config NUM_DDR_CONTROLLERS
> int "Maximum DDR controllers"
> default 3 if ARCH_LS2080A
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> index 467d9af..3bdeb0e 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c
> @@ -345,8 +345,9 @@ int print_cpuinfo(void)
> (type == TY_ITYP_VER_A72 ? "A72" : " "))),
> strmhz(buf, sysinfo.freq_processor[core]));
> }
> + /* Display platform clock as Bus frequency. */
> printf("\n Bus: %-4s MHz ",
> - strmhz(buf, sysinfo.freq_systembus));
> + strmhz(buf, sysinfo.freq_systembus /
> CONFIG_SYS_FSL_PCLK_DIV));
> printf("DDR: %-4s MT/s", strmhz(buf, sysinfo.freq_ddrbus));
> #ifdef CONFIG_SYS_DPAA_FMAN
> printf(" FMAN: %-4s MHz", strmhz(buf, sysinfo.freq_fman[0]));
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> index 55005f0..f216231 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> @@ -52,22 +52,28 @@ void get_sys_info(struct sys_info *sys_info)
> uint freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
> uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
> unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
> + unsigned long cluster_clk;
>
> sys_info->freq_systembus = sysclk;
> +#ifndef CONFIG_CLUSTER_CLK_FREQ
> +#define CONFIG_CLUSTER_CLK_FREQ CONFIG_SYS_CLK_FREQ
> +#endif
> + cluster_clk = CONFIG_CLUSTER_CLK_FREQ;
> +
> #ifdef CONFIG_DDR_CLK_FREQ
> sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ; #else
> sys_info->freq_ddrbus = sysclk;
> #endif
>
> -#ifdef CONFIG_ARCH_LS1012A
> - sys_info->freq_ddrbus *= (gur_in32(&gur->rcwsr[0]) >>
> - FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) &
> - FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK;
> -#else
> + /* The freq_systembus is used to record frequency of platform PLL */
> sys_info->freq_systembus *= (gur_in32(&gur->rcwsr[0]) >>
> FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) &
> FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK;
> +
> +#ifdef CONFIG_ARCH_LS1012A
> + sys_info->freq_ddrbus = 2 * sys_info->freq_systembus; #else
> sys_info->freq_ddrbus *= (gur_in32(&gur->rcwsr[0]) >>
> FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT) &
> FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK;
> @@ -76,7 +82,7 @@ void get_sys_info(struct sys_info *sys_info)
> for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
> ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0xff;
> if (ratio[i] > 4)
> - freq_c_pll[i] = sysclk * ratio[i];
> + freq_c_pll[i] = cluster_clk * ratio[i];
> else
> freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
> }
> @@ -91,11 +97,6 @@ void get_sys_info(struct sys_info *sys_info)
> freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
> }
>
> -#ifdef CONFIG_ARCH_LS1012A
> - sys_info->freq_systembus = sys_info->freq_ddrbus / 2;
> - sys_info->freq_ddrbus *= 2;
> -#endif
> -
> #define HWA_CGA_M1_CLK_SEL 0xe0000000
> #define HWA_CGA_M1_CLK_SHIFT 29
> #ifdef CONFIG_SYS_DPAA_FMAN
> @@ -148,7 +149,8 @@ void get_sys_info(struct sys_info *sys_info)
> break;
> }
> #else
> - sys_info->freq_sdhc = sys_info->freq_systembus;
> + sys_info->freq_sdhc = sys_info->freq_systembus /
> + CONFIG_SYS_FSL_SDHC_CLK_DIV;
> #endif
> #endif
>
> @@ -166,7 +168,7 @@ int get_clocks(void)
>
> get_sys_info(&sys_info);
> gd->cpu_clk = sys_info.freq_processor[0];
> - gd->bus_clk = sys_info.freq_systembus;
> + gd->bus_clk = sys_info.freq_systembus / CONFIG_SYS_FSL_PCLK_DIV;
> gd->mem_clk = sys_info.freq_ddrbus;
>
> #ifdef CONFIG_FSL_ESDHC
> @@ -179,41 +181,73 @@ int get_clocks(void)
> return 1;
> }
>
> +/********************************************
> + * get_bus_freq
> + * return platform clock in Hz
> + *********************************************/
> ulong get_bus_freq(ulong dummy)
> {
> + if (!gd->bus_clk)
> + get_clocks();
> +
> return gd->bus_clk;
> }
>
> ulong get_ddr_freq(ulong dummy)
> {
> + if (!gd->mem_clk)
> + get_clocks();
> +
> return gd->mem_clk;
> }
>
> #ifdef CONFIG_FSL_ESDHC
> int get_sdhc_freq(ulong dummy)
> {
> + if (!gd->arch.sdhc_clk)
> + get_clocks();
> +
> return gd->arch.sdhc_clk;
> }
> #endif
>
> int get_serial_clock(void)
> {
> - return gd->bus_clk;
> + return get_bus_freq(0) / CONFIG_SYS_FSL_DUART_CLK_DIV; }
> +
> +int get_i2c_freq(ulong dummy)
> +{
> + return get_bus_freq(0) / CONFIG_SYS_FSL_I2C_CLK_DIV; }
> +
> +int get_dspi_freq(ulong dummy)
> +{
> + return get_bus_freq(0) / CONFIG_SYS_FSL_DSPI_CLK_DIV;
> }
>
> +#ifdef CONFIG_FSL_LPUART
> +int get_uart_freq(ulong dummy)
> +{
> + return get_bus_freq(0) / CONFIG_SYS_FSL_LPUART_CLK_DIV; } #endif
> +
> unsigned int mxc_get_clock(enum mxc_clock clk) {
> switch (clk) {
> case MXC_I2C_CLK:
> - return get_bus_freq(0);
> + return get_i2c_freq(0);
> #if defined(CONFIG_FSL_ESDHC)
> case MXC_ESDHC_CLK:
> return get_sdhc_freq(0);
> #endif
> case MXC_DSPI_CLK:
> - return get_bus_freq(0);
> + return get_dspi_freq(0);
> +#ifdef CONFIG_FSL_LPUART
> case MXC_UART_CLK:
> - return get_bus_freq(0);
> + return get_uart_freq(0);
> +#endif
> default:
> printf("Unsupported clock\n");
> }
> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> index b3cfd89..6ace3da 100644
> --- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> +++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> @@ -137,6 +137,7 @@ CONFIG_SYS_CCSRBAR_PHYS_LOW and/or
> CONFIG_SYS_CCSRBAR_PHYS_HIGH instead."
>
> struct sys_info {
> unsigned long freq_processor[CONFIG_MAX_CPUS];
> + /* frequency of platform PLL */
> unsigned long freq_systembus;
> unsigned long freq_ddrbus;
> unsigned long freq_localbus;
> diff --git a/include/configs/ls1012a_common.h
> b/include/configs/ls1012a_common.h
> index 20f0c61..910835e 100644
> --- a/include/configs/ls1012a_common.h
> +++ b/include/configs/ls1012a_common.h
> @@ -19,9 +19,7 @@
>
> #define CONFIG_SYS_TEXT_BASE 0x40100000
>
> -#define CONFIG_SYS_FSL_CLK
> -#define CONFIG_SYS_CLK_FREQ 100000000
> -#define CONFIG_DDR_CLK_FREQ 125000000
> +#define CONFIG_SYS_CLK_FREQ 125000000
>
> #define CONFIG_SKIP_LOWLEVEL_INIT
> #define CONFIG_BOARD_EARLY_INIT_F 1
> @@ -82,7 +80,7 @@
> #define CONFIG_CONS_INDEX 1
> #define CONFIG_SYS_NS16550_SERIAL
> #define CONFIG_SYS_NS16550_REG_SIZE 1
> -#define CONFIG_SYS_NS16550_CLK (get_bus_freq(0)/2)
> +#define CONFIG_SYS_NS16550_CLK (get_serial_clock())
>
> #define CONFIG_BAUDRATE 115200
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600,
> 115200 }
> diff --git a/include/configs/ls1043a_common.h
> b/include/configs/ls1043a_common.h
> index c1e3ec6..f7a4397 100644
> --- a/include/configs/ls1043a_common.h
> +++ b/include/configs/ls1043a_common.h
> @@ -11,7 +11,6 @@
> #define CONFIG_FSL_LAYERSCAPE
> #define CONFIG_LS1043A
> #define CONFIG_MP
> -#define CONFIG_SYS_FSL_CLK
> #define CONFIG_GICV2
>
> #include <asm/arch/config.h>
> @@ -42,7 +41,7 @@
> #define CONFIG_CONS_INDEX 1
> #define CONFIG_SYS_NS16550_SERIAL
> #define CONFIG_SYS_NS16550_REG_SIZE 1
> -#define CONFIG_SYS_NS16550_CLK (get_bus_freq(0))
> +#define CONFIG_SYS_NS16550_CLK (get_serial_clock())
>
> #define CONFIG_BAUDRATE 115200
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600,
> 115200 }
> diff --git a/include/configs/ls1046a_common.h
> b/include/configs/ls1046a_common.h
> index 3887faa..b51e8bf 100644
> --- a/include/configs/ls1046a_common.h
> +++ b/include/configs/ls1046a_common.h
> @@ -10,7 +10,6 @@
> #define CONFIG_REMAKE_ELF
> #define CONFIG_FSL_LAYERSCAPE
> #define CONFIG_MP
> -#define CONFIG_SYS_FSL_CLK
> #define CONFIG_GICV2
>
> #include <asm/arch/config.h>
> @@ -41,7 +40,7 @@
> #define CONFIG_CONS_INDEX 1
> #define CONFIG_SYS_NS16550_SERIAL
> #define CONFIG_SYS_NS16550_REG_SIZE 1
> -#define CONFIG_SYS_NS16550_CLK (get_bus_freq(0)/2)
> +#define CONFIG_SYS_NS16550_CLK (get_serial_clock())
>
> #define CONFIG_BAUDRATE 115200
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600,
> 115200 }
> diff --git a/include/configs/ls2080aqds.h b/include/configs/ls2080aqds.h index
> 838568f..793e1ac 100644
> --- a/include/configs/ls2080aqds.h
> +++ b/include/configs/ls2080aqds.h
> @@ -14,8 +14,6 @@ unsigned long get_board_sys_clk(void); unsigned long
> get_board_ddr_clk(void); #endif
>
> -#define CONFIG_SYS_FSL_CLK
> -
> #ifdef CONFIG_FSL_QSPI
> #define CONFIG_SYS_NO_FLASH
> #undef CONFIG_CMD_IMLS
> diff --git a/include/configs/ls2080ardb.h b/include/configs/ls2080ardb.h index
> 31df781..76e8622 100644
> --- a/include/configs/ls2080ardb.h
> +++ b/include/configs/ls2080ardb.h
> @@ -32,7 +32,6 @@
> unsigned long get_board_sys_clk(void);
> #endif
>
> -#define CONFIG_SYS_FSL_CLK
> #define CONFIG_SYS_CLK_FREQ get_board_sys_clk()
> #define CONFIG_DDR_CLK_FREQ 133333333
> #define COUNTER_FREQUENCY_REAL (CONFIG_SYS_CLK_FREQ/4)
> --
> 2.1.0.27.g96db324
More information about the U-Boot
mailing list