public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Bo Shen <voice.shen@atmel.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [v2 PATCH 10/12] arm, spl, at91: add at91sam9260 and at91sam9g45 spl support
Date: Fri, 31 Oct 2014 09:50:12 +0800	[thread overview]
Message-ID: <5452EAD4.7080903@atmel.com> (raw)
In-Reply-To: <1414656906-16632-11-git-send-email-hs@denx.de>

Hi Heiko,

On 10/30/2014 04:15 PM, Heiko Schocher wrote:
> diff --git a/arch/arm/cpu/at91-common/spl.c b/arch/arm/cpu/at91-common/spl.c
> index 674a470..5c9a3ad 100644
> --- a/arch/arm/cpu/at91-common/spl.c
> +++ b/arch/arm/cpu/at91-common/spl.c

I am thinking, whether it be better to keep this file as two copy? This 
will remove #ifdef, although a little code duplication.

If this solution acceptable, some suggestion as following:
   - for armv5 (arm926ejs, now at91 series), named it spl_at91.c,
   - for armv7 (cortex-a5, now, sama5d3), named it spl_atmel.c?
(As for arm9 series, we have at91 prefix for SoC name, and for armv7 
SoC, we don't have at91 prefix, and it now changed to Atmel Smart)

> @@ -8,11 +8,18 @@
>   #include <common.h>
>   #include <asm/io.h>
>   #include <asm/arch/at91_common.h>
> +#if !defined(CONFIG_SAMA5D3)
> +#include <asm/arch/at91sam9_matrix.h>
> +#endif
> +#include <asm/arch/at91_pit.h>
>   #include <asm/arch/at91_pmc.h>
> +#include <asm/arch/at91_rstc.h>
>   #include <asm/arch/at91_wdt.h>
>   #include <asm/arch/clk.h>
>   #include <spl.h>
>
> +DECLARE_GLOBAL_DATA_PTR;
> +
>   static void at91_disable_wdt(void)
>   {
>   	struct at91_wdt *wdt = (struct at91_wdt *)ATMEL_BASE_WDT;
> @@ -20,6 +27,33 @@ static void at91_disable_wdt(void)
>   	writel(AT91_WDT_MR_WDDIS, &wdt->mr);
>   }
>
> +u32 spl_boot_device(void)
> +{
> +#ifdef CONFIG_SYS_USE_MMC
> +	return BOOT_DEVICE_MMC1;
> +#elif CONFIG_SYS_USE_NANDFLASH
> +	return BOOT_DEVICE_NAND;
> +#elif CONFIG_SYS_USE_SERIALFLASH
> +	return BOOT_DEVICE_SPI;
> +#endif
> +	return BOOT_DEVICE_NONE;
> +}
> +
> +u32 spl_boot_mode(void)
> +{
> +	switch (spl_boot_device()) {
> +#ifdef CONFIG_SYS_USE_MMC
> +	case BOOT_DEVICE_MMC1:
> +		return MMCSD_MODE_FS;
> +		break;
> +#endif
> +	case BOOT_DEVICE_NONE:
> +	default:
> +		hang();
> +	}
> +}
> +
> +#if defined(CONFIG_SAMA5D3)
>   static void switch_to_main_crystal_osc(void)
>   {
>   	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> @@ -57,77 +91,134 @@ static void switch_to_main_crystal_osc(void)
>   	writel(tmp, &pmc->mor);
>   }
>
> -void at91_plla_init(u32 pllar)
> +void s_init(void)
>   {
> -	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> +	switch_to_main_crystal_osc();
>
> -	writel(pllar, &pmc->pllar);
> -	while (!(readl(&pmc->sr) & (AT91_PMC_LOCKA | AT91_PMC_MCKRDY)))
> -		;
> -}
> +	/* disable watchdog */
> +	at91_disable_wdt();
>
> -void at91_mck_init(u32 mckr)
> -{
> -	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> -	u32 tmp;
> +	/* PMC configuration */
> +	at91_pmc_init();
>
> -	tmp = readl(&pmc->mckr);
> -	tmp &= ~(AT91_PMC_MCKR_PRES_MASK |
> -		 AT91_PMC_MCKR_MDIV_MASK |
> -		 AT91_PMC_MCKR_PLLADIV_2);
> -	tmp |= mckr & (AT91_PMC_MCKR_PRES_MASK |
> -		       AT91_PMC_MCKR_MDIV_MASK |
> -		       AT91_PMC_MCKR_PLLADIV_2);
> -	writel(tmp, &pmc->mckr);
> +	at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK);
>
> -	while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
> -		;
> -}
> +	timer_init();
>
> +	board_early_init_f();
>
> -u32 spl_boot_device(void)
> +	preloader_console_init();
> +
> +	mem_init();
> +}
> +#else
> +static void enable_ext_reset(void)
>   {
> -#ifdef CONFIG_SYS_USE_MMC
> -	return BOOT_DEVICE_MMC1;
> -#elif CONFIG_SYS_USE_NANDFLASH
> -	return BOOT_DEVICE_NAND;
> -#elif CONFIG_SYS_USE_SERIALFLASH
> -	return BOOT_DEVICE_SPI;
> -#endif
> -	return BOOT_DEVICE_NONE;
> +	struct at91_rstc *rstc = (struct at91_rstc *)ATMEL_BASE_RSTC;
> +
> +	writel(AT91_RSTC_KEY | AT91_RSTC_MR_URSTEN, &rstc->mr);
>   }
>
> -u32 spl_boot_mode(void)
> +#if defined(CONFIG_ATMEL_MATRIX_INIT)
> +static void matrix_init(void)
>   {
> -	switch (spl_boot_device()) {
> -#ifdef CONFIG_SYS_USE_MMC
> -	case BOOT_DEVICE_MMC1:
> -		return MMCSD_MODE_FS;
> -		break;
> +	struct at91_matrix *mat = (struct at91_matrix *)ATMEL_BASE_MATRIX;
> +
> +	writel((readl(&mat->scfg[3]) & (~AT91_MATRIX_SLOT_CYCLE))
> +			| AT91_MATRIX_SLOT_CYCLE_(0x40),
> +			&mat->scfg[3]);
> +}
>   #endif
> -	case BOOT_DEVICE_NONE:
> -	default:
> -		hang();
> +
> +void lowlevel_clock_init(void)
> +{
> +	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> +
> +	if (!(readl(&pmc->sr) & AT91_PMC_MOSCS)) {
> +		/* Enable Main Oscillator */
> +		writel(AT91_PMC_MOSCS | (0x40 << 8), &pmc->mor);
> +
> +		/* Wait until Main Oscillator is stable */
> +		while (!(readl(&pmc->sr) & AT91_PMC_MOSCS))
> +			;
>   	}
> +
> +	/* After stabilization, switch to Main Oscillator */
> +	if ((readl(&pmc->mckr) & AT91_PMC_CSS) == AT91_PMC_CSS_SLOW) {
> +		unsigned long tmp;
> +
> +		tmp = readl(&pmc->mckr);
> +		tmp &= ~AT91_PMC_CSS;
> +		tmp |= AT91_PMC_CSS_MAIN;
> +		writel(tmp, &pmc->mckr);
> +		while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
> +			;
> +
> +		tmp &= ~AT91_PMC_PRES;
> +		tmp |= AT91_PMC_PRES_1;
> +		writel(tmp, &pmc->mckr);
> +		while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
> +			;
> +	}
> +
> +	return;
>   }
>
> -void s_init(void)
> +void __weak at91_spl_board_init(void)
>   {
> -	switch_to_main_crystal_osc();
> +}
>
> -	/* disable watchdog */
> +void spl_board_init(void)
> +{
> +	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> +
> +	lowlevel_clock_init();
>   	at91_disable_wdt();
>
> -	/* PMC configuration */
> -	at91_pmc_init();
> +	/*
> +	 * At this stage the main oscillator is supposed to be enabled
> +	 * PCK = MCK = MOSC
> +	 */
> +	writel(0x00, &pmc->pllicpr);
>
> -	at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK);
> +	/* Configure PLLA = MOSC * (PLL_MULA + 1) / PLL_DIVA */
> +	at91_plla_init(CONFIG_SYS_AT91_PLLA);
>
> -	timer_init();
> +	/* PCK = PLLA = 2 * MCK */
> +	at91_mck_init(CONFIG_SYS_MCKR);
>
> -	board_early_init_f();
> +	/* Switch MCK on PLLA output */
> +	at91_mck_init(CONFIG_SYS_MCKR_CSS);
> +
> +#if defined(CONFIG_SYS_AT91_PLLB)
> +	/* Configure PLLB */
> +	at91_pllb_init(CONFIG_SYS_AT91_PLLB);
> +#endif
> +
> +	/* Enable External Reset */
> +	enable_ext_reset();
>
> +#if defined(CONFIG_ATMEL_MATRIX_INIT)
> +	/* Initialize matrix */
> +	matrix_init();
> +#endif

Can this also be weak function? And put matrix_init() code to SoC/board 
related file.

> +	gd->arch.mck_rate_hz = CONFIG_SYS_MASTER_CLOCK;
> +	/*
> +	 * init timer long enough for using in spl.
> +	 */
> +	timer_init();
> +
> +	/* enable clocks for all PIOs */
> +	at91_periph_clk_enable(ATMEL_ID_PIOA);
> +	at91_periph_clk_enable(ATMEL_ID_PIOB);
> +	at91_periph_clk_enable(ATMEL_ID_PIOC);
> +	/* init console */
> +	at91_seriald_hw_init();
>   	preloader_console_init();
>
>   	mem_init();
> +
> +	at91_spl_board_init();
>   }
> +#endif

Best Regards,
Bo Shen

  parent reply	other threads:[~2014-10-31  1:50 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-30  8:14 [U-Boot] [v2 PATCH 0/12] arm, at91, spl: add spl support for the taurus and corvus boards Heiko Schocher
2014-10-30  8:14 ` [U-Boot] [v2 PATCH 01/12] spi, atmel: move CONFIG_SYS_SPI_WRITE_TOUT into common header Heiko Schocher
2014-10-30  8:14 ` [U-Boot] [v2 PATCH 02/12] arm, at91: add spi dataflash support for the taurus board Heiko Schocher
2014-10-30  8:14 ` [U-Boot] [v2 PATCH 03/12] arm, at91, mpddrc: fix typo in ddr2_init() Heiko Schocher
2014-10-31  1:55   ` Bo Shen
2014-10-31  5:33     ` Heiko Schocher
2014-10-30  8:14 ` [U-Boot] [v2 PATCH 04/12] arm, at91: compile mpddrc ram init code also for AT91SAM9M10G45 Heiko Schocher
2014-10-30  8:14 ` [U-Boot] [v2 PATCH 05/12] arm, at91: add missing ddr2 cr register MPDDRC_CR_EBISHARE define Heiko Schocher
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 06/12] spl, nand: add option to boot raw u-boot.bin image only Heiko Schocher
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 07/12] mtd: atmel_nand: add missign include Heiko Schocher
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 08/12] spl, nand, atmel_nand: add erase one block function Heiko Schocher
2014-10-30 23:16   ` Scott Wood
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 09/12] spl, mtd, nand, atmel_nand: invert device ready pin logic Heiko Schocher
2014-10-30 23:18   ` Scott Wood
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 10/12] arm, spl, at91: add at91sam9260 and at91sam9g45 spl support Heiko Schocher
2014-10-30 10:17   ` Bo Shen
2014-10-30 11:41     ` Heiko Schocher
2014-10-31  1:55       ` Bo Shen
2014-10-31  1:50   ` Bo Shen [this message]
2014-10-31  6:03     ` Heiko Schocher
2014-10-31  6:08     ` Wolfgang Denk
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 11/12] arm, at91, spl: add spl support for the taurus board Heiko Schocher
2014-10-30  8:15 ` [U-Boot] [v2 PATCH 12/12] arm, spl, at91: add spl support for the corvus board Heiko Schocher

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=5452EAD4.7080903@atmel.com \
    --to=voice.shen@atmel.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