mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot
@ 2019-01-16 17:45 Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 01/11] ARM: at91: clk: prune never-compiled h32mx code Ahmad Fatoum
                   ` (11 more replies)
  0 siblings, 12 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

This patch series imports the necessary infrastructure out of the
at91bootstrap project to support first stage usage on the SAMA5.

This is leveraged to implement first stage boot on the SAMA5D3 based
Microchip KSZ9477-EVB.

Ahmad Fatoum (11):
  ARM: at91: clk: prune never-compiled h32mx code
  ARM: at91: sama5d3: remove never referenced empty header file
  ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's
  ARM: at91: watchdog: implement at91_wdt_disable
  ARM: at91: import lowlevel clock initialization from at91bootstrap
  ARM: at91: import early_udelay from at91bootstrap
  ARM: at91: import low level DDRAMC initialization code from
    at91bootstrap
  ARM: at91: import lowlevel dbgu UART init code from at91bootstrap
  ARM: at91: microchip-ksz9477-evb: reintroduce board code for first
    stage
  ARM: at91: microchip-ksz9477-evb: import low level init from
    at91bootstrap
  ARM: at91: microchip-ksz9477-evb: add first stage MMC defconfig

 arch/arm/boards/at91sam9m10g45ek/lowlevel.c   |   2 +-
 arch/arm/boards/at91sam9m10ihd/lowlevel.c     |   2 +-
 arch/arm/boards/at91sam9n12ek/lowlevel.c      |   2 +-
 arch/arm/boards/at91sam9x5ek/lowlevel.c       |   2 +-
 .../arm/boards/microchip-ksz9477-evb/Makefile |   3 +
 arch/arm/boards/microchip-ksz9477-evb/init.c  | 143 +++++
 .../boards/microchip-ksz9477-evb/lowlevel.c   | 196 ++++++-
 arch/arm/boards/pm9g45/lowlevel.c             |   3 +-
 arch/arm/boards/sama5d3_xplained/lowlevel.c   |   2 +-
 arch/arm/boards/sama5d3xek/lowlevel.c         |   2 +-
 arch/arm/boards/sama5d4_xplained/lowlevel.c   |   2 +-
 arch/arm/boards/sama5d4ek/lowlevel.c          |   2 +-
 .../configs/microchip_ksz9477_evb_defconfig   |   1 +
 ...chip_ksz9477_evb_first_stage_mmc_defconfig |  22 +
 arch/arm/dts/Makefile                         |   2 +-
 arch/arm/mach-at91/Kconfig                    |  18 +-
 arch/arm/mach-at91/Makefile                   |   3 +
 arch/arm/mach-at91/at91sam9g45_devices.c      |   2 +-
 arch/arm/mach-at91/at91sam9g45_reset.S        |   8 +-
 arch/arm/mach-at91/at91sam9n12_devices.c      |   2 +-
 arch/arm/mach-at91/at91sam9x5_devices.c       |   2 +-
 arch/arm/mach-at91/ddramc.c                   | 518 ++++++++++++++++++
 arch/arm/mach-at91/early_udelay.c             |  61 +++
 arch/arm/mach-at91/include/mach/at91_dbgu.h   |  57 +-
 .../arm/mach-at91/include/mach/at91_ddrsdrc.h | 426 ++++++++++++++
 .../include/mach/at91_lowlevel_clock.h        |  30 +
 arch/arm/mach-at91/include/mach/at91_pmc.h    |  24 +-
 arch/arm/mach-at91/include/mach/at91_wdt.h    |  16 +
 .../mach-at91/include/mach/at91sam9_ddrsdr.h  | 264 ---------
 arch/arm/mach-at91/include/mach/ddramc.h      |  35 ++
 .../arm/mach-at91/include/mach/early_udelay.h |  13 +
 arch/arm/mach-at91/include/mach/sama5d3.h     |   1 +
 .../mach-at91/include/mach/sama5d3_matrix.h   |  15 -
 arch/arm/mach-at91/lowlevel_clock.c           | 164 ++++++
 arch/arm/mach-at91/sama5d3_devices.c          |   2 +-
 arch/arm/mach-at91/sama5d4_devices.c          |   2 +-
 drivers/clk/at91/Makefile                     |   1 -
 drivers/clk/at91/clk-h32mx.c                  | 125 -----
 38 files changed, 1739 insertions(+), 436 deletions(-)
 create mode 100644 arch/arm/boards/microchip-ksz9477-evb/init.c
 create mode 100644 arch/arm/configs/microchip_ksz9477_evb_first_stage_mmc_defconfig
 create mode 100644 arch/arm/mach-at91/ddramc.c
 create mode 100644 arch/arm/mach-at91/early_udelay.c
 create mode 100644 arch/arm/mach-at91/include/mach/at91_ddrsdrc.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91_lowlevel_clock.h
 delete mode 100644 arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h
 create mode 100644 arch/arm/mach-at91/include/mach/ddramc.h
 create mode 100644 arch/arm/mach-at91/include/mach/early_udelay.h
 delete mode 100644 arch/arm/mach-at91/include/mach/sama5d3_matrix.h
 create mode 100644 arch/arm/mach-at91/lowlevel_clock.c
 delete mode 100644 drivers/clk/at91/clk-h32mx.c

-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 01/11] ARM: at91: clk: prune never-compiled h32mx code
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 02/11] ARM: at91: sama5d3: remove never referenced empty header file Ahmad Fatoum
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

This code is conditionally compiled when CONFIG_HAVE_AT91_H32MX
is defined, which never happens as it neither has a prompt
nor does another option select it.

As no one seems to miss it till now, just remove it.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/Kconfig   |   3 -
 drivers/clk/at91/Makefile    |   1 -
 drivers/clk/at91/clk-h32mx.c | 125 -----------------------------------
 3 files changed, 129 deletions(-)
 delete mode 100644 drivers/clk/at91/clk-h32mx.c

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index b101e61d221d..63e6e7285931 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -30,9 +30,6 @@ config MACH_AT91SAM9263EK_DT
 config HAVE_AT91_SMD
 	bool
 
-config HAVE_AT91_H32MX
-	bool
-
 config HAVE_AT91_GENERATED_CLK
 	bool
 
diff --git a/drivers/clk/at91/Makefile b/drivers/clk/at91/Makefile
index 13e67bd35cff..b1fe8b010797 100644
--- a/drivers/clk/at91/Makefile
+++ b/drivers/clk/at91/Makefile
@@ -9,5 +9,4 @@ obj-y += clk-system.o clk-peripheral.o clk-programmable.o
 obj-$(CONFIG_HAVE_AT91_UTMI)		+= clk-utmi.o
 obj-$(CONFIG_HAVE_AT91_USB_CLK)		+= clk-usb.o
 obj-$(CONFIG_HAVE_AT91_SMD)		+= clk-smd.o
-obj-$(CONFIG_HAVE_AT91_H32MX)		+= clk-h32mx.o
 obj-$(CONFIG_HAVE_AT91_GENERATED_CLK)	+= clk-generated.o
diff --git a/drivers/clk/at91/clk-h32mx.c b/drivers/clk/at91/clk-h32mx.c
deleted file mode 100644
index e0daa4a31f88..000000000000
--- a/drivers/clk/at91/clk-h32mx.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * clk-h32mx.c
- *
- *  Copyright (C) 2014 Atmel
- *
- * Alexandre Belloni <alexandre.belloni@free-electrons.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- */
-
-#include <linux/clk-provider.h>
-#include <linux/clkdev.h>
-#include <linux/clk/at91_pmc.h>
-#include <linux/of.h>
-#include <linux/regmap.h>
-#include <linux/mfd/syscon.h>
-
-#include "pmc.h"
-
-#define H32MX_MAX_FREQ	90000000
-
-struct clk_sama5d4_h32mx {
-	struct clk_hw hw;
-	struct regmap *regmap;
-};
-
-#define to_clk_sama5d4_h32mx(hw) container_of(hw, struct clk_sama5d4_h32mx, hw)
-
-static unsigned long clk_sama5d4_h32mx_recalc_rate(struct clk_hw *hw,
-						 unsigned long parent_rate)
-{
-	struct clk_sama5d4_h32mx *h32mxclk = to_clk_sama5d4_h32mx(hw);
-	unsigned int mckr;
-
-	regmap_read(h32mxclk->regmap, AT91_PMC_MCKR, &mckr);
-	if (mckr & AT91_PMC_H32MXDIV)
-		return parent_rate / 2;
-
-	if (parent_rate > H32MX_MAX_FREQ)
-		pr_warn("H32MX clock is too fast\n");
-	return parent_rate;
-}
-
-static long clk_sama5d4_h32mx_round_rate(struct clk_hw *hw, unsigned long rate,
-				       unsigned long *parent_rate)
-{
-	unsigned long div;
-
-	if (rate > *parent_rate)
-		return *parent_rate;
-	div = *parent_rate / 2;
-	if (rate < div)
-		return div;
-
-	if (rate - div < *parent_rate - rate)
-		return div;
-
-	return *parent_rate;
-}
-
-static int clk_sama5d4_h32mx_set_rate(struct clk_hw *hw, unsigned long rate,
-				    unsigned long parent_rate)
-{
-	struct clk_sama5d4_h32mx *h32mxclk = to_clk_sama5d4_h32mx(hw);
-	u32 mckr = 0;
-
-	if (parent_rate != rate && (parent_rate / 2) != rate)
-		return -EINVAL;
-
-	if ((parent_rate / 2) == rate)
-		mckr = AT91_PMC_H32MXDIV;
-
-	regmap_update_bits(h32mxclk->regmap, AT91_PMC_MCKR,
-			   AT91_PMC_H32MXDIV, mckr);
-
-	return 0;
-}
-
-static const struct clk_ops h32mx_ops = {
-	.recalc_rate = clk_sama5d4_h32mx_recalc_rate,
-	.round_rate = clk_sama5d4_h32mx_round_rate,
-	.set_rate = clk_sama5d4_h32mx_set_rate,
-};
-
-static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np)
-{
-	struct clk_sama5d4_h32mx *h32mxclk;
-	struct clk_init_data init;
-	const char *parent_name;
-	struct regmap *regmap;
-	int ret;
-
-	regmap = syscon_node_to_regmap(of_get_parent(np));
-	if (IS_ERR(regmap))
-		return;
-
-	h32mxclk = kzalloc(sizeof(*h32mxclk), GFP_KERNEL);
-	if (!h32mxclk)
-		return;
-
-	parent_name = of_clk_get_parent_name(np, 0);
-
-	init.name = np->name;
-	init.ops = &h32mx_ops;
-	init.parent_names = parent_name ? &parent_name : NULL;
-	init.num_parents = parent_name ? 1 : 0;
-	init.flags = CLK_SET_RATE_GATE;
-
-	h32mxclk->hw.init = &init;
-	h32mxclk->regmap = regmap;
-
-	ret = clk_hw_register(NULL, &h32mxclk->hw);
-	if (ret) {
-		kfree(h32mxclk);
-		return;
-	}
-
-	of_clk_add_hw_provider(np, of_clk_hw_simple_get, &h32mxclk->hw);
-}
-CLK_OF_DECLARE(of_sama5d4_clk_h32mx_setup, "atmel,sama5d4-clk-h32mx",
-	       of_sama5d4_clk_h32mx_setup);
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 02/11] ARM: at91: sama5d3: remove never referenced empty header file
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 01/11] ARM: at91: clk: prune never-compiled h32mx code Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's Ahmad Fatoum
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

The file was added along with the sama5d3 support, but never used,
so remove it.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/include/mach/sama5d3_matrix.h | 15 ---------------
 1 file changed, 15 deletions(-)
 delete mode 100644 arch/arm/mach-at91/include/mach/sama5d3_matrix.h

diff --git a/arch/arm/mach-at91/include/mach/sama5d3_matrix.h b/arch/arm/mach-at91/include/mach/sama5d3_matrix.h
deleted file mode 100644
index 8176b38bd328..000000000000
--- a/arch/arm/mach-at91/include/mach/sama5d3_matrix.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Matrix-centric header file for the SAMA5D3 family
- *
- *  Copyright (C) 2009-2012 Atmel Corporation.
- *
- * Only EBI related registers.
- * Write Protect register definitions may be useful.
- *
- * Licensed under GPLv2 or later.
- */
-
-#ifndef SAMA5D3_MATRIX_H
-#define SAMA5D3_MATRIX_H
-
-#endif
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 01/11] ARM: at91: clk: prune never-compiled h32mx code Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 02/11] ARM: at91: sama5d3: remove never referenced empty header file Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 18:24   ` Sam Ravnborg
  2019-01-16 17:45 ` [PATCH 04/11] ARM: at91: watchdog: implement at91_wdt_disable Ahmad Fatoum
                   ` (8 subsequent siblings)
  11 siblings, 1 reply; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

Only at91sam9g45_reset.S and the header itself actually use
any of the macros defined within.

Instead of adding missing definitions and adapting the incoming DDRAMC
initialization code from at91bootstrap, just include the at91_ddrsdrc.h
header wholesale.

This patch shouldn't affect resulting binaries.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/boards/at91sam9m10g45ek/lowlevel.c   |   2 +-
 arch/arm/boards/at91sam9m10ihd/lowlevel.c     |   2 +-
 arch/arm/boards/at91sam9n12ek/lowlevel.c      |   2 +-
 arch/arm/boards/at91sam9x5ek/lowlevel.c       |   2 +-
 arch/arm/boards/pm9g45/lowlevel.c             |   3 +-
 arch/arm/boards/sama5d3_xplained/lowlevel.c   |   2 +-
 arch/arm/boards/sama5d3xek/lowlevel.c         |   2 +-
 arch/arm/boards/sama5d4_xplained/lowlevel.c   |   2 +-
 arch/arm/boards/sama5d4ek/lowlevel.c          |   2 +-
 arch/arm/mach-at91/at91sam9g45_devices.c      |   2 +-
 arch/arm/mach-at91/at91sam9g45_reset.S        |   8 +-
 arch/arm/mach-at91/at91sam9n12_devices.c      |   2 +-
 arch/arm/mach-at91/at91sam9x5_devices.c       |   2 +-
 .../arm/mach-at91/include/mach/at91_ddrsdrc.h | 426 ++++++++++++++++++
 .../mach-at91/include/mach/at91sam9_ddrsdr.h  | 264 -----------
 arch/arm/mach-at91/sama5d3_devices.c          |   2 +-
 arch/arm/mach-at91/sama5d4_devices.c          |   2 +-
 17 files changed, 445 insertions(+), 282 deletions(-)
 create mode 100644 arch/arm/mach-at91/include/mach/at91_ddrsdrc.h
 delete mode 100644 arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h

diff --git a/arch/arm/boards/at91sam9m10g45ek/lowlevel.c b/arch/arm/boards/at91sam9m10g45ek/lowlevel.c
index 478ff11e1dfe..b0161553ed05 100644
--- a/arch/arm/boards/at91sam9m10g45ek/lowlevel.c
+++ b/arch/arm/boards/at91sam9m10g45ek/lowlevel.c
@@ -11,7 +11,7 @@
 #include <asm/barebox-arm.h>
 
 #include <mach/hardware.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
 {
diff --git a/arch/arm/boards/at91sam9m10ihd/lowlevel.c b/arch/arm/boards/at91sam9m10ihd/lowlevel.c
index d5940b987afa..c660b18e8854 100644
--- a/arch/arm/boards/at91sam9m10ihd/lowlevel.c
+++ b/arch/arm/boards/at91sam9m10ihd/lowlevel.c
@@ -10,7 +10,7 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/at91sam9g45.h>
 #include <mach/hardware.h>
 
diff --git a/arch/arm/boards/at91sam9n12ek/lowlevel.c b/arch/arm/boards/at91sam9n12ek/lowlevel.c
index 47079336e632..de8308725ac9 100644
--- a/arch/arm/boards/at91sam9n12ek/lowlevel.c
+++ b/arch/arm/boards/at91sam9n12ek/lowlevel.c
@@ -10,7 +10,7 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/hardware.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
diff --git a/arch/arm/boards/at91sam9x5ek/lowlevel.c b/arch/arm/boards/at91sam9x5ek/lowlevel.c
index 9aa0e8ba9b2b..aefe18d1c92e 100644
--- a/arch/arm/boards/at91sam9x5ek/lowlevel.c
+++ b/arch/arm/boards/at91sam9x5ek/lowlevel.c
@@ -1,6 +1,6 @@
 #include <common.h>
 #include <linux/sizes.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 #include <io.h>
diff --git a/arch/arm/boards/pm9g45/lowlevel.c b/arch/arm/boards/pm9g45/lowlevel.c
index 67454bde268c..d64ebef27407 100644
--- a/arch/arm/boards/pm9g45/lowlevel.c
+++ b/arch/arm/boards/pm9g45/lowlevel.c
@@ -10,7 +10,8 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
+
 #include <mach/hardware.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
diff --git a/arch/arm/boards/sama5d3_xplained/lowlevel.c b/arch/arm/boards/sama5d3_xplained/lowlevel.c
index b791f2a03cc7..41cc0e1f49db 100644
--- a/arch/arm/boards/sama5d3_xplained/lowlevel.c
+++ b/arch/arm/boards/sama5d3_xplained/lowlevel.c
@@ -10,7 +10,7 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/hardware.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
diff --git a/arch/arm/boards/sama5d3xek/lowlevel.c b/arch/arm/boards/sama5d3xek/lowlevel.c
index b791f2a03cc7..41cc0e1f49db 100644
--- a/arch/arm/boards/sama5d3xek/lowlevel.c
+++ b/arch/arm/boards/sama5d3xek/lowlevel.c
@@ -10,7 +10,7 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/hardware.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
diff --git a/arch/arm/boards/sama5d4_xplained/lowlevel.c b/arch/arm/boards/sama5d4_xplained/lowlevel.c
index b791f2a03cc7..41cc0e1f49db 100644
--- a/arch/arm/boards/sama5d4_xplained/lowlevel.c
+++ b/arch/arm/boards/sama5d4_xplained/lowlevel.c
@@ -10,7 +10,7 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/hardware.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
diff --git a/arch/arm/boards/sama5d4ek/lowlevel.c b/arch/arm/boards/sama5d4ek/lowlevel.c
index b791f2a03cc7..41cc0e1f49db 100644
--- a/arch/arm/boards/sama5d4ek/lowlevel.c
+++ b/arch/arm/boards/sama5d4ek/lowlevel.c
@@ -10,7 +10,7 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/hardware.h>
 
 void __naked __bare_init barebox_arm_reset_vector(void)
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index 43d8d5fbd6a2..389d88c17d4f 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -17,7 +17,7 @@
 #include <mach/hardware.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91sam9g45_matrix.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/at91_rtt.h>
 #include <mach/board.h>
 #include <mach/iomux.h>
diff --git a/arch/arm/mach-at91/at91sam9g45_reset.S b/arch/arm/mach-at91/at91sam9g45_reset.S
index 6a58de618ce0..9f2a90ff82f1 100644
--- a/arch/arm/mach-at91/at91sam9g45_reset.S
+++ b/arch/arm/mach-at91/at91sam9g45_reset.S
@@ -12,7 +12,7 @@
 
 #include <linux/linkage.h>
 #include <mach/hardware.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/at91_rstc.h>
 
 			.arm
@@ -20,13 +20,13 @@
 			.globl	at91sam9g45_reset
 
 at91sam9g45_reset:	mov	r2, #1
-			mov	r3, #AT91_DDRSDRC_LPCB_POWER_DOWN
+			mov	r3, #AT91C_DDRC2_LPCB_POWERDOWN
 			ldr	r4, =AT91_RSTC_KEY | AT91_RSTC_PERRST | AT91_RSTC_PROCRST
 
 			.balign	32				@ align to cache line
 
-			str	r2, [r0, #AT91_DDRSDRC_RTR]	@ disable DDR0 access
-			str	r3, [r0, #AT91_DDRSDRC_LPR]	@ power down DDR0
+			str	r2, [r0, #HDDRSDRC2_RTR]	@ disable DDR0 access
+			str	r3, [r0, #HDDRSDRC2_LPR]	@ power down DDR0
 			str	r4, [r1]			@ reset processor
 
 			b	.
diff --git a/arch/arm/mach-at91/at91sam9n12_devices.c b/arch/arm/mach-at91/at91sam9n12_devices.c
index 43cbb79af4a5..91b3e9b2fbc5 100644
--- a/arch/arm/mach-at91/at91sam9n12_devices.c
+++ b/arch/arm/mach-at91/at91sam9n12_devices.c
@@ -18,7 +18,7 @@
 #include <mach/board.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91sam9n12_matrix.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/iomux.h>
 #include <mach/cpu.h>
 #include <i2c/i2c-gpio.h>
diff --git a/arch/arm/mach-at91/at91sam9x5_devices.c b/arch/arm/mach-at91/at91sam9x5_devices.c
index ab506a1f4236..022e4fb59ab9 100644
--- a/arch/arm/mach-at91/at91sam9x5_devices.c
+++ b/arch/arm/mach-at91/at91sam9x5_devices.c
@@ -17,7 +17,7 @@
 #include <mach/board.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91sam9x5_matrix.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/iomux.h>
 #include <mach/cpu.h>
 #include <i2c/i2c-gpio.h>
diff --git a/arch/arm/mach-at91/include/mach/at91_ddrsdrc.h b/arch/arm/mach-at91/include/mach/at91_ddrsdrc.h
new file mode 100644
index 000000000000..263d51f3ee9a
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91_ddrsdrc.h
@@ -0,0 +1,426 @@
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2006, Atmel Corporation
+ */
+#ifndef __AT91_DDRSDRC_H__
+#define __AT91_DDRSDRC_H__
+
+/**** Register offset in AT91S_HDDRSDRC2 structure ***/
+#define HDDRSDRC2_MR		0x00	/* Mode Register */
+#define HDDRSDRC2_RTR		0x04	/* Refresh Timer Register */
+#define HDDRSDRC2_CR		0x08	/* Configuration Register */
+#define HDDRSDRC2_T0PR		0x0C	/* Timing Parameter 0 Register */
+#define HDDRSDRC2_T1PR		0x10	/* Timing Parameter 1 Register */
+#define HDDRSDRC2_T2PR		0x14	/* Timing Parameter 2 Register */
+#define HDDRSDRC2_T3PR		0x18	/* Timing Parameter 3 Register */
+#define HDDRSDRC2_LPR		0x1C	/* Low-power Register */
+#define HDDRSDRC2_MDR		0x20	/* Memory Device Register */
+#define HDDRSDRC2_DLL		0x24	/* DLL Information Register */
+#define HDDRSDRC2_HS		0x2C	/* High Speed Register */
+
+/* below items defined for sama5d3x */
+#define	MPDDRC_LPDDR2_HS	0x24	/* MPDDRC LPDDR2 High Speed Register */
+#define	MPDDRC_LPDDR2_LPR	0x28	/* MPDDRC LPDDR2 Low-power Register */
+#define	MPDDRC_LPDDR2_CAL_MR4	0x2C	/* MPDDRC LPDDR2 Calibration and MR4 Register */
+#define	MPDDRC_LPDDR2_TIM_CAL	0x30	/* MPDDRC LPDDR2 Timing Calibration Register */
+#define	MPDDRC_IO_CALIBR	0x34	/* MPDDRC IO Calibration */
+#define	MPDDRC_OCMS		0x38	/* MPDDRC OCMS Register */
+#define	MPDDRC_OCMS_KEY1	0x3C	/* MPDDRC OCMS KEY1 Register */
+#define	MPDDRC_OCMS_KEY2	0x40	/* MPDDRC OCMS KEY2 Register */
+/* 0x54 ~ 0x70 Reserved */
+#define	MPDDRC_DLL_MOR		0x74	/* MPDDRC DLL Master Offset Register */
+#define	MPDDRC_DLL_SOR		0x78	/* MPDDRC DLL Slave Offset Register */
+#define	MPDDRC_DLL_MSR		0x7C	/* MPDDRC DLL Master Status Register */
+#define	MPDDRC_DLL_S0SR		0x80	/* MPDDRC DLL Slave 0 Status Register */
+#define	MPDDRC_DLL_S1SR		0x84	/* MPDDRC DLL Slave 1 Status Register */
+
+#define MPDDRC_RD_DATA_PATH	0x5C	/* MPDDRC Read Data Path */
+
+/* 0x94 ~ 0xE0 Reserved */
+#define HDDRSDRC2_WPCR		0xE4	/* Write Protect Mode Register */
+#define HDDRSDRC2_WPSR		0xE8	/* Write Protect Status Register */
+
+/* -------- HDDRSDRC2_MR : (HDDRSDRC2 Offset: 0x0) Mode Register --------*/
+#define AT91C_DDRC2_MODE	(0x7UL << 0)
+#define 	AT91C_DDRC2_MODE_NORMAL_CMD		(0x0UL)
+#define 	AT91C_DDRC2_MODE_NOP_CMD		(0x1UL)
+#define 	AT91C_DDRC2_MODE_PRCGALL_CMD		(0x2UL)
+#define 	AT91C_DDRC2_MODE_LMR_CMD		(0x3UL)
+#define 	AT91C_DDRC2_MODE_RFSH_CMD		(0x4UL)
+#define 	AT91C_DDRC2_MODE_EXT_LMR_CMD		(0x5UL)
+#define 	AT91C_DDRC2_MODE_DEEP_CMD		(0x6UL)
+#define		AT91C_DDRC2_MODE_LPDDR2_CMD		(0x7UL)
+#define AT91C_DDRC2_MRS(value)	(value << 8)
+
+/* -------- HDDRSDRC2_RTR : (HDDRSDRC2 Offset: 0x4) Refresh Timer Register -------- */
+#define AT91C_DDRC2_COUNT	(0xFFFUL << 0)
+
+/* -------- HDDRSDRC2_CR : (HDDRSDRC2 Offset: 0x8) Configuration Register --------*/
+#define AT91C_DDRC2_NC		(0x3UL <<  0)
+#define 	AT91C_DDRC2_NC_DDR9_SDR8	(0x0UL)
+#define 	AT91C_DDRC2_NC_DDR10_SDR9	(0x1UL)
+#define 	AT91C_DDRC2_NC_DDR11_SDR10	(0x2UL)
+#define 	AT91C_DDRC2_NC_DDR12_SDR11	(0x3UL)
+#define AT91C_DDRC2_NR		(0x3UL << 2)
+#define 	AT91C_DDRC2_NR_11		(0x0UL << 2)
+#define 	AT91C_DDRC2_NR_12		(0x1UL << 2)
+#define 	AT91C_DDRC2_NR_13		(0x2UL << 2)
+#define 	AT91C_DDRC2_NR_14		(0x3UL << 2)
+#define AT91C_DDRC2_CAS		(0x7UL << 4)
+#define 	AT91C_DDRC2_CAS_2		(0x2UL << 4)
+#define 	AT91C_DDRC2_CAS_3		(0x3UL << 4)
+#define 	AT91C_DDRC2_CAS_4		(0x4UL << 4)
+#define 	AT91C_DDRC2_CAS_5		(0x5UL << 4)
+#define 	AT91C_DDRC2_CAS_6		(0x6UL << 4)
+#define AT91C_DDRC2_RESET_DLL		(0x1UL << 7)
+#define 	AT91C_DDRC2_DISABLE_RESET_DLL	(0x0UL << 7)
+#define 	AT91C_DDRC2_ENABLE_RESET_DLL	(0x1UL << 7)
+#define AT91C_DDRC2_DIC_DS	(0x1UL << 8)
+#define		AT91C_DDRC2_NORMAL_STRENGTH_RZQ6	(0x0UL << 8)
+#define		AT91C_DDRC2_WEAK_STRENGTH_RZQ7		(0x1UL << 8)
+#define AT91C_DDRC2_DLL	(0x1UL << 9)
+#define 	AT91C_DDRC2_ENABLE_DLL		(0x0UL << 9)
+#define 	AT91C_DDRC2_DISABLE_DLL		(0x1UL << 9)
+#define AT91C_DDRC2_ZQ		(0x03 << 10)
+#define		AT91C_DDRC2_ZQ_INIT		(0x0 << 10)
+#define		AT91C_DDRC2_ZQ_LONG		(0x1 << 10)
+#define		AT91C_DDRC2_ZQ_SHORT		(0x2 << 10)
+#define		AT91C_DDRC2_ZQ_RESET		(0x3 << 10)
+#define AT91C_DDRC2_OCD		(0x7UL << 12)
+#define 	AT91C_DDRC2_OCD_EXIT		(0x0UL << 12)
+#define 	AT91C_DDRC2_OCD_DEFAULT		(0x7UL << 12)
+#define AT91C_DDRC2_EBISHARE	(0x1UL << 16)
+#define AT91C_DDRC2_DQMS	(0x1UL << 16)
+#define		AT91C_DDRC2_DQMS_NOT_SHARED	(0x0UL << 16)
+#define		AT91C_DDRC2_DQMS_SHARED		(0x1UL << 16)
+#define AT91C_DDRC2_ENRDM	(0x1UL << 17)
+#define 	AT91C_DDRC2_ENRDM_DISABLE	(0x0UL << 17)
+#define 	AT91C_DDRC2_ENRDM_ENABLE	(0x1UL << 17)
+#define AT91C_DDRC2_ACTBST	(0x1UL << 18)
+#define AT91C_DDRC2_NB_BANKS	(0x1UL << 20)
+#define 	AT91C_DDRC2_NB_BANKS_4		(0x0UL << 20)
+#define 	AT91C_DDRC2_NB_BANKS_8		(0x1UL << 20)
+#define AT91C_DDRC2_NDQS	(0x1UL << 21)	/* Not DQS(sama5d3x only) */
+#define 	AT91C_DDRC2_NDQS_ENABLED	(0x0UL << 21)
+#define 	AT91C_DDRC2_NDQS_DISABLED	(0x1UL << 21)
+#define AT91C_DDRC2_DECOD	(0x1UL << 22)
+#define 	AT91C_DDRC2_DECOD_SEQUENTIAL	(0x0UL << 22)
+#define 	AT91C_DDRC2_DECOD_INTERLEAVED	(0x1UL << 22)
+#define AT91C_DDRC2_UNAL	(0x1UL << 23)	/* Support Unaligned Access(sama5d3x only) */
+#define 	AT91C_DDRC2_UNAL_UNSUPPORTED		(0x0UL << 23)
+#define 	AT91C_DDRC2_UNAL_SUPPORTED		(0x1UL << 23)
+
+/* -------- HDDRSDRC2_T0PR : (HDDRSDRC2 Offset: 0xc) Timing0 Register --------*/
+#define AT91C_DDRC2_TRAS	(0xFUL <<  0)
+#define		AT91C_DDRC2_TRAS_(x)		(x & 0x0f)
+#define	AT91C_DDRC2_TRCD	(0xFUL <<  4)
+#define		AT91C_DDRC2_TRCD_(x)		((x & 0x0f) << 4)
+#define	AT91C_DDRC2_TWR		(0xFUL << 8)
+#define		AT91C_DDRC2_TWR_(x)		((x & 0x0f) << 8)
+#define	AT91C_DDRC2_TRC		(0xFUL << 12)
+#define		AT91C_DDRC2_TRC_(x)		((x & 0x0f) << 12)
+#define	AT91C_DDRC2_TRP		(0xFUL << 16)
+#define		AT91C_DDRC2_TRP_(x)		((x & 0x0f) << 16)
+#define	AT91C_DDRC2_TRRD	(0xFUL << 20)
+#define		AT91C_DDRC2_TRRD_(x)		((x & 0x0f) << 20)
+#define	AT91C_DDRC2_TWTR	(0xFUL << 24)
+#define		AT91C_DDRC2_TWTR_(x)		((x & 0x0f) << 24)
+#define	AT91C_DDRC2_TMRD	(0xFUL << 28)
+#define		AT91C_DDRC2_TMRD_(x)		((x & 0x0f) << 28)
+
+/* -------- HDDRSDRC2_T1PR : (HDDRSDRC2 Offset: 0x10) Timing1 Register -------- */
+#define	AT91C_DDRC2_TRFC	(0x7FUL <<  0)
+#define		AT91C_DDRC2_TRFC_(x)		(x & 0x7f)
+#define	AT91C_DDRC2_TXSNR	(0xFFUL << 8)
+#define		AT91C_DDRC2_TXSNR_(x)		((x & 0xff) << 8)
+#define AT91C_DDRC2_TXSRD	(0xFFUL << 16)
+#define		AT91C_DDRC2_TXSRD_(x)		((x & 0xff) << 16)
+#define	AT91C_DDRC2_TXP		(0xFUL << 24)
+#define		AT91C_DDRC2_TXP_(x)		((x & 0x0f) << 24)
+
+/* -------- HDDRSDRC2_T2PR : (HDDRSDRC2 Offset: 0x14) Timing2 Register --------*/
+#define	AT91C_DDRC2_TXARD	(0xFUL << 0)
+#define		AT91C_DDRC2_TXARD_(x)		(x & 0x0f)
+#define	AT91C_DDRC2_TXARDS	(0xFUL << 4)
+#define		AT91C_DDRC2_TXARDS_(x)		((x & 0x0f) << 4)
+#define	AT91C_DDRC2_TRPA	(0xFUL << 8)
+#define		AT91C_DDRC2_TRPA_(x)		((x & 0x0f) << 8)
+#define	AT91C_DDRC2_TRT		(0xFUL << 12)
+#define		AT91C_DDRC2_TRTP_(x)		((x & 0x0f) << 12)
+#define	AT91C_DDRC2_TFA		(0xFUL << 16)
+#define		AT91C_DDRC2_TFAW_(x)		((x & 0x0f) << 16)
+
+/* -------- HDDRSDRC2_LPR : (HDDRSDRC2 Offset: 0x1c) --------*/
+#define AT91C_DDRC2_LPCB	(0x3UL << 0)
+#define 	AT91C_DDRC2_LPCB_DISABLED	(0x0UL)
+#define 	AT91C_DDRC2_LPCB_SELFREFRESH	(0x1UL)
+#define 	AT91C_DDRC2_LPCB_POWERDOWN	(0x2UL)
+#define 	AT91C_DDRC2_LPCB_DEEP_PWD	(0x3UL)
+#define AT91C_DDRC2_CLK_FR	(0x1UL << 2)
+#define AT91C_DDRC2_PASR	(0x7UL << 4)
+#define		AT91C_DDRC2_PASR_(x)		((x & 0x7) << 4)
+#define AT91C_DDRC2_DS		(0x7UL << 8)
+#define		AT91C_DDRC2_DS_(x)		((x & 0x7) << 8)
+#define AT91C_DDRC2_TIMEOUT	(0x3UL << 12)
+#define 	AT91C_DDRC2_TIMEOUT_0		(0x0UL << 12)
+#define 	AT91C_DDRC2_TIMEOUT_64		(0x1UL << 12)
+#define 	AT91C_DDRC2_TIMEOUT_128		(0x2UL << 12)
+#define 	AT91C_DDRC2_TIMEOUT_Reserved	(0x3UL << 12)
+#define AT91C_DDRC2_ADPE	(0x1UL << 16)
+#define 	AT91C_DDRC2_ADPE_FAST		(0x0UL << 16)
+#define 	AT91C_DDRC2_ADPE_SLOW		(0x1UL << 16)
+#define AT91C_DDRC2_UPD_MR	(0x3UL << 20)
+#define		AT91C_DDRC2_UPD_MR_NO_UPDATE		(0x0UL << 20)
+#define		AT91C_DDRC2_UPD_MR_SHARED_BUS		(0x1UL << 20)
+#define		AT91C_DDRC2_UPD_MR_NO_SHARED_BUS	(0x2UL << 20)
+#define AT91C_DDRC2_SELF_DONE	(0x1UL << 25)
+
+/* -------- HDDRSDRC2_MDR : (HDDRSDRC2 Offset: 0x20) Memory Device Register -------- */
+#define AT91C_DDRC2_MD		(0x7UL << 0)
+#define 	AT91C_DDRC2_MD_SDR_SDRAM	(0x0UL)
+#define 	AT91C_DDRC2_MD_LP_SDR_SDRAM	(0x1UL)
+#define 	AT91C_DDRC2_MD_DDR_SDRAM	(0x2UL)
+#define 	AT91C_DDRC2_MD_LP_DDR_SDRAM	(0x3UL)
+#define 	AT91C_DDRC2_MD_DDR3_SDRAM	(0x4UL)
+#define 	AT91C_DDRC2_MD_LPDDR3_SDRAM	(0x5UL)
+#define 	AT91C_DDRC2_MD_DDR2_SDRAM	(0x6UL)
+#define		AT91C_DDRC2_MD_LPDDR2_SDRAM	(0x7UL)
+#define AT91C_DDRC2_DBW		(0x1UL << 4)
+#define 	AT91C_DDRC2_DBW_32_BITS		(0x0UL << 4)
+#define 	AT91C_DDRC2_DBW_16_BITS		(0x1UL << 4)
+
+/* -------- HDDRSDRC2_DLL : (HDDRSDRC2 Offset: 0x24) DLL Information Register --------*/
+#define AT91C_DDRC2_MDINC	(0x1UL << 0)
+#define AT91C_DDRC2_MDDEC	(0x1UL << 1)
+#define AT91C_DDRC2_MDOVF	(0x1UL << 2)
+#define AT91C_DDRC2_MDVAL	(0xFFUL << 8)
+
+/* ------- MPDDRC_LPDDR2_LPR (offset: 0x28) */
+#define AT91C_LPDDRC2_BK_MASK_PASR(value)	(value << 0)
+#define AT91C_LPDDRC2_SEG_MASK(value)		(value << 8)
+#define AT91C_LPDDRC2_DS(value)			(value << 24)
+
+/* -------- HDDRSDRC2_HS : (HDDRSDRC2 Offset: 0x2c) High Speed Register --------*/
+#define AT91C_DDRC2_NO_ANT	(0x1UL << 2)
+
+/* -------- MPDDRC_LPDDR2_CAL_MR4: (MPDDRC Offset: 0x2c) Calibration and MR4 Register --------*/
+#define AT91C_DDRC2_COUNT_CAL_MASK	(0xFFFFUL)
+#define AT91C_DDRC2_COUNT_CAL(value)	(((value) & AT91C_DDRC2_COUNT_CAL_MASK) << 0)
+
+/* -------- MPDDRC_LPDDR2_TIM_CAL : (MPDDRC Offset: 0x30) */
+#define AT91C_DDRC2_ZQCS(value)	(value << 0)
+
+/* -------- MPDDRC_IO_CALIBR : (MPDDRC Offset: 0x34) IO Calibration --------*/
+#define AT91C_MPDDRC_RDIV	(0x7UL << 0)
+#define 	AT91C_MPDDRC_RDIV_LPDDR2_RZQ_34		(0x1UL << 0)
+#define 	AT91C_MPDDRC_RDIV_LPDDR2_RZQ_48		(0x3UL << 0)
+#define 	AT91C_MPDDRC_RDIV_LPDDR2_RZQ_60		(0x4UL << 0)
+#define 	AT91C_MPDDRC_RDIV_LPDDR2_RZQ_120	(0x7UL << 0)
+
+#define 	AT91C_MPDDRC_RDIV_DDR2_RZQ_33_3		(0x2UL << 0)
+#define 	AT91C_MPDDRC_RDIV_DDR2_RZQ_50		(0x4UL << 0)
+#define		AT91C_MPDDRC_RDIV_DDR2_RZQ_66_7		(0x6UL << 0)
+#define 	AT91C_MPDDRC_RDIV_DDR2_RZQ_100		(0x7UL << 0)
+
+#define		AT91C_MPDDRC_RDIV_LPDDR3_RZQ_38		(0x02UL << 0)
+#define		AT91C_MPDDRC_RDIV_LPDDR3_RZQ_46		(0x03UL << 0)
+#define		AT91C_MPDDRC_RDIV_LPDDR3_RZQ_57		(0x04UL << 0)
+#define		AT91C_MPDDRC_RDIV_LPDDR3_RZQ_77		(0x06UL << 0)
+#define		AT91C_MPDDRC_RDIV_LPDDR3_RZQ_115	(0x07UL << 0)
+
+#define	AT91C_MPDDRC_ENABLE_CALIB	(0x01 << 4)
+#define		AT91C_MPDDRC_DISABLE_CALIB		(0x00 << 4)
+#define		AT91C_MPDDRC_EN_CALIB		(0x01 << 4)
+
+#define	AT91C_MPDDRC_TZQIO	(0x7FUL << 8)
+#define	AT91C_MPDDRC_TZQIO_(x)		((x) << 8)
+#define		AT91C_MPDDRC_TZQIO_0	(0x0UL << 8)
+#define		AT91C_MPDDRC_TZQIO_1	(0x1UL << 8)
+#define		AT91C_MPDDRC_TZQIO_3	(0x3UL << 8)
+#define		AT91C_MPDDRC_TZQIO_4	(0x4UL << 8)
+#define		AT91C_MPDDRC_TZQIO_5	(0x5UL << 8)
+#define		AT91C_MPDDRC_TZQIO_31	(0x1FUL << 8)
+
+#define	AT91C_MPDDRC_CALCODEP	(0xFUL << 16)
+#define		AT91C_MPDDRC_CALCODEP_(x)	((x) << 16)
+
+#define	AT91C_MPDDRC_CALCODEN	(0xFUL << 20)
+#define		AT91C_MPDDRC_CALCODEN_(x)	((x) << 20)
+
+/* ---- MPDDRC_RD_DATA_PATH : (MPDDRC Offset: 0x5c) MPDDRC Read Data Path */
+#define AT91_MPDDRC_SHIFT_SAMPLING	(0x03 << 0)
+#define		AT91C_MPDDRC_RD_DATA_PATH_NO_SHIFT	(0x00 << 0)
+#define		AT91C_MPDDRC_RD_DATA_PATH_ONE_CYCLES	(0x01 << 0)
+#define		AT91C_MPDDRC_RD_DATA_PATH_TWO_CYCLES	(0x02 << 0)
+#define		AT91C_MPDDRC_RD_DATA_PATH_THREE_CYCLES	(0x03 << 0)
+
+/* -------- MPDDRC_DLL_MOR : (MPDDRC Offset: 0x74) DLL Master Offset Register --------*/
+#define AT91C_MPDDRC_MOFF(value)	(value << 0)
+#define 	AT91C_MPDDRC_MOFF_1	(0x1UL << 0)
+#define 	AT91C_MPDDRC_MOFF_7	(0x7UL << 0)
+#define AT91C_MPDDRC_CLK90OFF(value)		(value << 8)
+#define 	AT91C_MPDDRC_CLK90OFF_1		(0x1UL << 8)
+#define 	AT91C_MPDDRC_CLK90OFF_31	(0x1FUL << 8)
+#define AT91C_MPDDRC_SELOFF	(0x1UL << 16)
+#define 	AT91C_MPDDRC_SELOFF_DISABLED	(0x0UL << 16)
+#define 	AT91C_MPDDRC_SELOFF_ENABLED	(0x1UL << 16)
+#define AT91C_MPDDRC_KEY	(0xC5UL << 24)
+
+/* -------- MPDDRC_DLL_SOR : (MPDDRC Offset: 0x78) DLL Slave Offset Register --------*/
+#define AT91C_MPDDRC_S0OFF_1	(0x1UL << 0)
+#define AT91C_MPDDRC_S1OFF_1	(0x1UL << 8)
+#define AT91C_MPDDRC_S2OFF_1	(0x1UL << 16)
+#define AT91C_MPDDRC_S3OFF_1	(0x1UL << 24)
+
+#define AT91C_MPDDRC_S0OFF(value)	(value << 0)
+#define AT91C_MPDDRC_S1OFF(value)	(value << 8)
+#define AT91C_MPDDRC_S2OFF(value)	(value << 16)
+#define AT91C_MPDDRC_S3OFF(value)	(value << 24)
+
+/* -------- HDDRSDRC2_WPCR : (HDDRSDRC2 Offset: 0xe4) Write Protect Control Register --------*/
+#define AT91C_DDRC2_WPEN	(0x1UL << 0)
+#define AT91C_DDRC2_WPKEY	(0xFFFFFFUL << 8)
+
+/* -------- HDDRSDRC2_WPSR : (HDDRSDRC2 Offset: 0xe8) Write Protect Status Register --------*/
+#define AT91C_DDRC2_WPVS	(0x1UL << 0)
+#define AT91C_DDRC2_WPSRC	(0xFFFFUL << 8)
+
+/*
+ * Header file for the Atmel DDR/SDR SDRAM Controller
+ *
+ * Copyright (C) 2010 Atmel Corporation
+ *	Nicolas Ferre <nicolas.ferre@atmel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __ASSEMBLY__
+#include <common.h>
+#include <io.h>
+
+static inline u32 at91_get_ddram_size(void * __iomem base, bool is_nb)
+{
+	u32 cr;
+	u32 mdr;
+	u32 size;
+	bool is_sdram;
+
+	cr = __raw_readl(base + HDDRSDRC2_CR);
+	mdr = __raw_readl(base + HDDRSDRC2_MDR);
+
+	is_sdram = (mdr & AT91C_DDRC2_MD) <= AT91C_DDRC2_MD_LP_SDR_SDRAM;
+
+	/* Formula:
+	 * size = bank << (col + row + 1);
+	 * if (bandwidth == 32 bits)
+	 *	size <<= 1;
+	 */
+	size = 1;
+	/* COL */
+	size += (cr & AT91C_DDRC2_NC) + 8;
+	if (!is_sdram)
+		size ++;
+	/* ROW */
+	size += ((cr & AT91C_DDRC2_NR) >> 2) + 11;
+	/* BANK */
+	if (is_nb)
+		size = ((cr & AT91C_DDRC2_NB_BANKS) ? 8 : 4) << size;
+	else
+		size = 4 << size;
+
+	/* bandwidth */
+	if (!(mdr & AT91C_DDRC2_DBW))
+		size <<= 1;
+
+	return size;
+}
+
+#ifdef CONFIG_SOC_AT91SAM9G45
+#include <mach/at91sam9g45.h>
+static inline u32 at91sam9g45_get_ddram_size(int bank)
+{
+	switch (bank) {
+	case 0:
+		return at91_get_ddram_size(IOMEM(AT91SAM9G45_BASE_DDRSDRC0), false);
+	case 1:
+		return at91_get_ddram_size(IOMEM(AT91SAM9G45_BASE_DDRSDRC1), false);
+	default:
+		return 0;
+	}
+}
+#else
+static inline u32 at91sam9g45_get_ddram_size(int bank)
+{
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_SOC_AT91SAM9X5
+#include <mach/at91sam9x5.h>
+static inline u32 at91sam9x5_get_ddram_size(void)
+{
+	return at91_get_ddram_size(IOMEM(AT91SAM9X5_BASE_DDRSDRC0), true);
+}
+#else
+static inline u32 at91sam9x5_get_ddram_size(void)
+{
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_SOC_AT91SAM9N12
+#include <mach/at91sam9n12.h>
+static inline u32 at91sam9n12_get_ddram_size(void)
+{
+	return at91_get_ddram_size(IOMEM(AT91SAM9N12_BASE_DDRSDRC0), true);
+}
+#else
+static inline u32 at91sam9n12_get_ddram_size(void)
+{
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_SOC_SAMA5
+#include <mach/sama5d3.h>
+static inline u32 at91sama5_get_ddram_size(void)
+{
+	u32 cr;
+	u32 mdr;
+	u32 size;
+	void * __iomem base = IOMEM(SAMA5D3_BASE_MPDDRC);
+
+	cr = __raw_readl(base + HDDRSDRC2_CR);
+	mdr = __raw_readl(base + HDDRSDRC2_MDR);
+
+	/* Formula:
+	 * size = bank << (col + row + 1);
+	 * if (bandwidth == 32 bits)
+	 *	size <<= 1;
+	 */
+	size = 1;
+	/* COL */
+	size += (cr & AT91C_DDRC2_NC) + 9;
+	/* ROW */
+	size += ((cr & AT91C_DDRC2_NR) >> 2) + 11;
+	/* BANK */
+	size = ((cr & AT91C_DDRC2_NB_BANKS) ? 8 : 4) << size;
+
+	/* bandwidth */
+	if (!(mdr & AT91C_DDRC2_DBW))
+		size <<= 1;
+
+	return size;
+}
+#else
+static inline u32 at91sama5_get_ddram_size(void)
+{
+	return 0;
+}
+#endif
+
+#endif
+#endif	/* #ifndef __AT91_DDRSDRC_H__ */
diff --git a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h
deleted file mode 100644
index 1c4d313eb486..000000000000
--- a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Header file for the Atmel DDR/SDR SDRAM Controller
- *
- * Copyright (C) 2010 Atmel Corporation
- *	Nicolas Ferre <nicolas.ferre@atmel.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-#ifndef AT91SAM9_DDRSDR_H
-#define AT91SAM9_DDRSDR_H
-
-#define AT91_DDRSDRC_MR		0x00	/* Mode Register */
-#define		AT91_DDRSDRC_MODE	(0x7 << 0)		/* Command Mode */
-#define			AT91_DDRSDRC_MODE_NORMAL	0
-#define			AT91_DDRSDRC_MODE_NOP		1
-#define			AT91_DDRSDRC_MODE_PRECHARGE	2
-#define			AT91_DDRSDRC_MODE_LMR		3
-#define			AT91_DDRSDRC_MODE_REFRESH	4
-#define			AT91_DDRSDRC_MODE_EXT_LMR	5
-#define			AT91_DDRSDRC_MODE_DEEP		6
-
-#define AT91_DDRSDRC_RTR	0x04	/* Refresh Timer Register */
-#define		AT91_DDRSDRC_COUNT	(0xfff << 0)		/* Refresh Timer Counter */
-
-#define AT91_DDRSDRC_CR		0x08	/* Configuration Register */
-#define		AT91_DDRSDRC_NC		(3 << 0)		/* Number of Column Bits */
-#define			AT91_DDRSDRC_NC_SDR8	(0 << 0)
-#define			AT91_DDRSDRC_NC_SDR9	(1 << 0)
-#define			AT91_DDRSDRC_NC_SDR10	(2 << 0)
-#define			AT91_DDRSDRC_NC_SDR11	(3 << 0)
-#define			AT91_DDRSDRC_NC_DDR9	(0 << 0)
-#define			AT91_DDRSDRC_NC_DDR10	(1 << 0)
-#define			AT91_DDRSDRC_NC_DDR11	(2 << 0)
-#define			AT91_DDRSDRC_NC_DDR12	(3 << 0)
-#define		AT91_DDRSDRC_NR		(3 << 2)		/* Number of Row Bits */
-#define			AT91_DDRSDRC_NR_11	(0 << 2)
-#define			AT91_DDRSDRC_NR_12	(1 << 2)
-#define			AT91_DDRSDRC_NR_13	(2 << 2)
-#define			AT91_DDRSDRC_NR_14	(3 << 2)
-#define		AT91_DDRSDRC_CAS	(7 << 4)		/* CAS Latency */
-#define			AT91_DDRSDRC_CAS_2	(2 << 4)
-#define			AT91_DDRSDRC_CAS_3	(3 << 4)
-#define			AT91_DDRSDRC_CAS_25	(6 << 4)
-#define		AT91_DDRSDRC_RST_DLL	(1 << 7)		/* Reset DLL */
-#define		AT91_DDRSDRC_DICDS	(1 << 8)		/* Output impedance control */
-#define		AT91_DDRSDRC_DIS_DLL	(1 << 9)		/* Disable DLL [SAM9 Only] */
-#define		AT91_DDRSDRC_OCD	(1 << 12)		/* Off-Chip Driver [SAM9 Only] */
-#define		AT91_DDRSDRC_DQMS	(1 << 16)		/* Mask Data is Shared [SAM9 Only] */
-#define		AT91_DDRSDRC_ACTBST	(1 << 18)		/* Active Bank X to Burst Stop Read Access Bank Y [SAM9 Only] */
-#define		AT91_DDRSDRC_NB		(1 << 20)		/* Number of
-Banks [not SAM9G45] */
-#define			AT91_SDRAMC_NB_4	(0 << 20)
-#define			AT91_SDRAMC_NB_8	(1 << 20)
-
-#define AT91_DDRSDRC_T0PR	0x0C	/* Timing 0 Register */
-#define		AT91_DDRSDRC_TRAS	(0xf <<  0)		/* Active to Precharge delay */
-#define		AT91_DDRSDRC_TRCD	(0xf <<  4)		/* Row to Column delay */
-#define		AT91_DDRSDRC_TWR	(0xf <<  8)		/* Write recovery delay */
-#define		AT91_DDRSDRC_TRC	(0xf << 12)		/* Row cycle delay */
-#define		AT91_DDRSDRC_TRP	(0xf << 16)		/* Row precharge delay */
-#define		AT91_DDRSDRC_TRRD	(0xf << 20)		/* Active BankA to BankB */
-#define		AT91_DDRSDRC_TWTR	(0x7 << 24)		/* Internal Write to Read delay */
-#define		AT91CAP9_DDRSDRC_TWTR	(1   << 24)		/* Internal Write to Read delay */
-#define		AT91_DDRSDRC_RED_WRRD	(0x1 << 27)		/* Reduce Write to Read Delay [SAM9 Only] */
-#define		AT91_DDRSDRC_TMRD	(0xf << 28)		/* Load mode to active/refresh delay */
-
-#define AT91_DDRSDRC_T1PR	0x10	/* Timing 1 Register */
-#define		AT91_DDRSDRC_TRFC	(0x1f << 0)		/* Row Cycle Delay */
-#define		AT91_DDRSDRC_TXSNR	(0xff << 8)		/* Exit self-refresh to non-read */
-#define		AT91_DDRSDRC_TXSRD	(0xff << 16)		/* Exit self-refresh to read */
-#define		AT91_DDRSDRC_TXP	(0xf  << 24)		/* Exit power-down delay */
-
-#define AT91_DDRSDRC_T2PR	0x14	/* Timing 2 Register [SAM9 Only] */
-#define		AT91_DDRSDRC_TXARD	(0xf  << 0)		/* Exit active power down delay to read command in mode "Fast Exit" */
-#define		AT91_DDRSDRC_TXARDS	(0xf  << 4)		/* Exit active power down delay to read command in mode "Slow Exit" */
-#define		AT91_DDRSDRC_TRPA	(0xf  << 8)		/* Row Precharge All delay */
-#define		AT91_DDRSDRC_TRTP	(0x7  << 12)		/* Read to Precharge delay */
-
-#define AT91_DDRSDRC_LPR	0x1C	/* Low Power Register */
-#define AT91CAP9_DDRSDRC_LPR	0x18	/* Low Power Register */
-#define		AT91_DDRSDRC_LPCB	(3 << 0)		/* Low-power Configurations */
-#define			AT91_DDRSDRC_LPCB_DISABLE		0
-#define			AT91_DDRSDRC_LPCB_SELF_REFRESH		1
-#define			AT91_DDRSDRC_LPCB_POWER_DOWN		2
-#define			AT91_DDRSDRC_LPCB_DEEP_POWER_DOWN	3
-#define		AT91_DDRSDRC_CLKFR	(1 << 2)	/* Clock Frozen */
-#define		AT91_DDRSDRC_PASR	(7 << 4)	/* Partial Array Self Refresh */
-#define		AT91_DDRSDRC_TCSR	(3 << 8)	/* Temperature Compensated Self Refresh */
-#define		AT91_DDRSDRC_DS		(3 << 10)	/* Drive Strength */
-#define		AT91_DDRSDRC_TIMEOUT	(3 << 12)	/* Time to define when Low Power Mode is enabled */
-#define			AT91_DDRSDRC_TIMEOUT_0_CLK_CYCLES	(0 << 12)
-#define			AT91_DDRSDRC_TIMEOUT_64_CLK_CYCLES	(1 << 12)
-#define			AT91_DDRSDRC_TIMEOUT_128_CLK_CYCLES	(2 << 12)
-#define		AT91_DDRSDRC_APDE	(1 << 16)	 /* Active power down exit time */
-#define		AT91_DDRSDRC_UPD_MR	(3 << 20)	 /* Update load mode register and extended mode register */
-
-#define AT91_DDRSDRC_MDR	0x20	/* Memory Device Register */
-#define AT91CAP9_DDRSDRC_MDR	0x1C	/* Memory Device Register */
-#define		AT91_DDRSDRC_MD		(3 << 0)		/* Memory Device Type */
-#define			AT91_DDRSDRC_MD_SDR		0
-#define			AT91_DDRSDRC_MD_LOW_POWER_SDR	1
-#define			AT91CAP9_DDRSDRC_MD_DDR		2
-#define			AT91_DDRSDRC_MD_LOW_POWER_DDR	3
-#define			AT91_DDRSDRC_MD_DDR2		6	/* [SAM9 Only] */
-#define		AT91_DDRSDRC_DBW	(1 << 4)		/* Data Bus Width */
-#define			AT91_DDRSDRC_DBW_32BITS		(0 <<  4)
-#define			AT91_DDRSDRC_DBW_16BITS		(1 <<  4)
-
-#define AT91_DDRSDRC_DLL	0x24	/* DLL Information Register */
-#define AT91CAP9_DDRSDRC_DLL	0x20	/* DLL Information Register */
-#define		AT91_DDRSDRC_MDINC	(1 << 0)		/* Master Delay increment */
-#define		AT91_DDRSDRC_MDDEC	(1 << 1)		/* Master Delay decrement */
-#define		AT91_DDRSDRC_MDOVF	(1 << 2)		/* Master Delay Overflow */
-#define		AT91CAP9_DDRSDRC_SDCOVF	(1 << 3)		/* Slave Delay Correction Overflow */
-#define		AT91CAP9_DDRSDRC_SDCUDF	(1 << 4)		/* Slave Delay Correction Underflow */
-#define		AT91CAP9_DDRSDRC_SDERF	(1 << 5)		/* Slave Delay Correction error */
-#define		AT91_DDRSDRC_MDVAL	(0xff <<  8)		/* Master Delay value */
-#define		AT91CAP9_DDRSDRC_SDVAL	(0xff << 16)		/* Slave Delay value */
-#define		AT91CAP9_DDRSDRC_SDCVAL	(0xff << 24)		/* Slave Delay Correction value */
-
-#define AT91_DDRSDRC_HS		0x2C	/* High Speed Register [SAM9 Only] */
-#define		AT91_DDRSDRC_DIS_ATCP_RD	(1 << 2)	/* Anticip read access is disabled */
-
-#define AT91_DDRSDRC_DELAY(n)	(0x30 + (0x4 * (n)))	/* Delay I/O Register n */
-
-#define AT91_DDRSDRC_WPMR	0xE4	/* Write Protect Mode Register [SAM9 Only] */
-#define		AT91_DDRSDRC_WP		(1 << 0)		/* Write protect enable */
-#define		AT91_DDRSDRC_WPKEY	(0xffffff << 8)		/* Write protect key */
-#define		AT91_DDRSDRC_KEY	(0x444452 << 8)		/* Write protect key = "DDR" */
-
-#define AT91_DDRSDRC_WPSR	0xE8	/* Write Protect Status Register [SAM9 Only] */
-#define		AT91_DDRSDRC_WPVS	(1 << 0)		/* Write protect violation status */
-#define		AT91_DDRSDRC_WPVSRC	(0xffff << 8)		/* Write protect violation source */
-
-#ifndef __ASSEMBLY__
-#include <io.h>
-
-static inline u32 at91_get_ddram_size(void * __iomem base, bool is_nb)
-{
-	u32 cr;
-	u32 mdr;
-	u32 size;
-	bool is_sdram;
-
-	cr = __raw_readl(base + AT91_DDRSDRC_CR);
-	mdr = __raw_readl(base + AT91_DDRSDRC_MDR);
-
-	is_sdram = (mdr & AT91_DDRSDRC_MD) <= AT91_DDRSDRC_MD_LOW_POWER_SDR;
-
-	/* Formula:
-	 * size = bank << (col + row + 1);
-	 * if (bandwidth == 32 bits)
-	 *	size <<= 1;
-	 */
-	size = 1;
-	/* COL */
-	size += (cr & AT91_DDRSDRC_NC) + 8;
-	if (!is_sdram)
-		size ++;
-	/* ROW */
-	size += ((cr & AT91_DDRSDRC_NR) >> 2) + 11;
-	/* BANK */
-	if (is_nb)
-		size = ((cr & AT91_DDRSDRC_NB) ? 8 : 4) << size;
-	else
-		size = 4 << size;
-
-	/* bandwidth */
-	if (!(mdr & AT91_DDRSDRC_DBW))
-		size <<= 1;
-
-	return size;
-}
-
-#ifdef CONFIG_SOC_AT91SAM9G45
-#include <mach/at91sam9g45.h>
-static inline u32 at91sam9g45_get_ddram_size(int bank)
-{
-	switch (bank) {
-	case 0:
-		return at91_get_ddram_size(IOMEM(AT91SAM9G45_BASE_DDRSDRC0), false);
-	case 1:
-		return at91_get_ddram_size(IOMEM(AT91SAM9G45_BASE_DDRSDRC1), false);
-	default:
-		return 0;
-	}
-}
-#else
-static inline u32 at91sam9g45_get_ddram_size(int bank)
-{
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_SOC_AT91SAM9X5
-#include <mach/at91sam9x5.h>
-static inline u32 at91sam9x5_get_ddram_size(void)
-{
-	return at91_get_ddram_size(IOMEM(AT91SAM9X5_BASE_DDRSDRC0), true);
-}
-#else
-static inline u32 at91sam9x5_get_ddram_size(void)
-{
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_SOC_AT91SAM9N12
-#include <mach/at91sam9n12.h>
-static inline u32 at91sam9n12_get_ddram_size(void)
-{
-	return at91_get_ddram_size(IOMEM(AT91SAM9N12_BASE_DDRSDRC0), true);
-}
-#else
-static inline u32 at91sam9n12_get_ddram_size(void)
-{
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_SOC_SAMA5
-#include <mach/sama5d3.h>
-static inline u32 at91sama5_get_ddram_size(void)
-{
-	u32 cr;
-	u32 mdr;
-	u32 size;
-	void * __iomem base = IOMEM(SAMA5D3_BASE_MPDDRC);
-
-	cr = __raw_readl(base + AT91_DDRSDRC_CR);
-	mdr = __raw_readl(base + AT91_DDRSDRC_MDR);
-
-	/* Formula:
-	 * size = bank << (col + row + 1);
-	 * if (bandwidth == 32 bits)
-	 *	size <<= 1;
-	 */
-	size = 1;
-	/* COL */
-	size += (cr & AT91_DDRSDRC_NC) + 9;
-	/* ROW */
-	size += ((cr & AT91_DDRSDRC_NR) >> 2) + 11;
-	/* BANK */
-	size = ((cr & AT91_DDRSDRC_NB) ? 8 : 4) << size;
-
-	/* bandwidth */
-	if (!(mdr & AT91_DDRSDRC_DBW))
-		size <<= 1;
-
-	return size;
-}
-#else
-static inline u32 at91sama5_get_ddram_size(void)
-{
-	return 0;
-}
-#endif
-
-#endif
-
-#endif
diff --git a/arch/arm/mach-at91/sama5d3_devices.c b/arch/arm/mach-at91/sama5d3_devices.c
index f5075b39374f..f6d5e47c33ed 100644
--- a/arch/arm/mach-at91/sama5d3_devices.c
+++ b/arch/arm/mach-at91/sama5d3_devices.c
@@ -18,7 +18,7 @@
 #include <mach/board.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91sam9x5_matrix.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/iomux.h>
 #include <mach/cpu.h>
 #include <i2c/i2c-gpio.h>
diff --git a/arch/arm/mach-at91/sama5d4_devices.c b/arch/arm/mach-at91/sama5d4_devices.c
index 4064e4441f9f..f5c0367ca844 100644
--- a/arch/arm/mach-at91/sama5d4_devices.c
+++ b/arch/arm/mach-at91/sama5d4_devices.c
@@ -19,7 +19,7 @@
 #include <mach/board.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91sam9x5_matrix.h>
-#include <mach/at91sam9_ddrsdr.h>
+#include <mach/at91_ddrsdrc.h>
 #include <mach/iomux.h>
 #include <mach/cpu.h>
 #include <i2c/i2c-gpio.h>
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 04/11] ARM: at91: watchdog: implement at91_wdt_disable
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (2 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 05/11] ARM: at91: import lowlevel clock initialization from at91bootstrap Ahmad Fatoum
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

Low level init code might want to disable the watchdog in PBL.
Provide a helper to do so.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/include/mach/at91_wdt.h | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/arch/arm/mach-at91/include/mach/at91_wdt.h b/arch/arm/mach-at91/include/mach/at91_wdt.h
index 36d37b9d2d64..ecb50edc8c70 100644
--- a/arch/arm/mach-at91/include/mach/at91_wdt.h
+++ b/arch/arm/mach-at91/include/mach/at91_wdt.h
@@ -35,4 +35,20 @@
 #define		AT91_WDT_WDUNF		(1 << 0)		/* Watchdog Underflow */
 #define		AT91_WDT_WDERR		(1 << 1)		/* Watchdog Error */
 
+#ifndef __ASSEMBLY__
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2006, Atmel Corporation
+ */
+
+#include <asm-generic/io.h>
+
+static inline void at91_wdt_disable(void __iomem *wdt_base)
+{
+	u32 reg = __raw_readl(wdt_base + AT91_WDT_MR);
+	reg |= AT91_WDT_WDDIS;
+	__raw_writel(reg, wdt_base + AT91_WDT_MR);
+}
+
+#endif /* __ASSEMBLY__ */
 #endif
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 05/11] ARM: at91: import lowlevel clock initialization from at91bootstrap
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (3 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 04/11] ARM: at91: watchdog: implement at91_wdt_disable Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 06/11] ARM: at91: import early_udelay " Ahmad Fatoum
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

For use by future at91 first stage bootloaders, this commit imports
https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/driver/pmc.c
to do the low level clock initialization.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/Makefile                   |   1 +
 .../include/mach/at91_lowlevel_clock.h        |  30 ++++
 arch/arm/mach-at91/include/mach/at91_pmc.h    |   5 +-
 arch/arm/mach-at91/lowlevel_clock.c           | 164 ++++++++++++++++++
 4 files changed, 199 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/mach-at91/include/mach/at91_lowlevel_clock.h
 create mode 100644 arch/arm/mach-at91/lowlevel_clock.c

diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index d81683ac121a..7c4c58b080a1 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,4 +1,5 @@
 obj-y += setup.o
+pbl-y += lowlevel_clock.o
 
 ifeq ($(CONFIG_COMMON_CLK_OF_PROVIDER),)
 obj-y += clock.o
diff --git a/arch/arm/mach-at91/include/mach/at91_lowlevel_clock.h b/arch/arm/mach-at91/include/mach/at91_lowlevel_clock.h
new file mode 100644
index 000000000000..5b32cfdc69bf
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91_lowlevel_clock.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2006, Atmel Corporation
+ */
+
+#ifndef AT91_LOWLEVEL_CLOCK_H
+#define AT91_LOWLEVEL_CLOCK_H
+
+#include <errno.h>
+#include <asm/io.h>
+#include <mach/at91_pmc.h>
+
+void at91_lowlevel_clock_init(void __iomem *pmc_base);
+void at91_pmc_cfg_mck(void __iomem *pmc_base, unsigned int pmc_mckr);
+static inline int at91_pmc_enable_periph_clock(void __iomem *pmc_base,
+					  unsigned periph_id)
+{
+	u32 mask = 0x01 << (periph_id % 32);
+
+	if ((periph_id / 32) == 1)
+		__raw_writel(mask, pmc_base + AT91_PMC_PCER1);
+	else if ((periph_id / 32) == 0)
+		__raw_writel(mask, pmc_base + AT91_PMC_PCER);
+	else
+		return -EINVAL;
+
+	return 0;
+}
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/at91_pmc.h b/arch/arm/mach-at91/include/mach/at91_pmc.h
index bbbd497afaed..0f13e4f4d391 100644
--- a/arch/arm/mach-at91/include/mach/at91_pmc.h
+++ b/arch/arm/mach-at91/include/mach/at91_pmc.h
@@ -50,7 +50,9 @@
 #define		AT91_PMC_OSCBYPASS	(1    <<  1)		/* Oscillator Bypass */
 #define		AT91_PMC_MOSCRCEN	(1    <<  3)		/* Main On-Chip RC Oscillator Enable [some SAM9] */
 #define		AT91_PMC_OSCOUNT	(0xff <<  8)		/* Main Oscillator Start-up Time */
-#define		AT91_PMC_KEY		(0x37 << 16)		/* MOR Writing Key */
+#define			AT91_PMC_OSCOUNT_(x) ((x) << 8)
+#define		AT91_PMC_KEY_MASK	(0xff << 16)		/* MOR Writing Key */
+#define			AT91_PMC_KEY		(0x37 << 16)
 #define		AT91_PMC_MOSCSEL	(1    << 24)		/* Main Oscillator Selection [some SAM9] */
 #define		AT91_PMC_CFDEN		(1    << 25)		/* Clock Failure Detector Enable [some SAM9] */
 
@@ -133,6 +135,7 @@
 #define			AT91_PMC_CSSMCK_MCK		(1 << 8)
 
 #define	AT91_PMC_IER		0x60			/* Interrupt Enable Register */
+#define		AT91_PMC_MOSCXTS	(1 << 0)		/* Oscillator Startup Time */
 #define	AT91_PMC_IDR		0x64			/* Interrupt Disable Register */
 #define	AT91_PMC_SR		0x68			/* Status Register */
 #define		AT91_PMC_MOSCS		(1 <<  0)		/* MOSCS Flag */
diff --git a/arch/arm/mach-at91/lowlevel_clock.c b/arch/arm/mach-at91/lowlevel_clock.c
new file mode 100644
index 000000000000..c974409a99fc
--- /dev/null
+++ b/arch/arm/mach-at91/lowlevel_clock.c
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2006, Atmel Corporation
+ */
+
+#include <common.h>
+#include <mach/at91_lowlevel_clock.h>
+#include <mach/at91_pmc.h>
+
+#define at91_pmc_write(off, val) writel(val, pmc_base + off)
+#define at91_pmc_read(off) readl(pmc_base + off)
+
+void at91_lowlevel_clock_init(void __iomem *pmc_base)
+{
+	unsigned long tmp;
+
+	/*
+	 * Switch the master clock to the slow clock without modifying other
+	 * parameters. It is assumed that ROM code set H32MXDIV, PLLADIV2,
+	 * PCK_DIV3.
+	 */
+	tmp = at91_pmc_read(AT91_PMC_MCKR);
+	tmp &= ~AT91_PMC_ALT_PCKR_CSS;
+	tmp |= AT91_PMC_CSS_SLOW;
+	at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+	while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MCKRDY))
+		;
+
+	if (IS_ENABLED(CONFIG_SOC_AT91SAM9X5) || IS_ENABLED(CONFIG_SOC_AT91SAM9N12)
+	   || IS_ENABLED(CONFIG_SOC_SAMA5)) {
+		/*
+		 * Enable the Main Crystal Oscillator
+		 * tST_max = 2ms
+		 * Startup Time: 32768 * 2ms / 8 = 8
+		 */
+		tmp = at91_pmc_read(AT91_CKGR_MOR);
+		tmp &= ~AT91_PMC_OSCOUNT;
+		tmp &= ~AT91_PMC_KEY_MASK;
+		tmp |= AT91_PMC_MOSCEN;
+		tmp |= AT91_PMC_OSCOUNT_(8);
+		tmp |= AT91_PMC_KEY;
+		at91_pmc_write(AT91_CKGR_MOR, tmp);
+
+		while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MOSCS))
+			;
+
+		/* Switch from internal 12MHz RC to the Main Cristal Oscillator */
+		tmp = at91_pmc_read(AT91_CKGR_MOR);
+		tmp &= ~AT91_PMC_OSCBYPASS;
+		tmp &= ~AT91_PMC_KEY_MASK;
+		tmp |= AT91_PMC_KEY;
+		at91_pmc_write(AT91_CKGR_MOR, tmp);
+
+		tmp = at91_pmc_read(AT91_CKGR_MOR);
+		tmp |= AT91_PMC_MOSCSEL;
+		tmp &= ~AT91_PMC_KEY_MASK;
+		tmp |= AT91_PMC_KEY;
+		at91_pmc_write(AT91_CKGR_MOR, tmp);
+
+		while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MOSCSELS))
+			;
+
+		if (!IS_ENABLED(CONFIG_ARCH_SAMA5D4)) {
+			/* Disable the 12MHz RC Oscillator */
+			tmp = at91_pmc_read(AT91_CKGR_MOR);
+			tmp &= ~AT91_PMC_MOSCRCEN;
+			tmp &= ~AT91_PMC_KEY_MASK;
+			tmp |= AT91_PMC_KEY;
+			at91_pmc_write(AT91_CKGR_MOR, tmp);
+		}
+
+	} else {
+		/*
+		 * Enable the Main Crystal Oscillator
+		 * tST_max = 2ms
+		 * Startup Time: 32768 * 2ms / 8 = 8
+		 */
+		tmp = at91_pmc_read(AT91_CKGR_MOR);
+		tmp &= ~AT91_PMC_OSCOUNT;
+		tmp |= AT91_PMC_MOSCEN;
+		tmp |= AT91_PMC_OSCOUNT_(8);
+		at91_pmc_write(AT91_CKGR_MOR, tmp);
+
+		while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MOSCXTS))
+			;
+	}
+
+	/* After stablization, switch to Main Clock */
+	if ((at91_pmc_read(AT91_PMC_MCKR) & AT91_PMC_ALT_PCKR_CSS) == AT91_PMC_CSS_SLOW) {
+		tmp = at91_pmc_read(AT91_PMC_MCKR);
+		tmp &= ~(0x1 << 13);
+		tmp &= ~AT91_PMC_ALT_PCKR_CSS;
+		tmp |= AT91_PMC_CSS_MAIN;
+		at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+		while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MCKRDY))
+			;
+
+		tmp &= ~AT91_PMC_PRES;
+		tmp |= AT91_PMC_PRES_1;
+		at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+		while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MCKRDY))
+			;
+	}
+}
+
+void at91_pmc_cfg_mck(void __iomem *pmc_base, unsigned int pmc_mckr)
+{
+	u32 tmp;
+
+	/*
+	 * Program the PRES field in the AT91_PMC_MCKR register
+	 */
+	tmp = at91_pmc_read(AT91_PMC_MCKR);
+	tmp &= ~(0x1 << 13);
+	if (IS_ENABLED(CONFIG_SOC_AT91SAM9X5)
+	    || IS_ENABLED(CONFIG_SOC_AT91SAM9N12)
+	    || IS_ENABLED(CONFIG_SOC_SAMA5)) {
+		tmp &= ~AT91_PMC_ALT_PRES;
+		tmp |= pmc_mckr & AT91_PMC_ALT_PRES;
+	} else {
+		tmp &= ~AT91_PMC_PRES;
+		tmp |= pmc_mckr & AT91_PMC_PRES;
+	}
+	at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+	/*
+	 * Program the MDIV field in the AT91_PMC_MCKR register
+	 */
+	tmp = at91_pmc_read(AT91_PMC_MCKR);
+	tmp &= ~AT91_PMC_MDIV;
+	tmp |= pmc_mckr & AT91_PMC_MDIV;
+	at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+	/*
+	 * Program the PLLADIV2 field in the AT91_PMC_MCKR register
+	 */
+	tmp = at91_pmc_read(AT91_PMC_MCKR);
+	tmp &= ~AT91_PMC_PLLADIV2;
+	tmp |= pmc_mckr & AT91_PMC_PLLADIV2;
+	at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+	/*
+	 * Program the H32MXDIV field in the AT91_PMC_MCKR register
+	 */
+	tmp = at91_pmc_read(AT91_PMC_MCKR);
+	tmp &= ~AT91_PMC_H32MXDIV;
+	tmp |= pmc_mckr & AT91_PMC_H32MXDIV;
+	at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+	/*
+	 * Program the CSS field in the AT91_PMC_MCKR register,
+	 * wait for MCKRDY bit to be set in the PMC_SR register
+	 */
+	tmp = at91_pmc_read(AT91_PMC_MCKR);
+	tmp &= ~AT91_PMC_ALT_PCKR_CSS;
+	tmp |= pmc_mckr & AT91_PMC_ALT_PCKR_CSS;
+	at91_pmc_write(AT91_PMC_MCKR, tmp);
+
+	while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_MCKRDY))
+		;
+}
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 06/11] ARM: at91: import early_udelay from at91bootstrap
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (4 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 05/11] ARM: at91: import lowlevel clock initialization from at91bootstrap Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code " Ahmad Fatoum
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

For use by the incoming at91bootstrap DDRAMC initialization code,
this commit provides an early_udelay function usable in PBL imported from
https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/driver/at91_pit.c

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/Kconfig                    |  4 ++
 arch/arm/mach-at91/Makefile                   |  1 +
 arch/arm/mach-at91/early_udelay.c             | 61 +++++++++++++++++++
 .../arm/mach-at91/include/mach/early_udelay.h | 13 ++++
 4 files changed, 79 insertions(+)
 create mode 100644 arch/arm/mach-at91/early_udelay.c
 create mode 100644 arch/arm/mach-at91/include/mach/early_udelay.h

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 63e6e7285931..98d18c8b26db 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -15,6 +15,9 @@ config HAVE_AT91_UTMI
 config HAVE_AT91_USB_CLK
 	bool
 
+config HAVE_AT91_H32MXDIV
+	bool
+
 config COMMON_CLK_AT91
 	bool
 	select COMMON_CLK
@@ -196,6 +199,7 @@ config ARCH_SAMA5D4
 	select HAVE_AT91_DBGU2
 	select HAS_MACB
 	select HAVE_MACH_ARM_HEAD
+	select HAVE_AT91_H32MXDIV
 
 endchoice
 
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 7c4c58b080a1..b8ff6428d05a 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,5 +1,6 @@
 obj-y += setup.o
 pbl-y += lowlevel_clock.o
+pbl-$(CONFIG_CLOCKSOURCE_ATMEL_PIT) += early_udelay.o
 
 ifeq ($(CONFIG_COMMON_CLK_OF_PROVIDER),)
 obj-y += clock.o
diff --git a/arch/arm/mach-at91/early_udelay.c b/arch/arm/mach-at91/early_udelay.c
new file mode 100644
index 000000000000..b25b5d558833
--- /dev/null
+++ b/arch/arm/mach-at91/early_udelay.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2012, Atmel Corporation
+ */
+
+#include <mach/hardware.h>
+#include <asm/io.h>
+#include <mach/at91_lowlevel_clock.h>
+#include <mach/at91_pit.h>
+#include <mach/early_udelay.h>
+
+static unsigned int master_clock;
+static void __iomem *pmc, *pit;
+
+static bool pmc_check_mck_h32mxdiv(void)
+{
+	if (IS_ENABLED(CONFIG_HAVE_AT91_H32MXDIV))
+		return __raw_readl(pmc + AT91_PMC_MCKR) & AT91_PMC_H32MXDIV;
+
+	return false;
+}
+
+/* Because the below statement is used in the function:
+ *	((MASTER_CLOCK >> 10) * usec) is used,
+ * to our 32-bit system. the argu "usec" maximum value is:
+ * supposed "MASTER_CLOCK" is 132M.
+ *	132000000 / 1024 = 128906
+ *	(0xffffffff) / 128906 = 33318.
+ * So the maximum delay time is 33318 us.
+ */
+/* requires PIT to be initialized, but not the clocksource framework */
+void early_udelay(unsigned int usec)
+{
+	unsigned int delay;
+	unsigned int current;
+	unsigned int base = __raw_readl(pit + AT91_PIT_PIIR);
+
+	if (pmc_check_mck_h32mxdiv())
+		master_clock /= 2;
+
+	delay = ((master_clock >> 10) * usec) >> 14;
+
+	do {
+		current = __raw_readl(pit + AT91_PIT_PIIR);
+		current -= base;
+	} while (current < delay);
+}
+
+void early_udelay_init(void __iomem *pmc_base,
+		       void __iomem *pit_base,
+		       unsigned clock,
+		       unsigned int master_clock_rate)
+{
+	master_clock = master_clock_rate;
+	pmc = pmc_base;
+	pit = pit_base;
+
+	__raw_writel(AT91_PIT_PIV | AT91_PIT_PITEN, pit + AT91_PIT_MR);
+
+	at91_pmc_enable_periph_clock(pmc_base, clock);
+}
diff --git a/arch/arm/mach-at91/include/mach/early_udelay.h b/arch/arm/mach-at91/include/mach/early_udelay.h
new file mode 100644
index 000000000000..120b586310f0
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/early_udelay.h
@@ -0,0 +1,13 @@
+#ifndef __EARLY_UDELAY_H__
+#define __EARLY_UDELAY_H__
+
+#include <linux/compiler.h>
+
+/* requires PIT to be initialized, but not the clocksource framework */
+void early_udelay(unsigned int usec);
+void early_udelay_init(void __iomem *pmc_base,
+		       void __iomem *pit_base,
+		       unsigned clock,
+		       unsigned int master_clock_rate);
+
+#endif
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code from at91bootstrap
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (5 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 06/11] ARM: at91: import early_udelay " Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-17  8:11   ` Sascha Hauer
  2019-01-16 17:45 ` [PATCH 08/11] ARM: at91: import lowlevel dbgu UART init " Ahmad Fatoum
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

This commit imports DDRAMC initialization routines for use in PBL from
https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/driver/ddramc.c

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/Makefile              |   1 +
 arch/arm/mach-at91/ddramc.c              | 518 +++++++++++++++++++++++
 arch/arm/mach-at91/include/mach/ddramc.h |  35 ++
 3 files changed, 554 insertions(+)
 create mode 100644 arch/arm/mach-at91/ddramc.c
 create mode 100644 arch/arm/mach-at91/include/mach/ddramc.h

diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index b8ff6428d05a..ac88f83f9fe5 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,6 +1,7 @@
 obj-y += setup.o
 pbl-y += lowlevel_clock.o
 pbl-$(CONFIG_CLOCKSOURCE_ATMEL_PIT) += early_udelay.o
+pbl-y += ddramc.o
 
 ifeq ($(CONFIG_COMMON_CLK_OF_PROVIDER),)
 obj-y += clock.o
diff --git a/arch/arm/mach-at91/ddramc.c b/arch/arm/mach-at91/ddramc.c
new file mode 100644
index 000000000000..837711345bbf
--- /dev/null
+++ b/arch/arm/mach-at91/ddramc.c
@@ -0,0 +1,518 @@
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2007, Stelian Pop <stelian.pop@leadtechdesign.com>
+ * Copyright (c) 2007 Lead Tech Design <www.leadtechdesign.com>
+ */
+
+#include <linux/kconfig.h>
+#include <asm/system.h>
+#include <mach/at91_ddrsdrc.h>
+#include <mach/ddramc.h>
+#include <mach/early_udelay.h>
+
+static bool ddramc_decodtype_is_seq(unsigned long ddramc_cr)
+{
+	if (IS_ENABLED(CONFIG_SOC_AT91SAM9X5) || IS_ENABLED(CONFIG_SOC_AT91SAM9N12)
+	    || IS_ENABLED(CONFIG_SOC_SAMA5)) {
+		if (ddramc_cr & AT91C_DDRC2_DECOD_INTERLEAVED)
+			return false;
+	}
+	return true;
+}
+
+
+void ddram_initialize(unsigned long base_address,
+		     unsigned long ram_address,
+		     struct ddramc_register *ddramc_config)
+{
+	unsigned long ba_offset;
+	unsigned long cr = 0;
+
+	/* compute BA[] offset according to CR configuration */
+	ba_offset = (ddramc_config->cr & AT91C_DDRC2_NC) + 9;
+	if (ddramc_decodtype_is_seq(ddramc_config->cr))
+		ba_offset += ((ddramc_config->cr & AT91C_DDRC2_NR) >> 2) + 11;
+
+	ba_offset += (ddramc_config->mdr & AT91C_DDRC2_DBW) ? 1 : 2;
+
+	/*
+	 * Step 1: Program the memory device type into the Memory Device Register
+	 */
+	__raw_writel(ddramc_config->mdr, base_address + HDDRSDRC2_MDR);
+
+	/*
+	 * Step 2: Program the feature of DDR2-SDRAM device into
+	 * the Timing Register, and into the Configuration Register
+	 */
+	__raw_writel(ddramc_config->cr, base_address + HDDRSDRC2_CR);
+
+	__raw_writel(ddramc_config->t0pr, base_address + HDDRSDRC2_T0PR);
+	__raw_writel(ddramc_config->t1pr, base_address + HDDRSDRC2_T1PR);
+	__raw_writel(ddramc_config->t2pr, base_address + HDDRSDRC2_T2PR);
+
+	/*
+	 * Step 3: An NOP command is issued to the DDR2-SDRAM
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NOP_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+	/* Now, clocks which drive the DDR2-SDRAM device are enabled */
+
+	/* A minimum pause wait 200 us is provided to precede any signal toggle.
+	   (6 core cycles per iteration, core is at 396MHz: min 13340 loops) */
+	early_udelay(200);
+
+	/*
+	 * Step 4:  An NOP command is issued to the DDR2-SDRAM
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NOP_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+	/* Now, CKE is driven high */
+	/* wait 400 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 5: An all banks precharge command is issued to the DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_PRCGALL_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 6: An Extended Mode Register set(EMRS2) cycle is issued to chose between commercial or high
+	 * temperature operations.
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1] is set to 1 and BA[0] is set to 0.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_EXT_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x2 << ba_offset));
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 7: An Extended Mode Register set(EMRS3) cycle is issued
+	 * to set the Extended Mode Register to "0".
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1] is set to 1 and BA[0] is set to 1.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_EXT_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x3 << ba_offset));
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 8: An Extened Mode Register set(EMRS1) cycle is issued to enable DLL,
+	 * and to program D.I.C(Output Driver Impedance Control)
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1] is set to 0 and BA[0] is set to 1.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_EXT_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x1 << ba_offset));
+
+	/* An additional 200 cycles of clock are required for locking DLL */
+	early_udelay(1);
+
+	/*
+	 * Step 9: Program DLL field into the Configuration Register to high(Enable DLL reset)
+	 */
+	cr = __raw_readl(base_address + HDDRSDRC2_CR);
+	__raw_writel(cr | AT91C_DDRC2_ENABLE_RESET_DLL, base_address + HDDRSDRC2_CR);
+
+	/*
+	 * Step 10: A Mode Register set(MRS) cycle is issied to reset DLL.
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1:0] bits are set to 0.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x0 << ba_offset));
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 11: An all banks precharge command is issued to the DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_PRCGALL_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/* wait 400 ns min (not needed on certain DDR2 devices) */
+	early_udelay(1);
+
+	/*
+	 * Step 12: Two auto-refresh (CBR) cycles are provided.
+	 * Program the auto refresh command (CBR) into the Mode Register.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_RFSH_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/* wait TRFC cycles min (135 ns min) extended to 400 ns */
+	early_udelay(1);
+
+	/* Set 2nd CBR */
+	__raw_writel(AT91C_DDRC2_MODE_RFSH_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/* wait TRFC cycles min (135 ns min) extended to 400 ns */
+	early_udelay(1);
+
+	/*
+	 * Step 13: Program DLL field into the Configuration Register to low(Disable DLL reset).
+	 */
+	cr = __raw_readl(base_address + HDDRSDRC2_CR);
+	__raw_writel(cr & ~AT91C_DDRC2_ENABLE_RESET_DLL, base_address + HDDRSDRC2_CR);
+
+	/*
+	 * Step 14: A Mode Register set (MRS) cycle is issued to program
+	 * the parameters of the DDR2-SDRAM devices, in particular CAS latency,
+	 * burst length and to disable DDL reset.
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1:0] bits are set to 0.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x0 << ba_offset));
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 15: Program OCD field into the Configuration Register
+	 * to high (OCD calibration default).
+	 */
+	cr = __raw_readl(base_address + HDDRSDRC2_CR);
+	__raw_writel(cr | AT91C_DDRC2_OCD_DEFAULT, base_address + HDDRSDRC2_CR);
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 16: An Extended Mode Register set (EMRS1) cycle is issued to OCD default value.
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1] is set to 0 and BA[0] is set to 1.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_EXT_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x1 << ba_offset));
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 17: Program OCD field into the Configuration Register
+	 * to low (OCD calibration mode exit).
+	 */
+	cr = __raw_readl(base_address + HDDRSDRC2_CR);
+	__raw_writel(cr & ~AT91C_DDRC2_OCD_DEFAULT, base_address + HDDRSDRC2_CR);
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 18: An Extended Mode Register set (EMRS1) cycle is issued to enable OCD exit.
+	 * Perform a write access to DDR2-SDRAM to acknowledge this command.
+	 * The write address must be chosen so that BA[1] is set to 0 and BA[0] is set to 1.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_EXT_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x1 << ba_offset));
+
+	/* wait 2 cycles min (of tCK) = 15 ns min */
+	early_udelay(1);
+
+	/*
+	 * Step 19: A Nornal mode command is provided.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NORMAL_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 20: Perform a write access to any DDR2-SDRAM address
+	 */
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 21: Write the refresh rate into the count field in the Refresh Timer register.
+	 */
+	__raw_writel(ddramc_config->rtr, base_address + HDDRSDRC2_RTR);
+
+	/*
+	 * Now we are ready to work on the DDRSDR
+	 *  wait for end of calibration
+	 */
+	early_udelay(10);
+}
+
+/* This initialization sequence is sama5d3 and sama5d4 LP-DDR2 specific */
+
+void lpddr2_sdram_initialize(unsigned long base_address,
+			    unsigned long ram_address,
+			    struct ddramc_register *ddramc_config)
+{
+	unsigned long reg;
+
+	__raw_writel(ddramc_config->lpddr2_lpr, base_address + MPDDRC_LPDDR2_LPR);
+
+	__raw_writel(ddramc_config->tim_calr, base_address + MPDDRC_LPDDR2_TIM_CAL);
+
+	/*
+	 * Step 1: Program the memory device type.
+	 */
+	__raw_writel(ddramc_config->mdr, base_address + HDDRSDRC2_MDR);
+
+	/*
+	 * Step 2: Program the feature of the low-power DDR2-SDRAM device.
+	 */
+	__raw_writel(ddramc_config->cr, base_address + HDDRSDRC2_CR);
+
+	__raw_writel(ddramc_config->t0pr, base_address + HDDRSDRC2_T0PR);
+	__raw_writel(ddramc_config->t1pr, base_address + HDDRSDRC2_T1PR);
+	__raw_writel(ddramc_config->t2pr, base_address + HDDRSDRC2_T2PR);
+
+	/*
+	 * Step 3: A NOP command is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NOP_CMD, base_address + HDDRSDRC2_MR);
+
+	/*
+	 * Step 3bis: Add memory barrier then Perform a write access to
+	 * any low-power DDR2-SDRAM address to acknowledge the command.
+	 */
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 4: A pause of at least 100 ns must be observed before
+	 * a single toggle.
+	 */
+	early_udelay(1);
+
+	/*
+	 * Step 5: A NOP command is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NOP_CMD, base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 6: A pause of at least 200 us must be observed before a Reset
+	 * Command.
+	 */
+	early_udelay(200);
+
+	/*
+	 * Step 7: A Reset command is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MRS(63) | AT91C_DDRC2_MODE_LPDDR2_CMD,
+		     base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 8: A pause of at least tINIT5 must be observed before issuing
+	 * any commands.
+	 */
+	early_udelay(1);
+
+	/*
+	 * Step 9: A Calibration command is issued to the low-power DDR2-SDRAM.
+	 */
+	reg = __raw_readl(base_address + HDDRSDRC2_CR);
+	reg &= ~AT91C_DDRC2_ZQ;
+	reg |= AT91C_DDRC2_ZQ_RESET;
+	__raw_writel(reg, base_address + HDDRSDRC2_CR);
+
+	__raw_writel(AT91C_DDRC2_MRS(10) | AT91C_DDRC2_MODE_LPDDR2_CMD,
+		     base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 9bis: The ZQ Calibration command is now issued.
+	 * Program the type of calibration in the MPDDRC_CR: set the
+	 * ZQ field to the SHORT value.
+	 */
+	reg = __raw_readl(base_address + HDDRSDRC2_CR);
+	reg &= ~AT91C_DDRC2_ZQ;
+	reg |= AT91C_DDRC2_ZQ_SHORT;
+	__raw_writel(reg, base_address + HDDRSDRC2_CR);
+
+	/*
+	 * Step 10: A Mode Register Write command with 1 to the MRS field
+	 * is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MRS(1) | AT91C_DDRC2_MODE_LPDDR2_CMD,
+		     base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 11: A Mode Register Write command with 2 to the MRS field
+	 * is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MRS(2) | AT91C_DDRC2_MODE_LPDDR2_CMD,
+		     base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 12: A Mode Register Write command with 3 to the MRS field
+	 * is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MRS(3) | AT91C_DDRC2_MODE_LPDDR2_CMD,
+		     base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 13: A Mode Register Write command with 16 to the MRS field
+	 * is issued to the low-power DDR2-SDRAM.
+	 */
+	__raw_writel(AT91C_DDRC2_MRS(16) | AT91C_DDRC2_MODE_LPDDR2_CMD,
+		     base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 14: A Normal Mode command is provided.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NORMAL_CMD, base_address + HDDRSDRC2_MR);
+	dmb();
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 15: close the input buffers: error in documentation: no need.
+	 */
+
+	/*
+	 * Step 16: Write the refresh rate into the COUNT field in the MPDDRC
+	 * Refresh Timer Register.
+	 */
+	__raw_writel(ddramc_config->rtr, base_address + HDDRSDRC2_RTR);
+
+	/*
+	 * Now configure the CAL MR4 register.
+	 */
+	__raw_writel(ddramc_config->cal_mr4r, base_address + MPDDRC_LPDDR2_CAL_MR4);
+}
+
+void lpddr1_sdram_initialize(unsigned long base_address,
+			    unsigned long ram_address,
+			    struct ddramc_register *ddramc_config)
+{
+	unsigned long ba_offset;
+
+	/* Compute BA[] offset according to CR configuration */
+	ba_offset = (ddramc_config->cr & AT91C_DDRC2_NC) + 8;
+	if (!(ddramc_config->cr & AT91C_DDRC2_DECOD_INTERLEAVED))
+		ba_offset += ((ddramc_config->cr & AT91C_DDRC2_NR) >> 2) + 11;
+
+	ba_offset += (ddramc_config->mdr & AT91C_DDRC2_DBW) ? 1 : 2;
+
+	/*
+	 * Step 1: Program the memory device type in the MPDDRC Memory Device Register
+	 */
+	__raw_writel(ddramc_config->mdr, base_address + HDDRSDRC2_MDR);
+
+	/*
+	 * Step 2: Program the features of the low-power DDR1-SDRAM device
+	 * in the MPDDRC Configuration Register and in the MPDDRC Timing
+	 * Parameter 0 Register/MPDDRC Timing Parameter 1 Register.
+	 */
+	__raw_writel(ddramc_config->cr, base_address + HDDRSDRC2_CR);
+
+	__raw_writel(ddramc_config->t0pr, base_address + HDDRSDRC2_T0PR);
+	__raw_writel(ddramc_config->t1pr, base_address + HDDRSDRC2_T1PR);
+	__raw_writel(ddramc_config->t2pr, base_address + HDDRSDRC2_T2PR);
+
+	/*
+	 * Step 3: Program Temperature Compensated Self-refresh (TCR),
+	 * Partial Array Self-refresh (PASR) and Drive Strength (DS) parameters
+	 * in the MPDDRC Low-power Register.
+	 */
+	__raw_writel(ddramc_config->lpr, base_address + HDDRSDRC2_LPR);
+
+	/*
+	 * Step 4: A NOP command is issued to the low-power DDR1-SDRAM.
+	 * Program the NOP command in the MPDDRC Mode Register (MPDDRC_MR).
+	 * The clocks which drive the low-power DDR1-SDRAM device
+	 * are now enabled.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NOP_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 5: A pause of at least 200 us must be observed before
+	 * a signal toggle.
+	 */
+	early_udelay(200);
+
+	/*
+	 * Step 6: A NOP command is issued to the low-power DDR1-SDRAM.
+	 * Program the NOP command in the MPDDRC_MR. calibration request is
+	 * now made to the I/O pad.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NOP_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 7: An All Banks Precharge command is issued
+	 * to the low-power DDR1-SDRAM.
+	 * Program All Banks Precharge command in the MPDDRC_MR.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_PRCGALL_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 8: Two auto-refresh (CBR) cycles are provided.
+	 * Program the Auto Refresh command (CBR) in the MPDDRC_MR.
+	 * The application must write a four to the MODE field
+	 * in the MPDDRC_MR. Perform a write access to any low-power
+	 * DDR1-SDRAM location twice to acknowledge these commands.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_RFSH_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	__raw_writel(AT91C_DDRC2_MODE_RFSH_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 9: An Extended Mode Register Set (EMRS) cycle is issued to
+	 * program the low-power DDR1-SDRAM parameters (TCSR, PASR, DS).
+	 * The application must write a five to the MODE field in the MPDDRC_MR
+	 * and perform a write access to the SDRAM to acknowledge this command.
+	 * The write address must be chosen so that signal BA[1] is set to 1
+	 * and BA[0] is set to 0.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_EXT_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x2 << ba_offset));
+
+	/*
+	 * Step 10: A Mode Register Set (MRS) cycle is issued to program
+	 * parameters of the low-power DDR1-SDRAM devices, in particular
+	 * CAS latency.
+	 * The application must write a three to the MODE field in the MPDDRC_MR
+	 * and perform a write access to the SDRAM to acknowledge this command.
+	 * The write address must be chosen so that signals BA[1:0] are set to 0.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_LMR_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address + (0x0 << ba_offset));
+
+	/*
+	 * Step 11: The application must enter Normal mode, write a zero
+	 * to the MODE field in the MPDDRC_MR and perform a write access
+	 * at any location in the SDRAM to acknowledge this command.
+	 */
+	__raw_writel(AT91C_DDRC2_MODE_NORMAL_CMD, base_address + HDDRSDRC2_MR);
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 12: Perform a write access to any low-power DDR1-SDRAM address.
+	 */
+	__raw_writel(0, ram_address);
+
+	/*
+	 * Step 14: Write the refresh rate into the COUNT field in the MPDDRC
+	 * Refresh Timer Register (MPDDRC_RTR):
+	 */
+	__raw_writel(ddramc_config->rtr, base_address + HDDRSDRC2_RTR);
+}
diff --git a/arch/arm/mach-at91/include/mach/ddramc.h b/arch/arm/mach-at91/include/mach/ddramc.h
new file mode 100644
index 000000000000..e5151b2999d9
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/ddramc.h
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: BSD-1-Clause
+/*
+ * Copyright (c) 2006, Atmel Corporation
+ */
+#ifndef __DDRAMC_H__
+#define __DDRAMC_H__
+
+struct ddramc_register {
+	unsigned long mdr;
+	unsigned long cr;
+	unsigned long rtr;
+	unsigned long t0pr;
+	unsigned long t1pr;
+	unsigned long t2pr;
+	unsigned long lpr;
+	unsigned long lpddr2_lpr;
+	unsigned long tim_calr;
+	unsigned long cal_mr4r;
+};
+
+void ddram_initialize(unsigned long base_address,
+		      unsigned long ram_address,
+		      struct ddramc_register *ddramc_config);
+
+void lpddr2_sdram_initialize(unsigned long base_address,
+			     unsigned long ram_address,
+			     struct ddramc_register *ddramc_config);
+
+
+void lpddr1_sdram_initialize(unsigned long base_address,
+			     unsigned long ram_address,
+			     struct ddramc_register *ddramc_config);
+
+
+#endif /* #ifndef __DDRAMC_H__ */
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 08/11] ARM: at91: import lowlevel dbgu UART init code from at91bootstrap
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (6 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code " Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage Ahmad Fatoum
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

From: Ahmad Fatoum <ahmad@a3f.at>

For use in PBL, import dbgu init code from:
https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/driver/at91_usart.c

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 arch/arm/mach-at91/include/mach/at91_dbgu.h | 57 ++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-at91/include/mach/at91_dbgu.h b/arch/arm/mach-at91/include/mach/at91_dbgu.h
index 3b5948566e52..a6f44f744f2a 100644
--- a/arch/arm/mach-at91/include/mach/at91_dbgu.h
+++ b/arch/arm/mach-at91/include/mach/at91_dbgu.h
@@ -5,7 +5,7 @@
  * Copyright (C) SAN People
  *
  * Debug Unit (DBGU) - System peripherals registers.
- * Based on AT91RM9200 datasheet revision E.
+ * Based on AT91RM9200 datasheet revision E and SAMA5D3 datasheet revision B.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -16,9 +16,37 @@
 #ifndef AT91_DBGU_H
 #define AT91_DBGU_H
 
+#include <asm/io.h>
+
 #if !defined(CONFIG_ARCH_AT91X40)
 #define AT91_DBGU_CR		(0x00)	/* Control Register */
+#define 	AT91_DBGU_RSTRX		(1 << 2)		/* Reset Receiver */
+#define 	AT91_DBGU_RSTTX		(1 << 3)		/* Reset Transmitter */
+#define 	AT91_DBGU_RXEN		(1 << 4)		/* Receiver Enable */
+#define 	AT91_DBGU_RXDIS		(1 << 5)		/* Receiver Disable */
+#define 	AT91_DBGU_TXEN		(1 << 6)		/* Transmitter Enable */
+#define 	AT91_DBGU_TXDIS		(1 << 7)		/* Transmitter Disable */
+#define 	AT91_DBGU_RSTSTA	(1 << 8)		/* Reset Status Bits */
 #define AT91_DBGU_MR		(0x04)	/* Mode Register */
+#define		AT91_DBGU_NBSTOP_1BIT		(0 << 12) /* 1 stop bit */
+#define		AT91_DBGU_NBSTOP_1_5BIT	(1 << 12) /* 1.5 stop bits */
+#define		AT91_DBGU_NBSTOP_2BIT		(2 << 12) /* 2 stop bits */
+
+#define		AT91_DBGU_CHRL_5BIT	(0 << 6) /* 5 bit character length */
+#define		AT91_DBGU_CHRL_6BIT	(1 << 6) /* 6 bit character length */
+#define		AT91_DBGU_CHRL_7BIT	(2 << 6) /* 7 bit character length */
+#define		AT91_DBGU_CHRL_8BIT	(3 << 6) /* 8 bit character length */
+
+#define 	AT91_DBGU_PAR_EVEN	(0 << 9)		/* Even Parity */
+#define 	AT91_DBGU_PAR_ODD	(1 << 9)		/* Odd Parity */
+#define 	AT91_DBGU_PAR_SPACE	(2 << 9)		/* Space: Force Parity to 0 */
+#define 	AT91_DBGU_PAR_MARK	(3 << 9)		/* Mark: Force Parity to 1 */
+#define 	AT91_DBGU_PAR_NONE	(4 << 9)		/* No Parity */
+
+#define 	AT91_DBGU_CHMODE_NORMAL	(0 << 14) /* Normal mode */
+#define 	AT91_DBGU_CHMODE_AUTO		(1 << 14) /* Automatic Echo */
+#define 	AT91_DBGU_CHMODE_LOCAL		(2 << 14) /* Local Loopback */
+#define 	AT91_DBGU_CHMODE_REMOTE	(3 << 14) /* Remote Loopback */
 #define AT91_DBGU_IER		(0x08)	/* Interrupt Enable Register */
 #define		AT91_DBGU_TXRDY		(1 << 1)		/* Transmitter Ready */
 #define		AT91_DBGU_TXEMPTY	(1 << 9)		/* Transmitter Empty */
@@ -63,4 +91,31 @@
 #define		AT91_CIDR_NVPTYP	(7    << 28)		/* Nonvolatile Program Memory Type */
 #define		AT91_CIDR_EXT		(1    << 31)		/* Extension Flag */
 
+#ifndef __ASSEMBLY__
+#ifdef CONFIG_DEBUG_LL
+static inline void at91_dbgu_setup_ll(unsigned long dbgu_base, unsigned baudrate)
+{
+	__raw_writel(~0, dbgu_base + AT91_DBGU_IDR);
+
+	__raw_writel(AT91_DBGU_RSTRX
+		     | AT91_DBGU_RSTTX
+		     | AT91_DBGU_RXDIS
+		     | AT91_DBGU_TXDIS,
+		     dbgu_base + AT91_DBGU_CR);
+
+	__raw_writel(baudrate, dbgu_base + AT91_DBGU_BRGR);
+
+	__raw_writel(AT91_DBGU_PAR_NONE
+		     | AT91_DBGU_CHMODE_NORMAL
+		     | AT91_DBGU_CHRL_8BIT
+		     | AT91_DBGU_NBSTOP_1BIT,
+		     dbgu_base + AT91_DBGU_MR);
+
+	__raw_writel(AT91_DBGU_RXEN | AT91_DBGU_TXEN, dbgu_base + AT91_DBGU_CR);
+}
+#else
+static inline void at91_dbgu_setup_ll(unsigned long dbgu_base, unsigned baudrate) {}
+#endif
+#endif
+
 #endif
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (7 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 08/11] ARM: at91: import lowlevel dbgu UART init " Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-17  8:25   ` Sascha Hauer
  2019-01-16 17:45 ` [PATCH 10/11] ARM: at91: microchip-ksz9477-evb: import low level init from at91bootstrap Ahmad Fatoum
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

From: Ahmad Fatoum <ahmad@a3f.at>

We are limited to 64K in the first stage, but we still need MMC and FAT
support, so to make place, make the device tree support optional by
providing the sama5d3's board code for NAND/MMC as an alternative.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 .../arm/boards/microchip-ksz9477-evb/Makefile |   3 +
 arch/arm/boards/microchip-ksz9477-evb/init.c  | 143 ++++++++++++++++++
 .../configs/microchip_ksz9477_evb_defconfig   |   1 +
 arch/arm/dts/Makefile                         |   2 +-
 arch/arm/mach-at91/Kconfig                    |  11 +-
 5 files changed, 157 insertions(+), 3 deletions(-)
 create mode 100644 arch/arm/boards/microchip-ksz9477-evb/init.c

diff --git a/arch/arm/boards/microchip-ksz9477-evb/Makefile b/arch/arm/boards/microchip-ksz9477-evb/Makefile
index b08c4a93ca27..0ca5b98a9b33 100644
--- a/arch/arm/boards/microchip-ksz9477-evb/Makefile
+++ b/arch/arm/boards/microchip-ksz9477-evb/Makefile
@@ -1 +1,4 @@
 lwl-y += lowlevel.o
+ifeq ($(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT),)
+obj-y += init.o
+endif
diff --git a/arch/arm/boards/microchip-ksz9477-evb/init.c b/arch/arm/boards/microchip-ksz9477-evb/init.c
new file mode 100644
index 000000000000..39febad84c5d
--- /dev/null
+++ b/arch/arm/boards/microchip-ksz9477-evb/init.c
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2014 Bo Shen <voice.shen@gmail.com>
+ */
+
+#include <init.h>
+#include <mach/board.h>
+#include <mach/iomux.h>
+
+#if defined(CONFIG_NAND_ATMEL)
+static struct atmel_nand_data nand_pdata = {
+	.ale		= 21,
+	.cle		= 22,
+	.det_pin	= -EINVAL,
+	.rdy_pin	= -EINVAL,
+	.enable_pin	= -EINVAL,
+	.ecc_mode	= NAND_ECC_HW,
+	.has_pmecc	= 1,
+	.pmecc_sector_size = 512,
+	.pmecc_corr_cap = 4,
+#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
+	.bus_width_16	= 1,
+#endif
+	.on_flash_bbt	= 1,
+};
+
+static struct sam9_smc_config sama5d3_xplained_nand_smc_config = {
+	.ncs_read_setup		= 1,
+	.nrd_setup		= 2,
+	.ncs_write_setup	= 1,
+	.nwe_setup		= 2,
+
+	.ncs_read_pulse		= 5,
+	.nrd_pulse		= 3,
+	.ncs_write_pulse	= 5,
+	.nwe_pulse		= 3,
+
+	.read_cycle		= 8,
+	.write_cycle		= 8,
+
+	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
+	.tdf_cycles		= 3,
+
+	.tclr			= 3,
+	.tadl			= 10,
+	.tar			= 3,
+	.ocms			= 0,
+	.trr			= 4,
+	.twb			= 5,
+	.rbnsel			= 3,
+	.nfsel			= 1
+};
+
+static void ek_add_device_nand(void)
+{
+	struct clk *clk = clk_get(NULL, "smc_clk");
+
+	clk_enable(clk);
+
+	/* setup bus-width (8 or 16) */
+	if (nand_pdata.bus_width_16)
+		sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_16;
+	else
+		sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_8;
+
+	/* configure chip-select 3 (NAND) */
+	sama5_smc_configure(0, 3, &sama5d3_xplained_nand_smc_config);
+
+	at91_add_device_nand(&nand_pdata);
+}
+#else
+static void ek_add_device_nand(void) {}
+#endif
+
+#if defined(CONFIG_MCI_ATMEL)
+/*
+ * MCI (SD/MMC)
+ */
+static struct atmel_mci_platform_data mci0_data = {
+	.bus_width	= 8,
+	.detect_pin	= AT91_PIN_PE0,
+	.wp_pin		= -EINVAL,
+};
+
+static void ek_add_device_mci(void)
+{
+	/* MMC0 */
+	at91_add_device_mci(0, &mci0_data);
+}
+#else
+static void ek_add_device_mci(void) {}
+#endif
+
+static int sama5d3_xplained_mem_init(void)
+{
+	at91_add_device_sdram(0);
+
+	return 0;
+}
+mem_initcall(sama5d3_xplained_mem_init);
+
+static const struct devfs_partition sama5d3_xplained_nand0_partitions[] = {
+	{
+		.offset = 0x00000,
+		.size = SZ_256K,
+		.flags = DEVFS_PARTITION_FIXED,
+		.name = "at91bootstrap_raw",
+		.bbname = "at91bootstrap",
+	}, {
+		.offset = DEVFS_PARTITION_APPEND, /* 256 KiB */
+		.size = SZ_256K + SZ_128K,
+		.flags = DEVFS_PARTITION_FIXED,
+		.name = "self_raw",
+		.bbname = "self0",
+	},
+	/* hole of 128 KiB */
+	{
+		.offset = SZ_512K + SZ_256K,
+		.size = SZ_256K,
+		.flags = DEVFS_PARTITION_FIXED,
+		.name = "env_raw",
+		.bbname = "env0",
+	}, {
+		.offset = DEVFS_PARTITION_APPEND, /* 1 MiB */
+		.size = SZ_256K,
+		.flags = DEVFS_PARTITION_FIXED,
+		.name = "env_raw1",
+		.bbname = "env1",
+	}, {
+		/* sentinel */
+	}
+};
+
+static int sama5d3_xplained_devices_init(void)
+{
+	ek_add_device_nand();
+	ek_add_device_mci();
+
+	devfs_create_partitions("nand0", sama5d3_xplained_nand0_partitions);
+
+	return 0;
+}
+device_initcall(sama5d3_xplained_devices_init);
diff --git a/arch/arm/configs/microchip_ksz9477_evb_defconfig b/arch/arm/configs/microchip_ksz9477_evb_defconfig
index e7d05bd13b46..33cf2198a696 100644
--- a/arch/arm/configs/microchip_ksz9477_evb_defconfig
+++ b/arch/arm/configs/microchip_ksz9477_evb_defconfig
@@ -59,6 +59,7 @@ CONFIG_CMD_OFTREE=y
 CONFIG_CMD_TIME=y
 CONFIG_NET=y
 CONFIG_NET_NFS=y
+CONFIG_OFDEVICE=y
 CONFIG_OF_BAREBOX_DRIVERS=y
 CONFIG_OF_BAREBOX_ENV_IN_FS=y
 CONFIG_DRIVER_NET_MACB=y
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index c08b35a10132..ef2a1961e165 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -118,7 +118,7 @@ pbl-dtb-$(CONFIG_MACH_ZII_VF610_DEV) += \
 	vf610-zii-ssmb-spu3.dtb.o	\
 	vf610-zii-scu4-aib-rev-c.dtb.o
 pbl-dtb-$(CONFIG_MACH_AT91SAM9263EK_DT) += at91sam9263ek.dtb.o
-pbl-dtb-$(CONFIG_MACH_MICROCHIP_KSZ9477_EVB) += at91-microchip-ksz9477-evb.dtb.o
+pbl-dtb-$(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT) += at91-microchip-ksz9477-evb.dtb.o
 pbl-dtb-$(CONFIG_MACH_AT91SAM9X5EK) += at91sam9x5ek.dtb.o
 
 pbl-dtb-$(CONFIG_MACH_ZII_IMX7D_RPU2) += imx7d-zii-rpu2.dtb.o
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 98d18c8b26db..068fb139f2a7 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -30,6 +30,13 @@ config MACH_AT91SAM9263EK_DT
 	  Enabled for at91sam9263ek - evaluation kit.
 	  But only if we need the device tree (bootstrap do not use DT)
 
+config MACH_MICROCHIP_KSZ9477_EVB_DT
+	def_bool y
+	depends on MACH_MICROCHIP_KSZ9477_EVB && OFDEVICE
+	help
+	  Enabled for Microchip KSZ9477 - evaluation kit.
+	  But only if we need the device tree (bootstrap do not use DT)
+
 config HAVE_AT91_SMD
 	bool
 
@@ -540,8 +547,8 @@ config MACH_AT91SAM9X5EK
 config MACH_MICROCHIP_KSZ9477_EVB
 	bool "Microchip EVB-KSZ9477 Evaluation Kit"
 	depends on ARCH_SAMA5D3
-	select OFDEVICE
-	select COMMON_CLK_OF_PROVIDER
+	select HAVE_AT91_BOOTSTRAP
+	select COMMON_CLK_OF_PROVIDER if MACH_MICROCHIP_KSZ9477_EVB_DT
 	help
 	  Select this if you are using Microchip's EVB-KSZ9477 Evaluation Kit.
 
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 10/11] ARM: at91: microchip-ksz9477-evb: import low level init from at91bootstrap
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (8 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 17:45 ` [PATCH 11/11] ARM: at91: microchip-ksz9477-evb: add first stage MMC defconfig Ahmad Fatoum
  2019-01-16 18:47 ` [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Sam Ravnborg
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

This imports
https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/board/sama5d3_xplained/sama5d3_xplained.c

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 .../boards/microchip-ksz9477-evb/lowlevel.c   | 196 +++++++++++++++++-
 arch/arm/mach-at91/include/mach/at91_pmc.h    |  19 ++
 arch/arm/mach-at91/include/mach/sama5d3.h     |   1 +
 3 files changed, 211 insertions(+), 5 deletions(-)

diff --git a/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c b/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c
index 639958a459ad..110a93e8cd13 100644
--- a/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c
+++ b/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c
@@ -10,19 +10,205 @@
 #include <asm/barebox-arm-head.h>
 #include <asm/barebox-arm.h>
 
-#include <mach/hardware.h>
+#include <debug_ll.h>
+#include <linux/kconfig.h>
+#include <mach/at91_dbgu.h>
+#include <mach/at91_ddrsdrc.h>
+#include <mach/at91_lowlevel_clock.h>
+#include <mach/at91_pio.h>
+#include <mach/at91_pmc.h>
+#include <mach/at91_wdt.h>
+#include <mach/ddramc.h>
+#include <mach/early_udelay.h>
+#include <mach/gpio.h>
+#include <mach/iomux.h>
 
-extern char __dtb_at91_microchip_ksz9477_evb_start[];
+/* PCK = 528MHz, MCK = 132MHz */
+#define MASTER_CLOCK	132000000
 
-ENTRY_FUNCTION(start_sama5d3_xplained_ung8071, r0, r1, r2)
+#define sama5d3_pmc_enable_periph_clock(clk) \
+	at91_pmc_enable_periph_clock(IOMEM(SAMA5D3_BASE_PMC), clk)
+
+#define at91_pmc_write(off, val) writel(val, IOMEM(SAMA5D3_BASE_PMC) + off)
+#define at91_pmc_read(off) readl(IOMEM(SAMA5D3_BASE_PMC) + off)
+
+#define BAUDRATE(mck, baud) \
+	(((((mck) * 10) / ((baud) * 16)) % 10) >= 5) ? \
+	(mck / (baud * 16) + 1) : ((mck) / (baud * 16))
+
+
+static void configure_pin(unsigned pin)
+{
+	void __iomem *pio = IOMEM(SAMA5D3_BASE_PIOB);
+	unsigned mask = pin_to_mask(pin);
+
+	at91_mux_disable_interrupt(pio, mask);
+	at91_mux_set_pullup(pio, mask, 0);
+	at91_mux_pio3_set_pulldown(pio, mask, 0);
+
+	at91_mux_pio3_set_A_periph(pio, mask);
+
+	at91_mux_gpio_disable(pio, mask);
+}
+
+static void dbgu_init(void)
+{
+	sama5d3_pmc_enable_periph_clock(SAMA5D3_ID_PIOB);
+
+	configure_pin(AT91_PIN_PB30);
+	configure_pin(AT91_PIN_PB31);
+
+	sama5d3_pmc_enable_periph_clock(SAMA5D3_ID_DBGU);
+	at91_dbgu_setup_ll(AT91_BASE_DBGU1, BAUDRATE(MASTER_CLOCK, 115200));
+
+	putc_ll('>');
+}
+
+static void ddramc_reg_config(struct ddramc_register *ddramc_config)
+{
+	ddramc_config->mdr = (AT91C_DDRC2_DBW_32_BITS
+				| AT91C_DDRC2_MD_DDR2_SDRAM);
+
+	ddramc_config->cr = (AT91C_DDRC2_NC_DDR10_SDR9
+				| AT91C_DDRC2_NR_13
+				| AT91C_DDRC2_CAS_3
+				| AT91C_DDRC2_DISABLE_RESET_DLL
+				| AT91C_DDRC2_ENABLE_DLL
+				| AT91C_DDRC2_ENRDM_ENABLE
+				| AT91C_DDRC2_NB_BANKS_8
+				| AT91C_DDRC2_NDQS_DISABLED
+				| AT91C_DDRC2_DECOD_INTERLEAVED
+				| AT91C_DDRC2_UNAL_SUPPORTED);
+
+	/*
+	 * The DDR2-SDRAM device requires a refresh every 15.625 us or 7.81 us.
+	 * With a 133 MHz frequency, the refresh timer count register must to be
+	 * set with (15.625 x 133 MHz) ~ 2084 i.e. 0x824
+	 * or (7.81 x 133 MHz) ~ 1039 i.e. 0x40F.
+	 */
+	ddramc_config->rtr = 0x40F;     /* Refresh timer: 7.812us */
+
+	/* One clock cycle @ 133 MHz = 7.5 ns */
+	ddramc_config->t0pr = (AT91C_DDRC2_TRAS_(6)	/* 6 * 7.5 = 45 ns */
+			| AT91C_DDRC2_TRCD_(2)		/* 2 * 7.5 = 22.5 ns */
+			| AT91C_DDRC2_TWR_(2)		/* 2 * 7.5 = 15   ns */
+			| AT91C_DDRC2_TRC_(8)		/* 8 * 7.5 = 75   ns */
+			| AT91C_DDRC2_TRP_(2)		/* 2 * 7.5 = 15   ns */
+			| AT91C_DDRC2_TRRD_(2)		/* 2 * 7.5 = 15   ns */
+			| AT91C_DDRC2_TWTR_(2)		/* 2 clock cycles min */
+			| AT91C_DDRC2_TMRD_(2));	/* 2 clock cycles */
+
+	ddramc_config->t1pr = (AT91C_DDRC2_TXP_(2)	/* 2 clock cycles */
+			| AT91C_DDRC2_TXSRD_(200)	/* 200 clock cycles */
+			| AT91C_DDRC2_TXSNR_(19)	/* 19 * 7.5 = 142.5 ns */
+			| AT91C_DDRC2_TRFC_(17));	/* 17 * 7.5 = 127.5 ns */
+
+	ddramc_config->t2pr = (AT91C_DDRC2_TFAW_(6)	/* 6 * 7.5 = 45 ns */
+			| AT91C_DDRC2_TRTP_(2)		/* 2 clock cycles min */
+			| AT91C_DDRC2_TRPA_(2)		/* 2 * 7.5 = 15 ns */
+			| AT91C_DDRC2_TXARDS_(8)	/* = TXARD */
+			| AT91C_DDRC2_TXARD_(8));	/* MR12 = 1 */
+}
+
+static void sama5d3_ddramc_init(void)
 {
+	struct ddramc_register ddramc_reg;
+	unsigned int reg;
+
+	ddramc_reg_config(&ddramc_reg);
+
+	/* enable ddr2 clock */
+	sama5d3_pmc_enable_periph_clock(SAMA5D3_ID_MPDDRC);
+	at91_pmc_write(AT91_PMC_SCER, AT91CAP9_PMC_DDR);
+
+
+	/* Init the special register for sama5d3x */
+	/* MPDDRC DLL Slave Offset Register: DDR2 configuration */
+	reg = AT91C_MPDDRC_S0OFF_1
+		| AT91C_MPDDRC_S2OFF_1
+		| AT91C_MPDDRC_S3OFF_1;
+	writel(reg, (SAMA5D3_BASE_MPDDRC + MPDDRC_DLL_SOR));
+
+	/* MPDDRC DLL Master Offset Register */
+	/* write master + clk90 offset */
+	reg = AT91C_MPDDRC_MOFF_7
+		| AT91C_MPDDRC_CLK90OFF_31
+		| AT91C_MPDDRC_SELOFF_ENABLED | AT91C_MPDDRC_KEY;
+	writel(reg, (SAMA5D3_BASE_MPDDRC + MPDDRC_DLL_MOR));
+
+	/* MPDDRC I/O Calibration Register */
+	/* DDR2 RZQ = 50 Ohm */
+	/* TZQIO = 4 */
+	reg = AT91C_MPDDRC_RDIV_DDR2_RZQ_50
+		| AT91C_MPDDRC_TZQIO_4;
+	writel(reg, (SAMA5D3_BASE_MPDDRC + MPDDRC_IO_CALIBR));
+
+	/* DDRAM2 Controller initialize */
+	ddram_initialize(SAMA5D3_BASE_MPDDRC, SAMA5_DDRCS, &ddramc_reg);
+}
+
+extern char __dtb_at91_microchip_ksz9477_evb_start[];
+
+static void noinline board_init(void) {
 	void *fdt;
 
+	if (get_pc() < SAMA5_DDRCS) {
+		at91_wdt_disable(IOMEM(SAMA5D3_BASE_WDT));
+		at91_lowlevel_clock_init(IOMEM(SAMA5D3_BASE_PMC));
+
+		/* At this stage the main oscillator
+		 * is supposed to be enabled PCK = MCK = MOSC
+		 */
+
+		/* Configure PLLA = MOSC * (PLL_MULA + 1) / PLL_DIVA */
+		at91_pmc_write(AT91_CKGR_PLLAR, AT91_PMC_PLLA_WR_ERRATA);
+		at91_pmc_write(AT91_CKGR_PLLAR, AT91_PMC_PLLA_WR_ERRATA
+			       | AT91_PMC3_MUL_(43) | AT91_PMC_OUT_0
+			       | AT91_PMC_PLLCOUNT
+			       | AT91_PMC_DIV_BYPASS);
+
+		while (!(at91_pmc_read(AT91_PMC_SR) & AT91_PMC_LOCKA))
+			;
+
+		/* Initialize PLLA charge pump */
+		at91_pmc_write(AT91_PMC_PLLICPR, AT91_PMC_IPLLA_3);
+
+		/* Switch PCK/MCK on Main clock output */
+		at91_pmc_cfg_mck(IOMEM(SAMA5D3_BASE_PMC), AT91SAM9_PMC_MDIV_4
+				 | AT91_PMC_CSS_MAIN);
+
+		/* Switch PCK/MCK on PLLA output */
+		at91_pmc_cfg_mck(IOMEM(SAMA5D3_BASE_PMC), AT91SAM9_PMC_MDIV_4
+				 | AT91_PMC_CSS_PLLA);
+
+		early_udelay_init(IOMEM(SAMA5D3_BASE_PMC), IOMEM(SAMA5D3_BASE_PIT),
+				  SAMA5D3_ID_PIT, MASTER_CLOCK);
+	}
+
+	if (IS_ENABLED(CONFIG_DEBUG_LL))
+		dbgu_init();
+
+	if (get_pc() < SAMA5_DDRCS)
+		sama5d3_ddramc_init();
+
+	if (IS_ENABLED(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT))
+		fdt = __dtb_at91_microchip_ksz9477_evb_start + get_runtime_offset();
+	else
+		fdt = NULL;
+
+	barebox_arm_entry(SAMA5_DDRCS, SZ_256M, fdt);
+}
+
+
+ENTRY_FUNCTION(start_sama5d3_xplained_ung8071, r0, r1, r2)
+{
 	arm_cpu_lowlevel_init();
 
 	arm_setup_stack(SAMA5D3_SRAM_BASE + SAMA5D3_SRAM_SIZE - 16);
 
-	fdt = __dtb_at91_microchip_ksz9477_evb_start + get_runtime_offset();
+	relocate_to_current_adr();
+	setup_c();
+	barrier();
 
-	barebox_arm_entry(SAMA5_DDRCS, SZ_256M, fdt);
+	board_init();
 }
diff --git a/arch/arm/mach-at91/include/mach/at91_pmc.h b/arch/arm/mach-at91/include/mach/at91_pmc.h
index 0f13e4f4d391..1e708f78d555 100644
--- a/arch/arm/mach-at91/include/mach/at91_pmc.h
+++ b/arch/arm/mach-at91/include/mach/at91_pmc.h
@@ -63,9 +63,17 @@
 #define	AT91_CKGR_PLLAR		0x28			/* PLL A Register */
 #define	AT91_CKGR_PLLBR		0x2c			/* PLL B Register */
 #define		AT91_PMC_DIV		(0xff  <<  0)		/* Divider */
+#define			AT91_PMC_DIV_BYPASS	(1 << 0)		/* Divider bypass */
 #define		AT91_PMC_PLLCOUNT	(0x3f  <<  8)		/* PLL Counter */
 #define		AT91_PMC_OUT		(3     << 14)		/* PLL Clock Frequency Range */
+#define			AT91_PMC_OUT_0		(0 << 14)
+#define			AT91_PMC_OUT_1		(1 << 14)
+#define			AT91_PMC_OUT_2		(2 << 14)
+#define			AT91_PMC_OUT_3		(3 << 14)
 #define		AT91_PMC_MUL		(0x7ff << 16)		/* PLL Multiplier */
+#define			AT91_PMC_MUL_(n)		(((n) << 16) & AT91_PMC_MUL)
+#define		AT91_PMC3_MUL		(0x7f << 18)		/* PLL Multiplier [SAMA5 only]*/
+#define			AT91_PMC3_MUL_(n)		(((n) << 18) & AT91_PMC3_MUL)
 #define		AT91_PMC_USBDIV		(3     << 28)		/* USB Divisor (PLLB only) */
 #define			AT91_PMC_USBDIV_1		(0 << 28)
 #define			AT91_PMC_USBDIV_2		(1 << 28)
@@ -151,6 +159,17 @@
 #define		AT91_PMC_MOSCRCS	(1 << 17)		/* Main On-Chip RC [some SAM9] */
 #define		AT91_PMC_CFDEV		(1 << 18)		/* Clock Failure Detector Event [some SAM9] */
 #define	AT91_PMC_IMR		0x6c			/* Interrupt Mask Register */
+#define	AT91_PMC_PLLICPR	0x80		/* PLL Charge Pump Current Register */
+#define		AT91C_PMC_ICPPLLA	(0xf <<  0)
+#define			AT91_PMC_ICPPLLA_0		(0 << 0)
+#define			AT91_PMC_ICPPLLA_1		(1 << 0)
+#define		AT91_PMC_REALLOCK	(0x1 <<  7)
+#define		AT91_PMC_IPLLA		(0xf <<  8)
+#define			AT91_PMC_IPLLA_0		(0 <<  8)
+#define			AT91_PMC_IPLLA_1		(1 <<  8)
+#define			AT91_PMC_IPLLA_2		(2 <<  8)
+#define			AT91_PMC_IPLLA_3		(3 <<  8)
+
 
 #define AT91_PMC_PROT		0xe4			/* Write Protect Mode Register [some SAM9] */
 #define		AT91_PMC_WPEN		(0x1  <<  0)		/* Write Protect Enable */
diff --git a/arch/arm/mach-at91/include/mach/sama5d3.h b/arch/arm/mach-at91/include/mach/sama5d3.h
index f0e53610c6c0..da6e825593e6 100644
--- a/arch/arm/mach-at91/include/mach/sama5d3.h
+++ b/arch/arm/mach-at91/include/mach/sama5d3.h
@@ -87,6 +87,7 @@
 #define SAMA5D3_BASE_PIOC	0xfffff600
 #define SAMA5D3_BASE_PIOD	0xfffff800
 #define SAMA5D3_BASE_PIOE	0xfffffa00
+#define SAMA5D3_BASE_PMC	0xfffffc00
 #define SAMA5D3_BASE_MPDDRC	0xffffea00
 #define	SAMA5D3_BASE_HSMC	0xffffc000
 #define SAMA5D3_BASE_RSTC	0xfffffe00
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 11/11] ARM: at91: microchip-ksz9477-evb: add first stage MMC defconfig
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (9 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 10/11] ARM: at91: microchip-ksz9477-evb: import low level init from at91bootstrap Ahmad Fatoum
@ 2019-01-16 17:45 ` Ahmad Fatoum
  2019-01-16 18:47 ` [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Sam Ravnborg
  11 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-16 17:45 UTC (permalink / raw)
  To: barebox

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 ...chip_ksz9477_evb_first_stage_mmc_defconfig | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 arch/arm/configs/microchip_ksz9477_evb_first_stage_mmc_defconfig

diff --git a/arch/arm/configs/microchip_ksz9477_evb_first_stage_mmc_defconfig b/arch/arm/configs/microchip_ksz9477_evb_first_stage_mmc_defconfig
new file mode 100644
index 000000000000..b20d4094159b
--- /dev/null
+++ b/arch/arm/configs/microchip_ksz9477_evb_first_stage_mmc_defconfig
@@ -0,0 +1,22 @@
+CONFIG_ARCH_SAMA5D3=y
+CONFIG_AT91_MULTI_BOARDS=y
+CONFIG_MACH_MICROCHIP_KSZ9477_EVB=y
+CONFIG_AT91_BOOTSTRAP=y
+CONFIG_BAREBOX_MAX_PBLX_SIZE=0x10000
+CONFIG_RELOCATABLE=y
+CONFIG_PROMPT="BOOT.BIN:"
+CONFIG_SHELL_NONE=y
+# CONFIG_TIMESTAMP is not set
+CONFIG_PBL_CONSOLE=y
+CONFIG_DEFAULT_LOGLEVEL=6
+CONFIG_MCI=y
+CONFIG_MCI_STARTUP=y
+# CONFIG_MCI_WRITE is not set
+CONFIG_MCI_ATMEL=y
+CONFIG_MFD_SYSCON=y
+# CONFIG_FS_RAMFS is not set
+# CONFIG_FS_DEVFS is not set
+CONFIG_FS_FAT=y
+CONFIG_FS_FAT_LFN=y
+CONFIG_BOOTSTRAP_DEVFS=y
+CONFIG_BOOTSTRAP_DISK=y
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's
  2019-01-16 17:45 ` [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's Ahmad Fatoum
@ 2019-01-16 18:24   ` Sam Ravnborg
  2019-01-17  9:28     ` Ahmad Fatoum
  0 siblings, 1 reply; 20+ messages in thread
From: Sam Ravnborg @ 2019-01-16 18:24 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

Hi Ahmad.

On Wed, Jan 16, 2019 at 06:45:51PM +0100, Ahmad Fatoum wrote:
> Only at91sam9g45_reset.S and the header itself actually use
> any of the macros defined within.
> 
> Instead of adding missing definitions and adapting the incoming DDRAMC
> initialization code from at91bootstrap, just include the at91_ddrsdrc.h
> header wholesale.

This seems to go in the opposite direction
of what we did in for example this commit:
eaa7fcf934826d519f532227c304c09a62cfe685 ("ARM: at91: Add SoC namespace to matrix defines")

It adds a lot of defines that are not prefixed with SOC names,
so asking for conflicts.

Also the patch was a little hard to follow with several types of
changes in one patch.
(Adding files, replacing header files, deleting files)

	Sam

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot
  2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
                   ` (10 preceding siblings ...)
  2019-01-16 17:45 ` [PATCH 11/11] ARM: at91: microchip-ksz9477-evb: add first stage MMC defconfig Ahmad Fatoum
@ 2019-01-16 18:47 ` Sam Ravnborg
  2019-01-17  9:43   ` Ahmad Fatoum
  11 siblings, 1 reply; 20+ messages in thread
From: Sam Ravnborg @ 2019-01-16 18:47 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

Hi Ahmad.

On Wed, Jan 16, 2019 at 06:45:48PM +0100, Ahmad Fatoum wrote:
> This patch series imports the necessary infrastructure out of the
> at91bootstrap project to support first stage usage on the SAMA5.

Very nice, especillay as I have a shiny new SAMA5D4 Xplained Ultra
on my disk waiting to be toyed with.

I will take a closer look in a few days, but most looked good
at first look.

Could I ask you to update the very simple .rst file included
just a few days ago in Documentation/ so we get a better
board description and have the new defconfig also documented.

	Sam

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code from at91bootstrap
  2019-01-16 17:45 ` [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code " Ahmad Fatoum
@ 2019-01-17  8:11   ` Sascha Hauer
  2019-01-17  9:28     ` Ahmad Fatoum
  0 siblings, 1 reply; 20+ messages in thread
From: Sascha Hauer @ 2019-01-17  8:11 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

On Wed, Jan 16, 2019 at 06:45:55PM +0100, Ahmad Fatoum wrote:
> This commit imports DDRAMC initialization routines for use in PBL from
> https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/driver/ddramc.c
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
> +
> +void ddram_initialize(unsigned long base_address,
> +		     unsigned long ram_address,
> +		     struct ddramc_register *ddramc_config)

All the exported functions should have a proper at91_ or whatever
prefix.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage
  2019-01-16 17:45 ` [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage Ahmad Fatoum
@ 2019-01-17  8:25   ` Sascha Hauer
  2019-01-17  9:37     ` Ahmad Fatoum
  0 siblings, 1 reply; 20+ messages in thread
From: Sascha Hauer @ 2019-01-17  8:25 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox, Ahmad Fatoum

On Wed, Jan 16, 2019 at 06:45:57PM +0100, Ahmad Fatoum wrote:
> From: Ahmad Fatoum <ahmad@a3f.at>
> 
> We are limited to 64K in the first stage, but we still need MMC and FAT
> support, so to make place, make the device tree support optional by
> providing the sama5d3's board code for NAND/MMC as an alternative.
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
>  .../arm/boards/microchip-ksz9477-evb/Makefile |   3 +
>  arch/arm/boards/microchip-ksz9477-evb/init.c  | 143 ++++++++++++++++++
>  .../configs/microchip_ksz9477_evb_defconfig   |   1 +
>  arch/arm/dts/Makefile                         |   2 +-
>  arch/arm/mach-at91/Kconfig                    |  11 +-
>  5 files changed, 157 insertions(+), 3 deletions(-)
>  create mode 100644 arch/arm/boards/microchip-ksz9477-evb/init.c
> 
> diff --git a/arch/arm/boards/microchip-ksz9477-evb/Makefile b/arch/arm/boards/microchip-ksz9477-evb/Makefile
> index b08c4a93ca27..0ca5b98a9b33 100644
> --- a/arch/arm/boards/microchip-ksz9477-evb/Makefile
> +++ b/arch/arm/boards/microchip-ksz9477-evb/Makefile
> @@ -1 +1,4 @@
>  lwl-y += lowlevel.o
> +ifeq ($(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT),)
> +obj-y += init.o
> +endif
> diff --git a/arch/arm/boards/microchip-ksz9477-evb/init.c b/arch/arm/boards/microchip-ksz9477-evb/init.c
> new file mode 100644
> index 000000000000..39febad84c5d
> --- /dev/null
> +++ b/arch/arm/boards/microchip-ksz9477-evb/init.c
> @@ -0,0 +1,143 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2014 Bo Shen <voice.shen@gmail.com>
> + */
> +
> +#include <init.h>
> +#include <mach/board.h>
> +#include <mach/iomux.h>
> +
> +#if defined(CONFIG_NAND_ATMEL)
> +static struct atmel_nand_data nand_pdata = {
> +	.ale		= 21,
> +	.cle		= 22,
> +	.det_pin	= -EINVAL,
> +	.rdy_pin	= -EINVAL,
> +	.enable_pin	= -EINVAL,
> +	.ecc_mode	= NAND_ECC_HW,
> +	.has_pmecc	= 1,
> +	.pmecc_sector_size = 512,
> +	.pmecc_corr_cap = 4,
> +#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
> +	.bus_width_16	= 1,
> +#endif
> +	.on_flash_bbt	= 1,
> +};
> +
> +static struct sam9_smc_config sama5d3_xplained_nand_smc_config = {
> +	.ncs_read_setup		= 1,
> +	.nrd_setup		= 2,
> +	.ncs_write_setup	= 1,
> +	.nwe_setup		= 2,
> +
> +	.ncs_read_pulse		= 5,
> +	.nrd_pulse		= 3,
> +	.ncs_write_pulse	= 5,
> +	.nwe_pulse		= 3,
> +
> +	.read_cycle		= 8,
> +	.write_cycle		= 8,
> +
> +	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
> +	.tdf_cycles		= 3,
> +
> +	.tclr			= 3,
> +	.tadl			= 10,
> +	.tar			= 3,
> +	.ocms			= 0,
> +	.trr			= 4,
> +	.twb			= 5,
> +	.rbnsel			= 3,
> +	.nfsel			= 1
> +};
> +
> +static void ek_add_device_nand(void)
> +{
> +	struct clk *clk = clk_get(NULL, "smc_clk");
> +
> +	clk_enable(clk);
> +
> +	/* setup bus-width (8 or 16) */
> +	if (nand_pdata.bus_width_16)
> +		sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_16;
> +	else
> +		sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_8;
> +
> +	/* configure chip-select 3 (NAND) */
> +	sama5_smc_configure(0, 3, &sama5d3_xplained_nand_smc_config);
> +
> +	at91_add_device_nand(&nand_pdata);
> +}
> +#else
> +static void ek_add_device_nand(void) {}
> +#endif
> +
> +#if defined(CONFIG_MCI_ATMEL)
> +/*
> + * MCI (SD/MMC)
> + */
> +static struct atmel_mci_platform_data mci0_data = {
> +	.bus_width	= 8,
> +	.detect_pin	= AT91_PIN_PE0,
> +	.wp_pin		= -EINVAL,
> +};
> +
> +static void ek_add_device_mci(void)
> +{
> +	/* MMC0 */
> +	at91_add_device_mci(0, &mci0_data);
> +}
> +#else
> +static void ek_add_device_mci(void) {}
> +#endif
> +
> +static int sama5d3_xplained_mem_init(void)
> +{
> +	at91_add_device_sdram(0);
> +
> +	return 0;
> +}
> +mem_initcall(sama5d3_xplained_mem_init);
> +
> +static const struct devfs_partition sama5d3_xplained_nand0_partitions[] = {
> +	{
> +		.offset = 0x00000,
> +		.size = SZ_256K,
> +		.flags = DEVFS_PARTITION_FIXED,
> +		.name = "at91bootstrap_raw",
> +		.bbname = "at91bootstrap",
> +	}, {
> +		.offset = DEVFS_PARTITION_APPEND, /* 256 KiB */
> +		.size = SZ_256K + SZ_128K,

384K can get tight quite fast for bigger barebox images. I would at
least add the 128KiB hole below, but preferrably go to something like
1MiB for barebox.

> +		.flags = DEVFS_PARTITION_FIXED,
> +		.name = "self_raw",
> +		.bbname = "self0",
> +	},
> +	/* hole of 128 KiB */
> +	{
> +		.offset = SZ_512K + SZ_256K,
> +		.size = SZ_256K,
> +		.flags = DEVFS_PARTITION_FIXED,
> +		.name = "env_raw",
> +		.bbname = "env0",
> +	}, {
> +		.offset = DEVFS_PARTITION_APPEND, /* 1 MiB */
> +		.size = SZ_256K,
> +		.flags = DEVFS_PARTITION_FIXED,
> +		.name = "env_raw1",
> +		.bbname = "env1",
> +	}, {

The environment partitions end up unused, right? So I think you should
remove them here.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's
  2019-01-16 18:24   ` Sam Ravnborg
@ 2019-01-17  9:28     ` Ahmad Fatoum
  0 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-17  9:28 UTC (permalink / raw)
  To: Sam Ravnborg; +Cc: barebox

Hello Sam,

On 16/1/19 19:24, Sam Ravnborg wrote:
> Hi Ahmad.
> 
> On Wed, Jan 16, 2019 at 06:45:51PM +0100, Ahmad Fatoum wrote:
>> Only at91sam9g45_reset.S and the header itself actually use
>> any of the macros defined within.
>>
>> Instead of adding missing definitions and adapting the incoming DDRAMC
>> initialization code from at91bootstrap, just include the at91_ddrsdrc.h
>> header wholesale.
> 
> This seems to go in the opposite direction
> of what we did in for example this commit:
> eaa7fcf934826d519f532227c304c09a62cfe685 ("ARM: at91: Add SoC namespace to matrix defines")
> 
> It adds a lot of defines that are not prefixed with SOC names,
> so asking for conflicts.

You refer to the {HDDRSDRC2,MPDDRC}_* ones?
I'll prefix those in v2.

> 
> Also the patch was a little hard to follow with several types of
> changes in one patch.
> (Adding files, replacing header files, deleting files)

Will split it for v2.

> 
> 	Sam
> 

Thanks
Ahmad

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code from at91bootstrap
  2019-01-17  8:11   ` Sascha Hauer
@ 2019-01-17  9:28     ` Ahmad Fatoum
  0 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-17  9:28 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox



On 17/1/19 09:11, Sascha Hauer wrote:
> On Wed, Jan 16, 2019 at 06:45:55PM +0100, Ahmad Fatoum wrote:
>> This commit imports DDRAMC initialization routines for use in PBL from
>> https://github.com/linux4sam/at91bootstrap/blob/v3.8.12/driver/ddramc.c
>>
>> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
>> ---
>> +
>> +void ddram_initialize(unsigned long base_address,
>> +		     unsigned long ram_address,
>> +		     struct ddramc_register *ddramc_config)
> 
> All the exported functions should have a proper at91_ or whatever
> prefix.
> 
> Sascha
> 
> 

Will do in v2.

Thanks
Ahmad

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage
  2019-01-17  8:25   ` Sascha Hauer
@ 2019-01-17  9:37     ` Ahmad Fatoum
  0 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-17  9:37 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox, Ahmad Fatoum

Hello,

On 17/1/19 09:25, Sascha Hauer wrote:
> On Wed, Jan 16, 2019 at 06:45:57PM +0100, Ahmad Fatoum wrote:
>> From: Ahmad Fatoum <ahmad@a3f.at>
>>
>> We are limited to 64K in the first stage, but we still need MMC and FAT
>> support, so to make place, make the device tree support optional by
>> providing the sama5d3's board code for NAND/MMC as an alternative.
>>
>> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
>> ---
>>  .../arm/boards/microchip-ksz9477-evb/Makefile |   3 +
>>  arch/arm/boards/microchip-ksz9477-evb/init.c  | 143 ++++++++++++++++++
>>  .../configs/microchip_ksz9477_evb_defconfig   |   1 +
>>  arch/arm/dts/Makefile                         |   2 +-
>>  arch/arm/mach-at91/Kconfig                    |  11 +-
>>  5 files changed, 157 insertions(+), 3 deletions(-)
>>  create mode 100644 arch/arm/boards/microchip-ksz9477-evb/init.c
>>
>> diff --git a/arch/arm/boards/microchip-ksz9477-evb/Makefile b/arch/arm/boards/microchip-ksz9477-evb/Makefile
>> index b08c4a93ca27..0ca5b98a9b33 100644
>> --- a/arch/arm/boards/microchip-ksz9477-evb/Makefile
>> +++ b/arch/arm/boards/microchip-ksz9477-evb/Makefile
>> @@ -1 +1,4 @@
>>  lwl-y += lowlevel.o
>> +ifeq ($(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT),)
>> +obj-y += init.o
>> +endif
>> diff --git a/arch/arm/boards/microchip-ksz9477-evb/init.c b/arch/arm/boards/microchip-ksz9477-evb/init.c
>> new file mode 100644
>> index 000000000000..39febad84c5d
>> --- /dev/null
>> +++ b/arch/arm/boards/microchip-ksz9477-evb/init.c
>> @@ -0,0 +1,143 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (C) 2014 Bo Shen <voice.shen@gmail.com>
>> + */
>> +
>> +#include <init.h>
>> +#include <mach/board.h>
>> +#include <mach/iomux.h>
>> +
>> +#if defined(CONFIG_NAND_ATMEL)
>> +static struct atmel_nand_data nand_pdata = {
>> +	.ale		= 21,
>> +	.cle		= 22,
>> +	.det_pin	= -EINVAL,
>> +	.rdy_pin	= -EINVAL,
>> +	.enable_pin	= -EINVAL,
>> +	.ecc_mode	= NAND_ECC_HW,
>> +	.has_pmecc	= 1,
>> +	.pmecc_sector_size = 512,
>> +	.pmecc_corr_cap = 4,
>> +#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
>> +	.bus_width_16	= 1,
>> +#endif
>> +	.on_flash_bbt	= 1,
>> +};
>> +
>> +static struct sam9_smc_config sama5d3_xplained_nand_smc_config = {
>> +	.ncs_read_setup		= 1,
>> +	.nrd_setup		= 2,
>> +	.ncs_write_setup	= 1,
>> +	.nwe_setup		= 2,
>> +
>> +	.ncs_read_pulse		= 5,
>> +	.nrd_pulse		= 3,
>> +	.ncs_write_pulse	= 5,
>> +	.nwe_pulse		= 3,
>> +
>> +	.read_cycle		= 8,
>> +	.write_cycle		= 8,
>> +
>> +	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
>> +	.tdf_cycles		= 3,
>> +
>> +	.tclr			= 3,
>> +	.tadl			= 10,
>> +	.tar			= 3,
>> +	.ocms			= 0,
>> +	.trr			= 4,
>> +	.twb			= 5,
>> +	.rbnsel			= 3,
>> +	.nfsel			= 1
>> +};
>> +
>> +static void ek_add_device_nand(void)
>> +{
>> +	struct clk *clk = clk_get(NULL, "smc_clk");
>> +
>> +	clk_enable(clk);
>> +
>> +	/* setup bus-width (8 or 16) */
>> +	if (nand_pdata.bus_width_16)
>> +		sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_16;
>> +	else
>> +		sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_8;
>> +
>> +	/* configure chip-select 3 (NAND) */
>> +	sama5_smc_configure(0, 3, &sama5d3_xplained_nand_smc_config);
>> +
>> +	at91_add_device_nand(&nand_pdata);
>> +}
>> +#else
>> +static void ek_add_device_nand(void) {}
>> +#endif
>> +
>> +#if defined(CONFIG_MCI_ATMEL)
>> +/*
>> + * MCI (SD/MMC)
>> + */
>> +static struct atmel_mci_platform_data mci0_data = {
>> +	.bus_width	= 8,
>> +	.detect_pin	= AT91_PIN_PE0,
>> +	.wp_pin		= -EINVAL,
>> +};
>> +
>> +static void ek_add_device_mci(void)
>> +{
>> +	/* MMC0 */
>> +	at91_add_device_mci(0, &mci0_data);
>> +}
>> +#else
>> +static void ek_add_device_mci(void) {}
>> +#endif
>> +
>> +static int sama5d3_xplained_mem_init(void)
>> +{
>> +	at91_add_device_sdram(0);
>> +
>> +	return 0;
>> +}
>> +mem_initcall(sama5d3_xplained_mem_init);
>> +
>> +static const struct devfs_partition sama5d3_xplained_nand0_partitions[] = {
>> +	{
>> +		.offset = 0x00000,
>> +		.size = SZ_256K,
>> +		.flags = DEVFS_PARTITION_FIXED,
>> +		.name = "at91bootstrap_raw",
>> +		.bbname = "at91bootstrap",
>> +	}, {
>> +		.offset = DEVFS_PARTITION_APPEND, /* 256 KiB */
>> +		.size = SZ_256K + SZ_128K,
> 
> 384K can get tight quite fast for bigger barebox images. I would at
> least add the 128KiB hole below, but preferrably go to something like
> 1MiB for barebox.

I see. The code is a straight copy of the sama5d3_xplained/init.c,
and untested because I tested only SD card boot.
I'll bump this to 1M.

> 
>> +		.flags = DEVFS_PARTITION_FIXED,
>> +		.name = "self_raw",
>> +		.bbname = "self0",
>> +	},
>> +	/* hole of 128 KiB */
>> +	{
>> +		.offset = SZ_512K + SZ_256K,
>> +		.size = SZ_256K,
>> +		.flags = DEVFS_PARTITION_FIXED,
>> +		.name = "env_raw",
>> +		.bbname = "env0",
>> +	}, {
>> +		.offset = DEVFS_PARTITION_APPEND, /* 1 MiB */
>> +		.size = SZ_256K,
>> +		.flags = DEVFS_PARTITION_FIXED,
>> +		.name = "env_raw1",
>> +		.bbname = "env1",
>> +	}, {
> 
> The environment partitions end up unused, right? So I think you should
> remove them here.

And if a user wants an environment, they encode this into the second
stage's device tree instead? Ye, I can do that.

> 
> Sascha
> 

Thanks
Ahmad

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot
  2019-01-16 18:47 ` [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Sam Ravnborg
@ 2019-01-17  9:43   ` Ahmad Fatoum
  0 siblings, 0 replies; 20+ messages in thread
From: Ahmad Fatoum @ 2019-01-17  9:43 UTC (permalink / raw)
  To: barebox

Hello Sam,

On 16/1/19 19:47, Sam Ravnborg wrote:
> Hi Ahmad.
> 
> On Wed, Jan 16, 2019 at 06:45:48PM +0100, Ahmad Fatoum wrote:
>> This patch series imports the necessary infrastructure out of the
>> at91bootstrap project to support first stage usage on the SAMA5.
> 
> Very nice, especillay as I have a shiny new SAMA5D4 Xplained Ultra
> on my disk waiting to be toyed with.

:-)

> 
> I will take a closer look in a few days, but most looked good
> at first look.

Ok, I'll wait till then with the v2.

> 
> Could I ask you to update the very simple .rst file included
> just a few days ago in Documentation/ so we get a better
> board description and have the new defconfig also documented.

Will do.

> 
> 	Sam
> 

Cheers
Ahmad

> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2019-01-17  9:43 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-16 17:45 [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 01/11] ARM: at91: clk: prune never-compiled h32mx code Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 02/11] ARM: at91: sama5d3: remove never referenced empty header file Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 03/11] ARM: at91: replace at91sam9_ddrsdr.h with at91bootstrap's Ahmad Fatoum
2019-01-16 18:24   ` Sam Ravnborg
2019-01-17  9:28     ` Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 04/11] ARM: at91: watchdog: implement at91_wdt_disable Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 05/11] ARM: at91: import lowlevel clock initialization from at91bootstrap Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 06/11] ARM: at91: import early_udelay " Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 07/11] ARM: at91: import low level DDRAMC initialization code " Ahmad Fatoum
2019-01-17  8:11   ` Sascha Hauer
2019-01-17  9:28     ` Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 08/11] ARM: at91: import lowlevel dbgu UART init " Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 09/11] ARM: at91: microchip-ksz9477-evb: reintroduce board code for first stage Ahmad Fatoum
2019-01-17  8:25   ` Sascha Hauer
2019-01-17  9:37     ` Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 10/11] ARM: at91: microchip-ksz9477-evb: import low level init from at91bootstrap Ahmad Fatoum
2019-01-16 17:45 ` [PATCH 11/11] ARM: at91: microchip-ksz9477-evb: add first stage MMC defconfig Ahmad Fatoum
2019-01-16 18:47 ` [PATCH 00/11] ARM: at91: microchip-kz9477-evb: support first stage boot Sam Ravnborg
2019-01-17  9:43   ` Ahmad Fatoum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox