blob: 09f59a0f0dc0ff00514080e434f29a3dbac255e0 [file] [log] [blame]
wdenkfe8c2802002-11-03 00:38:21 +00001/*
2 * (C) Copyright 2002
3 * Custom IDEAS, Inc. <www.cideas.com>
4 * Gerald Van Baren <vanbaren@cideas.com>
5 *
6 * See file CREDITS for list of people who contributed to this
7 * project.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22 * MA 02111-1307 USA
23 */
24
wdenkfe8c2802002-11-03 00:38:21 +000025#include <common.h>
Wolfgang Denk4ff170a2008-07-03 22:34:08 +020026#include <asm/u-boot.h>
wdenkfe8c2802002-11-03 00:38:21 +000027#include <ioports.h>
28#include <mpc8260.h>
wdenkfe8c2802002-11-03 00:38:21 +000029#include <i2c.h>
30#include <spi.h>
wdenk78137c32003-09-15 18:00:00 +000031#include <command.h>
wdenkfe8c2802002-11-03 00:38:21 +000032
33#ifdef CONFIG_SHOW_BOOT_PROGRESS
34#include <status_led.h>
35#endif
36
wdenk78137c32003-09-15 18:00:00 +000037#ifdef CONFIG_ETHER_LOOPBACK_TEST
38extern void eth_loopback_test(void);
39#endif /* CONFIG_ETHER_LOOPBACK_TEST */
40
wdenkfe8c2802002-11-03 00:38:21 +000041#include "clkinit.h"
Wolfgang Denke615de02011-11-05 05:13:14 +000042#include "ioconfig.h" /* I/O configuration table */
wdenkfe8c2802002-11-03 00:38:21 +000043
44/*
45 * PBI Page Based Interleaving
46 * PSDMR_PBI page based interleaving
47 * 0 bank based interleaving
48 * External Address Multiplexing (EAMUX) adds a clock to address cycles
49 * (this can help with marginal board layouts)
50 * PSDMR_EAMUX adds a clock
51 * 0 no extra clock
52 * Buffer Command (BUFCMD) adds a clock to command cycles.
53 * PSDMR_BUFCMD adds a clock
54 * 0 no extra clock
55 */
56#define CONFIG_PBI PSDMR_PBI
57#define PESSIMISTIC_SDRAM 0
58#define EAMUX 0 /* EST requires EAMUX */
59#define BUFCMD 0
60
61/*
62 * ADC/DAC Defines:
63 */
Wolfgang Denke615de02011-11-05 05:13:14 +000064#define INITIAL_SAMPLE_RATE 10016 /* Initial Daq sample rate */
65#define INITIAL_RIGHT_JUST 0 /* Initial DAC right justification */
66#define INITIAL_MCLK_DIVIDE 0 /* Initial MCLK Divide */
67#define INITIAL_SAMPLE_64X 1 /* Initial 64x clocking mode */
68#define INITIAL_SAMPLE_128X 0 /* Initial 128x clocking mode */
wdenkfe8c2802002-11-03 00:38:21 +000069
70/*
71 * ADC Defines:
72 */
Wolfgang Denke615de02011-11-05 05:13:14 +000073#define I2C_ADC_1_ADDR 0x0E /* I2C Address of the ADC #1 */
74#define I2C_ADC_2_ADDR 0x0F /* I2C Address of the ADC #2 */
wdenkfe8c2802002-11-03 00:38:21 +000075
Wolfgang Denke615de02011-11-05 05:13:14 +000076#define ADC_SDATA1_MASK 0x00020000 /* PA14 - CH12SDATA_PU */
77#define ADC_SDATA2_MASK 0x00010000 /* PA15 - CH34SDATA_PU */
wdenkfe8c2802002-11-03 00:38:21 +000078
Wolfgang Denke615de02011-11-05 05:13:14 +000079#define ADC_VREF_CAP 100 /* VREF capacitor in uF */
80#define ADC_INITIAL_DELAY (10 * ADC_VREF_CAP) /* 10 usec per uF, in usec */
81#define ADC_SDATA_DELAY 100 /* ADC SDATA release delay in usec */
wdenkfe8c2802002-11-03 00:38:21 +000082#define ADC_CAL_DELAY (1000000 / INITIAL_SAMPLE_RATE * 4500)
Wolfgang Denke615de02011-11-05 05:13:14 +000083 /* Wait at least 4100 LRCLK's */
wdenkfe8c2802002-11-03 00:38:21 +000084
Wolfgang Denke615de02011-11-05 05:13:14 +000085#define ADC_REG1_FRAME_START 0x80 /* Frame start */
86#define ADC_REG1_GROUND_CAL 0x40 /* Ground calibration enable */
87#define ADC_REG1_ANA_MOD_PDOWN 0x20 /* Analog modulator section in power down */
88#define ADC_REG1_DIG_MOD_PDOWN 0x10 /* Digital modulator section in power down */
wdenkfe8c2802002-11-03 00:38:21 +000089
Wolfgang Denke615de02011-11-05 05:13:14 +000090#define ADC_REG2_128x 0x80 /* Oversample at 128x */
91#define ADC_REG2_CAL 0x40 /* System calibration enable */
92#define ADC_REG2_CHANGE_SIGN 0x20 /* Change sign enable */
93#define ADC_REG2_LR_DISABLE 0x10 /* Left/Right output disable */
94#define ADC_REG2_HIGH_PASS_DIS 0x08 /* High pass filter disable */
95#define ADC_REG2_SLAVE_MODE 0x04 /* Slave mode */
96#define ADC_REG2_DFS 0x02 /* Digital format select */
97#define ADC_REG2_MUTE 0x01 /* Mute */
wdenkfe8c2802002-11-03 00:38:21 +000098
Wolfgang Denke615de02011-11-05 05:13:14 +000099#define ADC_REG7_ADDR_ENABLE 0x80 /* Address enable */
100#define ADC_REG7_PEAK_ENABLE 0x40 /* Peak enable */
101#define ADC_REG7_PEAK_UPDATE 0x20 /* Peak update */
102#define ADC_REG7_PEAK_FORMAT 0x10 /* Peak display format */
103#define ADC_REG7_DIG_FILT_PDOWN 0x04 /* Digital filter power down enable */
104#define ADC_REG7_FIR2_IN_EN 0x02 /* External FIR2 input enable */
105#define ADC_REG7_PSYCHO_EN 0x01 /* External pyscho filter input enable */
wdenkfe8c2802002-11-03 00:38:21 +0000106
107/*
108 * DAC Defines:
109 */
110
Wolfgang Denke615de02011-11-05 05:13:14 +0000111#define I2C_DAC_ADDR 0x11 /* I2C Address of the DAC */
wdenkfe8c2802002-11-03 00:38:21 +0000112
Wolfgang Denke615de02011-11-05 05:13:14 +0000113#define DAC_RST_MASK 0x00008000 /* PA16 - DAC_RST* */
114#define DAC_RESET_DELAY 100 /* DAC reset delay in usec */
115#define DAC_INITIAL_DELAY 5000 /* DAC initialization delay in usec */
wdenkfe8c2802002-11-03 00:38:21 +0000116
Wolfgang Denke615de02011-11-05 05:13:14 +0000117#define DAC_REG1_AMUTE 0x80 /* Auto-mute */
wdenkfe8c2802002-11-03 00:38:21 +0000118
Wolfgang Denke615de02011-11-05 05:13:14 +0000119#define DAC_REG1_LEFT_JUST_24_BIT (0 << 4) /* Fmt 0: Left justified 24 bit */
120#define DAC_REG1_I2S_24_BIT (1 << 4) /* Fmt 1: I2S up to 24 bit */
121#define DAC_REG1_RIGHT_JUST_16BIT (2 << 4) /* Fmt 2: Right justified 16 bit */
122#define DAC_REG1_RIGHT_JUST_24BIT (3 << 4) /* Fmt 3: Right justified 24 bit */
123#define DAC_REG1_RIGHT_JUST_20BIT (4 << 4) /* Fmt 4: Right justified 20 bit */
124#define DAC_REG1_RIGHT_JUST_18BIT (5 << 4) /* Fmt 5: Right justified 18 bit */
wdenkfe8c2802002-11-03 00:38:21 +0000125
Wolfgang Denke615de02011-11-05 05:13:14 +0000126#define DAC_REG1_DEM_NO (0 << 2) /* No De-emphasis */
127#define DAC_REG1_DEM_44KHZ (1 << 2) /* 44.1KHz De-emphasis */
128#define DAC_REG1_DEM_48KHZ (2 << 2) /* 48KHz De-emphasis */
129#define DAC_REG1_DEM_32KHZ (3 << 2) /* 32KHz De-emphasis */
wdenkfe8c2802002-11-03 00:38:21 +0000130
Wolfgang Denke615de02011-11-05 05:13:14 +0000131#define DAC_REG1_SINGLE 0 /* 4- 50KHz sample rate */
132#define DAC_REG1_DOUBLE 1 /* 50-100KHz sample rate */
133#define DAC_REG1_QUAD 2 /* 100-200KHz sample rate */
134#define DAC_REG1_DSD 3 /* Direct Stream Data, DSD */
wdenkfe8c2802002-11-03 00:38:21 +0000135
Wolfgang Denke615de02011-11-05 05:13:14 +0000136#define DAC_REG5_INVERT_A 0x80 /* Invert channel A */
137#define DAC_REG5_INVERT_B 0x40 /* Invert channel B */
138#define DAC_REG5_I2C_MODE 0x20 /* Control port (I2C) mode */
139#define DAC_REG5_POWER_DOWN 0x10 /* Power down mode */
140#define DAC_REG5_MUTEC_A_B 0x08 /* Mutec A=B */
141#define DAC_REG5_FREEZE 0x04 /* Freeze */
142#define DAC_REG5_MCLK_DIV 0x02 /* MCLK divide by 2 */
143#define DAC_REG5_RESERVED 0x01 /* Reserved */
wdenkfe8c2802002-11-03 00:38:21 +0000144
145/*
146 * Check Board Identity:
147 */
148
149int checkboard(void)
150{
Wolfgang Denke615de02011-11-05 05:13:14 +0000151 printf("SACSng\n");
wdenkfe8c2802002-11-03 00:38:21 +0000152
Wolfgang Denke615de02011-11-05 05:13:14 +0000153 return 0;
wdenkfe8c2802002-11-03 00:38:21 +0000154}
155
Becky Bruce9973e3c2008-06-09 16:03:40 -0500156phys_size_t initdram(int board_type)
wdenkfe8c2802002-11-03 00:38:21 +0000157{
Wolfgang Denke615de02011-11-05 05:13:14 +0000158 volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
159 volatile memctl8260_t *memctl = &immap->im_memctl;
160 volatile uchar c = 0;
161 volatile uchar *ramaddr = (uchar *)(CONFIG_SYS_SDRAM_BASE + 0x8);
162 uint psdmr = CONFIG_SYS_PSDMR;
163 int i;
164 uint psrt = 14; /* for no SPD */
165 uint chipselects = 1; /* for no SPD */
166 uint sdram_size = CONFIG_SYS_SDRAM0_SIZE * 1024 * 1024; /* for no SPD */
167 uint or = CONFIG_SYS_OR2_PRELIM; /* for no SPD */
168
wdenkfe8c2802002-11-03 00:38:21 +0000169#ifdef SDRAM_SPD_ADDR
Wolfgang Denke615de02011-11-05 05:13:14 +0000170 uint data_width;
171 uint rows;
172 uint banks;
173 uint cols;
174 uint caslatency;
175 uint width;
176 uint rowst;
177 uint sdam;
178 uint bsma;
179 uint sda10;
180 u_char spd_size;
181 u_char data;
182 u_char cksum;
183 int j;
wdenkfe8c2802002-11-03 00:38:21 +0000184#endif
185
186#ifdef SDRAM_SPD_ADDR
Wolfgang Denke615de02011-11-05 05:13:14 +0000187 /* Keep the compiler from complaining about potentially uninitialized vars */
188 data_width = chipselects = rows = banks = cols = caslatency = psrt =
189 0;
wdenkfe8c2802002-11-03 00:38:21 +0000190
Wolfgang Denke615de02011-11-05 05:13:14 +0000191 /*
192 * Read the SDRAM SPD EEPROM via I2C.
193 */
194 i2c_read(SDRAM_SPD_ADDR, 0, 1, &data, 1);
195 spd_size = data;
196 cksum = data;
197 for (j = 1; j < 64; j++) { /* read only the checksummed bytes */
198 /* note: the I2C address autoincrements when alen == 0 */
199 i2c_read(SDRAM_SPD_ADDR, 0, 0, &data, 1);
200 if (j == 5)
201 chipselects = data & 0x0F;
202 else if (j == 6)
203 data_width = data;
204 else if (j == 7)
205 data_width |= data << 8;
206 else if (j == 3)
207 rows = data & 0x0F;
208 else if (j == 4)
209 cols = data & 0x0F;
210 else if (j == 12) {
211 /*
212 * Refresh rate: this assumes the prescaler is set to
213 * approximately 1uSec per tick.
214 */
215 switch (data & 0x7F) {
216 default:
217 case 0:
218 psrt = 14; /* 15.625uS */
219 break;
220 case 1:
221 psrt = 2; /* 3.9uS */
222 break;
223 case 2:
224 psrt = 6; /* 7.8uS */
225 break;
226 case 3:
227 psrt = 29; /* 31.3uS */
228 break;
229 case 4:
230 psrt = 60; /* 62.5uS */
231 break;
232 case 5:
233 psrt = 120; /* 125uS */
234 break;
235 }
236 } else if (j == 17)
237 banks = data;
238 else if (j == 18) {
239 caslatency = 3; /* default CL */
wdenkfe8c2802002-11-03 00:38:21 +0000240#if(PESSIMISTIC_SDRAM)
Wolfgang Denke615de02011-11-05 05:13:14 +0000241 if ((data & 0x04) != 0)
242 caslatency = 3;
243 else if ((data & 0x02) != 0)
244 caslatency = 2;
245 else if ((data & 0x01) != 0)
246 caslatency = 1;
wdenkfe8c2802002-11-03 00:38:21 +0000247#else
Wolfgang Denke615de02011-11-05 05:13:14 +0000248 if ((data & 0x01) != 0)
249 caslatency = 1;
250 else if ((data & 0x02) != 0)
251 caslatency = 2;
252 else if ((data & 0x04) != 0)
253 caslatency = 3;
wdenkfe8c2802002-11-03 00:38:21 +0000254#endif
Wolfgang Denke615de02011-11-05 05:13:14 +0000255 else {
256 printf("WARNING: Unknown CAS latency 0x%02X, using 3\n", data);
257 }
258 } else if (j == 63) {
259 if (data != cksum) {
260 printf("WARNING: Configuration data checksum failure:" " is 0x%02x, calculated 0x%02x\n", data, cksum);
261 }
262 }
263 cksum += data;
wdenkfe8c2802002-11-03 00:38:21 +0000264 }
Wolfgang Denke615de02011-11-05 05:13:14 +0000265
266 /* We don't trust CL less than 2 (only saw it on an old 16MByte DIMM) */
267 if (caslatency < 2) {
268 printf("WARNING: CL was %d, forcing to 2\n", caslatency);
269 caslatency = 2;
wdenkfe8c2802002-11-03 00:38:21 +0000270 }
Wolfgang Denke615de02011-11-05 05:13:14 +0000271 if (rows > 14) {
272 printf("WARNING: This doesn't look good, rows = %d, should be <= 14\n",
273 rows);
274 rows = 14;
275 }
276 if (cols > 11) {
277 printf("WARNING: This doesn't look good, columns = %d, should be <= 11\n",
278 cols);
279 cols = 11;
280 }
wdenkfe8c2802002-11-03 00:38:21 +0000281
Wolfgang Denke615de02011-11-05 05:13:14 +0000282 if ((data_width != 64) && (data_width != 72)) {
283 printf("WARNING: SDRAM width unsupported, is %d, expected 64 or 72.\n",
284 data_width);
285 }
286 width = 3; /* 2^3 = 8 bytes = 64 bits wide */
287 /*
288 * Convert banks into log2(banks)
289 */
290 if (banks == 2)
291 banks = 1;
292 else if (banks == 4)
293 banks = 2;
294 else if (banks == 8)
295 banks = 3;
wdenkfe8c2802002-11-03 00:38:21 +0000296
Wolfgang Denke615de02011-11-05 05:13:14 +0000297 sdram_size = 1 << (rows + cols + banks + width);
wdenkfe8c2802002-11-03 00:38:21 +0000298
Wolfgang Denke615de02011-11-05 05:13:14 +0000299#if(CONFIG_PBI == 0) /* bank-based interleaving */
300 rowst = ((32 - 6) - (rows + cols + width)) * 2;
wdenkfe8c2802002-11-03 00:38:21 +0000301#else
Wolfgang Denke615de02011-11-05 05:13:14 +0000302 rowst = 32 - (rows + banks + cols + width);
wdenkfe8c2802002-11-03 00:38:21 +0000303#endif
304
Wolfgang Denke615de02011-11-05 05:13:14 +0000305 or = ~(sdram_size - 1) | /* SDAM address mask */
306 ((banks - 1) << 13) | /* banks per device */
307 (rowst << 9) | /* rowst */
308 ((rows - 9) << 6); /* numr */
wdenkfe8c2802002-11-03 00:38:21 +0000309
Wolfgang Denke615de02011-11-05 05:13:14 +0000310 memctl->memc_or2 = or;
wdenkfe8c2802002-11-03 00:38:21 +0000311
Wolfgang Denke615de02011-11-05 05:13:14 +0000312 /*
313 * SDAM specifies the number of columns that are multiplexed
314 * (reference AN2165/D), defined to be (columns - 6) for page
315 * interleave, (columns - 8) for bank interleave.
316 *
317 * BSMA is 14 - max(rows, cols). The bank select lines come
318 * into play above the highest "address" line going into the
319 * the SDRAM.
320 */
321#if(CONFIG_PBI == 0) /* bank-based interleaving */
322 sdam = cols - 8;
323 bsma = ((31 - width) - 14) - ((rows > cols) ? rows : cols);
324 sda10 = sdam + 2;
wdenkfe8c2802002-11-03 00:38:21 +0000325#else
Wolfgang Denke615de02011-11-05 05:13:14 +0000326 sdam = cols - 6;
327 bsma = ((31 - width) - 14) - ((rows > cols) ? rows : cols);
328 sda10 = sdam;
wdenkfe8c2802002-11-03 00:38:21 +0000329#endif
330#if(PESSIMISTIC_SDRAM)
Wolfgang Denke615de02011-11-05 05:13:14 +0000331 psdmr = (CONFIG_PBI | PSDMR_RFEN | PSDMR_RFRC_16_CLK |
332 PSDMR_PRETOACT_8W | PSDMR_ACTTORW_8W | PSDMR_WRC_4C |
333 PSDMR_EAMUX | PSDMR_BUFCMD) | caslatency |
334 ((caslatency - 1) << 6) | /* LDOTOPRE is CL - 1 */
335 (sdam << 24) | (bsma << 21) | (sda10 << 18);
wdenkfe8c2802002-11-03 00:38:21 +0000336#else
Wolfgang Denke615de02011-11-05 05:13:14 +0000337 psdmr = (CONFIG_PBI | PSDMR_RFEN | PSDMR_RFRC_7_CLK |
338 PSDMR_PRETOACT_3W | /* 1 for 7E parts (fast PC-133) */
339 PSDMR_ACTTORW_2W | /* 1 for 7E parts (fast PC-133) */
340 PSDMR_WRC_1C | /* 1 clock + 7nSec */
341 EAMUX | BUFCMD) |
342 caslatency | ((caslatency - 1) << 6) | /* LDOTOPRE is CL - 1 */
343 (sdam << 24) | (bsma << 21) | (sda10 << 18);
wdenkfe8c2802002-11-03 00:38:21 +0000344#endif
345#endif
346
Wolfgang Denke615de02011-11-05 05:13:14 +0000347 /*
348 * Quote from 8260 UM (10.4.2 SDRAM Power-On Initialization, 10-35):
349 *
350 * "At system reset, initialization software must set up the
351 * programmable parameters in the memory controller banks registers
352 * (ORx, BRx, P/LSDMR). After all memory parameters are configured,
353 * system software should execute the following initialization sequence
354 * for each SDRAM device.
355 *
356 * 1. Issue a PRECHARGE-ALL-BANKS command
357 * 2. Issue eight CBR REFRESH commands
358 * 3. Issue a MODE-SET command to initialize the mode register
359 *
360 * Quote from Micron MT48LC8M16A2 data sheet:
361 *
362 * "...the SDRAM requires a 100uS delay prior to issuing any
363 * command other than a COMMAND INHIBIT or NOP. Starting at some
364 * point during this 100uS period and continuing at least through
365 * the end of this period, COMMAND INHIBIT or NOP commands should
366 * be applied."
367 *
368 * "Once the 100uS delay has been satisfied with at least one COMMAND
369 * INHIBIT or NOP command having been applied, a /PRECHARGE command/
370 * should be applied. All banks must then be precharged, thereby
371 * placing the device in the all banks idle state."
372 *
373 * "Once in the idle state, /two/ AUTO REFRESH cycles must be
374 * performed. After the AUTO REFRESH cycles are complete, the
375 * SDRAM is ready for mode register programming."
376 *
377 * (/emphasis/ mine, gvb)
378 *
379 * The way I interpret this, Micron start up sequence is:
380 * 1. Issue a PRECHARGE-BANK command (initial precharge)
381 * 2. Issue a PRECHARGE-ALL-BANKS command ("all banks ... precharged")
382 * 3. Issue two (presumably, doing eight is OK) CBR REFRESH commands
383 * 4. Issue a MODE-SET command to initialize the mode register
384 *
385 * --------
386 *
387 * The initial commands are executed by setting P/LSDMR[OP] and
388 * accessing the SDRAM with a single-byte transaction."
389 *
390 * The appropriate BRx/ORx registers have already been set when we
391 * get here. The SDRAM can be accessed at the address CONFIG_SYS_SDRAM_BASE.
392 */
wdenkfe8c2802002-11-03 00:38:21 +0000393
Wolfgang Denke615de02011-11-05 05:13:14 +0000394 memctl->memc_mptpr = CONFIG_SYS_MPTPR;
395 memctl->memc_psrt = psrt;
wdenkfe8c2802002-11-03 00:38:21 +0000396
397 memctl->memc_psdmr = psdmr | PSDMR_OP_PREA;
398 *ramaddr = c;
399
400 memctl->memc_psdmr = psdmr | PSDMR_OP_CBRR;
401 for (i = 0; i < 8; i++)
Wolfgang Denke615de02011-11-05 05:13:14 +0000402 *ramaddr = c;
wdenkfe8c2802002-11-03 00:38:21 +0000403
404 memctl->memc_psdmr = psdmr | PSDMR_OP_MRW;
405 *ramaddr = c;
406
407 memctl->memc_psdmr = psdmr | PSDMR_OP_NORM | PSDMR_RFEN;
408 *ramaddr = c;
wdenkfe8c2802002-11-03 00:38:21 +0000409
Wolfgang Denke615de02011-11-05 05:13:14 +0000410 /*
411 * Do it a second time for the second set of chips if the DIMM has
412 * two chip selects (double sided).
413 */
414 if (chipselects > 1) {
415 ramaddr += sdram_size;
416
417 memctl->memc_br3 = CONFIG_SYS_BR3_PRELIM + sdram_size;
418 memctl->memc_or3 = or;
419
420 memctl->memc_psdmr = psdmr | PSDMR_OP_PREA;
421 *ramaddr = c;
422
423 memctl->memc_psdmr = psdmr | PSDMR_OP_CBRR;
424 for (i = 0; i < 8; i++)
425 *ramaddr = c;
426
427 memctl->memc_psdmr = psdmr | PSDMR_OP_MRW;
428 *ramaddr = c;
429
430 memctl->memc_psdmr = psdmr | PSDMR_OP_NORM | PSDMR_RFEN;
431 *ramaddr = c;
432 }
433
434 /* return total ram size */
435 return (sdram_size * chipselects);
wdenkfe8c2802002-11-03 00:38:21 +0000436}
437
438/*-----------------------------------------------------------------------
439 * Board Control Functions
440 */
Wolfgang Denke615de02011-11-05 05:13:14 +0000441void board_poweroff(void)
wdenkfe8c2802002-11-03 00:38:21 +0000442{
Wolfgang Denke615de02011-11-05 05:13:14 +0000443 while (1); /* hang forever */
wdenkfe8c2802002-11-03 00:38:21 +0000444}
445
446
447#ifdef CONFIG_MISC_INIT_R
448/* ------------------------------------------------------------------------- */
449int misc_init_r(void)
450{
Wolfgang Denke615de02011-11-05 05:13:14 +0000451 /*
452 * Note: iop is used by the I2C macros, and iopa by the ADC/DAC initialization.
453 */
454 volatile ioport_t *iopa =
455 ioport_addr((immap_t *)CONFIG_SYS_IMMR, 0 /* port A */ );
456 volatile ioport_t *iop =
457 ioport_addr((immap_t *)CONFIG_SYS_IMMR, I2C_PORT);
wdenkfe8c2802002-11-03 00:38:21 +0000458
Wolfgang Denke615de02011-11-05 05:13:14 +0000459 int reg; /* I2C register value */
460 char *ep; /* Environment pointer */
461 char str_buf[12]; /* sprintf output buffer */
462 int sample_rate; /* ADC/DAC sample rate */
463 int sample_64x; /* Use 64/4 clocking for the ADC/DAC */
464 int sample_128x; /* Use 128/4 clocking for the ADC/DAC */
465 int right_just; /* Is the data to the DAC right justified? */
466 int mclk_divide; /* MCLK Divide */
467 int quiet; /* Quiet or minimal output mode */
wdenk78137c32003-09-15 18:00:00 +0000468
Wolfgang Denke615de02011-11-05 05:13:14 +0000469 quiet = 0;
wdenkfe8c2802002-11-03 00:38:21 +0000470
Wolfgang Denke615de02011-11-05 05:13:14 +0000471 if ((ep = getenv("quiet")) != NULL)
472 quiet = simple_strtol(ep, NULL, 10);
473 else
474 setenv("quiet", "0");
wdenkfe8c2802002-11-03 00:38:21 +0000475
Wolfgang Denke615de02011-11-05 05:13:14 +0000476 /*
477 * SACSng custom initialization:
478 * Start the ADC and DAC clocks, since the Crystal parts do not
479 * work on the I2C bus until the clocks are running.
480 */
wdenkfe8c2802002-11-03 00:38:21 +0000481
Wolfgang Denke615de02011-11-05 05:13:14 +0000482 sample_rate = INITIAL_SAMPLE_RATE;
483 if ((ep = getenv("DaqSampleRate")) != NULL)
484 sample_rate = simple_strtol(ep, NULL, 10);
485
486 sample_64x = INITIAL_SAMPLE_64X;
487 sample_128x = INITIAL_SAMPLE_128X;
488 if ((ep = getenv("Daq64xSampling")) != NULL) {
489 sample_64x = simple_strtol(ep, NULL, 10);
490 if (sample_64x)
491 sample_128x = 0;
492 else
493 sample_128x = 1;
494 } else {
495 if ((ep = getenv("Daq128xSampling")) != NULL) {
496 sample_128x = simple_strtol(ep, NULL, 10);
497 if (sample_128x)
498 sample_64x = 0;
499 else
500 sample_64x = 1;
501 }
502 }
503
504 /*
505 * Stop the clocks and wait for at least 1 LRCLK period
506 * to make sure the clocking has really stopped.
507 */
508 Daq_Stop_Clocks();
509 udelay((1000000 / sample_rate) * NUM_LRCLKS_TO_STABILIZE);
510
511 /*
512 * Initialize the clocks with the new rates
513 */
514 Daq_Init_Clocks(sample_rate, sample_64x);
515 sample_rate = Daq_Get_SampleRate();
516
517 /*
518 * Start the clocks and wait for at least 1 LRCLK period
519 * to make sure the clocking has become stable.
520 */
521 Daq_Start_Clocks(sample_rate);
522 udelay((1000000 / sample_rate) * NUM_LRCLKS_TO_STABILIZE);
523
524 sprintf(str_buf, "%d", sample_rate);
525 setenv("DaqSampleRate", str_buf);
526
wdenkfe8c2802002-11-03 00:38:21 +0000527 if (sample_64x) {
Wolfgang Denke615de02011-11-05 05:13:14 +0000528 setenv("Daq64xSampling", "1");
529 setenv("Daq128xSampling", NULL);
530 } else {
531 setenv("Daq64xSampling", NULL);
532 setenv("Daq128xSampling", "1");
wdenkfe8c2802002-11-03 00:38:21 +0000533 }
Wolfgang Denke615de02011-11-05 05:13:14 +0000534
535 /*
536 * Display the ADC/DAC clocking information
537 */
538 if (!quiet)
539 Daq_Display_Clocks();
540
541 /*
542 * Determine the DAC data justification
543 */
544
545 right_just = INITIAL_RIGHT_JUST;
546 if ((ep = getenv("DaqDACRightJustified")) != NULL)
547 right_just = simple_strtol(ep, NULL, 10);
548
549 sprintf(str_buf, "%d", right_just);
550 setenv("DaqDACRightJustified", str_buf);
551
552 /*
553 * Determine the DAC MCLK Divide
554 */
555
556 mclk_divide = INITIAL_MCLK_DIVIDE;
557 if ((ep = getenv("DaqDACMClockDivide")) != NULL)
558 mclk_divide = simple_strtol(ep, NULL, 10);
559
560 sprintf(str_buf, "%d", mclk_divide);
561 setenv("DaqDACMClockDivide", str_buf);
562
563 /*
564 * Initializing the I2C address in the Crystal A/Ds:
565 *
566 * 1) Wait for VREF cap to settle (10uSec per uF)
567 * 2) Release pullup on SDATA
568 * 3) Write the I2C address to register 6
569 * 4) Enable address matching by setting the MSB in register 7
570 */
571
572 if (!quiet)
573 printf("Initializing the ADC...\n");
574
575 udelay(ADC_INITIAL_DELAY); /* 10uSec per uF of VREF cap */
576
577 iopa->pdat &= ~ADC_SDATA1_MASK; /* release SDATA1 */
578 udelay(ADC_SDATA_DELAY); /* arbitrary settling time */
579
580 i2c_reg_write(0x00, 0x06, I2C_ADC_1_ADDR); /* set address */
581 i2c_reg_write(I2C_ADC_1_ADDR, 0x07, /* turn on ADDREN */
582 ADC_REG7_ADDR_ENABLE);
583
584 i2c_reg_write(I2C_ADC_1_ADDR, 0x02, /* 128x, slave mode, !HPEN */
585 (sample_64x ? 0 : ADC_REG2_128x) |
586 ADC_REG2_HIGH_PASS_DIS | ADC_REG2_SLAVE_MODE);
587
588 reg = i2c_reg_read(I2C_ADC_1_ADDR, 0x06) & 0x7F;
589 if (reg != I2C_ADC_1_ADDR) {
590 printf("Init of ADC U10 failed: address is 0x%02X should be 0x%02X\n",
591 reg, I2C_ADC_1_ADDR);
wdenkfe8c2802002-11-03 00:38:21 +0000592 }
Wolfgang Denke615de02011-11-05 05:13:14 +0000593
594 iopa->pdat &= ~ADC_SDATA2_MASK; /* release SDATA2 */
595 udelay(ADC_SDATA_DELAY); /* arbitrary settling time */
596
597 /* set address (do not set ADDREN yet) */
598 i2c_reg_write(0x00, 0x06, I2C_ADC_2_ADDR);
599
600 i2c_reg_write(I2C_ADC_2_ADDR, 0x02, /* 64x, slave mode, !HPEN */
601 (sample_64x ? 0 : ADC_REG2_128x) |
602 ADC_REG2_HIGH_PASS_DIS | ADC_REG2_SLAVE_MODE);
603
604 reg = i2c_reg_read(I2C_ADC_2_ADDR, 0x06) & 0x7F;
605 if (reg != I2C_ADC_2_ADDR) {
606 printf("Init of ADC U15 failed: address is 0x%02X should be 0x%02X\n",
607 reg, I2C_ADC_2_ADDR);
wdenkfe8c2802002-11-03 00:38:21 +0000608 }
wdenkfe8c2802002-11-03 00:38:21 +0000609
Wolfgang Denke615de02011-11-05 05:13:14 +0000610 i2c_reg_write(I2C_ADC_1_ADDR, 0x01, /* set FSTART and GNDCAL */
611 ADC_REG1_FRAME_START | ADC_REG1_GROUND_CAL);
wdenkeb9401e2002-11-11 02:11:37 +0000612
Wolfgang Denke615de02011-11-05 05:13:14 +0000613 i2c_reg_write(I2C_ADC_1_ADDR, 0x02, /* Start calibration */
614 (sample_64x ? 0 : ADC_REG2_128x) |
615 ADC_REG2_CAL |
616 ADC_REG2_HIGH_PASS_DIS | ADC_REG2_SLAVE_MODE);
wdenkeb9401e2002-11-11 02:11:37 +0000617
Wolfgang Denke615de02011-11-05 05:13:14 +0000618 udelay(ADC_CAL_DELAY); /* a minimum of 4100 LRCLKs */
619 i2c_reg_write(I2C_ADC_1_ADDR, 0x01, 0x00); /* remove GNDCAL */
wdenkfe8c2802002-11-03 00:38:21 +0000620
Wolfgang Denke615de02011-11-05 05:13:14 +0000621 /*
622 * Now that we have synchronized the ADC's, enable address
623 * selection on the second ADC as well as the first.
624 */
625 i2c_reg_write(I2C_ADC_2_ADDR, 0x07, ADC_REG7_ADDR_ENABLE);
wdenkfe8c2802002-11-03 00:38:21 +0000626
Wolfgang Denke615de02011-11-05 05:13:14 +0000627 /*
628 * Initialize the Crystal DAC
629 *
630 * Two of the config lines are used for I2C so we have to set them
631 * to the proper initialization state without inadvertantly
632 * sending an I2C "start" sequence. When we bring the I2C back to
633 * the normal state, we send an I2C "stop" sequence.
634 */
635 if (!quiet)
636 printf("Initializing the DAC...\n");
wdenkfe8c2802002-11-03 00:38:21 +0000637
Wolfgang Denke615de02011-11-05 05:13:14 +0000638 /*
639 * Bring the I2C clock and data lines low for initialization
640 */
641 I2C_SCL(0);
642 I2C_DELAY;
643 I2C_SDA(0);
644 I2C_ACTIVE;
645 I2C_DELAY;
wdenkfe8c2802002-11-03 00:38:21 +0000646
Wolfgang Denke615de02011-11-05 05:13:14 +0000647 /* Reset the DAC */
648 iopa->pdat &= ~DAC_RST_MASK;
649 udelay(DAC_RESET_DELAY);
wdenkfe8c2802002-11-03 00:38:21 +0000650
Wolfgang Denke615de02011-11-05 05:13:14 +0000651 /* Release the DAC reset */
652 iopa->pdat |= DAC_RST_MASK;
653 udelay(DAC_INITIAL_DELAY);
wdenkfe8c2802002-11-03 00:38:21 +0000654
Wolfgang Denke615de02011-11-05 05:13:14 +0000655 /*
656 * Cause the DAC to:
657 * Enable control port (I2C mode)
658 * Going into power down
659 */
660 i2c_reg_write(I2C_DAC_ADDR, 0x05,
661 DAC_REG5_I2C_MODE | DAC_REG5_POWER_DOWN);
wdenkfe8c2802002-11-03 00:38:21 +0000662
Wolfgang Denke615de02011-11-05 05:13:14 +0000663 /*
664 * Cause the DAC to:
665 * Enable control port (I2C mode)
666 * Going into power down
667 * . MCLK divide by 1
668 * . MCLK divide by 2
669 */
670 i2c_reg_write(I2C_DAC_ADDR, 0x05,
671 DAC_REG5_I2C_MODE |
672 DAC_REG5_POWER_DOWN |
673 (mclk_divide ? DAC_REG5_MCLK_DIV : 0));
wdenkfe8c2802002-11-03 00:38:21 +0000674
Wolfgang Denke615de02011-11-05 05:13:14 +0000675 /*
676 * Cause the DAC to:
677 * Auto-mute disabled
678 * . Format 0, left justified 24 bits
679 * . Format 3, right justified 24 bits
680 * No de-emphasis
681 * . Single speed mode
682 * . Double speed mode
683 */
684 i2c_reg_write(I2C_DAC_ADDR, 0x01,
685 (right_just ? DAC_REG1_RIGHT_JUST_24BIT :
686 DAC_REG1_LEFT_JUST_24_BIT) |
687 DAC_REG1_DEM_NO |
688 (sample_rate >=
689 50000 ? DAC_REG1_DOUBLE : DAC_REG1_SINGLE));
wdenkfe8c2802002-11-03 00:38:21 +0000690
Wolfgang Denke615de02011-11-05 05:13:14 +0000691 sprintf(str_buf, "%d",
692 sample_rate >= 50000 ? DAC_REG1_DOUBLE : DAC_REG1_SINGLE);
693 setenv("DaqDACFunctionalMode", str_buf);
wdenkfe8c2802002-11-03 00:38:21 +0000694
Wolfgang Denke615de02011-11-05 05:13:14 +0000695 /*
696 * Cause the DAC to:
697 * Enable control port (I2C mode)
698 * Remove power down
699 * . MCLK divide by 1
700 * . MCLK divide by 2
701 */
702 i2c_reg_write(I2C_DAC_ADDR, 0x05,
703 DAC_REG5_I2C_MODE |
704 (mclk_divide ? DAC_REG5_MCLK_DIV : 0));
wdenk42d1f032003-10-15 23:53:47 +0000705
Wolfgang Denke615de02011-11-05 05:13:14 +0000706 /*
707 * Create a I2C stop condition:
708 * low->high on data while clock is high.
709 */
710 I2C_SCL(1);
711 I2C_DELAY;
712 I2C_SDA(1);
713 I2C_DELAY;
714 I2C_TRISTATE;
wdenkfe8c2802002-11-03 00:38:21 +0000715
Wolfgang Denke615de02011-11-05 05:13:14 +0000716 if (!quiet)
717 printf("\n");
wdenk78137c32003-09-15 18:00:00 +0000718#ifdef CONFIG_ETHER_LOOPBACK_TEST
Wolfgang Denke615de02011-11-05 05:13:14 +0000719 /*
720 * Run the Ethernet loopback test
721 */
722 eth_loopback_test();
wdenk78137c32003-09-15 18:00:00 +0000723#endif /* CONFIG_ETHER_LOOPBACK_TEST */
wdenkfe8c2802002-11-03 00:38:21 +0000724
725#ifdef CONFIG_SHOW_BOOT_PROGRESS
Wolfgang Denke615de02011-11-05 05:13:14 +0000726 /*
727 * Turn off the RED fail LED now that we are up and running.
728 */
729 status_led_set(STATUS_LED_RED, STATUS_LED_OFF);
wdenkfe8c2802002-11-03 00:38:21 +0000730#endif
731
Wolfgang Denke615de02011-11-05 05:13:14 +0000732 return 0;
wdenkfe8c2802002-11-03 00:38:21 +0000733}
734
735#ifdef CONFIG_SHOW_BOOT_PROGRESS
736/*
737 * Show boot status: flash the LED if something goes wrong, indicating
738 * that last thing that worked and thus, by implication, what is broken.
739 *
740 * This stores the last OK value in RAM so this will not work properly
741 * before RAM is initialized. Since it is being used for indicating
742 * boot status (i.e. after RAM is initialized), that is OK.
743 */
744static void flash_code(uchar number, uchar modulo, uchar digits)
745{
Wolfgang Denke615de02011-11-05 05:13:14 +0000746 int j;
wdenkfe8c2802002-11-03 00:38:21 +0000747
wdenk8bde7f72003-06-27 21:31:46 +0000748 /*
Wolfgang Denke615de02011-11-05 05:13:14 +0000749 * Recursively do upper digits.
wdenk8bde7f72003-06-27 21:31:46 +0000750 */
Wolfgang Denke615de02011-11-05 05:13:14 +0000751 if (digits > 1)
752 flash_code(number / modulo, modulo, digits - 1);
753
754 number = number % modulo;
755
756 /*
757 * Zero is indicated by one long flash (dash).
758 */
759 if (number == 0) {
760 status_led_set(STATUS_LED_BOOT, STATUS_LED_ON);
761 udelay(1000000);
762 status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
763 udelay(200000);
764 } else {
765 /*
766 * Non-zero is indicated by short flashes, one per count.
767 */
768 for (j = 0; j < number; j++) {
769 status_led_set(STATUS_LED_BOOT, STATUS_LED_ON);
770 udelay(100000);
771 status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
772 udelay(200000);
773 }
wdenk8bde7f72003-06-27 21:31:46 +0000774 }
Wolfgang Denke615de02011-11-05 05:13:14 +0000775 /*
776 * Inter-digit pause: we've already waited 200 mSec, wait 1 sec total
777 */
778 udelay(700000);
wdenkfe8c2802002-11-03 00:38:21 +0000779}
780
781static int last_boot_progress;
782
Wolfgang Denke615de02011-11-05 05:13:14 +0000783void show_boot_progress(int status)
wdenkfe8c2802002-11-03 00:38:21 +0000784{
Wolfgang Denke615de02011-11-05 05:13:14 +0000785 int i, j;
wdenk42d1f032003-10-15 23:53:47 +0000786
Wolfgang Denke615de02011-11-05 05:13:14 +0000787 if (status > 0) {
788 last_boot_progress = status;
789 } else {
790 /*
791 * If a specific failure code is given, flash this code
792 * else just use the last success code we've seen
793 */
794 if (status < -1)
795 last_boot_progress = -status;
wdenk78137c32003-09-15 18:00:00 +0000796
Wolfgang Denke615de02011-11-05 05:13:14 +0000797 /*
798 * Flash this code 5 times
799 */
800 for (j = 0; j < 5; j++) {
801 /*
802 * Houston, we have a problem.
803 * Blink the last OK status which indicates where things failed.
804 */
805 status_led_set(STATUS_LED_RED, STATUS_LED_ON);
806 flash_code(last_boot_progress, 5, 3);
807
808 /*
809 * Delay 5 seconds between repetitions,
810 * with the fault LED blinking
811 */
812 for (i = 0; i < 5; i++) {
813 status_led_set(STATUS_LED_RED,
814 STATUS_LED_OFF);
815 udelay(500000);
816 status_led_set(STATUS_LED_RED, STATUS_LED_ON);
817 udelay(500000);
818 }
819 }
820
821 /*
822 * Reset the board to retry initialization.
823 */
824 do_reset(NULL, 0, 0, NULL);
wdenk78137c32003-09-15 18:00:00 +0000825 }
wdenkfe8c2802002-11-03 00:38:21 +0000826}
827#endif /* CONFIG_SHOW_BOOT_PROGRESS */
828
829
830/*
831 * The following are used to control the SPI chip selects for the SPI command.
832 */
Jon Loeligerab3abcb2007-07-09 18:45:16 -0500833#if defined(CONFIG_CMD_SPI)
wdenkfe8c2802002-11-03 00:38:21 +0000834
835#define SPI_ADC_CS_MASK 0x00000800
836#define SPI_DAC_CS_MASK 0x00001000
837
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200838static const u32 cs_mask[] = {
Wolfgang Denke615de02011-11-05 05:13:14 +0000839 SPI_ADC_CS_MASK,
840 SPI_DAC_CS_MASK,
wdenkfe8c2802002-11-03 00:38:21 +0000841};
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200842
843int spi_cs_is_valid(unsigned int bus, unsigned int cs)
844{
Wolfgang Denke615de02011-11-05 05:13:14 +0000845 return bus == 0 && cs < sizeof(cs_mask) / sizeof(cs_mask[0]);
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200846}
847
848void spi_cs_activate(struct spi_slave *slave)
849{
Wolfgang Denke615de02011-11-05 05:13:14 +0000850 volatile ioport_t *iopd =
851 ioport_addr((immap_t *) CONFIG_SYS_IMMR, 3 /* port D */ );
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200852
Wolfgang Denke615de02011-11-05 05:13:14 +0000853 iopd->pdat &= ~cs_mask[slave->cs];
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200854}
855
856void spi_cs_deactivate(struct spi_slave *slave)
857{
Wolfgang Denke615de02011-11-05 05:13:14 +0000858 volatile ioport_t *iopd =
859 ioport_addr((immap_t *) CONFIG_SYS_IMMR, 3 /* port D */ );
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200860
Wolfgang Denke615de02011-11-05 05:13:14 +0000861 iopd->pdat |= cs_mask[slave->cs];
Haavard Skinnemoend255bb02008-05-16 11:10:31 +0200862}
wdenkeb9401e2002-11-11 02:11:37 +0000863
Jon Loeligerd39b5742007-07-10 10:48:22 -0500864#endif
wdenkfe8c2802002-11-03 00:38:21 +0000865
866#endif /* CONFIG_MISC_INIT_R */