]>
git.ipfire.org Git - people/ms/u-boot.git/blob - board/sheldon/simpc8313/sdram.c
2 * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
3 * Copyright (C) Sheldon Instruments, Inc. 2008
5 * Author: Ron Madrid <info@sheldoninst.com>
8 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
10 * SPDX-License-Identifier: GPL-2.0+
15 #include <spd_sdram.h>
16 #include <asm/bitops.h>
18 #include <asm/processor.h>
21 DECLARE_GLOBAL_DATA_PTR
;
23 static long fixed_sdram(void);
25 #if defined(CONFIG_NAND_SPL)
26 void si_wait_i2c(void)
28 volatile immap_t
*im
= (immap_t
*) CONFIG_SYS_IMMR
;
30 while (!(__raw_readb(&im
->i2c
[0].sr
) & 0x02))
33 __raw_writeb(0x00, &im
->i2c
[0].sr
);
40 void si_read_i2c(u32 lbyte
, int count
, u8
*buffer
)
42 volatile immap_t
*im
= (immap_t
*) CONFIG_SYS_IMMR
;
44 u8 chip
= 0x50 << 1; /* boot sequencer I2C */
45 u32 ubyte
= (lbyte
& 0xff00) >> 8;
52 __raw_writeb(0x3f, &im
->i2c
[0].fdr
);
53 __raw_writeb(0x00, &im
->i2c
[0].adr
);
54 __raw_writeb(0x00, &im
->i2c
[0].sr
);
55 __raw_writeb(0x00, &im
->i2c
[0].dr
);
57 while (__raw_readb(&im
->i2c
[0].sr
) & 0x20)
61 * Writing address to device
63 __raw_writeb(0xb0, &im
->i2c
[0].cr
);
65 __raw_writeb(chip
, &im
->i2c
[0].dr
);
68 __raw_writeb(0xb0, &im
->i2c
[0].cr
);
70 __raw_writeb(ubyte
, &im
->i2c
[0].dr
);
73 __raw_writeb(lbyte
, &im
->i2c
[0].dr
);
76 __raw_writeb(0xb4, &im
->i2c
[0].cr
);
78 __raw_writeb(chip
+ 1, &im
->i2c
[0].dr
);
81 __raw_writeb(0xa0, &im
->i2c
[0].cr
);
87 __raw_readb(&im
->i2c
[0].dr
);
94 for (i
= 0; i
< count
; i
++)
96 if (i
== (count
- 2)) /* Reached next to last byte, No ACK */
97 __raw_writeb(0xa8, &im
->i2c
[0].cr
);
98 if (i
== (count
- 1)) /* Reached last byte, STOP */
99 __raw_writeb(0x88, &im
->i2c
[0].cr
);
101 /* Read byte of data */
102 buffer
[i
] = __raw_readb(&im
->i2c
[0].dr
);
104 if (i
== (count
- 1))
111 #endif /* CONFIG_NAND_SPL */
113 phys_size_t
initdram(int board_type
)
115 volatile immap_t
*im
= (immap_t
*) CONFIG_SYS_IMMR
;
116 volatile fsl_lbc_t
*lbc
= &im
->im_lbc
;
119 if ((__raw_readl(&im
->sysconf
.immrbar
) & IMMRBAR_BASE_ADDR
) != (u32
) im
)
122 /* DDR SDRAM - Main SODIMM */
123 __raw_writel(CONFIG_SYS_DDR_BASE
& LAWBAR_BAR
, &im
->sysconf
.ddrlaw
[0].bar
);
125 msize
= fixed_sdram();
127 /* Local Bus setup lbcr and mrtpr */
128 __raw_writel(CONFIG_SYS_LBC_LBCR
, &lbc
->lbcr
);
129 __raw_writel(CONFIG_SYS_LBC_MRTPR
, &lbc
->mrtpr
);
132 /* return total bus SDRAM size(bytes) -- DDR */
133 return (msize
* 1024 * 1024);
136 /*************************************************************************
137 * fixed sdram init -- reads values from boot sequencer I2C
138 ************************************************************************/
139 static long fixed_sdram(void)
141 volatile immap_t
*im
= (immap_t
*) CONFIG_SYS_IMMR
;
142 u32 msizelog2
, msize
= 1;
143 #if defined(CONFIG_NAND_SPL)
145 const u8 bytecount
= 135;
146 u8 buffer
[bytecount
];
149 si_read_i2c(0, bytecount
, buffer
);
151 for (i
= 18; i
< bytecount
; i
+= 7){
152 addr
= (u32
)buffer
[i
];
154 addr
|= (u32
)buffer
[i
+ 1];
156 data
= (u32
)buffer
[i
+ 2];
158 data
|= (u32
)buffer
[i
+ 3];
160 data
|= (u32
)buffer
[i
+ 4];
162 data
|= (u32
)buffer
[i
+ 5];
164 __raw_writel(data
, (u32
*)(CONFIG_SYS_IMMR
+ addr
));
169 /* enable DDR controller */
170 __raw_writel((__raw_readl(&im
->ddr
.sdram_cfg
) | SDRAM_CFG_MEM_EN
), &im
->ddr
.sdram_cfg
);
171 #endif /* (CONFIG_NAND_SPL) */
173 msizelog2
= ((__raw_readl(&im
->sysconf
.ddrlaw
[0].ar
) & LAWAR_SIZE
) + 1);
174 msize
<<= (msizelog2
- 20);