xref: /rk3399_rockchip-uboot/board/atmel/sama5d3_xplained/sama5d3_xplained.c (revision 4f66e09bb9fbc47b73f67c3cc08ee2663e8fcdb1)
17ca6f363SBo Shen /*
27ca6f363SBo Shen  * Copyright (C) 2014 Atmel Corporation
37ca6f363SBo Shen  *		      Bo Shen <voice.shen@atmel.com>
47ca6f363SBo Shen  *
57ca6f363SBo Shen  * SPDX-License-Identifier:	GPL-2.0+
67ca6f363SBo Shen  */
77ca6f363SBo Shen 
87ca6f363SBo Shen #include <common.h>
97ca6f363SBo Shen #include <asm/io.h>
107ca6f363SBo Shen #include <asm/arch/sama5d3_smc.h>
117ca6f363SBo Shen #include <asm/arch/at91_common.h>
127ca6f363SBo Shen #include <asm/arch/at91_rstc.h>
137ca6f363SBo Shen #include <asm/arch/gpio.h>
147ca6f363SBo Shen #include <asm/arch/clk.h>
15*ad46af0eSWenyou Yang #include <debug_uart.h>
16cd23aac4SBo Shen #include <spl.h>
17cd23aac4SBo Shen #include <asm/arch/atmel_mpddrc.h>
18cd23aac4SBo Shen #include <asm/arch/at91_wdt.h>
197ca6f363SBo Shen 
207ca6f363SBo Shen DECLARE_GLOBAL_DATA_PTR;
217ca6f363SBo Shen 
227ca6f363SBo Shen #ifdef CONFIG_NAND_ATMEL
sama5d3_xplained_nand_hw_init(void)237ca6f363SBo Shen void sama5d3_xplained_nand_hw_init(void)
247ca6f363SBo Shen {
257ca6f363SBo Shen 	struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
267ca6f363SBo Shen 
277ca6f363SBo Shen 	at91_periph_clk_enable(ATMEL_ID_SMC);
287ca6f363SBo Shen 
297ca6f363SBo Shen 	/* Configure SMC CS3 for NAND/SmartMedia */
307ca6f363SBo Shen 	writel(AT91_SMC_SETUP_NWE(2) | AT91_SMC_SETUP_NCS_WR(1) |
317ca6f363SBo Shen 	       AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(1),
327ca6f363SBo Shen 	       &smc->cs[3].setup);
337ca6f363SBo Shen 	writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(5) |
347ca6f363SBo Shen 	       AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(5),
357ca6f363SBo Shen 	       &smc->cs[3].pulse);
367ca6f363SBo Shen 	writel(AT91_SMC_CYCLE_NWE(8) | AT91_SMC_CYCLE_NRD(8),
377ca6f363SBo Shen 	       &smc->cs[3].cycle);
387ca6f363SBo Shen 	writel(AT91_SMC_TIMINGS_TCLR(3) | AT91_SMC_TIMINGS_TADL(10) |
397ca6f363SBo Shen 	       AT91_SMC_TIMINGS_TAR(3)  | AT91_SMC_TIMINGS_TRR(4)   |
407ca6f363SBo Shen 	       AT91_SMC_TIMINGS_TWB(5)  | AT91_SMC_TIMINGS_RBNSEL(3)|
417ca6f363SBo Shen 	       AT91_SMC_TIMINGS_NFSEL(1), &smc->cs[3].timings);
427ca6f363SBo Shen 	writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
437ca6f363SBo Shen 	       AT91_SMC_MODE_EXNW_DISABLE |
447ca6f363SBo Shen #ifdef CONFIG_SYS_NAND_DBW_16
457ca6f363SBo Shen 	       AT91_SMC_MODE_DBW_16 |
467ca6f363SBo Shen #else /* CONFIG_SYS_NAND_DBW_8 */
477ca6f363SBo Shen 	       AT91_SMC_MODE_DBW_8 |
487ca6f363SBo Shen #endif
497ca6f363SBo Shen 	       AT91_SMC_MODE_TDF_CYCLE(3),
507ca6f363SBo Shen 	       &smc->cs[3].mode);
517ca6f363SBo Shen }
527ca6f363SBo Shen #endif
537ca6f363SBo Shen 
547ca6f363SBo Shen #ifdef CONFIG_CMD_USB
sama5d3_xplained_usb_hw_init(void)557ca6f363SBo Shen static void sama5d3_xplained_usb_hw_init(void)
567ca6f363SBo Shen {
577ca6f363SBo Shen 	at91_set_pio_output(AT91_PIO_PORTE, 3, 0);
587ca6f363SBo Shen 	at91_set_pio_output(AT91_PIO_PORTE, 4, 0);
597ca6f363SBo Shen }
607ca6f363SBo Shen #endif
617ca6f363SBo Shen 
627ca6f363SBo Shen #ifdef CONFIG_GENERIC_ATMEL_MCI
sama5d3_xplained_mci0_hw_init(void)637ca6f363SBo Shen static void sama5d3_xplained_mci0_hw_init(void)
647ca6f363SBo Shen {
657ca6f363SBo Shen 	at91_set_pio_output(AT91_PIO_PORTE, 2, 0);	/* MCI0 Power */
667ca6f363SBo Shen }
677ca6f363SBo Shen #endif
687ca6f363SBo Shen 
69*ad46af0eSWenyou Yang #ifdef CONFIG_DEBUG_UART_BOARD_INIT
board_debug_uart_init(void)70*ad46af0eSWenyou Yang void board_debug_uart_init(void)
717ca6f363SBo Shen {
727ca6f363SBo Shen 	at91_seriald_hw_init();
73*ad46af0eSWenyou Yang }
74*ad46af0eSWenyou Yang #endif
757ca6f363SBo Shen 
76*ad46af0eSWenyou Yang #ifdef CONFIG_BOARD_EARLY_INIT_F
board_early_init_f(void)77*ad46af0eSWenyou Yang int board_early_init_f(void)
78*ad46af0eSWenyou Yang {
79*ad46af0eSWenyou Yang #ifdef CONFIG_DEBUG_UART
80*ad46af0eSWenyou Yang 	debug_uart_init();
81*ad46af0eSWenyou Yang #endif
827ca6f363SBo Shen 	return 0;
837ca6f363SBo Shen }
84*ad46af0eSWenyou Yang #endif
857ca6f363SBo Shen 
board_init(void)867ca6f363SBo Shen int board_init(void)
877ca6f363SBo Shen {
887ca6f363SBo Shen 	/* adress of boot parameters */
897ca6f363SBo Shen 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
907ca6f363SBo Shen 
917ca6f363SBo Shen #ifdef CONFIG_NAND_ATMEL
927ca6f363SBo Shen 	sama5d3_xplained_nand_hw_init();
937ca6f363SBo Shen #endif
947ca6f363SBo Shen #ifdef CONFIG_CMD_USB
957ca6f363SBo Shen 	sama5d3_xplained_usb_hw_init();
967ca6f363SBo Shen #endif
977ca6f363SBo Shen #ifdef CONFIG_GENERIC_ATMEL_MCI
987ca6f363SBo Shen 	sama5d3_xplained_mci0_hw_init();
997ca6f363SBo Shen #endif
1007ca6f363SBo Shen 	return 0;
1017ca6f363SBo Shen }
1027ca6f363SBo Shen 
dram_init(void)1037ca6f363SBo Shen int dram_init(void)
1047ca6f363SBo Shen {
1057ca6f363SBo Shen 	gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
1067ca6f363SBo Shen 				    CONFIG_SYS_SDRAM_SIZE);
1077ca6f363SBo Shen 
1087ca6f363SBo Shen 	return 0;
1097ca6f363SBo Shen }
1107ca6f363SBo Shen 
111cd23aac4SBo Shen /* SPL */
112cd23aac4SBo Shen #ifdef CONFIG_SPL_BUILD
spl_board_init(void)113cd23aac4SBo Shen void spl_board_init(void)
114cd23aac4SBo Shen {
115cd23aac4SBo Shen #ifdef CONFIG_SYS_USE_MMC
1161878804aSWenyou Yang #ifdef CONFIG_GENERIC_ATMEL_MCI
117cd23aac4SBo Shen 	sama5d3_xplained_mci0_hw_init();
1181878804aSWenyou Yang #endif
119cd23aac4SBo Shen #elif CONFIG_SYS_USE_NANDFLASH
120cd23aac4SBo Shen 	sama5d3_xplained_nand_hw_init();
121cd23aac4SBo Shen #endif
122cd23aac4SBo Shen }
123cd23aac4SBo Shen 
ddr2_conf(struct atmel_mpddrc_config * ddr2)1247e8702a0SWenyou Yang static void ddr2_conf(struct atmel_mpddrc_config *ddr2)
125cd23aac4SBo Shen {
126cd23aac4SBo Shen 	ddr2->md = (ATMEL_MPDDRC_MD_DBW_32_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
127cd23aac4SBo Shen 
128cd23aac4SBo Shen 	ddr2->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
129cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_NR_ROW_14 |
130cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
131cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_ENRDM_ON |
132cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_NB_8BANKS |
133cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_NDQS_DISABLED |
134cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
135cd23aac4SBo Shen 		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
136cd23aac4SBo Shen 	/*
137cd23aac4SBo Shen 	 * As the DDR2-SDRAm device requires a refresh time is 7.8125us
138cd23aac4SBo Shen 	 * when DDR run at 133MHz, so it needs (7.8125us * 133MHz / 10^9) clocks
139cd23aac4SBo Shen 	 */
140cd23aac4SBo Shen 	ddr2->rtr = 0x411;
141cd23aac4SBo Shen 
142cd23aac4SBo Shen 	ddr2->tpr0 = (6 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET |
143cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET |
144cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR0_TWR_OFFSET |
145cd23aac4SBo Shen 		      8 << ATMEL_MPDDRC_TPR0_TRC_OFFSET |
146cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR0_TRP_OFFSET |
147cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET |
148cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET |
149cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET);
150cd23aac4SBo Shen 
151cd23aac4SBo Shen 	ddr2->tpr1 = (2 << ATMEL_MPDDRC_TPR1_TXP_OFFSET |
152cd23aac4SBo Shen 		      200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET |
153cd23aac4SBo Shen 		      28 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET |
154cd23aac4SBo Shen 		      26 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET);
155cd23aac4SBo Shen 
156cd23aac4SBo Shen 	ddr2->tpr2 = (7 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET |
157cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET |
158cd23aac4SBo Shen 		      2 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET |
159cd23aac4SBo Shen 		      7 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET |
160cd23aac4SBo Shen 		      8 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET);
161cd23aac4SBo Shen }
162cd23aac4SBo Shen 
mem_init(void)163cd23aac4SBo Shen void mem_init(void)
164cd23aac4SBo Shen {
1657e8702a0SWenyou Yang 	struct atmel_mpddrc_config ddr2;
166cd23aac4SBo Shen 
167cd23aac4SBo Shen 	ddr2_conf(&ddr2);
168cd23aac4SBo Shen 
16970341e2eSWenyou Yang 	/* Enable MPDDR clock */
170cd23aac4SBo Shen 	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
17170341e2eSWenyou Yang 	at91_system_clk_enable(AT91_PMC_DDR);
172cd23aac4SBo Shen 
173cd23aac4SBo Shen 	/* DDRAM2 Controller initialize */
1740c01c3e8SErik van Luijk 	ddr2_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddr2);
175cd23aac4SBo Shen }
176cd23aac4SBo Shen 
at91_pmc_init(void)177cd23aac4SBo Shen void at91_pmc_init(void)
178cd23aac4SBo Shen {
179cd23aac4SBo Shen 	u32 tmp;
180cd23aac4SBo Shen 
181cd23aac4SBo Shen 	tmp = AT91_PMC_PLLAR_29 |
182cd23aac4SBo Shen 	      AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
183cd23aac4SBo Shen 	      AT91_PMC_PLLXR_MUL(43) |
184cd23aac4SBo Shen 	      AT91_PMC_PLLXR_DIV(1);
185cd23aac4SBo Shen 	at91_plla_init(tmp);
186cd23aac4SBo Shen 
187ede86ed2SWenyou Yang 	at91_pllicpr_init(AT91_PMC_IPLL_PLLA(0x3));
188cd23aac4SBo Shen 
189cd23aac4SBo Shen 	tmp = AT91_PMC_MCKR_MDIV_4 |
190cd23aac4SBo Shen 	      AT91_PMC_MCKR_CSS_PLLA;
191cd23aac4SBo Shen 	at91_mck_init(tmp);
192cd23aac4SBo Shen }
193cd23aac4SBo Shen #endif
194