aboutsummaryrefslogtreecommitdiff
path: root/drivers/ram/stm32_sdram.c
diff options
context:
space:
mode:
authorRadoslaw Pietrzyk2018-05-16 17:27:11 +0200
committerTom Rini2018-05-26 18:19:17 -0400
commit246a5e5fc20d4aa922bd980dd3272ebcb6b7a462 (patch)
tree498a9ce725eb6cd49c7c0b5070dc20cd8999d3da /drivers/ram/stm32_sdram.c
parentb460b889e28379014a7f951c08d93a151116b1ad (diff)
ram: stm32_sdram: Adds stm32f429-disco fixes for HardFault at booting
- adds reading FMC swap setting from DTB to SDRAM driver - sets FMC swap for stm32f429-disco board - changes ram start address to 0x90000000 Signed-off-by: Radoslaw Pietrzyk <radoslaw.pietrzyk@gmail.com> Acked-by: Patrice Chotard <patrice.chotard@st.com>
Diffstat (limited to 'drivers/ram/stm32_sdram.c')
-rw-r--r--drivers/ram/stm32_sdram.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/ram/stm32_sdram.c b/drivers/ram/stm32_sdram.c
index dc39f33d16a..f6cac8eb90b 100644
--- a/drivers/ram/stm32_sdram.c
+++ b/drivers/ram/stm32_sdram.c
@@ -11,6 +11,8 @@
#include <asm/io.h>
#define MEM_MODE_MASK GENMASK(2, 0)
+#define SWP_FMC_OFFSET 10
+#define SWP_FMC_MASK GENMASK(SWP_FMC_OFFSET+1, SWP_FMC_OFFSET)
#define NOT_FOUND 0xff
struct stm32_fmc_regs {
@@ -256,27 +258,36 @@ static int stm32_fmc_ofdata_to_platdata(struct udevice *dev)
struct ofnode_phandle_args args;
u32 *syscfg_base;
u32 mem_remap;
+ u32 swp_fmc;
ofnode bank_node;
char *bank_name;
u8 bank = 0;
int ret;
- mem_remap = dev_read_u32_default(dev, "st,mem_remap", NOT_FOUND);
- if (mem_remap != NOT_FOUND) {
- ret = dev_read_phandle_with_args(dev, "st,syscfg", NULL, 0, 0,
+ ret = dev_read_phandle_with_args(dev, "st,syscfg", NULL, 0, 0,
&args);
- if (ret) {
- debug("%s: can't find syscon device (%d)\n", __func__,
- ret);
- return ret;
- }
-
+ if (ret) {
+ dev_dbg(dev, "%s: can't find syscon device (%d)\n", __func__, ret);
+ } else {
syscfg_base = (u32 *)ofnode_get_addr(args.node);
- /* set memory mapping selection */
- clrsetbits_le32(syscfg_base, MEM_MODE_MASK, mem_remap);
- } else {
- debug("%s: cannot find st,mem_remap property\n", __func__);
+ mem_remap = dev_read_u32_default(dev, "st,mem_remap", NOT_FOUND);
+ if (mem_remap != NOT_FOUND) {
+ /* set memory mapping selection */
+ clrsetbits_le32(syscfg_base, MEM_MODE_MASK, mem_remap);
+ } else {
+ dev_dbg(dev, "%s: cannot find st,mem_remap property\n", __func__);
+ }
+
+ swp_fmc = dev_read_u32_default(dev, "st,swp_fmc", NOT_FOUND);
+ if (swp_fmc != NOT_FOUND) {
+ /* set fmc swapping selection */
+ clrsetbits_le32(syscfg_base, SWP_FMC_MASK, swp_fmc << SWP_FMC_OFFSET);
+ } else {
+ dev_dbg(dev, "%s: cannot find st,swp_fmc property\n", __func__);
+ }
+
+ dev_dbg(dev, "syscfg %x = %x\n", (u32)syscfg_base, *syscfg_base);
}
dev_for_each_subnode(bank_node, dev) {