xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-stm32f4/fmc.h (revision 5be93569262f4ebc963ca95891667f523f368d89)
1eaaa4f7eSrev13@wp.pl /*
2eaaa4f7eSrev13@wp.pl  * (C) Copyright 2013
3eaaa4f7eSrev13@wp.pl  * Pavel Boldin, Emcraft Systems, paboldin@emcraft.com
4eaaa4f7eSrev13@wp.pl  *
5eaaa4f7eSrev13@wp.pl  * (C) Copyright 2015
6*5be93569SKamil Lulko  * Kamil Lulko, <kamil.lulko@gmail.com>
7eaaa4f7eSrev13@wp.pl  *
8eaaa4f7eSrev13@wp.pl  * SPDX-License-Identifier:	GPL-2.0+
9eaaa4f7eSrev13@wp.pl  */
10eaaa4f7eSrev13@wp.pl 
11eaaa4f7eSrev13@wp.pl #ifndef _MACH_FMC_H_
12eaaa4f7eSrev13@wp.pl #define _MACH_FMC_H_
13eaaa4f7eSrev13@wp.pl 
14eaaa4f7eSrev13@wp.pl struct stm32_fmc_regs {
15eaaa4f7eSrev13@wp.pl 	u32 sdcr1;	/* Control register 1 */
16eaaa4f7eSrev13@wp.pl 	u32 sdcr2;	/* Control register 2 */
17eaaa4f7eSrev13@wp.pl 	u32 sdtr1;	/* Timing register 1 */
18eaaa4f7eSrev13@wp.pl 	u32 sdtr2;	/* Timing register 2 */
19eaaa4f7eSrev13@wp.pl 	u32 sdcmr;	/* Mode register */
20eaaa4f7eSrev13@wp.pl 	u32 sdrtr;	/* Refresh timing register */
21eaaa4f7eSrev13@wp.pl 	u32 sdsr;	/* Status register */
22eaaa4f7eSrev13@wp.pl };
23eaaa4f7eSrev13@wp.pl 
24eaaa4f7eSrev13@wp.pl /*
25eaaa4f7eSrev13@wp.pl  * FMC registers base
26eaaa4f7eSrev13@wp.pl  */
27eaaa4f7eSrev13@wp.pl #define STM32_SDRAM_FMC_BASE	0xA0000140
28eaaa4f7eSrev13@wp.pl #define STM32_SDRAM_FMC		((struct stm32_fmc_regs *)STM32_SDRAM_FMC_BASE)
29eaaa4f7eSrev13@wp.pl 
30eaaa4f7eSrev13@wp.pl /* Control register SDCR */
31eaaa4f7eSrev13@wp.pl #define FMC_SDCR_RPIPE_SHIFT	13	/* RPIPE bit shift */
32eaaa4f7eSrev13@wp.pl #define FMC_SDCR_RBURST_SHIFT	12	/* RBURST bit shift */
33eaaa4f7eSrev13@wp.pl #define FMC_SDCR_SDCLK_SHIFT	10	/* SDRAM clock divisor shift */
34eaaa4f7eSrev13@wp.pl #define FMC_SDCR_WP_SHIFT	9	/* Write protection shift */
35eaaa4f7eSrev13@wp.pl #define FMC_SDCR_CAS_SHIFT	7	/* CAS latency shift */
36eaaa4f7eSrev13@wp.pl #define FMC_SDCR_NB_SHIFT	6	/* Number of banks shift */
37eaaa4f7eSrev13@wp.pl #define FMC_SDCR_MWID_SHIFT	4	/* Memory width shift */
38eaaa4f7eSrev13@wp.pl #define FMC_SDCR_NR_SHIFT	2	/* Number of row address bits shift */
39eaaa4f7eSrev13@wp.pl #define FMC_SDCR_NC_SHIFT	0	/* Number of col address bits shift */
40eaaa4f7eSrev13@wp.pl 
41eaaa4f7eSrev13@wp.pl /* Timings register SDTR */
42eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TMRD_SHIFT	0	/* Load mode register to active */
43eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TXSR_SHIFT	4	/* Exit self-refresh time */
44eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TRAS_SHIFT	8	/* Self-refresh time */
45eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TRC_SHIFT	12	/* Row cycle delay */
46eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TWR_SHIFT	16	/* Recovery delay */
47eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TRP_SHIFT	20	/* Row precharge delay */
48eaaa4f7eSrev13@wp.pl #define FMC_SDTR_TRCD_SHIFT	24	/* Row-to-column delay */
49eaaa4f7eSrev13@wp.pl 
50eaaa4f7eSrev13@wp.pl 
51eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_NRFS_SHIFT	5
52eaaa4f7eSrev13@wp.pl 
53eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_NORMAL		0
54eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_START_CLOCK	1
55eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_PRECHARGE	2
56eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_AUTOREFRESH	3
57eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_WRITE_MODE	4
58eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_SELFREFRESH	5
59eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_POWERDOWN	6
60eaaa4f7eSrev13@wp.pl 
61eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_BANK_1		(1 << 4)
62eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_BANK_2		(1 << 3)
63eaaa4f7eSrev13@wp.pl 
64eaaa4f7eSrev13@wp.pl #define FMC_SDCMR_MODE_REGISTER_SHIFT	9
65eaaa4f7eSrev13@wp.pl 
66eaaa4f7eSrev13@wp.pl #define FMC_SDSR_BUSY			(1 << 5)
67eaaa4f7eSrev13@wp.pl 
68eaaa4f7eSrev13@wp.pl #define FMC_BUSY_WAIT()		do { \
69eaaa4f7eSrev13@wp.pl 		__asm__ __volatile__ ("dsb" : : : "memory"); \
70eaaa4f7eSrev13@wp.pl 		while (STM32_SDRAM_FMC->sdsr & FMC_SDSR_BUSY) \
71eaaa4f7eSrev13@wp.pl 			; \
72eaaa4f7eSrev13@wp.pl 	} while (0)
73eaaa4f7eSrev13@wp.pl 
74eaaa4f7eSrev13@wp.pl 
75eaaa4f7eSrev13@wp.pl #endif /* _MACH_FMC_H_ */
76