blob: eab3a130819505a6d6a7eb4a6ad96218aa0806fd [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Stelian Pop61e69d72008-05-08 20:52:22 +02002/*
3 * (C) Copyright 2007-2008
Stelian Pop5ee0c7f2011-11-01 00:00:39 +01004 * Stelian Pop <stelian@popies.net>
Stelian Pop61e69d72008-05-08 20:52:22 +02005 * Lead Tech Design <www.leadtechdesign.com>
Stelian Pop61e69d72008-05-08 20:52:22 +02006 */
7
8#include <common.h>
Wenyou.Yang@microchip.comb59fe682017-07-21 13:28:40 +08009#include <debug_uart.h>
Simon Glass8e16b1e2019-12-28 10:45:05 -070010#include <init.h>
Simon Glassf5c208d2019-11-14 12:57:20 -070011#include <vsprintf.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060012#include <asm/global_data.h>
Xu, Hong0a614942011-07-31 22:49:00 +000013#include <asm/io.h>
Stelian Pop61e69d72008-05-08 20:52:22 +020014#include <asm/arch/at91sam9261.h>
15#include <asm/arch/at91sam9261_matrix.h>
16#include <asm/arch/at91sam9_smc.h>
Jean-Christophe PLAGNIOL-VILLARD6b0b3db2009-03-21 21:07:59 +010017#include <asm/arch/at91_common.h>
Stelian Pop61e69d72008-05-08 20:52:22 +020018#include <asm/arch/at91_rstc.h>
Jean-Christophe PLAGNIOL-VILLARD23164f12009-04-16 21:30:44 +020019#include <asm/arch/clk.h>
Stelian Pop61e69d72008-05-08 20:52:22 +020020#include <asm/arch/gpio.h>
Stelian Pop905ed222008-05-08 14:52:30 +020021#include <atmel_lcdc.h>
Stelian Pop61e69d72008-05-08 20:52:22 +020022#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_DRIVER_DM9000)
23#include <net.h>
Remy Bohmer7eefd922009-05-02 21:49:18 +020024#include <netdev.h>
Stelian Pop61e69d72008-05-08 20:52:22 +020025#endif
Simon Glass0ffb9d62017-05-31 19:47:48 -060026#include <asm/mach-types.h>
Stelian Pop61e69d72008-05-08 20:52:22 +020027
28DECLARE_GLOBAL_DATA_PTR;
29
30/* ------------------------------------------------------------------------- */
31/*
32 * Miscelaneous platform dependent initialisations
33 */
34
Stelian Pop61e69d72008-05-08 20:52:22 +020035#ifdef CONFIG_CMD_NAND
36static void at91sam9261ek_nand_hw_init(void)
37{
Xu, Hong0a614942011-07-31 22:49:00 +000038 struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
39 struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
Stelian Pop61e69d72008-05-08 20:52:22 +020040 unsigned long csa;
41
42 /* Enable CS3 */
Xu, Hong0a614942011-07-31 22:49:00 +000043 csa = readl(&matrix->ebicsa);
44 csa |= AT91_MATRIX_CS3A_SMC_SMARTMEDIA;
45
46 writel(csa, &matrix->ebicsa);
Stelian Pop61e69d72008-05-08 20:52:22 +020047
48 /* Configure SMC CS3 for NAND/SmartMedia */
Sedji Gaouaou97a031b2009-06-25 17:04:15 +020049#ifdef CONFIG_AT91SAM9G10EK
Xu, Hong0a614942011-07-31 22:49:00 +000050 writel(AT91_SMC_SETUP_NWE(2) | AT91_SMC_SETUP_NCS_WR(0) |
51 AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(0),
52 &smc->cs[3].setup);
53 writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(7) |
54 AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(7),
55 &smc->cs[3].pulse);
56 writel(AT91_SMC_CYCLE_NWE(7) | AT91_SMC_CYCLE_NRD(7),
57 &smc->cs[3].cycle);
Sedji Gaouaou97a031b2009-06-25 17:04:15 +020058#else
Xu, Hong0a614942011-07-31 22:49:00 +000059 writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(0) |
60 AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(0),
61 &smc->cs[3].setup);
62 writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(3) |
63 AT91_SMC_PULSE_NRD(3) | AT91_SMC_PULSE_NCS_RD(3),
64 &smc->cs[3].pulse);
65 writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(5),
66 &smc->cs[3].cycle);
Sedji Gaouaou97a031b2009-06-25 17:04:15 +020067#endif
Xu, Hong0a614942011-07-31 22:49:00 +000068 writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
69 AT91_SMC_MODE_EXNW_DISABLE |
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020070#ifdef CONFIG_SYS_NAND_DBW_16
Xu, Hong0a614942011-07-31 22:49:00 +000071 AT91_SMC_MODE_DBW_16 |
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020072#else /* CONFIG_SYS_NAND_DBW_8 */
Xu, Hong0a614942011-07-31 22:49:00 +000073 AT91_SMC_MODE_DBW_8 |
Stelian Pop61e69d72008-05-08 20:52:22 +020074#endif
Xu, Hong0a614942011-07-31 22:49:00 +000075 AT91_SMC_MODE_TDF_CYCLE(2),
76 &smc->cs[3].mode);
Stelian Pop61e69d72008-05-08 20:52:22 +020077
Wenyou Yang78f89762016-02-03 10:16:50 +080078 at91_periph_clk_enable(ATMEL_ID_PIOC);
Stelian Pop61e69d72008-05-08 20:52:22 +020079
80 /* Configure RDY/BSY */
Tom Rinib4213492022-11-12 17:36:51 -050081 at91_set_gpio_input(CFG_SYS_NAND_READY_PIN, 1);
Stelian Pop61e69d72008-05-08 20:52:22 +020082
83 /* Enable NandFlash */
Tom Rinib4213492022-11-12 17:36:51 -050084 at91_set_gpio_output(CFG_SYS_NAND_ENABLE_PIN, 1);
Stelian Pop61e69d72008-05-08 20:52:22 +020085
86 at91_set_A_periph(AT91_PIN_PC0, 0); /* NANDOE */
87 at91_set_A_periph(AT91_PIN_PC1, 0); /* NANDWE */
88}
89#endif
90
Stelian Pop61e69d72008-05-08 20:52:22 +020091#ifdef CONFIG_DRIVER_DM9000
92static void at91sam9261ek_dm9000_hw_init(void)
93{
Xu, Hong0a614942011-07-31 22:49:00 +000094 struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
95
Stelian Pop61e69d72008-05-08 20:52:22 +020096 /* Configure SMC CS2 for DM9000 */
Sedji Gaouaou97a031b2009-06-25 17:04:15 +020097#ifdef CONFIG_AT91SAM9G10EK
Xu, Hong0a614942011-07-31 22:49:00 +000098 writel(AT91_SMC_SETUP_NWE(3) | AT91_SMC_SETUP_NCS_WR(0) |
99 AT91_SMC_SETUP_NRD(3) | AT91_SMC_SETUP_NCS_RD(0),
100 &smc->cs[2].setup);
101 writel(AT91_SMC_PULSE_NWE(6) | AT91_SMC_PULSE_NCS_WR(8) |
102 AT91_SMC_PULSE_NRD(6) | AT91_SMC_PULSE_NCS_RD(8),
103 &smc->cs[2].pulse);
104 writel(AT91_SMC_CYCLE_NWE(20) | AT91_SMC_CYCLE_NRD(20),
105 &smc->cs[2].cycle);
106 writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
107 AT91_SMC_MODE_EXNW_DISABLE |
108 AT91_SMC_MODE_BAT | AT91_SMC_MODE_DBW_16 |
109 AT91_SMC_MODE_TDF_CYCLE(1),
110 &smc->cs[2].mode);
Sedji Gaouaou97a031b2009-06-25 17:04:15 +0200111#else
Xu, Hong0a614942011-07-31 22:49:00 +0000112 writel(AT91_SMC_SETUP_NWE(3) | AT91_SMC_SETUP_NCS_WR(0) |
113 AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(0),
114 &smc->cs[2].setup);
115 writel(AT91_SMC_PULSE_NWE(4) | AT91_SMC_PULSE_NCS_WR(8) |
116 AT91_SMC_PULSE_NRD(4) | AT91_SMC_PULSE_NCS_RD(8),
117 &smc->cs[2].pulse);
118 writel(AT91_SMC_CYCLE_NWE(16) | AT91_SMC_CYCLE_NRD(16),
119 &smc->cs[2].cycle);
120 writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
121 AT91_SMC_MODE_EXNW_DISABLE |
122 AT91_SMC_MODE_BAT | AT91_SMC_MODE_DBW_16 |
123 AT91_SMC_MODE_TDF_CYCLE(1),
124 &smc->cs[2].mode);
Sedji Gaouaou97a031b2009-06-25 17:04:15 +0200125#endif
Stelian Pop61e69d72008-05-08 20:52:22 +0200126
127 /* Configure Reset signal as output */
128 at91_set_gpio_output(AT91_PIN_PC10, 0);
129
130 /* Configure Interrupt pin as input, no pull-up */
131 at91_set_gpio_input(AT91_PIN_PC11, 0);
132}
133#endif
134
Wenyou.Yang@microchip.comb59fe682017-07-21 13:28:40 +0800135#ifdef CONFIG_DEBUG_UART_BOARD_INIT
136void board_debug_uart_init(void)
137{
138 at91_seriald_hw_init();
139}
140#endif
141
142#ifdef CONFIG_BOARD_EARLY_INIT_F
143int board_early_init_f(void)
144{
Wenyou.Yang@microchip.comb59fe682017-07-21 13:28:40 +0800145 return 0;
146}
147#endif
148
Stelian Pop61e69d72008-05-08 20:52:22 +0200149int board_init(void)
150{
Sedji Gaouaou97a031b2009-06-25 17:04:15 +0200151#ifdef CONFIG_AT91SAM9G10EK
152 /* arch number of AT91SAM9G10EK-Board */
153 gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9G10EK;
154#else
Stelian Pop61e69d72008-05-08 20:52:22 +0200155 /* arch number of AT91SAM9261EK-Board */
156 gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9261EK;
Sedji Gaouaou97a031b2009-06-25 17:04:15 +0200157#endif
Stelian Pop61e69d72008-05-08 20:52:22 +0200158 /* adress of boot parameters */
Tom Rinibb4dd962022-11-16 13:10:37 -0500159 gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
Stelian Pop61e69d72008-05-08 20:52:22 +0200160
Stelian Pop61e69d72008-05-08 20:52:22 +0200161#ifdef CONFIG_CMD_NAND
162 at91sam9261ek_nand_hw_init();
163#endif
Stelian Pop61e69d72008-05-08 20:52:22 +0200164#ifdef CONFIG_DRIVER_DM9000
165 at91sam9261ek_dm9000_hw_init();
166#endif
Stelian Pop61e69d72008-05-08 20:52:22 +0200167 return 0;
168}
169
Remy Bohmer7eefd922009-05-02 21:49:18 +0200170#ifdef CONFIG_DRIVER_DM9000
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900171int board_eth_init(struct bd_info *bis)
Wolfgang Denke5032c82009-12-07 21:06:40 +0100172{
Remy Bohmer7eefd922009-05-02 21:49:18 +0200173 return dm9000_initialize(bis);
Wolfgang Denke5032c82009-12-07 21:06:40 +0100174}
175#endif
176
Stelian Pop61e69d72008-05-08 20:52:22 +0200177int dram_init(void)
178{
Tom Rinibb4dd962022-11-16 13:10:37 -0500179 gd->ram_size = get_ram_size((void *)CFG_SYS_SDRAM_BASE,
180 CFG_SYS_SDRAM_SIZE);
Xu, Hong0a614942011-07-31 22:49:00 +0000181
Stelian Pop61e69d72008-05-08 20:52:22 +0200182 return 0;
183}
184
185#ifdef CONFIG_RESET_PHY_R
186void reset_phy(void)
187{
188#ifdef CONFIG_DRIVER_DM9000
189 /*
190 * Initialize ethernet HW addr prior to starting Linux,
191 * needed for nfsroot
192 */
Joe Hershberger3dbe17e2015-03-22 17:09:06 -0500193 eth_init();
Stelian Pop61e69d72008-05-08 20:52:22 +0200194#endif
195}
196#endif