blob: 433769a608bc75970e87cbeb86347d10803feff8 [file] [log] [blame]
Sergey Kubushync74b2102007-08-10 20:26:18 +02001/*
2 * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
3 *
4 * Parts are shamelessly stolen from various TI sources, original copyright
5 * follows:
6 * -----------------------------------------------------------------
7 *
8 * Copyright (C) 2004 Texas Instruments.
9 *
10 * ----------------------------------------------------------------------------
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 * ----------------------------------------------------------------------------
25 */
26
27#include <common.h>
28#include <i2c.h>
29#include <asm/arch/hardware.h>
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -040030#include "../common/psc.h"
31#include "../common/misc.h"
Sergey Kubushync74b2102007-08-10 20:26:18 +020032
Dirk Behme66b3f242007-09-15 11:55:42 +020033DECLARE_GLOBAL_DATA_PTR;
34
Sergey Kubushync74b2102007-08-10 20:26:18 +020035int board_init(void)
36{
Sergey Kubushync74b2102007-08-10 20:26:18 +020037 /* arch number of the board */
38 gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
39
40 /* address of boot parameters */
41 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
42
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050043 /* Configure AEMIF pins (although this should be configured at boot time
44 * with pull-up/pull-down resistors) */
45 REG(PINMUX0) = 0x00000c1f;
46
47 davinci_errata_workarounds();
Sergey Kubushync74b2102007-08-10 20:26:18 +020048
49 /* Power on required peripherals */
Sergey Kubushync74b2102007-08-10 20:26:18 +020050 lpsc_on(DAVINCI_LPSC_GPIO);
51
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020052#if !defined(CONFIG_SYS_USE_DSPLINK)
Sergey Kubushync74b2102007-08-10 20:26:18 +020053 /* Powerup the DSP */
54 dsp_on();
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020055#endif /* CONFIG_SYS_USE_DSPLINK */
Sergey Kubushync74b2102007-08-10 20:26:18 +020056
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050057 davinci_enable_uart0();
58 davinci_enable_emac();
59 davinci_enable_i2c();
Sergey Kubushync74b2102007-08-10 20:26:18 +020060
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050061 lpsc_on(DAVINCI_LPSC_TIMER1);
Sergey Kubushync74b2102007-08-10 20:26:18 +020062 timer_init();
63
64 return(0);
65}
66
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -040067int misc_init_r(void)
Sergey Kubushync74b2102007-08-10 20:26:18 +020068{
69 u_int8_t tmp[20], buf[10];
70 int i = 0;
Sergey Kubushync74b2102007-08-10 20:26:18 +020071
72 /* Set serial number from UID chip */
Hugo Villeneuve0cd18fa2008-11-21 14:35:56 -050073 const u_int8_t crc_tbl[256] = {
Sergey Kubushync74b2102007-08-10 20:26:18 +020074 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
75 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
76 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
77 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
78 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
79 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
80 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
81 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
82 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
83 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
84 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
85 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
86 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
87 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
88 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
89 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
90 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
91 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
92 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
93 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
94 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
95 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
96 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
97 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
98 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
99 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
100 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
101 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
102 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
103 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
104 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
105 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
106 };
107
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -0400108 dv_display_clk_infos();
Sergey Kubushync74b2102007-08-10 20:26:18 +0200109
110 /* Set serial number from UID chip */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200111 if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
112 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Sergey Kubushync74b2102007-08-10 20:26:18 +0200113 forceenv("serial#", "FAILED");
114 } else {
Hugo Villeneuve264bbdd2008-07-11 15:10:13 -0400115 if (buf[0] != 0x70) {
116 /* Device Family Code */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200117 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
Sergey Kubushync74b2102007-08-10 20:26:18 +0200118 forceenv("serial#", "FAILED");
119 }
120 }
121 /* Now check CRC */
122 tmp[0] = 0;
123 for (i = 0; i < 8; i++)
124 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
125
126 if (tmp[0] != 0) {
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200127 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
Sergey Kubushync74b2102007-08-10 20:26:18 +0200128 forceenv("serial#", "FAILED");
129 } else {
130 /* CRC OK, set "serial" env variable */
ksi@koi8.netb361acd2007-08-14 10:02:16 -0700131 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
Sergey Kubushync74b2102007-08-10 20:26:18 +0200132 buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
133 forceenv("serial#", (char *)&tmp[0]);
134 }
135
Hugo Villeneuve85e58082008-07-11 15:10:11 -0400136 if (!eth_hw_init())
Sergey Kubushync74b2102007-08-10 20:26:18 +0200137 printf("ethernet init failed!\n");
Sergey Kubushync74b2102007-08-10 20:26:18 +0200138
139 return(0);
140}