From: Dinh Nguyen <dinguyen@opensource.altera.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 15/35] arm: socfpga: clock: Add code to read clock configuration
Date: Mon, 15 Sep 2014 15:09:34 -0500 [thread overview]
Message-ID: <5417477E.70005@opensource.altera.com> (raw)
In-Reply-To: <1410779188-6880-16-git-send-email-marex@denx.de>
On 09/15/2014 06:06 AM, Marek Vasut wrote:
> From: Pavel Machek <pavel@denx.de>
>
> Add the entire bulk of code to read out clock configuration from the SoCFPGA
> CPU registers. This is important for MMC, QSPI and UART drivers as otherwise
> they cannot determine the frequency of their upstream clock.
>
> Signed-off-by: Pavel Machek <pavel@denx.de>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Chin Liang See <clsee@altera.com>
> Cc: Dinh Nguyen <dinguyen@altera.com>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Tom Rini <trini@ti.com>
> Cc: Wolfgang Denk <wd@denx.de>
> Cc: Pavel Machek <pavel@denx.de>
> ---
> arch/arm/cpu/armv7/socfpga/clock_manager.c | 226 +++++++++++++++++++++-
> arch/arm/include/asm/arch-socfpga/clock_manager.h | 43 +++-
> include/configs/socfpga_cyclone5.h | 1 +
> 3 files changed, 267 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/socfpga/clock_manager.c b/arch/arm/cpu/armv7/socfpga/clock_manager.c
> index d032bbd..07cf74c 100644
> --- a/arch/arm/cpu/armv7/socfpga/clock_manager.c
> +++ b/arch/arm/cpu/armv7/socfpga/clock_manager.c
> @@ -8,8 +8,10 @@
> #include <asm/io.h>
> #include <asm/arch/clock_manager.h>
>
> +DECLARE_GLOBAL_DATA_PTR;
> +
> static const struct socfpga_clock_manager *clock_manager_base =
> - (void *)SOCFPGA_CLKMGR_ADDRESS;
> + (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
>
> #define CLKMGR_BYPASS_ENABLE 1
> #define CLKMGR_BYPASS_DISABLE 0
> @@ -358,3 +360,225 @@ void cm_basic_init(const cm_config_t *cfg)
> writel(~0, &clock_manager_base->per_pll.en);
> writel(~0, &clock_manager_base->sdr_pll.en);
> }
> +
> +unsigned long cm_get_mpu_clk_hz(void)
> +{
> + uint32_t reg, clock;
> +
> + /* get the main VCO clock */
> + reg = readl(&clock_manager_base->main_pll.vco);
> + clock = CONFIG_HPS_CLK_OSC1_HZ /
> + (CLKMGR_MAINPLLGRP_VCO_DENOM_GET(reg) + 1);
> + clock *= (CLKMGR_MAINPLLGRP_VCO_NUMER_GET(reg) + 1);
> +
> + /* get the MPU clock */
> + reg = readl(&clock_manager_base->altera.mpuclk);
> + clock /= (reg + 1);
> + reg = readl(&clock_manager_base->main_pll.mpuclk);
> + clock /= (reg + 1);
> + return clock;
> +}
> +
> +unsigned long cm_get_sdram_clk_hz(void)
> +{
> + uint32_t reg, clock = 0;
> +
> + /* identify SDRAM PLL clock source */
> + reg = readl(&clock_manager_base->sdr_pll.vco);
> + reg = CLKMGR_SDRPLLGRP_VCO_SSRC_GET(reg);
> + if (reg == CLKMGR_VCO_SSRC_EOSC1)
> + clock = CONFIG_HPS_CLK_OSC1_HZ;
> + else if (reg == CLKMGR_VCO_SSRC_EOSC2)
> + clock = CONFIG_HPS_CLK_OSC2_HZ;
> + else if (reg == CLKMGR_VCO_SSRC_F2S)
> + clock = CONFIG_HPS_CLK_F2S_SDR_REF_HZ;
> +
> + /* get the SDRAM VCO clock */
> + reg = readl(&clock_manager_base->sdr_pll.vco);
> + clock /= (CLKMGR_SDRPLLGRP_VCO_DENOM_GET(reg) + 1);
> + clock *= (CLKMGR_SDRPLLGRP_VCO_NUMER_GET(reg) + 1);
> +
> + /* get the SDRAM (DDR_DQS) clock */
> + reg = readl(&clock_manager_base->sdr_pll.ddrdqsclk);
> + reg = CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_GET(reg);
> + clock /= (reg + 1);
> +
> + return clock;
> +}
> +
> +unsigned int cm_get_l4_sp_clk_hz(void)
> +{
> + uint32_t reg, clock = 0;
> +
> + /* identify the source of L4 SP clock */
> + reg = readl(&clock_manager_base->main_pll.l4src);
> + reg = CLKMGR_MAINPLLGRP_L4SRC_L4SP_GET(reg);
> +
> + if (reg == CLKMGR_L4_SP_CLK_SRC_MAINPLL) {
> + /* get the main VCO clock */
> + reg = readl(&clock_manager_base->main_pll.vco);
> + clock = CONFIG_HPS_CLK_OSC1_HZ /
> + (CLKMGR_MAINPLLGRP_VCO_DENOM_GET(reg) + 1);
> + clock *= (CLKMGR_MAINPLLGRP_VCO_NUMER_GET(reg) + 1);
> +
> + /* get the clock prior L4 SP divider (main clk) */
> + reg = readl(&clock_manager_base->altera.mainclk);
> + clock /= (reg + 1);
> + reg = readl(&clock_manager_base->main_pll.mainclk);
> + clock /= (reg + 1);
> + } else if (reg == CLKMGR_L4_SP_CLK_SRC_PERPLL) {
> + /* identify PER PLL clock source */
> + reg = readl(&clock_manager_base->per_pll.vco);
> + reg = CLKMGR_PERPLLGRP_VCO_SSRC_GET(reg);
> + if (reg == CLKMGR_VCO_SSRC_EOSC1)
> + clock = CONFIG_HPS_CLK_OSC1_HZ;
> + else if (reg == CLKMGR_VCO_SSRC_EOSC2)
> + clock = CONFIG_HPS_CLK_OSC2_HZ;
> + else if (reg == CLKMGR_VCO_SSRC_F2S)
> + clock = CONFIG_HPS_CLK_F2S_PER_REF_HZ;
> +
> + /* get the PER VCO clock */
> + reg = readl(&clock_manager_base->per_pll.vco);
> + clock /= (CLKMGR_PERPLLGRP_VCO_DENOM_GET(reg) + 1);
> + clock *= (CLKMGR_PERPLLGRP_VCO_NUMER_GET(reg) + 1);
> +
> + /* get the clock prior L4 SP divider (periph_base_clk) */
> + reg = readl(&clock_manager_base->per_pll.perbaseclk);
> + clock /= (reg + 1);
> + }
> +
> + /* get the L4 SP clock which supplied to UART */
> + reg = readl(&clock_manager_base->main_pll.maindiv);
> + reg = CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_GET(reg);
> + clock = clock / (reg + 1);
This is not a +1. The l4 mp clock divider is structured like this:
0x0 = divide by 1
0x1 = divide by 2
0x2 = divide by 4
0x3 = divide by 8
0x4 = divide by 16
So it should be:
clock = clock / (1 << reg);
Dinh
next prev parent reply other threads:[~2014-09-15 20:09 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-15 11:05 [U-Boot] [PATCH 00/35][RFC] arm: socfpga: Usability fixes Marek Vasut
2014-09-15 11:05 ` [U-Boot] [PATCH 01/35] net: Remove unused CONFIG_DW_SEARCH_PHY from configs Marek Vasut
2014-09-15 15:34 ` Dinh Nguyen
2014-09-16 13:56 ` Marek Vasut
2014-09-15 11:05 ` [U-Boot] [PATCH 02/35] net: phy: Cleanup drivers/net/phy/micrel.c Marek Vasut
2014-09-15 11:05 ` [U-Boot] [PATCH 03/35] net: dwc: Fix cache alignment issues Marek Vasut
2014-09-15 15:40 ` Dinh Nguyen
2014-09-15 17:25 ` Marek Vasut
2014-09-15 11:05 ` [U-Boot] [PATCH 04/35] net: dwc: Make the cache handling less cryptic Marek Vasut
2014-09-16 13:10 ` Pavel Machek
2014-09-16 13:10 ` Pavel Machek
2014-09-16 13:11 ` Pavel Machek
2014-09-16 13:13 ` Pavel Machek
2014-09-16 13:13 ` Pavel Machek
2014-09-16 13:14 ` Pavel Machek
2014-09-16 13:16 ` Pavel Machek
2014-09-16 13:16 ` Pavel Machek
2014-09-16 18:10 ` Marek Vasut
2014-09-16 22:03 ` Dinh Nguyen
2014-09-16 22:12 ` Marek Vasut
2014-09-15 11:05 ` [U-Boot] [PATCH 05/35] mmc: dw_mmc: cleanups Marek Vasut
2014-09-15 16:00 ` Dinh Nguyen
2014-09-15 17:25 ` Marek Vasut
2014-09-15 11:05 ` [U-Boot] [PATCH 06/35] mmc: dw_mmc: Fix cache alignment issue Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 07/35] tools: socfpga: Add socfpga preloader signing to mkimage Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 08/35] arm: socfpga: Complete the list of base addresses Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 09/35] arm: socfpga: Clean up base address file Marek Vasut
2014-09-16 13:12 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 10/35] arm: socfpga: Add watchdog disable for socfpga Marek Vasut
2014-09-15 16:28 ` Dinh Nguyen
2014-09-16 13:58 ` Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 11/35] arm: socfpga: sysmgr: Clean up system manager Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 12/35] arm: socfpga: clock: Implant order into bit definitions Marek Vasut
2014-09-15 15:26 ` Wolfgang Denk
2014-09-15 21:21 ` Pavel Machek
2014-09-15 21:48 ` Marek Vasut
2014-09-16 8:18 ` Wolfgang Denk
2014-09-16 21:59 ` Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 13/35] arm: socfpga: clock: Drop nonsense inlining from clock manager code Marek Vasut
2014-09-15 19:25 ` Dinh Nguyen
2014-09-16 17:31 ` Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 14/35] arm: socfpga: clock: Add missing stubs into board file Marek Vasut
2014-09-15 19:27 ` Dinh Nguyen
2014-09-18 15:10 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 15/35] arm: socfpga: clock: Add code to read clock configuration Marek Vasut
2014-09-15 20:09 ` Dinh Nguyen [this message]
2014-09-16 18:09 ` Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 16/35] arm: socfpga: clock: Trim down code duplication Marek Vasut
2014-09-16 15:38 ` Dinh Nguyen
2014-09-18 15:12 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 17/35] arm: socfpga: mmc: Pick the clock from clock manager Marek Vasut
2014-09-16 15:52 ` Dinh Nguyen
2014-09-15 11:06 ` [U-Boot] [PATCH 18/35] arm: socfpga: timer: Pull the timer reload value from config file Marek Vasut
2014-09-15 21:25 ` Pavel Machek
2014-09-16 15:55 ` Dinh Nguyen
2014-09-15 11:06 ` [U-Boot] [PATCH 19/35] arm: socfpga: reset: Add EMAC reset functions Marek Vasut
2014-09-15 21:26 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 20/35] arm: socfpga: misc: Add proper ethernet initialization Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 21/35] arm: socfpga: misc: Add SD controller init Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 22/35] arm: socfpga: misc: Align print_cpuinfo() output Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 23/35] arm: socfpga: board: Correctly set ATAG position Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 24/35] arm: socfpga: board: Align checkboard() output Marek Vasut
2014-09-15 21:28 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 25/35] arm: socfpga: fpga: Add SoCFPGA FPGA programming interface Marek Vasut
2014-09-15 15:41 ` Wolfgang Denk
2014-09-16 18:18 ` Marek Vasut
2014-09-16 9:42 ` Michal Simek
2014-09-16 10:12 ` Marek Vasut
2014-09-16 10:33 ` Michal Simek
2014-09-16 20:15 ` Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 26/35] arm: socfpga: reset: Add function to reset FPGA bridges Marek Vasut
2014-09-15 21:31 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 27/35] arm: socfpga: sysmgr: Add FPGA bits into system manager Marek Vasut
2014-09-15 11:06 ` [U-Boot] [PATCH 28/35] arm: cache: Add support for write-allocate D-Cache Marek Vasut
2014-09-15 21:34 ` Pavel Machek
2014-09-15 11:06 ` [U-Boot] [PATCH 29/35] arm: socfpga: cache: Define cacheline size Marek Vasut
2014-09-15 21:35 ` Pavel Machek
2014-09-15 11:59 ` [U-Boot] [PATCH 30/35] arm: socfpga: cache: Enable D-Cache Marek Vasut
2014-09-15 21:39 ` Pavel Machek
2014-09-15 17:17 ` [U-Boot] [PATCH 31/35] arm: socfpga: cache: Enable PL310 L2 cache Marek Vasut
2014-09-15 17:17 ` [U-Boot] [PATCH 32/35] arm: socfpga: scu: Add SCU register file Marek Vasut
2014-09-15 17:17 ` [U-Boot] [PATCH 33/35] arm: socfpga: nic301: Add NIC-301 GPV " Marek Vasut
2014-09-15 17:17 ` [U-Boot] [PATCH 34/35] arm: socfpga: pl310: Map SDRAM to 0x0 Marek Vasut
2014-09-15 17:18 ` [U-Boot] [PATCH 35/35] arm: socfpga: nic301: Add NIC-301 configuration code Marek Vasut
2014-09-16 13:18 ` [U-Boot] [PATCH 00/35][RFC] arm: socfpga: Usability fixes Pavel Machek
2014-09-16 16:28 ` Dinh Nguyen
2014-09-16 20:43 ` Marek Vasut
2014-09-16 21:29 ` dinguyen
2014-09-16 21:55 ` Marek Vasut
2014-09-16 22:29 ` Dinh Nguyen
2014-09-16 23:52 ` Marek Vasut
2014-09-17 11:07 ` Chin Liang See
2014-09-17 12:35 ` Marek Vasut
2014-09-17 14:11 ` Wolfgang Denk
2014-09-19 9:44 ` Chin Liang See
2014-09-19 11:12 ` Marek Vasut
2014-09-19 12:06 ` Marek Vasut
2014-09-17 5:33 ` Wolfgang Denk
2014-09-16 21:35 ` dinguyen
2014-09-16 21:46 ` Marek Vasut
2014-09-16 22:20 ` Dinh Nguyen
2014-09-16 23:52 ` Marek Vasut
2014-09-18 15:19 ` Pavel Machek
2014-09-17 11:29 ` Chin Liang See
2014-09-17 11:52 ` Marek Vasut
2014-09-17 12:00 ` Chin Liang See
2014-09-17 12:39 ` Marek Vasut
2014-09-19 9:32 ` Chin Liang See
2014-09-19 10:36 ` Chin Liang See
2014-09-19 11:11 ` Marek Vasut
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=5417477E.70005@opensource.altera.com \
--to=dinguyen@opensource.altera.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.