]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/emk/top9000/top9000.c
Merge branch 'master' of git://git.denx.de/u-boot-mpc83xx
[karo-tx-uboot.git] / board / emk / top9000 / top9000.c
1 /*
2  * (C) Copyright 2007-2008
3  * Stelian Pop <stelian@popies.net>
4  * Lead Tech Design <www.leadtechdesign.com>
5  *
6  * (C) Copyright 2010
7  * Reinhard Meyer, EMK Elektronik, reinhard.meyer@emk-elektronik.de
8  *
9  * See file CREDITS for list of people who contributed to this
10  * project.
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License as
14  * published by the Free Software Foundation; either version 2 of
15  * the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25  * MA 02111-1307 USA
26  */
27
28 #include <common.h>
29 #include <net.h>
30 #include <netdev.h>
31 #include <mmc.h>
32 #include <i2c.h>
33 #include <spi.h>
34 #include <asm/io.h>
35 #include <asm/arch/hardware.h>
36 #include <asm/arch/at91sam9260_matrix.h>
37 #include <asm/arch/at91sam9_smc.h>
38 #include <asm/arch/at91_common.h>
39 #include <asm/arch/at91_pmc.h>
40 #include <asm/arch/at91_rstc.h>
41 #include <asm/arch/at91_shdwn.h>
42 #include <asm/arch/gpio.h>
43
44 DECLARE_GLOBAL_DATA_PTR;
45
46 #ifdef CONFIG_CMD_NAND
47 static void nand_hw_init(void)
48 {
49         struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
50         struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
51         unsigned long csa;
52
53         /* Assign CS3 to NAND/SmartMedia Interface */
54         csa = readl(&matrix->ebicsa);
55         csa |= AT91_MATRIX_CS3A_SMC_SMARTMEDIA;
56         writel(csa, &matrix->ebicsa);
57
58         /* Configure SMC CS3 for NAND/SmartMedia */
59         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);
67         writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
68                 AT91_SMC_MODE_EXNW_DISABLE |
69                 AT91_SMC_MODE_DBW_8 |
70                 AT91_SMC_MODE_TDF_CYCLE(2),
71                 &smc->cs[3].mode);
72
73         /* Configure RDY/BSY */
74         at91_set_gpio_input(CONFIG_SYS_NAND_READY_PIN, 1);
75
76         /* Enable NandFlash */
77         at91_set_gpio_output(CONFIG_SYS_NAND_ENABLE_PIN, 1);
78 }
79 #endif
80
81 #ifdef CONFIG_MACB
82 static void macb_hw_init(void)
83 {
84         struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
85
86         /* Enable EMAC clock */
87         writel(1 << ATMEL_ID_EMAC0, &pmc->pcer);
88
89         /* Initialize EMAC=MACB hardware */
90         at91_macb_hw_init();
91 }
92 #endif
93
94 #ifdef CONFIG_GENERIC_ATMEL_MCI
95 /* this is a weak define that we are overriding */
96 int board_mmc_init(bd_t *bd)
97 {
98         struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
99
100         /* Enable MCI clock */
101         writel(1 << ATMEL_ID_MCI, &pmc->pcer);
102
103         /* Initialize MCI hardware */
104         at91_mci_hw_init();
105
106         /* This calls the atmel_mmc_init in gen_atmel_mci.c */
107         return atmel_mci_init((void *)ATMEL_BASE_MCI);
108 }
109
110 /* this is a weak define that we are overriding */
111 int board_mmc_getcd(u8 *cd, struct mmc *mmc)
112 {
113         /*
114          * the only currently existing use of this function
115          * (fsl_esdhc.c) suggests this function must return
116          * *cs = TRUE if a card is NOT detected -> in most
117          * cases the value of the pin when the detect switch
118          * closes to GND
119          */
120         *cd = at91_get_gpio_value(CONFIG_SYS_MMC_CD_PIN) ? 1 : 0;
121         return 0;
122 }
123
124 #endif
125
126 int board_early_init_f(void)
127 {
128         struct at91_shdwn *shdwn = (struct at91_shdwn *)ATMEL_BASE_SHDWN;
129         struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
130
131         /*
132          * make sure the board can be powered on by
133          * any transition on WKUP
134          */
135         writel(AT91_SHDW_MR_WKMODE0H2L | AT91_SHDW_MR_WKMODE0L2H,
136                 &shdwn->mr);
137
138         /* Enable clocks for all PIOs */
139         writel((1 << ATMEL_ID_PIOA) | (1 << ATMEL_ID_PIOB) |
140                 (1 << ATMEL_ID_PIOC),
141                 &pmc->pcer);
142
143         /* set SCL0 and SDA0 to open drain */
144         at91_set_pio_output(I2C0_PORT, SCL0_PIN, 1);
145         at91_set_pio_multi_drive(I2C0_PORT, SCL0_PIN, 1);
146         at91_set_pio_pullup(I2C0_PORT, SCL0_PIN, 1);
147         at91_set_pio_output(I2C0_PORT, SDA0_PIN, 1);
148         at91_set_pio_multi_drive(I2C0_PORT, SDA0_PIN, 1);
149         at91_set_pio_pullup(I2C0_PORT, SDA0_PIN, 1);
150
151         /* set SCL1 and SDA1 to open drain */
152         at91_set_pio_output(I2C1_PORT, SCL1_PIN, 1);
153         at91_set_pio_multi_drive(I2C1_PORT, SCL1_PIN, 1);
154         at91_set_pio_pullup(I2C1_PORT, SCL1_PIN, 1);
155         at91_set_pio_output(I2C1_PORT, SDA1_PIN, 1);
156         at91_set_pio_multi_drive(I2C1_PORT, SDA1_PIN, 1);
157         at91_set_pio_pullup(I2C1_PORT, SDA1_PIN, 1);
158         return 0;
159 }
160
161 int board_init(void)
162 {
163         /* arch number of TOP9000 Board */
164         gd->bd->bi_arch_number = MACH_TYPE_TOP9000;
165         /* adress of boot parameters */
166         gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
167
168         at91_seriald_hw_init();
169 #ifdef CONFIG_CMD_NAND
170         nand_hw_init();
171 #endif
172 #ifdef CONFIG_MACB
173         macb_hw_init();
174 #endif
175 #ifdef CONFIG_ATMEL_SPI0
176         /* (n+4) denotes to use nSPISEL(0) in GPIO mode! */
177         at91_spi0_hw_init(1 << (FRAM_CS_NUM + 4));
178 #endif
179 #ifdef CONFIG_ATMEL_SPI1
180         at91_spi1_hw_init(1 << (ENC_CS_NUM + 4));
181 #endif
182         return 0;
183 }
184
185 #ifdef CONFIG_MISC_INIT_R
186 int misc_init_r(void)
187 {
188         /* read 'factory' part of EEPROM */
189         read_factory_r();
190         return 0;
191 }
192 #endif
193
194 int dram_init(void)
195 {
196         gd->ram_size = get_ram_size(
197                 (void *)CONFIG_SYS_SDRAM_BASE,
198                 CONFIG_SYS_SDRAM_SIZE);
199         return 0;
200 }
201
202 #ifdef CONFIG_RESET_PHY_R
203 void reset_phy(void)
204 {
205         /*
206          * Initialize ethernet HW addresses prior to starting Linux,
207          * needed for nfsroot.
208          * TODO: We need to investigate if that is really necessary.
209          */
210         eth_init(gd->bd);
211 }
212 #endif
213
214 int board_eth_init(bd_t *bis)
215 {
216         int rc = 0;
217         int num = 0;
218 #ifdef CONFIG_MACB
219         rc = macb_eth_initialize(0,
220                 (void *)ATMEL_BASE_EMAC0,
221                 CONFIG_SYS_PHY_ID);
222         if (!rc)
223                 num++;
224 #endif
225 #ifdef CONFIG_ENC28J60
226         rc = enc28j60_initialize(ENC_SPI_BUS, ENC_CS_NUM,
227                 ENC_SPI_CLOCK, SPI_MODE_0);
228         if (!rc)
229                 num++;
230 # ifdef CONFIG_ENC28J60_2
231         rc = enc28j60_initialize(ENC_SPI_BUS, ENC_CS_NUM+1,
232                 ENC_SPI_CLOCK, SPI_MODE_0);
233         if (!rc)
234                 num++;
235 #  ifdef CONFIG_ENC28J60_3
236         rc = enc28j60_initialize(ENC_SPI_BUS, ENC_CS_NUM+2,
237                 ENC_SPI_CLOCK, SPI_MODE_0);
238         if (!rc)
239                 num++;
240 #  endif
241 # endif
242 #endif
243         return num;
244 }
245
246 /*
247  * I2C access functions
248  *
249  * Note:
250  * We need to access Bus 0 before relocation to access the
251  * environment settings.
252  * However i2c_get_bus_num() cannot be called before
253  * relocation.
254  */
255 #ifdef CONFIG_SOFT_I2C
256 void iic_init(void)
257 {
258         /* ports are now initialized in board_early_init_f() */
259 }
260
261 int iic_read(void)
262 {
263         switch ((gd->flags & GD_FLG_RELOC) ? i2c_get_bus_num() : 0) {
264         case 0:
265                 return at91_get_pio_value(I2C0_PORT, SDA0_PIN);
266         case 1:
267                 return at91_get_pio_value(I2C1_PORT, SDA1_PIN);
268         }
269         return 1;
270 }
271
272 void iic_sda(int bit)
273 {
274         switch ((gd->flags & GD_FLG_RELOC) ? i2c_get_bus_num() : 0) {
275         case 0:
276                 at91_set_pio_value(I2C0_PORT, SDA0_PIN, bit);
277                 break;
278         case 1:
279                 at91_set_pio_value(I2C1_PORT, SDA1_PIN, bit);
280                 break;
281         }
282 }
283
284 void iic_scl(int bit)
285 {
286         switch ((gd->flags & GD_FLG_RELOC) ? i2c_get_bus_num() : 0) {
287         case 0:
288                 at91_set_pio_value(I2C0_PORT, SCL0_PIN, bit);
289                 break;
290         case 1:
291                 at91_set_pio_value(I2C1_PORT, SCL1_PIN, bit);
292                 break;
293         }
294 }
295
296 #endif