1*9989c156SWenyou Yang /*
2*9989c156SWenyou Yang * Copyright (C) 2016 Atmel
3*9989c156SWenyou Yang * Wenyou.Yang <wenyou.yang@atmel.com>
4*9989c156SWenyou Yang *
5*9989c156SWenyou Yang * SPDX-License-Identifier: GPL-2.0+
6*9989c156SWenyou Yang */
7*9989c156SWenyou Yang
8*9989c156SWenyou Yang #include <common.h>
9*9989c156SWenyou Yang #include <atmel_hlcdc.h>
10*9989c156SWenyou Yang #include <lcd.h>
11*9989c156SWenyou Yang #include <mmc.h>
12*9989c156SWenyou Yang #include <net.h>
13*9989c156SWenyou Yang #include <netdev.h>
14*9989c156SWenyou Yang #include <spi.h>
15*9989c156SWenyou Yang #include <version.h>
16*9989c156SWenyou Yang #include <asm/io.h>
17*9989c156SWenyou Yang #include <asm/arch/at91_common.h>
18*9989c156SWenyou Yang #include <asm/arch/atmel_pio4.h>
19*9989c156SWenyou Yang #include <asm/arch/atmel_mpddrc.h>
20*9989c156SWenyou Yang #include <asm/arch/atmel_usba_udc.h>
21*9989c156SWenyou Yang #include <asm/arch/atmel_sdhci.h>
22*9989c156SWenyou Yang #include <asm/arch/clk.h>
23*9989c156SWenyou Yang #include <asm/arch/gpio.h>
24*9989c156SWenyou Yang #include <asm/arch/sama5_sfr.h>
25*9989c156SWenyou Yang #include <asm/arch/sama5d2.h>
26*9989c156SWenyou Yang #include <asm/arch/sama5d3_smc.h>
27*9989c156SWenyou Yang
28*9989c156SWenyou Yang DECLARE_GLOBAL_DATA_PTR;
29*9989c156SWenyou Yang
spi_cs_is_valid(unsigned int bus,unsigned int cs)30*9989c156SWenyou Yang int spi_cs_is_valid(unsigned int bus, unsigned int cs)
31*9989c156SWenyou Yang {
32*9989c156SWenyou Yang return bus == 0 && cs == 0;
33*9989c156SWenyou Yang }
34*9989c156SWenyou Yang
spi_cs_activate(struct spi_slave * slave)35*9989c156SWenyou Yang void spi_cs_activate(struct spi_slave *slave)
36*9989c156SWenyou Yang {
37*9989c156SWenyou Yang atmel_pio4_set_pio_output(AT91_PIO_PORTA, 17, 0);
38*9989c156SWenyou Yang }
39*9989c156SWenyou Yang
spi_cs_deactivate(struct spi_slave * slave)40*9989c156SWenyou Yang void spi_cs_deactivate(struct spi_slave *slave)
41*9989c156SWenyou Yang {
42*9989c156SWenyou Yang atmel_pio4_set_pio_output(AT91_PIO_PORTA, 17, 1);
43*9989c156SWenyou Yang }
44*9989c156SWenyou Yang
board_spi0_hw_init(void)45*9989c156SWenyou Yang static void board_spi0_hw_init(void)
46*9989c156SWenyou Yang {
47*9989c156SWenyou Yang atmel_pio4_set_a_periph(AT91_PIO_PORTA, 14, 0);
48*9989c156SWenyou Yang atmel_pio4_set_a_periph(AT91_PIO_PORTA, 15, 0);
49*9989c156SWenyou Yang atmel_pio4_set_a_periph(AT91_PIO_PORTA, 16, 0);
50*9989c156SWenyou Yang
51*9989c156SWenyou Yang atmel_pio4_set_pio_output(AT91_PIO_PORTA, 17, 1);
52*9989c156SWenyou Yang
53*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_SPI0);
54*9989c156SWenyou Yang }
55*9989c156SWenyou Yang
board_nand_hw_init(void)56*9989c156SWenyou Yang static void board_nand_hw_init(void)
57*9989c156SWenyou Yang {
58*9989c156SWenyou Yang struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
59*9989c156SWenyou Yang struct atmel_sfr *sfr = (struct atmel_sfr *)ATMEL_BASE_SFR;
60*9989c156SWenyou Yang
61*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_HSMC);
62*9989c156SWenyou Yang
63*9989c156SWenyou Yang writel(AT91_SFR_EBICFG_DRIVE0_HIGH |
64*9989c156SWenyou Yang AT91_SFR_EBICFG_PULL0_NONE |
65*9989c156SWenyou Yang AT91_SFR_EBICFG_DRIVE1_HIGH |
66*9989c156SWenyou Yang AT91_SFR_EBICFG_PULL1_NONE, &sfr->ebicfg);
67*9989c156SWenyou Yang
68*9989c156SWenyou Yang /* Configure SMC CS3 for NAND */
69*9989c156SWenyou Yang writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(1) |
70*9989c156SWenyou Yang AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(1),
71*9989c156SWenyou Yang &smc->cs[3].setup);
72*9989c156SWenyou Yang writel(AT91_SMC_PULSE_NWE(2) | AT91_SMC_PULSE_NCS_WR(3) |
73*9989c156SWenyou Yang AT91_SMC_PULSE_NRD(2) | AT91_SMC_PULSE_NCS_RD(3),
74*9989c156SWenyou Yang &smc->cs[3].pulse);
75*9989c156SWenyou Yang writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(5),
76*9989c156SWenyou Yang &smc->cs[3].cycle);
77*9989c156SWenyou Yang writel(AT91_SMC_TIMINGS_TCLR(2) | AT91_SMC_TIMINGS_TADL(7) |
78*9989c156SWenyou Yang AT91_SMC_TIMINGS_TAR(2) | AT91_SMC_TIMINGS_TRR(3) |
79*9989c156SWenyou Yang AT91_SMC_TIMINGS_TWB(7) | AT91_SMC_TIMINGS_RBNSEL(3) |
80*9989c156SWenyou Yang AT91_SMC_TIMINGS_NFSEL(1), &smc->cs[3].timings);
81*9989c156SWenyou Yang writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
82*9989c156SWenyou Yang AT91_SMC_MODE_EXNW_DISABLE |
83*9989c156SWenyou Yang AT91_SMC_MODE_DBW_8 |
84*9989c156SWenyou Yang AT91_SMC_MODE_TDF_CYCLE(3),
85*9989c156SWenyou Yang &smc->cs[3].mode);
86*9989c156SWenyou Yang
87*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 0, 0); /* D0 */
88*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 1, 0); /* D1 */
89*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 2, 0); /* D2 */
90*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 3, 0); /* D3 */
91*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 4, 0); /* D4 */
92*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 5, 0); /* D5 */
93*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 6, 0); /* D6 */
94*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 7, 0); /* D7 */
95*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 12, 0); /* RE */
96*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 8, 0); /* WE */
97*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 9, 1); /* NCS */
98*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 21, 1); /* RDY */
99*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 10, 1); /* ALE */
100*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTA, 11, 1); /* CLE */
101*9989c156SWenyou Yang }
102*9989c156SWenyou Yang
board_usb_hw_init(void)103*9989c156SWenyou Yang static void board_usb_hw_init(void)
104*9989c156SWenyou Yang {
105*9989c156SWenyou Yang atmel_pio4_set_pio_output(AT91_PIO_PORTA, 28, 1);
106*9989c156SWenyou Yang }
107*9989c156SWenyou Yang
board_gmac_hw_init(void)108*9989c156SWenyou Yang static void board_gmac_hw_init(void)
109*9989c156SWenyou Yang {
110*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 14, 0); /* GTXCK */
111*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 15, 0); /* GTXEN */
112*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 16, 0); /* GRXDV */
113*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 17, 0); /* GRXER */
114*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 18, 0); /* GRX0 */
115*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 19, 0); /* GRX1 */
116*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 20, 0); /* GTX0 */
117*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 21, 0); /* GTX1 */
118*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 22, 0); /* GMDC */
119*9989c156SWenyou Yang atmel_pio4_set_f_periph(AT91_PIO_PORTB, 23, 0); /* GMDIO */
120*9989c156SWenyou Yang
121*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_GMAC);
122*9989c156SWenyou Yang }
123*9989c156SWenyou Yang
board_uart0_hw_init(void)124*9989c156SWenyou Yang static void board_uart0_hw_init(void)
125*9989c156SWenyou Yang {
126*9989c156SWenyou Yang atmel_pio4_set_c_periph(AT91_PIO_PORTB, 26, 1); /* URXD0 */
127*9989c156SWenyou Yang atmel_pio4_set_c_periph(AT91_PIO_PORTB, 27, 0); /* UTXD0 */
128*9989c156SWenyou Yang
129*9989c156SWenyou Yang at91_periph_clk_enable(CONFIG_USART_ID);
130*9989c156SWenyou Yang }
131*9989c156SWenyou Yang
board_early_init_f(void)132*9989c156SWenyou Yang int board_early_init_f(void)
133*9989c156SWenyou Yang {
134*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOA);
135*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOB);
136*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOC);
137*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_PIOD);
138*9989c156SWenyou Yang
139*9989c156SWenyou Yang board_uart0_hw_init();
140*9989c156SWenyou Yang
141*9989c156SWenyou Yang return 0;
142*9989c156SWenyou Yang }
143*9989c156SWenyou Yang
board_init(void)144*9989c156SWenyou Yang int board_init(void)
145*9989c156SWenyou Yang {
146*9989c156SWenyou Yang /* address of boot parameters */
147*9989c156SWenyou Yang gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
148*9989c156SWenyou Yang
149*9989c156SWenyou Yang #ifdef CONFIG_ATMEL_SPI
150*9989c156SWenyou Yang board_spi0_hw_init();
151*9989c156SWenyou Yang #endif
152*9989c156SWenyou Yang #ifdef CONFIG_NAND_ATMEL
153*9989c156SWenyou Yang board_nand_hw_init();
154*9989c156SWenyou Yang #endif
155*9989c156SWenyou Yang #ifdef CONFIG_MACB
156*9989c156SWenyou Yang board_gmac_hw_init();
157*9989c156SWenyou Yang #endif
158*9989c156SWenyou Yang #ifdef CONFIG_CMD_USB
159*9989c156SWenyou Yang board_usb_hw_init();
160*9989c156SWenyou Yang #endif
161*9989c156SWenyou Yang #ifdef CONFIG_USB_GADGET_ATMEL_USBA
162*9989c156SWenyou Yang at91_udp_hw_init();
163*9989c156SWenyou Yang #endif
164*9989c156SWenyou Yang
165*9989c156SWenyou Yang return 0;
166*9989c156SWenyou Yang }
167*9989c156SWenyou Yang
dram_init(void)168*9989c156SWenyou Yang int dram_init(void)
169*9989c156SWenyou Yang {
170*9989c156SWenyou Yang gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
171*9989c156SWenyou Yang CONFIG_SYS_SDRAM_SIZE);
172*9989c156SWenyou Yang return 0;
173*9989c156SWenyou Yang }
174*9989c156SWenyou Yang
board_eth_init(bd_t * bis)175*9989c156SWenyou Yang int board_eth_init(bd_t *bis)
176*9989c156SWenyou Yang {
177*9989c156SWenyou Yang int rc = 0;
178*9989c156SWenyou Yang
179*9989c156SWenyou Yang #ifdef CONFIG_MACB
180*9989c156SWenyou Yang rc = macb_eth_initialize(0, (void *)ATMEL_BASE_GMAC, 0x00);
181*9989c156SWenyou Yang if (rc)
182*9989c156SWenyou Yang printf("GMAC register failed\n");
183*9989c156SWenyou Yang #endif
184*9989c156SWenyou Yang
185*9989c156SWenyou Yang #ifdef CONFIG_USB_GADGET_ATMEL_USBA
186*9989c156SWenyou Yang usba_udc_probe(&pdata);
187*9989c156SWenyou Yang #ifdef CONFIG_USB_ETH_RNDIS
188*9989c156SWenyou Yang usb_eth_initialize(bis);
189*9989c156SWenyou Yang #endif
190*9989c156SWenyou Yang #endif
191*9989c156SWenyou Yang
192*9989c156SWenyou Yang return rc;
193*9989c156SWenyou Yang }
194*9989c156SWenyou Yang
195*9989c156SWenyou Yang /* SPL */
196*9989c156SWenyou Yang #ifdef CONFIG_SPL_BUILD
spl_board_init(void)197*9989c156SWenyou Yang void spl_board_init(void)
198*9989c156SWenyou Yang {
199*9989c156SWenyou Yang #ifdef CONFIG_SYS_USE_SERIALFLASH
200*9989c156SWenyou Yang board_spi0_hw_init();
201*9989c156SWenyou Yang #endif
202*9989c156SWenyou Yang
203*9989c156SWenyou Yang #ifdef CONFIG_SYS_USE_NANDFLASH
204*9989c156SWenyou Yang board_nand_hw_init();
205*9989c156SWenyou Yang #endif
206*9989c156SWenyou Yang }
207*9989c156SWenyou Yang
ddrc_conf(struct atmel_mpddrc_config * ddrc)208*9989c156SWenyou Yang static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
209*9989c156SWenyou Yang {
210*9989c156SWenyou Yang ddrc->md = (ATMEL_MPDDRC_MD_DBW_32_BITS | ATMEL_MPDDRC_MD_DDR3_SDRAM);
211*9989c156SWenyou Yang
212*9989c156SWenyou Yang ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
213*9989c156SWenyou Yang ATMEL_MPDDRC_CR_NR_ROW_14 |
214*9989c156SWenyou Yang ATMEL_MPDDRC_CR_CAS_DDR_CAS5 |
215*9989c156SWenyou Yang ATMEL_MPDDRC_CR_DIC_DS |
216*9989c156SWenyou Yang ATMEL_MPDDRC_CR_DIS_DLL |
217*9989c156SWenyou Yang ATMEL_MPDDRC_CR_NB_8BANKS |
218*9989c156SWenyou Yang ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
219*9989c156SWenyou Yang ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
220*9989c156SWenyou Yang
221*9989c156SWenyou Yang ddrc->rtr = 0x511;
222*9989c156SWenyou Yang
223*9989c156SWenyou Yang ddrc->tpr0 = ((6 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
224*9989c156SWenyou Yang (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
225*9989c156SWenyou Yang (4 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
226*9989c156SWenyou Yang (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
227*9989c156SWenyou Yang (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
228*9989c156SWenyou Yang (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
229*9989c156SWenyou Yang (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
230*9989c156SWenyou Yang (4 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
231*9989c156SWenyou Yang
232*9989c156SWenyou Yang ddrc->tpr1 = ((27 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
233*9989c156SWenyou Yang (29 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
234*9989c156SWenyou Yang (0 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
235*9989c156SWenyou Yang (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
236*9989c156SWenyou Yang
237*9989c156SWenyou Yang ddrc->tpr2 = ((0 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
238*9989c156SWenyou Yang (0 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
239*9989c156SWenyou Yang (0 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
240*9989c156SWenyou Yang (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
241*9989c156SWenyou Yang (7 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
242*9989c156SWenyou Yang }
243*9989c156SWenyou Yang
mem_init(void)244*9989c156SWenyou Yang void mem_init(void)
245*9989c156SWenyou Yang {
246*9989c156SWenyou Yang struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
247*9989c156SWenyou Yang struct atmel_mpddrc_config ddrc_config;
248*9989c156SWenyou Yang u32 reg;
249*9989c156SWenyou Yang
250*9989c156SWenyou Yang ddrc_conf(&ddrc_config);
251*9989c156SWenyou Yang
252*9989c156SWenyou Yang at91_periph_clk_enable(ATMEL_ID_MPDDRC);
253*9989c156SWenyou Yang at91_system_clk_enable(AT91_PMC_DDR);
254*9989c156SWenyou Yang
255*9989c156SWenyou Yang reg = readl(&mpddrc->io_calibr);
256*9989c156SWenyou Yang reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
257*9989c156SWenyou Yang reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
258*9989c156SWenyou Yang reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
259*9989c156SWenyou Yang reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(100);
260*9989c156SWenyou Yang writel(reg, &mpddrc->io_calibr);
261*9989c156SWenyou Yang
262*9989c156SWenyou Yang writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_TWO_CYCLE,
263*9989c156SWenyou Yang &mpddrc->rd_data_path);
264*9989c156SWenyou Yang
265*9989c156SWenyou Yang ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
266*9989c156SWenyou Yang
267*9989c156SWenyou Yang writel(0x3, &mpddrc->cal_mr4);
268*9989c156SWenyou Yang writel(64, &mpddrc->tim_cal);
269*9989c156SWenyou Yang }
270*9989c156SWenyou Yang
at91_pmc_init(void)271*9989c156SWenyou Yang void at91_pmc_init(void)
272*9989c156SWenyou Yang {
273*9989c156SWenyou Yang at91_plla_init(AT91_PMC_PLLAR_29 |
274*9989c156SWenyou Yang AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
275*9989c156SWenyou Yang AT91_PMC_PLLXR_MUL(82) |
276*9989c156SWenyou Yang AT91_PMC_PLLXR_DIV(1));
277*9989c156SWenyou Yang
278*9989c156SWenyou Yang at91_pllicpr_init(0);
279*9989c156SWenyou Yang
280*9989c156SWenyou Yang at91_mck_init(AT91_PMC_MCKR_H32MXDIV |
281*9989c156SWenyou Yang AT91_PMC_MCKR_PLLADIV_2 |
282*9989c156SWenyou Yang AT91_PMC_MCKR_MDIV_3 |
283*9989c156SWenyou Yang AT91_PMC_MCKR_CSS_PLLA);
284*9989c156SWenyou Yang }
285*9989c156SWenyou Yang #endif
286