summaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-08-13 15:02:51 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-08-14 08:54:40 +0200
commit1c1f94ecc2cf658b751847306a913acc209af64d (patch)
treebd3697a20bab08db90c3a51841b994c9307ddfed /arch/arm
parent59871972698b5587829d3bbb0639f8ccde2587cb (diff)
downloadbarebox-1c1f94ecc2cf658b751847306a913acc209af64d.tar.gz
barebox-1c1f94ecc2cf658b751847306a913acc209af64d.tar.xz
ARM: i.MX28: Add memory size detection
We can detect the SDRAM automatically, no need to let the boards do it manually. This also fixes device tree based i.MX28 boards like the duckbill. These boards once had a /memory node in the device tree, but now that this was changed to /memory@40000000 barebox didn't find it anymore. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Tested-by: Roland Hieber <r.hieber@pengutronix.de> Signed-off-by: Roland Hieber <r.hieber@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/cfa10036.c24
-rw-r--r--arch/arm/boards/freescale-mx28-evk/mx28-evk.c8
-rw-r--r--arch/arm/boards/karo-tx28/tx28.c8
-rw-r--r--arch/arm/mach-mxs/include/mach/imx28.h30
-rw-r--r--arch/arm/mach-mxs/soc-imx28.c4
5 files changed, 34 insertions, 40 deletions
diff --git a/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c b/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
index 947db7cff6..dcf560432d 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
+++ b/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
@@ -89,30 +89,6 @@ static struct i2c_gpio_platform_data i2c_gpio_pdata = {
.udelay = 5, /* ~100 kHz */
};
-void v5_mmu_cache_flush(void);
-long cfa10036_get_ram_size(void)
-{
- volatile u32 *base = (void *)IMX_MEMORY_BASE;
- volatile u32 *ofs = base + SZ_128M / sizeof(u32);
-
- *base = *ofs = 0xdeadbeef;
- *ofs = 0xbaadcafe;
-
- v5_mmu_cache_flush();
- if (*base == 0xbaadcafe)
- return SZ_128M;
- else
- return SZ_256M;
-}
-
-static int cfa10036_mem_init(void)
-{
- arm_add_mem_device("ram0", IMX_MEMORY_BASE, cfa10036_get_ram_size());
-
- return 0;
-}
-mem_initcall(cfa10036_mem_init);
-
static int cfa10036_devices_init(void)
{
int i;
diff --git a/arch/arm/boards/freescale-mx28-evk/mx28-evk.c b/arch/arm/boards/freescale-mx28-evk/mx28-evk.c
index 9e5d612bda..06a2c21a47 100644
--- a/arch/arm/boards/freescale-mx28-evk/mx28-evk.c
+++ b/arch/arm/boards/freescale-mx28-evk/mx28-evk.c
@@ -232,14 +232,6 @@ static struct imx_fb_platformdata mx28_evk_fb_pdata = {
.enable = mx28_evk_fb_enable,
};
-static int mx28_evk_mem_init(void)
-{
- arm_add_mem_device("ram0", IMX_MEMORY_BASE, 128 * 1024 * 1024);
-
- return 0;
-}
-mem_initcall(mx28_evk_mem_init);
-
static const struct spi_board_info mx28evk_spi_board_info[] = {
{
.name = "m25p80",
diff --git a/arch/arm/boards/karo-tx28/tx28.c b/arch/arm/boards/karo-tx28/tx28.c
index 26dbc00790..47cac21307 100644
--- a/arch/arm/boards/karo-tx28/tx28.c
+++ b/arch/arm/boards/karo-tx28/tx28.c
@@ -73,14 +73,6 @@ static const uint32_t tx28_pad_setup[] = {
extern void base_board_init(void);
-static int tx28_mem_init(void)
-{
- arm_add_mem_device("ram0", IMX_MEMORY_BASE, 128 * 1024 * 1024);
-
- return 0;
-}
-mem_initcall(tx28_mem_init);
-
static int tx28_devices_init(void)
{
int i;
diff --git a/arch/arm/mach-mxs/include/mach/imx28.h b/arch/arm/mach-mxs/include/mach/imx28.h
new file mode 100644
index 0000000000..5816625c89
--- /dev/null
+++ b/arch/arm/mach-mxs/include/mach/imx28.h
@@ -0,0 +1,30 @@
+#ifndef __MACH_IMX28_H
+#define __MACH_IMX28_H
+
+#include <linux/bitfield.h>
+#include <io.h>
+
+#define DRAM_CTL29_CS0_EN BIT(24)
+#define DRAM_CTL29_CS1_EN BIT(25)
+#define DRAM_CTL29_COLUMNS_DIFF GENMASK(18, 16)
+#define DRAM_CTL29_ROWS_DIFF GENMASK(10, 8)
+#define DRAM_CTL31_EIGHT_BANKS BIT(16)
+
+#define DRAM_CTL(n) (IMX_SDRAMC_BASE + 4 * (n))
+
+static inline u32 imx28_get_memsize(void)
+{
+ u32 ctl29 = readl(DRAM_CTL(29));
+ u32 ctl31 = readl(DRAM_CTL(31));
+ int rows, columns, banks, cs0, cs1;
+
+ columns = 12 - FIELD_GET(DRAM_CTL29_COLUMNS_DIFF, ctl29);
+ rows = 15 - FIELD_GET(DRAM_CTL29_ROWS_DIFF, ctl29);
+ banks = FIELD_GET(DRAM_CTL31_EIGHT_BANKS, ctl31) ? 8 : 4;
+ cs0 = FIELD_GET(DRAM_CTL29_CS0_EN, ctl29);
+ cs1 = FIELD_GET(DRAM_CTL29_CS1_EN, ctl29);
+
+ return (1 << columns) * (1 << rows) * banks * (cs0 + cs1);
+}
+
+#endif /* __MACH_IMX28_H */ \ No newline at end of file
diff --git a/arch/arm/mach-mxs/soc-imx28.c b/arch/arm/mach-mxs/soc-imx28.c
index dc6020aa36..49f870b5bf 100644
--- a/arch/arm/mach-mxs/soc-imx28.c
+++ b/arch/arm/mach-mxs/soc-imx28.c
@@ -19,6 +19,8 @@
#include <restart.h>
#include <mach/imx28-regs.h>
#include <io.h>
+#include <asm/memory.h>
+#include <mach/imx28.h>
#define HW_CLKCTRL_RESET 0x1e0
# define HW_CLKCTRL_RESET_CHIP (1 << 1)
@@ -51,6 +53,8 @@ static int imx28_init(void)
restart_handler_register_fn(imx28_restart_soc);
+ arm_add_mem_device("ram0", IMX_MEMORY_BASE, imx28_get_memsize());
+
return 0;
}
postcore_initcall(imx28_init);