From: Sam Ravnborg <sam@ravnborg.org>
To: Barebox List <barebox@lists.infradead.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Subject: [PATCH 03/23] at91sam9263ek: move reset vector to board code
Date: Fri, 7 Jul 2017 14:12:22 +0200 [thread overview]
Message-ID: <20170707121242.18499-3-sam@ravnborg.org> (raw)
In-Reply-To: <20170707121000.GA16920@ravnborg.org>
Create a new file at91sam926x_board_init.h which
is a copy of at91sam926x_lowlevel_init.c with a few minor
adjustments:
- We no longer call board code from this function
- The struct is renamed to avoid name clashes
- the function is rename to better match the prurpose
This file will be used in subsequent transformations
Otherwise just added the reset vector to the board code
and drop the now obsolete CONFIG selectst
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
---
arch/arm/boards/at91sam9263ek/lowlevel_init.c | 43 ++--
arch/arm/mach-at91/Kconfig | 2 -
.../include/mach/at91sam926x_board_init.h | 220 +++++++++++++++++++++
3 files changed, 252 insertions(+), 13 deletions(-)
create mode 100644 arch/arm/mach-at91/include/mach/at91sam926x_board_init.h
diff --git a/arch/arm/boards/at91sam9263ek/lowlevel_init.c b/arch/arm/boards/at91sam9263ek/lowlevel_init.c
index 2f8b312d3..70e0da3b1 100644
--- a/arch/arm/boards/at91sam9263ek/lowlevel_init.c
+++ b/arch/arm/boards/at91sam9263ek/lowlevel_init.c
@@ -4,21 +4,17 @@
* Under GPLv2
*/
-#include <common.h>
-#include <init.h>
-#include <mach/hardware.h>
-#include <mach/at91_rstc.h>
-#include <mach/at91_wdt.h>
-#include <mach/at91_pmc.h>
-#include <mach/at91sam9_smc.h>
-#include <mach/at91sam9_sdramc.h>
-#include <mach/at91sam9_matrix.h>
-#include <mach/at91_lowlevel_init.h>
+#include <linux/sizes.h>
+
+#include <asm/barebox-arm.h>
+
+#include <mach/at91sam926x_board_init.h>
+#include <mach/at91sam9263_matrix.h>
#define MASTER_PLL_MUL 171
#define MASTER_PLL_DIV 14
-void __bare_init at91sam926x_lowlevel_board_config(struct at91sam926x_lowlevel_cfg *cfg)
+static void __bare_init at91sam9263ek_board_config(struct at91sam926x_board_cfg *cfg)
{
/* Disable Watchdog */
cfg->wdt_mr =
@@ -102,3 +98,28 @@ void __bare_init at91sam926x_lowlevel_board_config(struct at91sam926x_lowlevel_c
AT91_RSTC_RSTTYP_WAKEUP |
AT91_RSTC_RSTTYP_WATCHDOG;
}
+
+static void __bare_init at91sam9263ek_init(void)
+{
+ struct at91sam926x_board_cfg cfg;
+
+ cfg.pio = IOMEM(AT91SAM9263_BASE_PIOD);
+ cfg.sdramc = IOMEM(AT91SAM9263_BASE_SDRAMC0);
+ cfg.ebi_pio_is_peripha = true;
+ cfg.matrix_csa = AT91_MATRIX_EBI0CSA;
+
+ at91sam9263ek_board_config(&cfg);
+ at91sam926x_board_init(&cfg);
+
+ barebox_arm_entry(AT91_CHIPSELECT_1, at91_get_sdram_size(cfg.sdramc),
+ NULL);
+}
+
+void __naked __bare_init barebox_arm_reset_vector(void)
+{
+ arm_cpu_lowlevel_init();
+
+ arm_setup_stack(AT91SAM9263_SRAM0_BASE + AT91SAM9263_SRAM0_SIZE - 16);
+
+ at91sam9263ek_init();
+}
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 970ee07b1..99a8fdeb2 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -437,8 +437,6 @@ config MACH_AT91SAM9263EK
bool "Atmel AT91SAM9263-EK"
select HAVE_NAND_ATMEL_BUSWIDTH_16
select HAVE_AT91_BOOTSTRAP
- select AT91SAM9263_LWL
- select AT91SAM926X_LWL
help
Say y here if you are using Atmel's AT91SAM9263-EK Evaluation board
diff --git a/arch/arm/mach-at91/include/mach/at91sam926x_board_init.h b/arch/arm/mach-at91/include/mach/at91sam926x_board_init.h
new file mode 100644
index 000000000..11959ae07
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91sam926x_board_init.h
@@ -0,0 +1,220 @@
+#ifndef __AT91SAM926X_BOARD_INIT_H__
+#define __AT91SAM926X_BOARD_INIT_H__
+/*
+ * Copyright (C) 2008 Ronetix Ilko Iliev (www.ronetix.at)
+ * Copyright (C) 2009-2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
+ *
+ * Under GPLv2
+ */
+
+#include <common.h>
+#include <init.h>
+
+#include <mach/at91sam9_sdramc.h>
+#include <mach/at91sam9_smc.h>
+#include <mach/at91_rstc.h>
+#include <mach/at91_pio.h>
+#include <mach/at91_pmc.h>
+#include <mach/at91_wdt.h>
+#include <mach/hardware.h>
+#include <mach/gpio.h>
+
+struct at91sam926x_board_cfg {
+ /* SoC specific */
+ void __iomem *pio;
+ void __iomem *sdramc;
+ u32 ebi_pio_is_peripha;
+ u32 matrix_csa;
+
+ /* board specific */
+ u32 wdt_mr;
+ u32 ebi_pio_pdr;
+ u32 ebi_pio_ppudr;
+ u32 ebi_csa;
+ u32 smc_cs;
+ u32 smc_mode;
+ u32 smc_cycle;
+ u32 smc_pulse;
+ u32 smc_setup;
+ u32 pmc_mor;
+ u32 pmc_pllar;
+ u32 pmc_mckr1;
+ u32 pmc_mckr2;
+ u32 sdrc_cr;
+ u32 sdrc_tr1;
+ u32 sdrc_mdr;
+ u32 sdrc_tr2;
+ u32 rstc_rmr;
+};
+
+
+static void inline access_sdram(void)
+{
+ writel(0x00000000, AT91_SDRAM_BASE);
+}
+
+static void inline pmc_check_mckrdy(void)
+{
+ u32 r;
+
+ do {
+ r = at91_pmc_read(AT91_PMC_SR);
+ } while (!(r & AT91_PMC_MCKRDY));
+}
+
+static int inline running_in_sram(void)
+{
+ u32 addr = get_pc();
+
+ addr >>= 28;
+ return addr == 0;
+}
+
+#define at91_sdramc_read(field) \
+ __raw_readl(cfg->sdramc + field)
+
+#define at91_sdramc_write(field, value) \
+ __raw_writel(value, cfg->sdramc + field)
+
+static void inline __bare_init at91sam926x_sdramc_init(struct at91sam926x_board_cfg *cfg)
+{
+ u32 r;
+ int i;
+ int in_sram = running_in_sram();
+
+ /*
+ * SDRAMC Check if Refresh Timer Counter is already initialized
+ */
+ r = at91_sdramc_read(AT91_SDRAMC_TR);
+ if (r && !in_sram)
+ return;
+
+ /* SDRAMC_MR : Normal Mode */
+ at91_sdramc_write(AT91_SDRAMC_MR, AT91_SDRAMC_MODE_NORMAL);
+
+ /* SDRAMC_TR - Refresh Timer register */
+ at91_sdramc_write(AT91_SDRAMC_TR, cfg->sdrc_tr1);
+
+ /* SDRAMC_CR - Configuration register*/
+ at91_sdramc_write(AT91_SDRAMC_CR, cfg->sdrc_cr);
+
+ /* Memory Device Type */
+ at91_sdramc_write(AT91_SDRAMC_MDR, cfg->sdrc_mdr);
+
+ /* SDRAMC_MR : Precharge All */
+ at91_sdramc_write(AT91_SDRAMC_MR, AT91_SDRAMC_MODE_PRECHARGE);
+
+ /* access SDRAM */
+ access_sdram();
+
+ /* SDRAMC_MR : refresh */
+ at91_sdramc_write(AT91_SDRAMC_MR, AT91_SDRAMC_MODE_REFRESH);
+
+ /* access SDRAM 8 times */
+ for (i = 0; i < 8; i++)
+ access_sdram();
+
+ /* SDRAMC_MR : Load Mode Register */
+ at91_sdramc_write(AT91_SDRAMC_MR, AT91_SDRAMC_MODE_LMR);
+
+ /* access SDRAM */
+ access_sdram();
+
+ /* SDRAMC_MR : Normal Mode */
+ at91_sdramc_write(AT91_SDRAMC_MR, AT91_SDRAMC_MODE_NORMAL);
+
+ /* access SDRAM */
+ access_sdram();
+
+ /* SDRAMC_TR : Refresh Timer Counter */
+ at91_sdramc_write(AT91_SDRAMC_TR, cfg->sdrc_tr2);
+
+ /* access SDRAM */
+ access_sdram();
+}
+
+static void inline __bare_init at91sam926x_board_init(struct at91sam926x_board_cfg *cfg)
+{
+ u32 r;
+ int in_sram = running_in_sram();
+
+ __raw_writel(cfg->wdt_mr, AT91_BASE_WDT + AT91_WDT_MR);
+
+ /* configure PIOx as EBI0 D[16-31] */
+ at91_mux_gpio_disable(cfg->pio, cfg->ebi_pio_pdr);
+ at91_mux_set_pullup(cfg->pio, cfg->ebi_pio_ppudr, true);
+ if (cfg->ebi_pio_is_peripha)
+ at91_mux_set_A_periph(cfg->pio, cfg->ebi_pio_ppudr);
+
+ at91_sys_write(cfg->matrix_csa, cfg->ebi_csa);
+
+ /* flash */
+ at91_smc_write(cfg->smc_cs, AT91_SAM9_SMC_MODE, cfg->smc_mode);
+
+ at91_smc_write(cfg->smc_cs, AT91_SMC_CYCLE, cfg->smc_cycle);
+
+ at91_smc_write(cfg->smc_cs, AT91_SMC_PULSE, cfg->smc_pulse);
+
+ at91_smc_write(cfg->smc_cs, AT91_SMC_SETUP, cfg->smc_setup);
+
+ /*
+ * PMC Check if the PLL is already initialized
+ */
+ r = at91_pmc_read(AT91_PMC_MCKR);
+ if (r & AT91_PMC_CSS && !in_sram)
+ return;
+
+ /*
+ * Enable the Main Oscillator
+ */
+ at91_pmc_write(AT91_CKGR_MOR, cfg->pmc_mor);
+
+ do {
+ r = at91_pmc_read(AT91_PMC_SR);
+ } while (!(r & AT91_PMC_MOSCS));
+
+ /*
+ * PLLAR: x MHz for PCK
+ */
+ at91_pmc_write(AT91_CKGR_PLLAR, cfg->pmc_pllar);
+
+ do {
+ r = at91_pmc_read(AT91_PMC_SR);
+ } while (!(r & AT91_PMC_LOCKA));
+
+ /*
+ * PCK/x = MCK Master Clock from SLOW
+ */
+ at91_pmc_write(AT91_PMC_MCKR, cfg->pmc_mckr1);
+
+ pmc_check_mckrdy();
+
+ /*
+ * PCK/x = MCK Master Clock from PLLA
+ */
+ at91_pmc_write(AT91_PMC_MCKR, cfg->pmc_mckr2);
+
+ pmc_check_mckrdy();
+
+ /*
+ * Init SDRAM
+ */
+ at91sam926x_sdramc_init(cfg);
+
+ /* User reset enable*/
+ at91_sys_write(AT91_RSTC_MR, cfg->rstc_rmr);
+
+#ifdef CONFIG_SYS_MATRIX_MCFG_REMAP
+ /* MATRIX_MCFG - REMAP all masters */
+ at91_sys_write(AT91_MATRIX_MCFG0, 0x1FF);
+#endif
+ /*
+ * When boot from external boot
+ * we need to enable mck and ohter clock
+ * so enable all of them
+ * We will shutdown what we don't need later
+ */
+ at91_pmc_write(AT91_PMC_PCER, 0xffffffff);
+}
+
+#endif /* __AT91SAM926X_BOARD_INIT_H__ */
--
2.12.0
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2017-07-07 12:13 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-07 12:10 [PATCH v2 0/23] at91: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 01/23] at91: refactor lowlevel_init selection Sam Ravnborg
2017-07-07 12:12 ` [PATCH 02/23] at91: drop unused at91sam9x5_lowlevel_init.c Sam Ravnborg
2017-07-07 12:12 ` Sam Ravnborg [this message]
2017-07-07 12:12 ` [PATCH 04/23] at91sam9261ek, at91sam9g10ek: move reset vector to board code Sam Ravnborg
2017-07-07 12:12 ` [PATCH 05/23] pm9261: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 06/23] at91: drop unused at91sam9261_lowlevel_init Sam Ravnborg
2017-07-07 12:12 ` [PATCH 07/23] mmccpu: move reset vector to board code Sam Ravnborg
2017-07-07 12:12 ` [PATCH 08/23] pm9263: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 09/23] usb-a926x: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 10/23] at91: delete at91sam926x_lowlevel_init Sam Ravnborg
2017-07-07 12:12 ` [PATCH 11/23] tny-a926x: move reset vector to board code Sam Ravnborg
2017-07-07 12:12 ` [PATCH 12/23] qil-a926x: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 13/23] haba-knx: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 14/23] at91: delete unused at91sam9263_lowlevel_init.c Sam Ravnborg
2017-07-07 12:12 ` [PATCH 15/23] sama5d{3, 4}{xek, xplained}: move reset vector to board code Sam Ravnborg
2017-07-07 12:12 ` [PATCH 16/23] at91sam{9260, 9G20, 9m10g45, 9n12}ek: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 17/23] at91rm9200ek: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 18/23] at91sam9m10ihd: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 19/23] pm9g45: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 20/23] animeo: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 21/23] dss11: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 22/23] telit-evk-pro3: " Sam Ravnborg
2017-07-07 12:12 ` [PATCH 23/23] at91: remove leftovers from reset code in mach-at91 Sam Ravnborg
2017-07-17 9:52 ` [PATCH v2 0/23] at91: move reset vector to board code Lucas Stach
2017-07-17 11:41 ` Sam Ravnborg
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=20170707121242.18499-3-sam@ravnborg.org \
--to=sam@ravnborg.org \
--cc=barebox@lists.infradead.org \
/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