public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Wenyou Yang <wenyou.yang@microchip.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v6 4/9] ARM: at91: spl: Add mck function to lower rate while switching
Date: Wed, 13 Sep 2017 14:58:49 +0800	[thread overview]
Message-ID: <20170913065854.26134-5-wenyou.yang@microchip.com> (raw)
In-Reply-To: <20170913065854.26134-1-wenyou.yang@microchip.com>

Refer to the commit 70f8c8316ad(PMC: add new mck function to lower
rate while switching) from AT91Bootstrap.

While switching to a lower clock source, we must switch the clock
source first instead of last. Otherwise, we could end up with
too high frequency on internal bus and peripherals.
This happens on SAMA5D2 as exitting from the ROM code.

Add a function pmc_mck_init_down() to allow this sequence.

Signed-off-by: Wenyou Yang <wenyou.yang@microchip.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---

Changes in v6:
 - Add function comments for at91_mck_init_down().

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/arm/mach-at91/armv7/clock.c              | 42 +++++++++++++++++++++++++++
 arch/arm/mach-at91/include/mach/at91_common.h |  1 +
 2 files changed, 43 insertions(+)

diff --git a/arch/arm/mach-at91/armv7/clock.c b/arch/arm/mach-at91/armv7/clock.c
index 2e55953799..51c5e80be7 100644
--- a/arch/arm/mach-at91/armv7/clock.c
+++ b/arch/arm/mach-at91/armv7/clock.c
@@ -150,6 +150,48 @@ void at91_mck_init(u32 mckr)
 		;
 }
 
+/*
+ * For the Master Clock Controller Register(MCKR), while switching
+ * to a lower clock source, we must switch the clock source first
+ * instead of last. Otherwise, we could end up with too high frequency
+ * on the internal bus and peripherals.
+ */
+void at91_mck_init_down(u32 mckr)
+{
+	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+	u32 tmp;
+
+	tmp = readl(&pmc->mckr);
+	tmp &= (~AT91_PMC_MCKR_CSS_MASK);
+	tmp |= (mckr & AT91_PMC_MCKR_CSS_MASK);
+	writel(tmp, &pmc->mckr);
+
+	while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
+		;
+
+#ifdef CPU_HAS_H32MXDIV
+	tmp = readl(&pmc->mckr);
+	tmp &= (~AT91_PMC_MCKR_H32MXDIV);
+	tmp |= (mckr & AT91_PMC_MCKR_H32MXDIV);
+	writel(tmp, &pmc->mckr);
+#endif
+
+	tmp = readl(&pmc->mckr);
+	tmp &= (~AT91_PMC_MCKR_PLLADIV_MASK);
+	tmp |= (mckr & AT91_PMC_MCKR_PLLADIV_MASK);
+	writel(tmp, &pmc->mckr);
+
+	tmp = readl(&pmc->mckr);
+	tmp &= (~AT91_PMC_MCKR_MDIV_MASK);
+	tmp |= (mckr & AT91_PMC_MCKR_MDIV_MASK);
+	writel(tmp, &pmc->mckr);
+
+	tmp = readl(&pmc->mckr);
+	tmp &= (~AT91_PMC_MCKR_PRES_MASK);
+	tmp |= (mckr & AT91_PMC_MCKR_PRES_MASK);
+	writel(tmp, &pmc->mckr);
+}
+
 int at91_enable_periph_generated_clk(u32 id, u32 clk_source, u32 div)
 {
 	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
diff --git a/arch/arm/mach-at91/include/mach/at91_common.h b/arch/arm/mach-at91/include/mach/at91_common.h
index 5416eb455d..0b09ce7b2e 100644
--- a/arch/arm/mach-at91/include/mach/at91_common.h
+++ b/arch/arm/mach-at91/include/mach/at91_common.h
@@ -25,6 +25,7 @@ void at91_lcd_hw_init(void);
 void at91_plla_init(u32 pllar);
 void at91_pllb_init(u32 pllar);
 void at91_mck_init(u32 mckr);
+void at91_mck_init_down(u32 mckr);
 void at91_pmc_init(void);
 void mem_init(void);
 void at91_phy_reset(void);
-- 
2.13.0

  parent reply	other threads:[~2017-09-13  6:58 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-13  6:58 [U-Boot] [PATCH v6 0/9] board: atmel: Add new board SAMA5D27-SOM1-EK board Wenyou Yang
2017-09-13  6:58 ` [U-Boot] [PATCH v6 1/9] lib: at91: Add logo files used via API of DM_VIDEO Wenyou Yang
2017-09-15  0:47   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 2/9] atmel: common: Add function to display via DM_VIDEO's API Wenyou Yang
2017-09-15  0:47   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 3/9] ARM: at91: spl: Adjust switching to oscillator for SAMA5D2 Wenyou Yang
2017-09-15  0:47   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` Wenyou Yang [this message]
2017-09-15  0:47   ` [U-Boot] [U-Boot, v6, 4/9] ARM: at91: spl: Add mck function to lower rate while switching Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 5/9] board: sama5d2_xplained: Make SPL work on spiflash Wenyou Yang
2017-09-15  0:47   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 6/9] ARM: at91: spl: Add boot device for boot from QSPI Wenyou Yang
2017-09-15  0:48   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 7/9] ARM: at91: mach: Add missing defines of MPDDRC Wenyou Yang
2017-09-15  0:48   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 8/9] ARM: at91: Get the Chip ID of SAMA5D2 SiP Wenyou Yang
2017-09-15  0:48   ` [U-Boot] [U-Boot, v6, " Tom Rini
2017-09-13  6:58 ` [U-Boot] [PATCH v6 9/9] board: atmel: Add SAMA5D27 SOM1 EK board Wenyou Yang
2017-09-15  0:48   ` [U-Boot] [U-Boot, v6, " 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=20170913065854.26134-5-wenyou.yang@microchip.com \
    --to=wenyou.yang@microchip.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox