Commit 0c01c3e876c0db59b4075a4a7550020f0ea25981
Committed by
Andreas Bießmann
1 parent
8d77576371
Exists in
v2017.01-smarct4x
and in
33 other branches
arm: at91: mpddr: allow multiple DDR controllers
The mpddr.c depends on ATMEL_BASE_MPDDRC for the base address to configure the controller. This cannot be used when there is more than one controller (i.e. AT91SAM9G45, AT91SAM9M10). Signed-off-by: Erik van Luijk <evanluijk@interact.nl> [remove 'new blank line at EOF'] Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
Showing 14 changed files with 34 additions and 36 deletions Side-by-side Diff
- arch/arm/mach-at91/include/mach/atmel_mpddrc.h
- arch/arm/mach-at91/mpddrc.c
- board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
- board/atmel/at91sam9n12ek/at91sam9n12ek.c
- board/atmel/at91sam9x5ek/at91sam9x5ek.c
- board/atmel/sama5d3_xplained/sama5d3_xplained.c
- board/atmel/sama5d3xek/sama5d3xek.c
- board/atmel/sama5d4_xplained/sama5d4_xplained.c
- board/atmel/sama5d4ek/sama5d4ek.c
- board/siemens/corvus/board.c
- include/configs/at91sam9m10g45ek.h
- include/configs/at91sam9n12ek.h
- include/configs/at91sam9x5ek.h
- include/configs/corvus.h
arch/arm/mach-at91/include/mach/atmel_mpddrc.h
| ... | ... | @@ -23,8 +23,10 @@ |
| 23 | 23 | u32 md; |
| 24 | 24 | }; |
| 25 | 25 | |
| 26 | -int ddr2_init(const unsigned int ram_address, | |
| 27 | - const struct atmel_mpddr *mpddr); | |
| 26 | + | |
| 27 | +int ddr2_init(const unsigned int base, | |
| 28 | + const unsigned int ram_address, | |
| 29 | + const struct atmel_mpddr *mpddr); | |
| 28 | 30 | |
| 29 | 31 | /* Bit field in mode register */ |
| 30 | 32 | #define ATMEL_MPDDRC_MR_MODE_NORMAL_CMD 0x0 |
arch/arm/mach-at91/mpddrc.c
| ... | ... | @@ -9,10 +9,10 @@ |
| 9 | 9 | #include <asm/io.h> |
| 10 | 10 | #include <asm/arch/atmel_mpddrc.h> |
| 11 | 11 | |
| 12 | -static inline void atmel_mpddr_op(int mode, u32 ram_address) | |
| 12 | +static inline void atmel_mpddr_op(const struct atmel_mpddr *mpddr, | |
| 13 | + int mode, | |
| 14 | + u32 ram_address) | |
| 13 | 15 | { |
| 14 | - struct atmel_mpddr *mpddr = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC; | |
| 15 | - | |
| 16 | 16 | writel(mode, &mpddr->mr); |
| 17 | 17 | writel(0, ram_address); |
| 18 | 18 | } |
| 19 | 19 | |
| ... | ... | @@ -27,10 +27,13 @@ |
| 27 | 27 | return 1; |
| 28 | 28 | } |
| 29 | 29 | |
| 30 | -int ddr2_init(const unsigned int ram_address, | |
| 30 | + | |
| 31 | +int ddr2_init(const unsigned int base, | |
| 32 | + const unsigned int ram_address, | |
| 31 | 33 | const struct atmel_mpddr *mpddr_value) |
| 32 | 34 | { |
| 33 | - struct atmel_mpddr *mpddr = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC; | |
| 35 | + const struct atmel_mpddr *mpddr = (struct atmel_mpddr *)base; | |
| 36 | + | |
| 34 | 37 | u32 ba_off, cr; |
| 35 | 38 | |
| 36 | 39 | /* Compute bank offset according to NC in configuration register */ |
| 37 | 40 | |
| 38 | 41 | |
| 39 | 42 | |
| 40 | 43 | |
| 41 | 44 | |
| ... | ... | @@ -52,30 +55,30 @@ |
| 52 | 55 | writel(mpddr_value->tpr2, &mpddr->tpr2); |
| 53 | 56 | |
| 54 | 57 | /* Issue a NOP command */ |
| 55 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address); | |
| 58 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address); | |
| 56 | 59 | |
| 57 | 60 | /* A 200 us is provided to precede any signal toggle */ |
| 58 | 61 | udelay(200); |
| 59 | 62 | |
| 60 | 63 | /* Issue a NOP command */ |
| 61 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address); | |
| 64 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address); | |
| 62 | 65 | |
| 63 | 66 | /* Issue an all banks precharge command */ |
| 64 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_PRCGALL_CMD, ram_address); | |
| 67 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_PRCGALL_CMD, ram_address); | |
| 65 | 68 | |
| 66 | 69 | /* Issue an extended mode register set(EMRS2) to choose operation */ |
| 67 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 70 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 68 | 71 | ram_address + (0x2 << ba_off)); |
| 69 | 72 | |
| 70 | 73 | /* Issue an extended mode register set(EMRS3) to set EMSR to 0 */ |
| 71 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 74 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 72 | 75 | ram_address + (0x3 << ba_off)); |
| 73 | 76 | |
| 74 | 77 | /* |
| 75 | 78 | * Issue an extended mode register set(EMRS1) to enable DLL and |
| 76 | 79 | * program D.I.C (output driver impedance control) |
| 77 | 80 | */ |
| 78 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 81 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 79 | 82 | ram_address + (0x1 << ba_off)); |
| 80 | 83 | |
| 81 | 84 | /* Enable DLL reset */ |
| 82 | 85 | |
| 83 | 86 | |
| 84 | 87 | |
| ... | ... | @@ -83,21 +86,21 @@ |
| 83 | 86 | writel(cr | ATMEL_MPDDRC_CR_DLL_RESET_ENABLED, &mpddr->cr); |
| 84 | 87 | |
| 85 | 88 | /* A mode register set(MRS) cycle is issued to reset DLL */ |
| 86 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address); | |
| 89 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address); | |
| 87 | 90 | |
| 88 | 91 | /* Issue an all banks precharge command */ |
| 89 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_PRCGALL_CMD, ram_address); | |
| 92 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_PRCGALL_CMD, ram_address); | |
| 90 | 93 | |
| 91 | 94 | /* Two auto-refresh (CBR) cycles are provided */ |
| 92 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_RFSH_CMD, ram_address); | |
| 93 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_RFSH_CMD, ram_address); | |
| 95 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_RFSH_CMD, ram_address); | |
| 96 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_RFSH_CMD, ram_address); | |
| 94 | 97 | |
| 95 | 98 | /* Disable DLL reset */ |
| 96 | 99 | cr = readl(&mpddr->cr); |
| 97 | 100 | writel(cr & (~ATMEL_MPDDRC_CR_DLL_RESET_ENABLED), &mpddr->cr); |
| 98 | 101 | |
| 99 | 102 | /* A mode register set (MRS) cycle is issued to disable DLL reset */ |
| 100 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address); | |
| 103 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address); | |
| 101 | 104 | |
| 102 | 105 | /* Set OCD calibration in default state */ |
| 103 | 106 | cr = readl(&mpddr->cr); |
| ... | ... | @@ -107,7 +110,7 @@ |
| 107 | 110 | * An extended mode register set (EMRS1) cycle is issued |
| 108 | 111 | * to OCD default value |
| 109 | 112 | */ |
| 110 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 113 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 111 | 114 | ram_address + (0x1 << ba_off)); |
| 112 | 115 | |
| 113 | 116 | /* OCD calibration mode exit */ |
| 114 | 117 | |
| ... | ... | @@ -118,11 +121,11 @@ |
| 118 | 121 | * An extended mode register set (EMRS1) cycle is issued |
| 119 | 122 | * to enable OCD exit |
| 120 | 123 | */ |
| 121 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 124 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD, | |
| 122 | 125 | ram_address + (0x1 << ba_off)); |
| 123 | 126 | |
| 124 | 127 | /* A nornal mode command is provided */ |
| 125 | - atmel_mpddr_op(ATMEL_MPDDRC_MR_MODE_NORMAL_CMD, ram_address); | |
| 128 | + atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NORMAL_CMD, ram_address); | |
| 126 | 129 | |
| 127 | 130 | /* Perform a write access to any DDR2-SDRAM address */ |
| 128 | 131 | writel(0, ram_address); |
board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
board/atmel/at91sam9n12ek/at91sam9n12ek.c
board/atmel/at91sam9x5ek/at91sam9x5ek.c
board/atmel/sama5d3_xplained/sama5d3_xplained.c
board/atmel/sama5d3xek/sama5d3xek.c
board/atmel/sama5d4_xplained/sama5d4_xplained.c
board/atmel/sama5d4ek/sama5d4ek.c
board/siemens/corvus/board.c
include/configs/at91sam9m10g45ek.h
include/configs/at91sam9n12ek.h
| ... | ... | @@ -259,8 +259,6 @@ |
| 259 | 259 | #define CONFIG_SYS_MCKR 0x1301 |
| 260 | 260 | #define CONFIG_SYS_MCKR_CSS 0x1302 |
| 261 | 261 | |
| 262 | -#define ATMEL_BASE_MPDDRC ATMEL_BASE_DDRSDRC | |
| 263 | - | |
| 264 | 262 | #ifdef CONFIG_SYS_USE_MMC |
| 265 | 263 | #define CONFIG_SPL_LDSCRIPT arch/arm/mach-at91/arm926ejs/u-boot-spl.lds |
| 266 | 264 | #define CONFIG_SPL_MMC_SUPPORT |
include/configs/at91sam9x5ek.h
| ... | ... | @@ -261,8 +261,6 @@ |
| 261 | 261 | #define CONFIG_SYS_MCKR 0x1301 |
| 262 | 262 | #define CONFIG_SYS_MCKR_CSS 0x1302 |
| 263 | 263 | |
| 264 | -#define ATMEL_BASE_MPDDRC ATMEL_BASE_DDRSDRC | |
| 265 | - | |
| 266 | 264 | #ifdef CONFIG_SYS_USE_MMC |
| 267 | 265 | #define CONFIG_SPL_LDSCRIPT arch/arm/mach-at91/arm926ejs/u-boot-spl.lds |
| 268 | 266 | #define CONFIG_SPL_MMC_SUPPORT |